]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Localisation updates from https://translatewiki.net.
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2         var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
3
4         function commonjsRequire () {
5                 throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
6         }
7
8         function unwrapExports (x) {
9                 return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
10         }
11
12         function createCommonjsModule(fn, module) {
13                 return module = { exports: {} }, fn(module, module.exports), module.exports;
14         }
15
16         function getCjsExportFromNamespace (n) {
17                 return n && n['default'] || n;
18         }
19
20         var isImplemented = function () {
21                 var set, iterator, result;
22                 if (typeof Set !== 'function') return false;
23                 set = new Set(['raz', 'dwa', 'trzy']);
24                 if (String(set) !== '[object Set]') return false;
25                 if (set.size !== 3) return false;
26                 if (typeof set.add !== 'function') return false;
27                 if (typeof set.clear !== 'function') return false;
28                 if (typeof set.delete !== 'function') return false;
29                 if (typeof set.entries !== 'function') return false;
30                 if (typeof set.forEach !== 'function') return false;
31                 if (typeof set.has !== 'function') return false;
32                 if (typeof set.keys !== 'function') return false;
33                 if (typeof set.values !== 'function') return false;
34
35                 iterator = set.values();
36                 result = iterator.next();
37                 if (result.done !== false) return false;
38                 if (result.value !== 'raz') return false;
39
40                 return true;
41         };
42
43         // eslint-disable-next-line no-empty-function
44         var noop = function () {};
45
46         var _undefined = noop(); // Support ES3 engines
47
48         var isValue = function (val) {
49          return (val !== _undefined) && (val !== null);
50         };
51
52         var validValue = function (value) {
53                 if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
54                 return value;
55         };
56
57         var clear = function () {
58                 validValue(this).length = 0;
59                 return this;
60         };
61
62         var isImplemented$1 = function () {
63                 var numberIsNaN = Number.isNaN;
64                 if (typeof numberIsNaN !== "function") return false;
65                 return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
66         };
67
68         var shim = function (value) {
69                 // eslint-disable-next-line no-self-compare
70                 return value !== value;
71         };
72
73         var isNan = isImplemented$1()
74                 ? Number.isNaN
75                 : shim;
76
77         var isImplemented$2 = function () {
78                 var sign = Math.sign;
79                 if (typeof sign !== "function") return false;
80                 return (sign(10) === 1) && (sign(-20) === -1);
81         };
82
83         var shim$1 = function (value) {
84                 value = Number(value);
85                 if (isNaN(value) || (value === 0)) return value;
86                 return value > 0 ? 1 : -1;
87         };
88
89         var sign = isImplemented$2()
90                 ? Math.sign
91                 : shim$1;
92
93         var abs = Math.abs, floor = Math.floor;
94
95         var toInteger = function (value) {
96                 if (isNaN(value)) return 0;
97                 value = Number(value);
98                 if ((value === 0) || !isFinite(value)) return value;
99                 return sign(value) * floor(abs(value));
100         };
101
102         var max = Math.max;
103
104         var toPosInteger = function (value) {
105          return max(0, toInteger(value));
106         };
107
108         var indexOf           = Array.prototype.indexOf
109           , objHasOwnProperty = Object.prototype.hasOwnProperty
110           , abs$1               = Math.abs
111           , floor$1             = Math.floor;
112
113         var eIndexOf = function (searchElement /*, fromIndex*/) {
114                 var i, length, fromIndex, val;
115                 if (!isNan(searchElement)) return indexOf.apply(this, arguments);
116
117                 length = toPosInteger(validValue(this).length);
118                 fromIndex = arguments[1];
119                 if (isNaN(fromIndex)) fromIndex = 0;
120                 else if (fromIndex >= 0) fromIndex = floor$1(fromIndex);
121                 else fromIndex = toPosInteger(this.length) - floor$1(abs$1(fromIndex));
122
123                 for (i = fromIndex; i < length; ++i) {
124                         if (objHasOwnProperty.call(this, i)) {
125                                 val = this[i];
126                                 if (isNan(val)) return i; // Jslint: ignore
127                         }
128                 }
129                 return -1;
130         };
131
132         var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {};
133
134         var isImplemented$3 = function (/* CustomCreate*/) {
135                 var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
136                 if (typeof setPrototypeOf !== "function") return false;
137                 return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
138         };
139
140         var map = { function: true, object: true };
141
142         var isObject = function (value) {
143                 return (isValue(value) && map[typeof value]) || false;
144         };
145
146         var create$1 = Object.create, shim$2;
147
148         if (!isImplemented$3()) {
149                 shim$2 = shim$3;
150         }
151
152         var create_1 = (function () {
153                 var nullObject, polyProps, desc;
154                 if (!shim$2) return create$1;
155                 if (shim$2.level !== 1) return create$1;
156
157                 nullObject = {};
158                 polyProps = {};
159                 desc = {
160                         configurable: false,
161                         enumerable: false,
162                         writable: true,
163                         value: undefined
164                 };
165                 Object.getOwnPropertyNames(Object.prototype).forEach(function (name) {
166                         if (name === "__proto__") {
167                                 polyProps[name] = {
168                                         configurable: true,
169                                         enumerable: false,
170                                         writable: true,
171                                         value: undefined
172                                 };
173                                 return;
174                         }
175                         polyProps[name] = desc;
176                 });
177                 Object.defineProperties(nullObject, polyProps);
178
179                 Object.defineProperty(shim$2, "nullPolyfill", {
180                         configurable: false,
181                         enumerable: false,
182                         writable: false,
183                         value: nullObject
184                 });
185
186                 return function (prototype, props) {
187                         return create$1(prototype === null ? nullObject : prototype, props);
188                 };
189         }());
190
191         var objIsPrototypeOf = Object.prototype.isPrototypeOf
192           , defineProperty  = Object.defineProperty
193           , nullDesc        = {
194                 configurable: true,
195                 enumerable: false,
196                 writable: true,
197                 value: undefined
198         }
199           , validate;
200
201         validate = function (obj, prototype) {
202                 validValue(obj);
203                 if (prototype === null || isObject(prototype)) return obj;
204                 throw new TypeError("Prototype must be null or an object");
205         };
206
207         var shim$3 = (function (status) {
208                 var fn, set;
209                 if (!status) return null;
210                 if (status.level === 2) {
211                         if (status.set) {
212                                 set = status.set;
213                                 fn = function (obj, prototype) {
214                                         set.call(validate(obj, prototype), prototype);
215                                         return obj;
216                                 };
217                         } else {
218                                 fn = function (obj, prototype) {
219                                         validate(obj, prototype).__proto__ = prototype;
220                                         return obj;
221                                 };
222                         }
223                 } else {
224                         fn = function self(obj, prototype) {
225                                 var isNullBase;
226                                 validate(obj, prototype);
227                                 isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
228                                 if (isNullBase) delete self.nullPolyfill.__proto__;
229                                 if (prototype === null) prototype = self.nullPolyfill;
230                                 obj.__proto__ = prototype;
231                                 if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
232                                 return obj;
233                         };
234                 }
235                 return Object.defineProperty(fn, "level", {
236                         configurable: false,
237                         enumerable: false,
238                         writable: false,
239                         value: status.level
240                 });
241         }(
242                 (function () {
243                         var tmpObj1 = Object.create(null)
244                           , tmpObj2 = {}
245                           , set
246                           , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
247
248                         if (desc) {
249                                 try {
250                                         set = desc.set; // Opera crashes at this point
251                                         set.call(tmpObj1, tmpObj2);
252                                 } catch (ignore) {}
253                                 if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
254                         }
255
256                         tmpObj1.__proto__ = tmpObj2;
257                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
258
259                         tmpObj1 = {};
260                         tmpObj1.__proto__ = tmpObj2;
261                         if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
262
263                         return false;
264                 })()
265         ));
266
267         var setPrototypeOf = isImplemented$3()
268                 ? Object.setPrototypeOf
269                 : shim$3;
270
271         var validCallable = function (fn) {
272                 if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
273                 return fn;
274         };
275
276         // ES3 safe
277         var _undefined$1 = void 0;
278
279         var is = function (value) { return value !== _undefined$1 && value !== null; };
280
281         // prettier-ignore
282         var possibleTypes = { "object": true, "function": true, "undefined": true /* document.all */ };
283
284         var is$1 = function (value) {
285                 if (!is(value)) return false;
286                 return hasOwnProperty.call(possibleTypes, typeof value);
287         };
288
289         var is$2 = function (value) {
290                 if (!is$1(value)) return false;
291                 try {
292                         if (!value.constructor) return false;
293                         return value.constructor.prototype === value;
294                 } catch (error) {
295                         return false;
296                 }
297         };
298
299         var is$3 = function (value) {
300                 if (typeof value !== "function") return false;
301
302                 if (!hasOwnProperty.call(value, "length")) return false;
303
304                 try {
305                         if (typeof value.length !== "number") return false;
306                         if (typeof value.call !== "function") return false;
307                         if (typeof value.apply !== "function") return false;
308                 } catch (error) {
309                         return false;
310                 }
311
312                 return !is$2(value);
313         };
314
315         var classRe = /^\s*class[\s{/}]/, functionToString = Function.prototype.toString;
316
317         var is$4 = function (value) {
318                 if (!is$3(value)) return false;
319                 if (classRe.test(functionToString.call(value))) return false;
320                 return true;
321         };
322
323         var isImplemented$4 = function () {
324                 var assign = Object.assign, obj;
325                 if (typeof assign !== "function") return false;
326                 obj = { foo: "raz" };
327                 assign(obj, { bar: "dwa" }, { trzy: "trzy" });
328                 return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
329         };
330
331         var isImplemented$5 = function () {
332                 try {
333                         Object.keys("primitive");
334                         return true;
335                 } catch (e) {
336                         return false;
337                 }
338         };
339
340         var keys = Object.keys;
341
342         var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
343
344         var keys$1 = isImplemented$5() ? Object.keys : shim$4;
345
346         var max$1   = Math.max;
347
348         var shim$5 = function (dest, src /*, …srcn*/) {
349                 var error, i, length = max$1(arguments.length, 2), assign;
350                 dest = Object(validValue(dest));
351                 assign = function (key) {
352                         try {
353                                 dest[key] = src[key];
354                         } catch (e) {
355                                 if (!error) error = e;
356                         }
357                 };
358                 for (i = 1; i < length; ++i) {
359                         src = arguments[i];
360                         keys$1(src).forEach(assign);
361                 }
362                 if (error !== undefined) throw error;
363                 return dest;
364         };
365
366         var assign = isImplemented$4()
367                 ? Object.assign
368                 : shim$5;
369
370         var forEach = Array.prototype.forEach, create$2 = Object.create;
371
372         var process$1 = function (src, obj) {
373                 var key;
374                 for (key in src) obj[key] = src[key];
375         };
376
377         // eslint-disable-next-line no-unused-vars
378         var normalizeOptions = function (opts1 /*, …options*/) {
379                 var result = create$2(null);
380                 forEach.call(arguments, function (options) {
381                         if (!isValue(options)) return;
382                         process$1(Object(options), result);
383                 });
384                 return result;
385         };
386
387         var str = "razdwatrzy";
388
389         var isImplemented$6 = function () {
390                 if (typeof str.contains !== "function") return false;
391                 return (str.contains("dwa") === true) && (str.contains("foo") === false);
392         };
393
394         var indexOf$1 = String.prototype.indexOf;
395
396         var shim$6 = function (searchString/*, position*/) {
397                 return indexOf$1.call(this, searchString, arguments[1]) > -1;
398         };
399
400         var contains = isImplemented$6()
401                 ? String.prototype.contains
402                 : shim$6;
403
404         var d_1 = createCommonjsModule(function (module) {
405
406
407
408         var d = (module.exports = function (dscr, value/*, options*/) {
409                 var c, e, w, options, desc;
410                 if (arguments.length < 2 || typeof dscr !== "string") {
411                         options = value;
412                         value = dscr;
413                         dscr = null;
414                 } else {
415                         options = arguments[2];
416                 }
417                 if (is(dscr)) {
418                         c = contains.call(dscr, "c");
419                         e = contains.call(dscr, "e");
420                         w = contains.call(dscr, "w");
421                 } else {
422                         c = w = true;
423                         e = false;
424                 }
425
426                 desc = { value: value, configurable: c, enumerable: e, writable: w };
427                 return !options ? desc : assign(normalizeOptions(options), desc);
428         });
429
430         d.gs = function (dscr, get, set/*, options*/) {
431                 var c, e, options, desc;
432                 if (typeof dscr !== "string") {
433                         options = set;
434                         set = get;
435                         get = dscr;
436                         dscr = null;
437                 } else {
438                         options = arguments[3];
439                 }
440                 if (!is(get)) {
441                         get = undefined;
442                 } else if (!is$4(get)) {
443                         options = get;
444                         get = set = undefined;
445                 } else if (!is(set)) {
446                         set = undefined;
447                 } else if (!is$4(set)) {
448                         options = set;
449                         set = undefined;
450                 }
451                 if (is(dscr)) {
452                         c = contains.call(dscr, "c");
453                         e = contains.call(dscr, "e");
454                 } else {
455                         c = true;
456                         e = false;
457                 }
458
459                 desc = { get: get, set: set, configurable: c, enumerable: e };
460                 return !options ? desc : assign(normalizeOptions(options), desc);
461         };
462         });
463
464         var eventEmitter = createCommonjsModule(function (module, exports) {
465
466         var apply = Function.prototype.apply, call = Function.prototype.call
467           , create = Object.create, defineProperty = Object.defineProperty
468           , defineProperties = Object.defineProperties
469           , hasOwnProperty = Object.prototype.hasOwnProperty
470           , descriptor = { configurable: true, enumerable: false, writable: true }
471
472           , on, once, off, emit, methods, descriptors, base;
473
474         on = function (type, listener) {
475                 var data;
476
477                 validCallable(listener);
478
479                 if (!hasOwnProperty.call(this, '__ee__')) {
480                         data = descriptor.value = create(null);
481                         defineProperty(this, '__ee__', descriptor);
482                         descriptor.value = null;
483                 } else {
484                         data = this.__ee__;
485                 }
486                 if (!data[type]) data[type] = listener;
487                 else if (typeof data[type] === 'object') data[type].push(listener);
488                 else data[type] = [data[type], listener];
489
490                 return this;
491         };
492
493         once = function (type, listener) {
494                 var once, self;
495
496                 validCallable(listener);
497                 self = this;
498                 on.call(this, type, once = function () {
499                         off.call(self, type, once);
500                         apply.call(listener, this, arguments);
501                 });
502
503                 once.__eeOnceListener__ = listener;
504                 return this;
505         };
506
507         off = function (type, listener) {
508                 var data, listeners, candidate, i;
509
510                 validCallable(listener);
511
512                 if (!hasOwnProperty.call(this, '__ee__')) return this;
513                 data = this.__ee__;
514                 if (!data[type]) return this;
515                 listeners = data[type];
516
517                 if (typeof listeners === 'object') {
518                         for (i = 0; (candidate = listeners[i]); ++i) {
519                                 if ((candidate === listener) ||
520                                                 (candidate.__eeOnceListener__ === listener)) {
521                                         if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
522                                         else listeners.splice(i, 1);
523                                 }
524                         }
525                 } else {
526                         if ((listeners === listener) ||
527                                         (listeners.__eeOnceListener__ === listener)) {
528                                 delete data[type];
529                         }
530                 }
531
532                 return this;
533         };
534
535         emit = function (type) {
536                 var i, l, listener, listeners, args;
537
538                 if (!hasOwnProperty.call(this, '__ee__')) return;
539                 listeners = this.__ee__[type];
540                 if (!listeners) return;
541
542                 if (typeof listeners === 'object') {
543                         l = arguments.length;
544                         args = new Array(l - 1);
545                         for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
546
547                         listeners = listeners.slice();
548                         for (i = 0; (listener = listeners[i]); ++i) {
549                                 apply.call(listener, this, args);
550                         }
551                 } else {
552                         switch (arguments.length) {
553                         case 1:
554                                 call.call(listeners, this);
555                                 break;
556                         case 2:
557                                 call.call(listeners, this, arguments[1]);
558                                 break;
559                         case 3:
560                                 call.call(listeners, this, arguments[1], arguments[2]);
561                                 break;
562                         default:
563                                 l = arguments.length;
564                                 args = new Array(l - 1);
565                                 for (i = 1; i < l; ++i) {
566                                         args[i - 1] = arguments[i];
567                                 }
568                                 apply.call(listeners, this, args);
569                         }
570                 }
571         };
572
573         methods = {
574                 on: on,
575                 once: once,
576                 off: off,
577                 emit: emit
578         };
579
580         descriptors = {
581                 on: d_1(on),
582                 once: d_1(once),
583                 off: d_1(off),
584                 emit: d_1(emit)
585         };
586
587         base = defineProperties({}, descriptors);
588
589         module.exports = exports = function (o) {
590                 return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
591         };
592         exports.methods = methods;
593         });
594         var eventEmitter_1 = eventEmitter.methods;
595
596         var validTypes = { object: true, symbol: true };
597
598         var isImplemented$7 = function () {
599                 var symbol;
600                 if (typeof Symbol !== 'function') return false;
601                 symbol = Symbol('test symbol');
602                 try { String(symbol); } catch (e) { return false; }
603
604                 // Return 'true' also for polyfills
605                 if (!validTypes[typeof Symbol.iterator]) return false;
606                 if (!validTypes[typeof Symbol.toPrimitive]) return false;
607                 if (!validTypes[typeof Symbol.toStringTag]) return false;
608
609                 return true;
610         };
611
612         var isSymbol = function (x) {
613                 if (!x) return false;
614                 if (typeof x === 'symbol') return true;
615                 if (!x.constructor) return false;
616                 if (x.constructor.name !== 'Symbol') return false;
617                 return (x[x.constructor.toStringTag] === 'Symbol');
618         };
619
620         var validateSymbol = function (value) {
621                 if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
622                 return value;
623         };
624
625         var create$3 = Object.create, defineProperties = Object.defineProperties
626           , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
627           , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
628           , isNativeSafe;
629
630         if (typeof Symbol === 'function') {
631                 NativeSymbol = Symbol;
632                 try {
633                         String(NativeSymbol());
634                         isNativeSafe = true;
635                 } catch (ignore) {}
636         }
637
638         var generateName = (function () {
639                 var created = create$3(null);
640                 return function (desc) {
641                         var postfix = 0, name, ie11BugWorkaround;
642                         while (created[desc + (postfix || '')]) ++postfix;
643                         desc += (postfix || '');
644                         created[desc] = true;
645                         name = '@@' + desc;
646                         defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
647                                 // For IE11 issue see:
648                                 // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
649                                 //    ie11-broken-getters-on-dom-objects
650                                 // https://github.com/medikoo/es6-symbol/issues/12
651                                 if (ie11BugWorkaround) return;
652                                 ie11BugWorkaround = true;
653                                 defineProperty$1(this, name, d_1(value));
654                                 ie11BugWorkaround = false;
655                         }));
656                         return name;
657                 };
658         }());
659
660         // Internal constructor (not one exposed) for creating Symbol instances.
661         // This one is used to ensure that `someSymbol instanceof Symbol` always return false
662         HiddenSymbol = function Symbol(description) {
663                 if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
664                 return SymbolPolyfill(description);
665         };
666
667         // Exposed `Symbol` constructor
668         // (returns instances of HiddenSymbol)
669         var polyfill = SymbolPolyfill = function Symbol(description) {
670                 var symbol;
671                 if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
672                 if (isNativeSafe) return NativeSymbol(description);
673                 symbol = create$3(HiddenSymbol.prototype);
674                 description = (description === undefined ? '' : String(description));
675                 return defineProperties(symbol, {
676                         __description__: d_1('', description),
677                         __name__: d_1('', generateName(description))
678                 });
679         };
680         defineProperties(SymbolPolyfill, {
681                 for: d_1(function (key) {
682                         if (globalSymbols[key]) return globalSymbols[key];
683                         return (globalSymbols[key] = SymbolPolyfill(String(key)));
684                 }),
685                 keyFor: d_1(function (s) {
686                         var key;
687                         validateSymbol(s);
688                         for (key in globalSymbols) if (globalSymbols[key] === s) return key;
689                 }),
690
691                 // To ensure proper interoperability with other native functions (e.g. Array.from)
692                 // fallback to eventual native implementation of given symbol
693                 hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
694                 isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
695                         SymbolPolyfill('isConcatSpreadable')),
696                 iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
697                 match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
698                 replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
699                 search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
700                 species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
701                 split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
702                 toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
703                 toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
704                 unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
705         });
706
707         // Internal tweaks for real symbol producer
708         defineProperties(HiddenSymbol.prototype, {
709                 constructor: d_1(SymbolPolyfill),
710                 toString: d_1('', function () { return this.__name__; })
711         });
712
713         // Proper implementation of methods exposed on Symbol.prototype
714         // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
715         defineProperties(SymbolPolyfill.prototype, {
716                 toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
717                 valueOf: d_1(function () { return validateSymbol(this); })
718         });
719         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
720                 var symbol = validateSymbol(this);
721                 if (typeof symbol === 'symbol') return symbol;
722                 return symbol.toString();
723         }));
724         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
725
726         // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
727         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
728                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
729
730         // Note: It's important to define `toPrimitive` as last one, as some implementations
731         // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
732         // And that may invoke error in definition flow:
733         // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
734         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
735                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
736
737         var es6Symbol = isImplemented$7() ? Symbol : polyfill;
738
739         var objToString = Object.prototype.toString
740           , id = objToString.call(
741                 (function () {
742                         return arguments;
743                 })()
744         );
745
746         var isArguments = function (value) {
747                 return objToString.call(value) === id;
748         };
749
750         var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
751
752         var isString = function (value) {
753                 return (
754                         typeof value === "string" ||
755                         (value &&
756                                 typeof value === "object" &&
757                                 (value instanceof String || objToString$1.call(value) === id$1)) ||
758                         false
759                 );
760         };
761
762         var iteratorSymbol = es6Symbol.iterator
763           , isArray        = Array.isArray;
764
765         var isIterable = function (value) {
766                 if (!isValue(value)) return false;
767                 if (isArray(value)) return true;
768                 if (isString(value)) return true;
769                 if (isArguments(value)) return true;
770                 return typeof value[iteratorSymbol] === "function";
771         };
772
773         var validIterable = function (value) {
774                 if (!isIterable(value)) throw new TypeError(value + " is not iterable");
775                 return value;
776         };
777
778         var objectToString = Object.prototype.toString;
779
780         var coerce = function (value) {
781                 if (!is(value)) return null;
782                 if (is$1(value)) {
783                         // Reject Object.prototype.toString coercion
784                         var valueToString = value.toString;
785                         if (typeof valueToString !== "function") return null;
786                         if (valueToString === objectToString) return null;
787                         // Note: It can be object coming from other realm, still as there's no ES3 and CSP compliant
788                         // way to resolve its realm's Object.prototype.toString it's left as not addressed edge case
789                 }
790                 try {
791                         return "" + value; // Ensure implicit coercion
792                 } catch (error) {
793                         return null;
794                 }
795         };
796
797         var safeToString = function (value) {
798                 try {
799                         return value.toString();
800                 } catch (error) {
801                         try { return String(value); }
802                         catch (error2) { return null; }
803                 }
804         };
805
806         var reNewLine = /[\n\r\u2028\u2029]/g;
807
808         var toShortString = function (value) {
809                 var string = safeToString(value);
810                 if (string === null) return "<Non-coercible to string value>";
811                 // Trim if too long
812                 if (string.length > 100) string = string.slice(0, 99) + "…";
813                 // Replace eventual new lines
814                 string = string.replace(reNewLine, function (char) {
815                         switch (char) {
816                                 case "\n":
817                                         return "\\n";
818                                 case "\r":
819                                         return "\\r";
820                                 case "\u2028":
821                                         return "\\u2028";
822                                 case "\u2029":
823                                         return "\\u2029";
824                                 /* istanbul ignore next */
825                                 default:
826                                         throw new Error("Unexpected character");
827                         }
828                 });
829                 return string;
830         };
831
832         var resolveMessage = function (message, value) {
833                 return message.replace("%v", toShortString(value));
834         };
835
836         var resolveException = function (value, defaultMessage, inputOptions) {
837                 if (!is$1(inputOptions)) throw new TypeError(resolveMessage(defaultMessage, value));
838                 if (!is(value)) {
839                         if ("default" in inputOptions) return inputOptions["default"];
840                         if (inputOptions.isOptional) return null;
841                 }
842                 var errorMessage = coerce(inputOptions.errorMessage);
843                 if (!is(errorMessage)) errorMessage = defaultMessage;
844                 throw new TypeError(resolveMessage(errorMessage, value));
845         };
846
847         var ensure = function (value/*, options*/) {
848                 if (is(value)) return value;
849                 return resolveException(value, "Cannot use %v", arguments[1]);
850         };
851
852         var ensure$1 = function (value/*, options*/) {
853                 if (is$4(value)) return value;
854                 return resolveException(value, "%v is not a plain function", arguments[1]);
855         };
856
857         var isImplemented$8 = function () {
858                 var from = Array.from, arr, result;
859                 if (typeof from !== "function") return false;
860                 arr = ["raz", "dwa"];
861                 result = from(arr);
862                 return Boolean(result && (result !== arr) && (result[1] === "dwa"));
863         };
864
865         var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
866
867         var isFunction = function (value) {
868                 return typeof value === "function" && objToString$2.call(value) === id$2;
869         };
870
871         var iteratorSymbol$1 = es6Symbol.iterator
872           , isArray$1        = Array.isArray
873           , call           = Function.prototype.call
874           , desc           = { configurable: true, enumerable: true, writable: true, value: null }
875           , defineProperty$2 = Object.defineProperty;
876
877         // eslint-disable-next-line complexity, max-lines-per-function
878         var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
879                 var mapFn = arguments[1]
880                   , thisArg = arguments[2]
881                   , Context
882                   , i
883                   , j
884                   , arr
885                   , length
886                   , code
887                   , iterator
888                   , result
889                   , getIterator
890                   , value;
891
892                 arrayLike = Object(validValue(arrayLike));
893
894                 if (isValue(mapFn)) validCallable(mapFn);
895                 if (!this || this === Array || !isFunction(this)) {
896                         // Result: Plain array
897                         if (!mapFn) {
898                                 if (isArguments(arrayLike)) {
899                                         // Source: Arguments
900                                         length = arrayLike.length;
901                                         if (length !== 1) return Array.apply(null, arrayLike);
902                                         arr = new Array(1);
903                                         arr[0] = arrayLike[0];
904                                         return arr;
905                                 }
906                                 if (isArray$1(arrayLike)) {
907                                         // Source: Array
908                                         arr = new Array(length = arrayLike.length);
909                                         for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
910                                         return arr;
911                                 }
912                         }
913                         arr = [];
914                 } else {
915                         // Result: Non plain array
916                         Context = this;
917                 }
918
919                 if (!isArray$1(arrayLike)) {
920                         if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
921                                 // Source: Iterator
922                                 iterator = validCallable(getIterator).call(arrayLike);
923                                 if (Context) arr = new Context();
924                                 result = iterator.next();
925                                 i = 0;
926                                 while (!result.done) {
927                                         value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
928                                         if (Context) {
929                                                 desc.value = value;
930                                                 defineProperty$2(arr, i, desc);
931                                         } else {
932                                                 arr[i] = value;
933                                         }
934                                         result = iterator.next();
935                                         ++i;
936                                 }
937                                 length = i;
938                         } else if (isString(arrayLike)) {
939                                 // Source: String
940                                 length = arrayLike.length;
941                                 if (Context) arr = new Context();
942                                 for (i = 0, j = 0; i < length; ++i) {
943                                         value = arrayLike[i];
944                                         if (i + 1 < length) {
945                                                 code = value.charCodeAt(0);
946                                                 // eslint-disable-next-line max-depth
947                                                 if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
948                                         }
949                                         value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
950                                         if (Context) {
951                                                 desc.value = value;
952                                                 defineProperty$2(arr, j, desc);
953                                         } else {
954                                                 arr[j] = value;
955                                         }
956                                         ++j;
957                                 }
958                                 length = j;
959                         }
960                 }
961                 if (length === undefined) {
962                         // Source: array or array-like
963                         length = toPosInteger(arrayLike.length);
964                         if (Context) arr = new Context(length);
965                         for (i = 0; i < length; ++i) {
966                                 value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
967                                 if (Context) {
968                                         desc.value = value;
969                                         defineProperty$2(arr, i, desc);
970                                 } else {
971                                         arr[i] = value;
972                                 }
973                         }
974                 }
975                 if (Context) {
976                         desc.value = null;
977                         arr.length = length;
978                 }
979                 return arr;
980         };
981
982         var from_1 = isImplemented$8()
983                 ? Array.from
984                 : shim$7;
985
986         var copy = function (obj/*, propertyNames, options*/) {
987                 var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
988                 if (copy !== obj && !propertyNames) return copy;
989                 var result = {};
990                 if (propertyNames) {
991                         from_1(propertyNames, function (propertyName) {
992                                 if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
993                         });
994                 } else {
995                         assign(result, obj);
996                 }
997                 return result;
998         };
999
1000         var bind                    = Function.prototype.bind
1001           , call$1                    = Function.prototype.call
1002           , keys$2                    = Object.keys
1003           , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
1004
1005         var _iterate = function (method, defVal) {
1006                 return function (obj, cb /*, thisArg, compareFn*/) {
1007                         var list, thisArg = arguments[2], compareFn = arguments[3];
1008                         obj = Object(validValue(obj));
1009                         validCallable(cb);
1010
1011                         list = keys$2(obj);
1012                         if (compareFn) {
1013                                 list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
1014                         }
1015                         if (typeof method !== "function") method = list[method];
1016                         return call$1.call(method, list, function (key, index) {
1017                                 if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
1018                                 return call$1.call(cb, thisArg, obj[key], key, obj, index);
1019                         });
1020                 };
1021         };
1022
1023         var forEach$1 = _iterate("forEach");
1024
1025         var call$2     = Function.prototype.call;
1026
1027         var map$1 = function (obj, cb /*, thisArg*/) {
1028                 var result = {}, thisArg = arguments[2];
1029                 validCallable(cb);
1030                 forEach$1(obj, function (value, key, targetObj, index) {
1031                         result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
1032                 });
1033                 return result;
1034         };
1035
1036         var bind$1 = Function.prototype.bind
1037           , defineProperty$3 = Object.defineProperty
1038           , hasOwnProperty$1 = Object.prototype.hasOwnProperty
1039           , define;
1040
1041         define = function (name, desc, options) {
1042                 var value = ensure(desc) && ensure$1(desc.value), dgs;
1043                 dgs = copy(desc);
1044                 delete dgs.writable;
1045                 delete dgs.value;
1046                 dgs.get = function () {
1047                         if (!options.overwriteDefinition && hasOwnProperty$1.call(this, name)) return value;
1048                         desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
1049                         defineProperty$3(this, name, desc);
1050                         return this[name];
1051                 };
1052                 return dgs;
1053         };
1054
1055         var autoBind = function (props/*, options*/) {
1056                 var options = normalizeOptions(arguments[1]);
1057                 if (is(options.resolveContext)) ensure$1(options.resolveContext);
1058                 return map$1(props, function (desc, name) { return define(name, desc, options); });
1059         };
1060
1061         var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
1062
1063         var es6Iterator = Iterator = function (list, context) {
1064                 if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
1065                 defineProperties$1(this, {
1066                         __list__: d_1("w", validValue(list)),
1067                         __context__: d_1("w", context),
1068                         __nextIndex__: d_1("w", 0)
1069                 });
1070                 if (!context) return;
1071                 validCallable(context.on);
1072                 context.on("_add", this._onAdd);
1073                 context.on("_delete", this._onDelete);
1074                 context.on("_clear", this._onClear);
1075         };
1076
1077         // Internal %IteratorPrototype% doesn't expose its constructor
1078         delete Iterator.prototype.constructor;
1079
1080         defineProperties$1(
1081                 Iterator.prototype,
1082                 assign(
1083                         {
1084                                 _next: d_1(function () {
1085                                         var i;
1086                                         if (!this.__list__) return undefined;
1087                                         if (this.__redo__) {
1088                                                 i = this.__redo__.shift();
1089                                                 if (i !== undefined) return i;
1090                                         }
1091                                         if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
1092                                         this._unBind();
1093                                         return undefined;
1094                                 }),
1095                                 next: d_1(function () {
1096                                         return this._createResult(this._next());
1097                                 }),
1098                                 _createResult: d_1(function (i) {
1099                                         if (i === undefined) return { done: true, value: undefined };
1100                                         return { done: false, value: this._resolve(i) };
1101                                 }),
1102                                 _resolve: d_1(function (i) {
1103                                         return this.__list__[i];
1104                                 }),
1105                                 _unBind: d_1(function () {
1106                                         this.__list__ = null;
1107                                         delete this.__redo__;
1108                                         if (!this.__context__) return;
1109                                         this.__context__.off("_add", this._onAdd);
1110                                         this.__context__.off("_delete", this._onDelete);
1111                                         this.__context__.off("_clear", this._onClear);
1112                                         this.__context__ = null;
1113                                 }),
1114                                 toString: d_1(function () {
1115                                         return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
1116                                 })
1117                         },
1118                         autoBind({
1119                                 _onAdd: d_1(function (index) {
1120                                         if (index >= this.__nextIndex__) return;
1121                                         ++this.__nextIndex__;
1122                                         if (!this.__redo__) {
1123                                                 defineProperty$4(this, "__redo__", d_1("c", [index]));
1124                                                 return;
1125                                         }
1126                                         this.__redo__.forEach(function (redo, i) {
1127                                                 if (redo >= index) this.__redo__[i] = ++redo;
1128                                         }, this);
1129                                         this.__redo__.push(index);
1130                                 }),
1131                                 _onDelete: d_1(function (index) {
1132                                         var i;
1133                                         if (index >= this.__nextIndex__) return;
1134                                         --this.__nextIndex__;
1135                                         if (!this.__redo__) return;
1136                                         i = this.__redo__.indexOf(index);
1137                                         if (i !== -1) this.__redo__.splice(i, 1);
1138                                         this.__redo__.forEach(function (redo, j) {
1139                                                 if (redo > index) this.__redo__[j] = --redo;
1140                                         }, this);
1141                                 }),
1142                                 _onClear: d_1(function () {
1143                                         if (this.__redo__) clear.call(this.__redo__);
1144                                         this.__nextIndex__ = 0;
1145                                 })
1146                         })
1147                 )
1148         );
1149
1150         defineProperty$4(
1151                 Iterator.prototype,
1152                 es6Symbol.iterator,
1153                 d_1(function () {
1154                         return this;
1155                 })
1156         );
1157
1158         var array = createCommonjsModule(function (module) {
1159
1160
1161
1162         var defineProperty = Object.defineProperty, ArrayIterator;
1163
1164         ArrayIterator = module.exports = function (arr, kind) {
1165                 if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
1166                 es6Iterator.call(this, arr);
1167                 if (!kind) kind = "value";
1168                 else if (contains.call(kind, "key+value")) kind = "key+value";
1169                 else if (contains.call(kind, "key")) kind = "key";
1170                 else kind = "value";
1171                 defineProperty(this, "__kind__", d_1("", kind));
1172         };
1173         if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
1174
1175         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1176         delete ArrayIterator.prototype.constructor;
1177
1178         ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
1179                 _resolve: d_1(function (i) {
1180                         if (this.__kind__ === "value") return this.__list__[i];
1181                         if (this.__kind__ === "key+value") return [i, this.__list__[i]];
1182                         return i;
1183                 })
1184         });
1185         defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
1186         });
1187
1188         var string = createCommonjsModule(function (module) {
1189
1190
1191
1192         var defineProperty = Object.defineProperty, StringIterator;
1193
1194         StringIterator = module.exports = function (str) {
1195                 if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
1196                 str = String(str);
1197                 es6Iterator.call(this, str);
1198                 defineProperty(this, "__length__", d_1("", str.length));
1199         };
1200         if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
1201
1202         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1203         delete StringIterator.prototype.constructor;
1204
1205         StringIterator.prototype = Object.create(es6Iterator.prototype, {
1206                 _next: d_1(function () {
1207                         if (!this.__list__) return undefined;
1208                         if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
1209                         this._unBind();
1210                         return undefined;
1211                 }),
1212                 _resolve: d_1(function (i) {
1213                         var char = this.__list__[i], code;
1214                         if (this.__nextIndex__ === this.__length__) return char;
1215                         code = char.charCodeAt(0);
1216                         if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
1217                         return char;
1218                 })
1219         });
1220         defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
1221         });
1222
1223         var iteratorSymbol$2 = es6Symbol.iterator;
1224
1225         var get = function (obj) {
1226                 if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
1227                 if (isArguments(obj)) return new array(obj);
1228                 if (isString(obj)) return new string(obj);
1229                 return new array(obj);
1230         };
1231
1232         var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
1233
1234         var forOf = function (iterable, cb /*, thisArg*/) {
1235                 var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
1236                 if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
1237                 else if (isString(iterable)) mode = "string";
1238                 else iterable = get(iterable);
1239
1240                 validCallable(cb);
1241                 doBreak = function () {
1242                         broken = true;
1243                 };
1244                 if (mode === "array") {
1245                         some.call(iterable, function (value) {
1246                                 call$3.call(cb, thisArg, value, doBreak);
1247                                 return broken;
1248                         });
1249                         return;
1250                 }
1251                 if (mode === "string") {
1252                         length = iterable.length;
1253                         for (i = 0; i < length; ++i) {
1254                                 char = iterable[i];
1255                                 if (i + 1 < length) {
1256                                         code = char.charCodeAt(0);
1257                                         if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
1258                                 }
1259                                 call$3.call(cb, thisArg, char, doBreak);
1260                                 if (broken) break;
1261                         }
1262                         return;
1263                 }
1264                 result = iterable.next();
1265
1266                 while (!result.done) {
1267                         call$3.call(cb, thisArg, result.value, doBreak);
1268                         if (broken) return;
1269                         result = iterable.next();
1270                 }
1271         };
1272
1273         var iterator = createCommonjsModule(function (module) {
1274
1275         var toStringTagSymbol = es6Symbol.toStringTag
1276
1277           , defineProperty = Object.defineProperty
1278           , SetIterator;
1279
1280         SetIterator = module.exports = function (set, kind) {
1281                 if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
1282                 es6Iterator.call(this, set.__setData__, set);
1283                 if (!kind) kind = 'value';
1284                 else if (contains.call(kind, 'key+value')) kind = 'key+value';
1285                 else kind = 'value';
1286                 defineProperty(this, '__kind__', d_1('', kind));
1287         };
1288         if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
1289
1290         SetIterator.prototype = Object.create(es6Iterator.prototype, {
1291                 constructor: d_1(SetIterator),
1292                 _resolve: d_1(function (i) {
1293                         if (this.__kind__ === 'value') return this.__list__[i];
1294                         return [this.__list__[i], this.__list__[i]];
1295                 }),
1296                 toString: d_1(function () { return '[object Set Iterator]'; })
1297         });
1298         defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
1299         });
1300
1301         // Exports true if environment provides native `Set` implementation,
1302
1303         var isNativeImplemented = (function () {
1304                 if (typeof Set === 'undefined') return false;
1305                 return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
1306         }());
1307
1308         var iterator$1       = validIterable
1309
1310           , call$4 = Function.prototype.call
1311           , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
1312           , SetPoly, getValues, NativeSet;
1313
1314         if (isNativeImplemented) NativeSet = Set;
1315
1316         var polyfill$1 = SetPoly = function Set(/*iterable*/) {
1317                 var iterable = arguments[0], self;
1318                 if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
1319                 if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
1320                 else self = this;
1321                 if (iterable != null) iterator$1(iterable);
1322                 defineProperty$5(self, '__setData__', d_1('c', []));
1323                 if (!iterable) return self;
1324                 forOf(iterable, function (value) {
1325                         if (eIndexOf.call(this, value) !== -1) return;
1326                         this.push(value);
1327                 }, self.__setData__);
1328                 return self;
1329         };
1330
1331         if (isNativeImplemented) {
1332                 if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
1333                 SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
1334         }
1335
1336         eventEmitter(Object.defineProperties(SetPoly.prototype, {
1337                 add: d_1(function (value) {
1338                         if (this.has(value)) return this;
1339                         this.emit('_add', this.__setData__.push(value) - 1, value);
1340                         return this;
1341                 }),
1342                 clear: d_1(function () {
1343                         if (!this.__setData__.length) return;
1344                         clear.call(this.__setData__);
1345                         this.emit('_clear');
1346                 }),
1347                 delete: d_1(function (value) {
1348                         var index = eIndexOf.call(this.__setData__, value);
1349                         if (index === -1) return false;
1350                         this.__setData__.splice(index, 1);
1351                         this.emit('_delete', index, value);
1352                         return true;
1353                 }),
1354                 entries: d_1(function () { return new iterator(this, 'key+value'); }),
1355                 forEach: d_1(function (cb/*, thisArg*/) {
1356                         var thisArg = arguments[1], iterator, result, value;
1357                         validCallable(cb);
1358                         iterator = this.values();
1359                         result = iterator._next();
1360                         while (result !== undefined) {
1361                                 value = iterator._resolve(result);
1362                                 call$4.call(cb, thisArg, value, value, this);
1363                                 result = iterator._next();
1364                         }
1365                 }),
1366                 has: d_1(function (value) {
1367                         return (eIndexOf.call(this.__setData__, value) !== -1);
1368                 }),
1369                 keys: d_1(getValues = function () { return this.values(); }),
1370                 size: d_1.gs(function () { return this.__setData__.length; }),
1371                 values: d_1(function () { return new iterator(this); }),
1372                 toString: d_1(function () { return '[object Set]'; })
1373         }));
1374         defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
1375         defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
1376
1377         var es6Set = isImplemented() ? Set : polyfill$1;
1378
1379         var isImplemented$9 = function () {
1380                 var map, iterator, result;
1381                 if (typeof Map !== 'function') return false;
1382                 try {
1383                         // WebKit doesn't support arguments and crashes
1384                         map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
1385                 } catch (e) {
1386                         return false;
1387                 }
1388                 if (String(map) !== '[object Map]') return false;
1389                 if (map.size !== 3) return false;
1390                 if (typeof map.clear !== 'function') return false;
1391                 if (typeof map.delete !== 'function') return false;
1392                 if (typeof map.entries !== 'function') return false;
1393                 if (typeof map.forEach !== 'function') return false;
1394                 if (typeof map.get !== 'function') return false;
1395                 if (typeof map.has !== 'function') return false;
1396                 if (typeof map.keys !== 'function') return false;
1397                 if (typeof map.set !== 'function') return false;
1398                 if (typeof map.values !== 'function') return false;
1399
1400                 iterator = map.entries();
1401                 result = iterator.next();
1402                 if (result.done !== false) return false;
1403                 if (!result.value) return false;
1404                 if (result.value[0] !== 'raz') return false;
1405                 if (result.value[1] !== 'one') return false;
1406
1407                 return true;
1408         };
1409
1410         var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
1411
1412         // eslint-disable-next-line no-unused-vars
1413         var primitiveSet = function (arg /*, …args*/) {
1414                 var set = create$4(null);
1415                 forEach$2.call(arguments, function (name) {
1416                         set[name] = true;
1417                 });
1418                 return set;
1419         };
1420
1421         var iteratorKinds = primitiveSet('key',
1422                 'value', 'key+value');
1423
1424         var iterator$2 = createCommonjsModule(function (module) {
1425
1426         var toStringTagSymbol = es6Symbol.toStringTag
1427
1428           , defineProperties = Object.defineProperties
1429           , unBind = es6Iterator.prototype._unBind
1430           , MapIterator;
1431
1432         MapIterator = module.exports = function (map, kind) {
1433                 if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
1434                 es6Iterator.call(this, map.__mapKeysData__, map);
1435                 if (!kind || !iteratorKinds[kind]) kind = 'key+value';
1436                 defineProperties(this, {
1437                         __kind__: d_1('', kind),
1438                         __values__: d_1('w', map.__mapValuesData__)
1439                 });
1440         };
1441         if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
1442
1443         MapIterator.prototype = Object.create(es6Iterator.prototype, {
1444                 constructor: d_1(MapIterator),
1445                 _resolve: d_1(function (i) {
1446                         if (this.__kind__ === 'value') return this.__values__[i];
1447                         if (this.__kind__ === 'key') return this.__list__[i];
1448                         return [this.__list__[i], this.__values__[i]];
1449                 }),
1450                 _unBind: d_1(function () {
1451                         this.__values__ = null;
1452                         unBind.call(this);
1453                 }),
1454                 toString: d_1(function () { return '[object Map Iterator]'; })
1455         });
1456         Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
1457                 d_1('c', 'Map Iterator'));
1458         });
1459
1460         // Exports true if environment provides native `Map` implementation,
1461
1462         var isNativeImplemented$1 = (function () {
1463                 if (typeof Map === 'undefined') return false;
1464                 return (Object.prototype.toString.call(new Map()) === '[object Map]');
1465         }());
1466
1467         var iterator$3       = validIterable
1468
1469           , call$5 = Function.prototype.call
1470           , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
1471           , MapPoly;
1472
1473         var polyfill$2 = MapPoly = function (/*iterable*/) {
1474                 var iterable = arguments[0], keys, values, self;
1475                 if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
1476                 if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
1477                         self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
1478                 } else {
1479                         self = this;
1480                 }
1481                 if (iterable != null) iterator$3(iterable);
1482                 defineProperties$2(self, {
1483                         __mapKeysData__: d_1('c', keys = []),
1484                         __mapValuesData__: d_1('c', values = [])
1485                 });
1486                 if (!iterable) return self;
1487                 forOf(iterable, function (value) {
1488                         var key = validValue(value)[0];
1489                         value = value[1];
1490                         if (eIndexOf.call(keys, key) !== -1) return;
1491                         keys.push(key);
1492                         values.push(value);
1493                 }, self);
1494                 return self;
1495         };
1496
1497         if (isNativeImplemented$1) {
1498                 if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
1499                 MapPoly.prototype = Object.create(Map.prototype, {
1500                         constructor: d_1(MapPoly)
1501                 });
1502         }
1503
1504         eventEmitter(defineProperties$2(MapPoly.prototype, {
1505                 clear: d_1(function () {
1506                         if (!this.__mapKeysData__.length) return;
1507                         clear.call(this.__mapKeysData__);
1508                         clear.call(this.__mapValuesData__);
1509                         this.emit('_clear');
1510                 }),
1511                 delete: d_1(function (key) {
1512                         var index = eIndexOf.call(this.__mapKeysData__, key);
1513                         if (index === -1) return false;
1514                         this.__mapKeysData__.splice(index, 1);
1515                         this.__mapValuesData__.splice(index, 1);
1516                         this.emit('_delete', index, key);
1517                         return true;
1518                 }),
1519                 entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
1520                 forEach: d_1(function (cb/*, thisArg*/) {
1521                         var thisArg = arguments[1], iterator, result;
1522                         validCallable(cb);
1523                         iterator = this.entries();
1524                         result = iterator._next();
1525                         while (result !== undefined) {
1526                                 call$5.call(cb, thisArg, this.__mapValuesData__[result],
1527                                         this.__mapKeysData__[result], this);
1528                                 result = iterator._next();
1529                         }
1530                 }),
1531                 get: d_1(function (key) {
1532                         var index = eIndexOf.call(this.__mapKeysData__, key);
1533                         if (index === -1) return;
1534                         return this.__mapValuesData__[index];
1535                 }),
1536                 has: d_1(function (key) {
1537                         return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
1538                 }),
1539                 keys: d_1(function () { return new iterator$2(this, 'key'); }),
1540                 set: d_1(function (key, value) {
1541                         var index = eIndexOf.call(this.__mapKeysData__, key), emit;
1542                         if (index === -1) {
1543                                 index = this.__mapKeysData__.push(key) - 1;
1544                                 emit = true;
1545                         }
1546                         this.__mapValuesData__[index] = value;
1547                         if (emit) this.emit('_add', index, key);
1548                         return this;
1549                 }),
1550                 size: d_1.gs(function () { return this.__mapKeysData__.length; }),
1551                 values: d_1(function () { return new iterator$2(this, 'value'); }),
1552                 toString: d_1(function () { return '[object Map]'; })
1553         }));
1554         Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
1555                 return this.entries();
1556         }));
1557         Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
1558
1559         var es6Map = isImplemented$9() ? Map : polyfill$2;
1560
1561         var toStr = Object.prototype.toString;
1562
1563         var isArguments$1 = function isArguments(value) {
1564                 var str = toStr.call(value);
1565                 var isArgs = str === '[object Arguments]';
1566                 if (!isArgs) {
1567                         isArgs = str !== '[object Array]' &&
1568                                 value !== null &&
1569                                 typeof value === 'object' &&
1570                                 typeof value.length === 'number' &&
1571                                 value.length >= 0 &&
1572                                 toStr.call(value.callee) === '[object Function]';
1573                 }
1574                 return isArgs;
1575         };
1576
1577         var keysShim;
1578         if (!Object.keys) {
1579                 // modified from https://github.com/es-shims/es5-shim
1580                 var has = Object.prototype.hasOwnProperty;
1581                 var toStr$1 = Object.prototype.toString;
1582                 var isArgs = isArguments$1; // eslint-disable-line global-require
1583                 var isEnumerable = Object.prototype.propertyIsEnumerable;
1584                 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
1585                 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
1586                 var dontEnums = [
1587                         'toString',
1588                         'toLocaleString',
1589                         'valueOf',
1590                         'hasOwnProperty',
1591                         'isPrototypeOf',
1592                         'propertyIsEnumerable',
1593                         'constructor'
1594                 ];
1595                 var equalsConstructorPrototype = function (o) {
1596                         var ctor = o.constructor;
1597                         return ctor && ctor.prototype === o;
1598                 };
1599                 var excludedKeys = {
1600                         $applicationCache: true,
1601                         $console: true,
1602                         $external: true,
1603                         $frame: true,
1604                         $frameElement: true,
1605                         $frames: true,
1606                         $innerHeight: true,
1607                         $innerWidth: true,
1608                         $onmozfullscreenchange: true,
1609                         $onmozfullscreenerror: true,
1610                         $outerHeight: true,
1611                         $outerWidth: true,
1612                         $pageXOffset: true,
1613                         $pageYOffset: true,
1614                         $parent: true,
1615                         $scrollLeft: true,
1616                         $scrollTop: true,
1617                         $scrollX: true,
1618                         $scrollY: true,
1619                         $self: true,
1620                         $webkitIndexedDB: true,
1621                         $webkitStorageInfo: true,
1622                         $window: true
1623                 };
1624                 var hasAutomationEqualityBug = (function () {
1625                         /* global window */
1626                         if (typeof window === 'undefined') { return false; }
1627                         for (var k in window) {
1628                                 try {
1629                                         if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
1630                                                 try {
1631                                                         equalsConstructorPrototype(window[k]);
1632                                                 } catch (e) {
1633                                                         return true;
1634                                                 }
1635                                         }
1636                                 } catch (e) {
1637                                         return true;
1638                                 }
1639                         }
1640                         return false;
1641                 }());
1642                 var equalsConstructorPrototypeIfNotBuggy = function (o) {
1643                         /* global window */
1644                         if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1645                                 return equalsConstructorPrototype(o);
1646                         }
1647                         try {
1648                                 return equalsConstructorPrototype(o);
1649                         } catch (e) {
1650                                 return false;
1651                         }
1652                 };
1653
1654                 keysShim = function keys(object) {
1655                         var isObject = object !== null && typeof object === 'object';
1656                         var isFunction = toStr$1.call(object) === '[object Function]';
1657                         var isArguments = isArgs(object);
1658                         var isString = isObject && toStr$1.call(object) === '[object String]';
1659                         var theKeys = [];
1660
1661                         if (!isObject && !isFunction && !isArguments) {
1662                                 throw new TypeError('Object.keys called on a non-object');
1663                         }
1664
1665                         var skipProto = hasProtoEnumBug && isFunction;
1666                         if (isString && object.length > 0 && !has.call(object, 0)) {
1667                                 for (var i = 0; i < object.length; ++i) {
1668                                         theKeys.push(String(i));
1669                                 }
1670                         }
1671
1672                         if (isArguments && object.length > 0) {
1673                                 for (var j = 0; j < object.length; ++j) {
1674                                         theKeys.push(String(j));
1675                                 }
1676                         } else {
1677                                 for (var name in object) {
1678                                         if (!(skipProto && name === 'prototype') && has.call(object, name)) {
1679                                                 theKeys.push(String(name));
1680                                         }
1681                                 }
1682                         }
1683
1684                         if (hasDontEnumBug) {
1685                                 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1686
1687                                 for (var k = 0; k < dontEnums.length; ++k) {
1688                                         if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
1689                                                 theKeys.push(dontEnums[k]);
1690                                         }
1691                                 }
1692                         }
1693                         return theKeys;
1694                 };
1695         }
1696         var implementation = keysShim;
1697
1698         var slice = Array.prototype.slice;
1699
1700
1701         var origKeys = Object.keys;
1702         var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
1703
1704         var originalKeys = Object.keys;
1705
1706         keysShim$1.shim = function shimObjectKeys() {
1707                 if (Object.keys) {
1708                         var keysWorksWithArguments = (function () {
1709                                 // Safari 5.0 bug
1710                                 var args = Object.keys(arguments);
1711                                 return args && args.length === arguments.length;
1712                         }(1, 2));
1713                         if (!keysWorksWithArguments) {
1714                                 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
1715                                         if (isArguments$1(object)) {
1716                                                 return originalKeys(slice.call(object));
1717                                         }
1718                                         return originalKeys(object);
1719                                 };
1720                         }
1721                 } else {
1722                         Object.keys = keysShim$1;
1723                 }
1724                 return Object.keys || keysShim$1;
1725         };
1726
1727         var objectKeys = keysShim$1;
1728
1729         var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1730
1731         var toStr$2 = Object.prototype.toString;
1732         var concat = Array.prototype.concat;
1733         var origDefineProperty = Object.defineProperty;
1734
1735         var isFunction$1 = function (fn) {
1736                 return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
1737         };
1738
1739         var arePropertyDescriptorsSupported = function () {
1740                 var obj = {};
1741                 try {
1742                         origDefineProperty(obj, 'x', { enumerable: false, value: obj });
1743                         // eslint-disable-next-line no-unused-vars, no-restricted-syntax
1744                         for (var _ in obj) { // jscs:ignore disallowUnusedVariables
1745                                 return false;
1746                         }
1747                         return obj.x === obj;
1748                 } catch (e) { /* this is IE 8. */
1749                         return false;
1750                 }
1751         };
1752         var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
1753
1754         var defineProperty$6 = function (object, name, value, predicate) {
1755                 if (name in object && (!isFunction$1(predicate) || !predicate())) {
1756                         return;
1757                 }
1758                 if (supportsDescriptors) {
1759                         origDefineProperty(object, name, {
1760                                 configurable: true,
1761                                 enumerable: false,
1762                                 value: value,
1763                                 writable: true
1764                         });
1765                 } else {
1766                         object[name] = value;
1767                 }
1768         };
1769
1770         var defineProperties$3 = function (object, map) {
1771                 var predicates = arguments.length > 2 ? arguments[2] : {};
1772                 var props = objectKeys(map);
1773                 if (hasSymbols) {
1774                         props = concat.call(props, Object.getOwnPropertySymbols(map));
1775                 }
1776                 for (var i = 0; i < props.length; i += 1) {
1777                         defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
1778                 }
1779         };
1780
1781         defineProperties$3.supportsDescriptors = !!supportsDescriptors;
1782
1783         var defineProperties_1 = defineProperties$3;
1784
1785         /* eslint no-invalid-this: 1 */
1786
1787         var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
1788         var slice$1 = Array.prototype.slice;
1789         var toStr$3 = Object.prototype.toString;
1790         var funcType = '[object Function]';
1791
1792         var implementation$1 = function bind(that) {
1793             var target = this;
1794             if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
1795                 throw new TypeError(ERROR_MESSAGE + target);
1796             }
1797             var args = slice$1.call(arguments, 1);
1798
1799             var bound;
1800             var binder = function () {
1801                 if (this instanceof bound) {
1802                     var result = target.apply(
1803                         this,
1804                         args.concat(slice$1.call(arguments))
1805                     );
1806                     if (Object(result) === result) {
1807                         return result;
1808                     }
1809                     return this;
1810                 } else {
1811                     return target.apply(
1812                         that,
1813                         args.concat(slice$1.call(arguments))
1814                     );
1815                 }
1816             };
1817
1818             var boundLength = Math.max(0, target.length - args.length);
1819             var boundArgs = [];
1820             for (var i = 0; i < boundLength; i++) {
1821                 boundArgs.push('$' + i);
1822             }
1823
1824             bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
1825
1826             if (target.prototype) {
1827                 var Empty = function Empty() {};
1828                 Empty.prototype = target.prototype;
1829                 bound.prototype = new Empty();
1830                 Empty.prototype = null;
1831             }
1832
1833             return bound;
1834         };
1835
1836         var functionBind = Function.prototype.bind || implementation$1;
1837
1838         var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
1839
1840         var isPrimitive = function isPrimitive(value) {
1841                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
1842         };
1843
1844         var fnToStr = Function.prototype.toString;
1845
1846         var constructorRegex = /^\s*class\b/;
1847         var isES6ClassFn = function isES6ClassFunction(value) {
1848                 try {
1849                         var fnStr = fnToStr.call(value);
1850                         return constructorRegex.test(fnStr);
1851                 } catch (e) {
1852                         return false; // not a function
1853                 }
1854         };
1855
1856         var tryFunctionObject = function tryFunctionToStr(value) {
1857                 try {
1858                         if (isES6ClassFn(value)) { return false; }
1859                         fnToStr.call(value);
1860                         return true;
1861                 } catch (e) {
1862                         return false;
1863                 }
1864         };
1865         var toStr$4 = Object.prototype.toString;
1866         var fnClass = '[object Function]';
1867         var genClass = '[object GeneratorFunction]';
1868         var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1869
1870         var isCallable = function isCallable(value) {
1871                 if (!value) { return false; }
1872                 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
1873                 if (typeof value === 'function' && !value.prototype) { return true; }
1874                 if (hasToStringTag) { return tryFunctionObject(value); }
1875                 if (isES6ClassFn(value)) { return false; }
1876                 var strClass = toStr$4.call(value);
1877                 return strClass === fnClass || strClass === genClass;
1878         };
1879
1880         var getDay = Date.prototype.getDay;
1881         var tryDateObject = function tryDateObject(value) {
1882                 try {
1883                         getDay.call(value);
1884                         return true;
1885                 } catch (e) {
1886                         return false;
1887                 }
1888         };
1889
1890         var toStr$5 = Object.prototype.toString;
1891         var dateClass = '[object Date]';
1892         var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1893
1894         var isDateObject = function isDateObject(value) {
1895                 if (typeof value !== 'object' || value === null) { return false; }
1896                 return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
1897         };
1898
1899         /* eslint complexity: [2, 17], max-statements: [2, 33] */
1900         var shams = function hasSymbols() {
1901                 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
1902                 if (typeof Symbol.iterator === 'symbol') { return true; }
1903
1904                 var obj = {};
1905                 var sym = Symbol('test');
1906                 var symObj = Object(sym);
1907                 if (typeof sym === 'string') { return false; }
1908
1909                 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
1910                 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
1911
1912                 // temp disabled per https://github.com/ljharb/object.assign/issues/17
1913                 // if (sym instanceof Symbol) { return false; }
1914                 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
1915                 // if (!(symObj instanceof Symbol)) { return false; }
1916
1917                 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
1918                 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
1919
1920                 var symVal = 42;
1921                 obj[sym] = symVal;
1922                 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
1923                 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
1924
1925                 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
1926
1927                 var syms = Object.getOwnPropertySymbols(obj);
1928                 if (syms.length !== 1 || syms[0] !== sym) { return false; }
1929
1930                 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
1931
1932                 if (typeof Object.getOwnPropertyDescriptor === 'function') {
1933                         var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
1934                         if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
1935                 }
1936
1937                 return true;
1938         };
1939
1940         var origSymbol = commonjsGlobal.Symbol;
1941
1942
1943         var hasSymbols$1 = function hasNativeSymbols() {
1944                 if (typeof origSymbol !== 'function') { return false; }
1945                 if (typeof Symbol !== 'function') { return false; }
1946                 if (typeof origSymbol('foo') !== 'symbol') { return false; }
1947                 if (typeof Symbol('bar') !== 'symbol') { return false; }
1948
1949                 return shams();
1950         };
1951
1952         var isSymbol$1 = createCommonjsModule(function (module) {
1953
1954         var toStr = Object.prototype.toString;
1955         var hasSymbols = hasSymbols$1();
1956
1957         if (hasSymbols) {
1958                 var symToStr = Symbol.prototype.toString;
1959                 var symStringRegex = /^Symbol\(.*\)$/;
1960                 var isSymbolObject = function isRealSymbolObject(value) {
1961                         if (typeof value.valueOf() !== 'symbol') {
1962                                 return false;
1963                         }
1964                         return symStringRegex.test(symToStr.call(value));
1965                 };
1966
1967                 module.exports = function isSymbol(value) {
1968                         if (typeof value === 'symbol') {
1969                                 return true;
1970                         }
1971                         if (toStr.call(value) !== '[object Symbol]') {
1972                                 return false;
1973                         }
1974                         try {
1975                                 return isSymbolObject(value);
1976                         } catch (e) {
1977                                 return false;
1978                         }
1979                 };
1980         } else {
1981
1982                 module.exports = function isSymbol(value) {
1983                         // this environment does not support Symbols.
1984                         return false ;
1985                 };
1986         }
1987         });
1988
1989         var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1990
1991
1992
1993
1994
1995
1996         var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
1997                 if (typeof O === 'undefined' || O === null) {
1998                         throw new TypeError('Cannot call method on ' + O);
1999                 }
2000                 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
2001                         throw new TypeError('hint must be "string" or "number"');
2002                 }
2003                 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2004                 var method, result, i;
2005                 for (i = 0; i < methodNames.length; ++i) {
2006                         method = O[methodNames[i]];
2007                         if (isCallable(method)) {
2008                                 result = method.call(O);
2009                                 if (isPrimitive(result)) {
2010                                         return result;
2011                                 }
2012                         }
2013                 }
2014                 throw new TypeError('No default value');
2015         };
2016
2017         var GetMethod = function GetMethod(O, P) {
2018                 var func = O[P];
2019                 if (func !== null && typeof func !== 'undefined') {
2020                         if (!isCallable(func)) {
2021                                 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
2022                         }
2023                         return func;
2024                 }
2025                 return void 0;
2026         };
2027
2028         // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
2029         var es2015 = function ToPrimitive(input) {
2030                 if (isPrimitive(input)) {
2031                         return input;
2032                 }
2033                 var hint = 'default';
2034                 if (arguments.length > 1) {
2035                         if (arguments[1] === String) {
2036                                 hint = 'string';
2037                         } else if (arguments[1] === Number) {
2038                                 hint = 'number';
2039                         }
2040                 }
2041
2042                 var exoticToPrim;
2043                 if (hasSymbols$2) {
2044                         if (Symbol.toPrimitive) {
2045                                 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
2046                         } else if (isSymbol$1(input)) {
2047                                 exoticToPrim = Symbol.prototype.valueOf;
2048                         }
2049                 }
2050                 if (typeof exoticToPrim !== 'undefined') {
2051                         var result = exoticToPrim.call(input, hint);
2052                         if (isPrimitive(result)) {
2053                                 return result;
2054                         }
2055                         throw new TypeError('unable to convert exotic object to primitive');
2056                 }
2057                 if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
2058                         hint = 'string';
2059                 }
2060                 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
2061         };
2062
2063         var es6 = es2015;
2064
2065         /* globals
2066                 Set,
2067                 Map,
2068                 WeakSet,
2069                 WeakMap,
2070
2071                 Promise,
2072
2073                 Symbol,
2074                 Proxy,
2075
2076                 Atomics,
2077                 SharedArrayBuffer,
2078
2079                 ArrayBuffer,
2080                 DataView,
2081                 Uint8Array,
2082                 Float32Array,
2083                 Float64Array,
2084                 Int8Array,
2085                 Int16Array,
2086                 Int32Array,
2087                 Uint8ClampedArray,
2088                 Uint16Array,
2089                 Uint32Array,
2090         */
2091
2092         var undefined$1; // eslint-disable-line no-shadow-restricted-names
2093
2094         var ThrowTypeError = Object.getOwnPropertyDescriptor
2095                 ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
2096                 : function () { throw new TypeError(); };
2097
2098         var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
2099
2100         var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
2101         var generatorFunction =  undefined$1;
2102         var asyncFunction =  undefined$1;
2103         var asyncGenFunction =  undefined$1;
2104
2105         var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
2106
2107         var INTRINSICS = {
2108                 '$ %Array%': Array,
2109                 '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
2110                 '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
2111                 '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
2112                 '$ %ArrayPrototype%': Array.prototype,
2113                 '$ %ArrayProto_entries%': Array.prototype.entries,
2114                 '$ %ArrayProto_forEach%': Array.prototype.forEach,
2115                 '$ %ArrayProto_keys%': Array.prototype.keys,
2116                 '$ %ArrayProto_values%': Array.prototype.values,
2117                 '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
2118                 '$ %AsyncFunction%': asyncFunction,
2119                 '$ %AsyncFunctionPrototype%':  undefined$1,
2120                 '$ %AsyncGenerator%':  undefined$1,
2121                 '$ %AsyncGeneratorFunction%': asyncGenFunction,
2122                 '$ %AsyncGeneratorPrototype%':  undefined$1,
2123                 '$ %AsyncIteratorPrototype%':  undefined$1,
2124                 '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
2125                 '$ %Boolean%': Boolean,
2126                 '$ %BooleanPrototype%': Boolean.prototype,
2127                 '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
2128                 '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
2129                 '$ %Date%': Date,
2130                 '$ %DatePrototype%': Date.prototype,
2131                 '$ %decodeURI%': decodeURI,
2132                 '$ %decodeURIComponent%': decodeURIComponent,
2133                 '$ %encodeURI%': encodeURI,
2134                 '$ %encodeURIComponent%': encodeURIComponent,
2135                 '$ %Error%': Error,
2136                 '$ %ErrorPrototype%': Error.prototype,
2137                 '$ %eval%': eval, // eslint-disable-line no-eval
2138                 '$ %EvalError%': EvalError,
2139                 '$ %EvalErrorPrototype%': EvalError.prototype,
2140                 '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
2141                 '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
2142                 '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
2143                 '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
2144                 '$ %Function%': Function,
2145                 '$ %FunctionPrototype%': Function.prototype,
2146                 '$ %Generator%':  undefined$1,
2147                 '$ %GeneratorFunction%': generatorFunction,
2148                 '$ %GeneratorPrototype%':  undefined$1,
2149                 '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
2150                 '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2151                 '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
2152                 '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2153                 '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
2154                 '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
2155                 '$ %isFinite%': isFinite,
2156                 '$ %isNaN%': isNaN,
2157                 '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
2158                 '$ %JSON%': JSON,
2159                 '$ %JSONParse%': JSON.parse,
2160                 '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
2161                 '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
2162                 '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
2163                 '$ %Math%': Math,
2164                 '$ %Number%': Number,
2165                 '$ %NumberPrototype%': Number.prototype,
2166                 '$ %Object%': Object,
2167                 '$ %ObjectPrototype%': Object.prototype,
2168                 '$ %ObjProto_toString%': Object.prototype.toString,
2169                 '$ %ObjProto_valueOf%': Object.prototype.valueOf,
2170                 '$ %parseFloat%': parseFloat,
2171                 '$ %parseInt%': parseInt,
2172                 '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
2173                 '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
2174                 '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
2175                 '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
2176                 '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
2177                 '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
2178                 '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
2179                 '$ %RangeError%': RangeError,
2180                 '$ %RangeErrorPrototype%': RangeError.prototype,
2181                 '$ %ReferenceError%': ReferenceError,
2182                 '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
2183                 '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
2184                 '$ %RegExp%': RegExp,
2185                 '$ %RegExpPrototype%': RegExp.prototype,
2186                 '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
2187                 '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
2188                 '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
2189                 '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
2190                 '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
2191                 '$ %String%': String,
2192                 '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
2193                 '$ %StringPrototype%': String.prototype,
2194                 '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
2195                 '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,
2196                 '$ %SyntaxError%': SyntaxError,
2197                 '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
2198                 '$ %ThrowTypeError%': ThrowTypeError,
2199                 '$ %TypedArray%': TypedArray,
2200                 '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1,
2201                 '$ %TypeError%': TypeError,
2202                 '$ %TypeErrorPrototype%': TypeError.prototype,
2203                 '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array,
2204                 '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype,
2205                 '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray,
2206                 '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype,
2207                 '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array,
2208                 '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype,
2209                 '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array,
2210                 '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype,
2211                 '$ %URIError%': URIError,
2212                 '$ %URIErrorPrototype%': URIError.prototype,
2213                 '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap,
2214                 '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype,
2215                 '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet,
2216                 '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype
2217         };
2218
2219         var GetIntrinsic = function GetIntrinsic(name, allowMissing) {
2220                 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2221                         throw new TypeError('"allowMissing" argument must be a boolean');
2222                 }
2223
2224                 var key = '$ ' + name;
2225                 if (!(key in INTRINSICS)) {
2226                         throw new SyntaxError('intrinsic ' + name + ' does not exist!');
2227                 }
2228
2229                 // istanbul ignore if // hopefully this is impossible to test :-)
2230                 if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
2231                         throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2232                 }
2233                 return INTRINSICS[key];
2234         };
2235
2236         var $TypeError = GetIntrinsic('%TypeError%');
2237         var $SyntaxError = GetIntrinsic('%SyntaxError%');
2238
2239
2240
2241         var predicates = {
2242           // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2243           'Property Descriptor': function isPropertyDescriptor(ES, Desc) {
2244             if (ES.Type(Desc) !== 'Object') {
2245               return false;
2246             }
2247             var allowed = {
2248               '[[Configurable]]': true,
2249               '[[Enumerable]]': true,
2250               '[[Get]]': true,
2251               '[[Set]]': true,
2252               '[[Value]]': true,
2253               '[[Writable]]': true
2254             };
2255
2256             for (var key in Desc) { // eslint-disable-line
2257               if (src(Desc, key) && !allowed[key]) {
2258                 return false;
2259               }
2260             }
2261
2262             var isData = src(Desc, '[[Value]]');
2263             var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2264             if (isData && IsAccessor) {
2265               throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
2266             }
2267             return true;
2268           }
2269         };
2270
2271         var assertRecord = function assertRecord(ES, recordType, argumentName, value) {
2272           var predicate = predicates[recordType];
2273           if (typeof predicate !== 'function') {
2274             throw new $SyntaxError('unknown record type: ' + recordType);
2275           }
2276           if (!predicate(ES, value)) {
2277             throw new $TypeError(argumentName + ' must be a ' + recordType);
2278           }
2279           console.log(predicate(ES, value), value);
2280         };
2281
2282         var _isNaN = Number.isNaN || function isNaN(a) {
2283                 return a !== a;
2284         };
2285
2286         var $isNaN = Number.isNaN || function (a) { return a !== a; };
2287
2288         var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
2289
2290         var has$1 = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
2291
2292         var $assign = Object.assign;
2293
2294         var assign$1 = function assign(target, source) {
2295                 if ($assign) {
2296                         return $assign(target, source);
2297                 }
2298
2299                 for (var key in source) {
2300                         if (has$1(source, key)) {
2301                                 target[key] = source[key];
2302                         }
2303                 }
2304                 return target;
2305         };
2306
2307         var sign$1 = function sign(number) {
2308                 return number >= 0 ? 1 : -1;
2309         };
2310
2311         var mod = function mod(number, modulo) {
2312                 var remain = number % modulo;
2313                 return Math.floor(remain >= 0 ? remain : remain + modulo);
2314         };
2315
2316         var isPrimitive$1 = function isPrimitive(value) {
2317                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2318         };
2319
2320         var toStr$6 = Object.prototype.toString;
2321
2322
2323
2324
2325
2326         // http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
2327         var ES5internalSlots = {
2328                 '[[DefaultValue]]': function (O) {
2329                         var actualHint;
2330                         if (arguments.length > 1) {
2331                                 actualHint = arguments[1];
2332                         } else {
2333                                 actualHint = toStr$6.call(O) === '[object Date]' ? String : Number;
2334                         }
2335
2336                         if (actualHint === String || actualHint === Number) {
2337                                 var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2338                                 var value, i;
2339                                 for (i = 0; i < methods.length; ++i) {
2340                                         if (isCallable(O[methods[i]])) {
2341                                                 value = O[methods[i]]();
2342                                                 if (isPrimitive(value)) {
2343                                                         return value;
2344                                                 }
2345                                         }
2346                                 }
2347                                 throw new TypeError('No default value');
2348                         }
2349                         throw new TypeError('invalid [[DefaultValue]] hint supplied');
2350                 }
2351         };
2352
2353         // http://ecma-international.org/ecma-262/5.1/#sec-9.1
2354         var es5 = function ToPrimitive(input) {
2355                 if (isPrimitive(input)) {
2356                         return input;
2357                 }
2358                 if (arguments.length > 1) {
2359                         return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
2360                 }
2361                 return ES5internalSlots['[[DefaultValue]]'](input);
2362         };
2363
2364         var $Object = GetIntrinsic('%Object%');
2365         var $TypeError$1 = GetIntrinsic('%TypeError%');
2366         var $String = GetIntrinsic('%String%');
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380         // https://es5.github.io/#x9
2381         var ES5 = {
2382                 ToPrimitive: es5,
2383
2384                 ToBoolean: function ToBoolean(value) {
2385                         return !!value;
2386                 },
2387                 ToNumber: function ToNumber(value) {
2388                         return +value; // eslint-disable-line no-implicit-coercion
2389                 },
2390                 ToInteger: function ToInteger(value) {
2391                         var number = this.ToNumber(value);
2392                         if (_isNaN(number)) { return 0; }
2393                         if (number === 0 || !_isFinite(number)) { return number; }
2394                         return sign$1(number) * Math.floor(Math.abs(number));
2395                 },
2396                 ToInt32: function ToInt32(x) {
2397                         return this.ToNumber(x) >> 0;
2398                 },
2399                 ToUint32: function ToUint32(x) {
2400                         return this.ToNumber(x) >>> 0;
2401                 },
2402                 ToUint16: function ToUint16(value) {
2403                         var number = this.ToNumber(value);
2404                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2405                         var posInt = sign$1(number) * Math.floor(Math.abs(number));
2406                         return mod(posInt, 0x10000);
2407                 },
2408                 ToString: function ToString(value) {
2409                         return $String(value);
2410                 },
2411                 ToObject: function ToObject(value) {
2412                         this.CheckObjectCoercible(value);
2413                         return $Object(value);
2414                 },
2415                 CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
2416                         /* jshint eqnull:true */
2417                         if (value == null) {
2418                                 throw new $TypeError$1(optMessage || 'Cannot call method on ' + value);
2419                         }
2420                         return value;
2421                 },
2422                 IsCallable: isCallable,
2423                 SameValue: function SameValue(x, y) {
2424                         if (x === y) { // 0 === -0, but they are not identical.
2425                                 if (x === 0) { return 1 / x === 1 / y; }
2426                                 return true;
2427                         }
2428                         return _isNaN(x) && _isNaN(y);
2429                 },
2430
2431                 // https://www.ecma-international.org/ecma-262/5.1/#sec-8
2432                 Type: function Type(x) {
2433                         if (x === null) {
2434                                 return 'Null';
2435                         }
2436                         if (typeof x === 'undefined') {
2437                                 return 'Undefined';
2438                         }
2439                         if (typeof x === 'function' || typeof x === 'object') {
2440                                 return 'Object';
2441                         }
2442                         if (typeof x === 'number') {
2443                                 return 'Number';
2444                         }
2445                         if (typeof x === 'boolean') {
2446                                 return 'Boolean';
2447                         }
2448                         if (typeof x === 'string') {
2449                                 return 'String';
2450                         }
2451                 },
2452
2453                 // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2454                 IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
2455                         if (this.Type(Desc) !== 'Object') {
2456                                 return false;
2457                         }
2458                         var allowed = {
2459                                 '[[Configurable]]': true,
2460                                 '[[Enumerable]]': true,
2461                                 '[[Get]]': true,
2462                                 '[[Set]]': true,
2463                                 '[[Value]]': true,
2464                                 '[[Writable]]': true
2465                         };
2466
2467                         for (var key in Desc) { // eslint-disable-line
2468                                 if (src(Desc, key) && !allowed[key]) {
2469                                         return false;
2470                                 }
2471                         }
2472
2473                         var isData = src(Desc, '[[Value]]');
2474                         var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2475                         if (isData && IsAccessor) {
2476                                 throw new $TypeError$1('Property Descriptors may not be both accessor and data descriptors');
2477                         }
2478                         return true;
2479                 },
2480
2481                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
2482                 IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
2483                         if (typeof Desc === 'undefined') {
2484                                 return false;
2485                         }
2486
2487                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2488
2489                         if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) {
2490                                 return false;
2491                         }
2492
2493                         return true;
2494                 },
2495
2496                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
2497                 IsDataDescriptor: function IsDataDescriptor(Desc) {
2498                         if (typeof Desc === 'undefined') {
2499                                 return false;
2500                         }
2501
2502                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2503
2504                         if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) {
2505                                 return false;
2506                         }
2507
2508                         return true;
2509                 },
2510
2511                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
2512                 IsGenericDescriptor: function IsGenericDescriptor(Desc) {
2513                         if (typeof Desc === 'undefined') {
2514                                 return false;
2515                         }
2516
2517                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2518
2519                         if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
2520                                 return true;
2521                         }
2522
2523                         return false;
2524                 },
2525
2526                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
2527                 FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
2528                         if (typeof Desc === 'undefined') {
2529                                 return Desc;
2530                         }
2531
2532                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2533
2534                         if (this.IsDataDescriptor(Desc)) {
2535                                 return {
2536                                         value: Desc['[[Value]]'],
2537                                         writable: !!Desc['[[Writable]]'],
2538                                         enumerable: !!Desc['[[Enumerable]]'],
2539                                         configurable: !!Desc['[[Configurable]]']
2540                                 };
2541                         } else if (this.IsAccessorDescriptor(Desc)) {
2542                                 return {
2543                                         get: Desc['[[Get]]'],
2544                                         set: Desc['[[Set]]'],
2545                                         enumerable: !!Desc['[[Enumerable]]'],
2546                                         configurable: !!Desc['[[Configurable]]']
2547                                 };
2548                         } else {
2549                                 throw new $TypeError$1('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
2550                         }
2551                 },
2552
2553                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
2554                 ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
2555                         if (this.Type(Obj) !== 'Object') {
2556                                 throw new $TypeError$1('ToPropertyDescriptor requires an object');
2557                         }
2558
2559                         var desc = {};
2560                         if (src(Obj, 'enumerable')) {
2561                                 desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
2562                         }
2563                         if (src(Obj, 'configurable')) {
2564                                 desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
2565                         }
2566                         if (src(Obj, 'value')) {
2567                                 desc['[[Value]]'] = Obj.value;
2568                         }
2569                         if (src(Obj, 'writable')) {
2570                                 desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
2571                         }
2572                         if (src(Obj, 'get')) {
2573                                 var getter = Obj.get;
2574                                 if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
2575                                         throw new TypeError('getter must be a function');
2576                                 }
2577                                 desc['[[Get]]'] = getter;
2578                         }
2579                         if (src(Obj, 'set')) {
2580                                 var setter = Obj.set;
2581                                 if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
2582                                         throw new $TypeError$1('setter must be a function');
2583                                 }
2584                                 desc['[[Set]]'] = setter;
2585                         }
2586
2587                         if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) {
2588                                 throw new $TypeError$1('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
2589                         }
2590                         return desc;
2591                 }
2592         };
2593
2594         var es5$1 = ES5;
2595
2596         var regexExec = RegExp.prototype.exec;
2597         var gOPD = Object.getOwnPropertyDescriptor;
2598
2599         var tryRegexExecCall = function tryRegexExec(value) {
2600                 try {
2601                         var lastIndex = value.lastIndex;
2602                         value.lastIndex = 0;
2603
2604                         regexExec.call(value);
2605                         return true;
2606                 } catch (e) {
2607                         return false;
2608                 } finally {
2609                         value.lastIndex = lastIndex;
2610                 }
2611         };
2612         var toStr$7 = Object.prototype.toString;
2613         var regexClass = '[object RegExp]';
2614         var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
2615
2616         var isRegex = function isRegex(value) {
2617                 if (!value || typeof value !== 'object') {
2618                         return false;
2619                 }
2620                 if (!hasToStringTag$2) {
2621                         return toStr$7.call(value) === regexClass;
2622                 }
2623
2624                 var descriptor = gOPD(value, 'lastIndex');
2625                 var hasLastIndexDataProperty = descriptor && src(descriptor, 'value');
2626                 if (!hasLastIndexDataProperty) {
2627                         return false;
2628                 }
2629
2630                 return tryRegexExecCall(value);
2631         };
2632
2633         var $TypeError$2 = GetIntrinsic('%TypeError%');
2634         var $SyntaxError$1 = GetIntrinsic('%SyntaxError%');
2635         var $Array = GetIntrinsic('%Array%');
2636         var $String$1 = GetIntrinsic('%String%');
2637         var $Object$1 = GetIntrinsic('%Object%');
2638         var $Number = GetIntrinsic('%Number%');
2639         var $Symbol = GetIntrinsic('%Symbol%', true);
2640         var $RegExp = GetIntrinsic('%RegExp%');
2641
2642         var hasSymbols$4 = !!$Symbol;
2643
2644
2645
2646
2647         var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
2648
2649
2650
2651
2652
2653         var parseInteger = parseInt;
2654
2655         var arraySlice = functionBind.call(Function.call, $Array.prototype.slice);
2656         var strSlice = functionBind.call(Function.call, $String$1.prototype.slice);
2657         var isBinary = functionBind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
2658         var isOctal = functionBind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
2659         var regexExec$1 = functionBind.call(Function.call, $RegExp.prototype.exec);
2660         var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
2661         var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
2662         var hasNonWS = functionBind.call(Function.call, $RegExp.prototype.test, nonWSregex);
2663         var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
2664         var isInvalidHexLiteral = functionBind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
2665         var $charCodeAt = functionBind.call(Function.call, $String$1.prototype.charCodeAt);
2666
2667         var toStr$8 = functionBind.call(Function.call, Object.prototype.toString);
2668
2669         var $NumberValueOf = functionBind.call(Function.call, GetIntrinsic('%NumberPrototype%').valueOf);
2670         var $BooleanValueOf = functionBind.call(Function.call, GetIntrinsic('%BooleanPrototype%').valueOf);
2671         var $StringValueOf = functionBind.call(Function.call, GetIntrinsic('%StringPrototype%').valueOf);
2672         var $DateValueOf = functionBind.call(Function.call, GetIntrinsic('%DatePrototype%').valueOf);
2673
2674         var $floor = Math.floor;
2675         var $abs = Math.abs;
2676
2677         var $ObjectCreate = Object.create;
2678         var $gOPD = $Object$1.getOwnPropertyDescriptor;
2679
2680         var $isExtensible = $Object$1.isExtensible;
2681
2682         var $defineProperty = $Object$1.defineProperty;
2683
2684         // whitespace from: http://es5.github.io/#x15.5.4.20
2685         // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
2686         var ws = [
2687                 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
2688                 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
2689                 '\u2029\uFEFF'
2690         ].join('');
2691         var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
2692         var replace = functionBind.call(Function.call, $String$1.prototype.replace);
2693         var trim = function (value) {
2694                 return replace(value, trimRegex, '');
2695         };
2696
2697
2698
2699
2700
2701         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
2702         var ES6 = assign$1(assign$1({}, es5$1), {
2703
2704                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
2705                 Call: function Call(F, V) {
2706                         var args = arguments.length > 2 ? arguments[2] : [];
2707                         if (!this.IsCallable(F)) {
2708                                 throw new $TypeError$2(F + ' is not a function');
2709                         }
2710                         return F.apply(V, args);
2711                 },
2712
2713                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
2714                 ToPrimitive: es6,
2715
2716                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
2717                 // ToBoolean: ES5.ToBoolean,
2718
2719                 // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
2720                 ToNumber: function ToNumber(argument) {
2721                         var value = isPrimitive$1(argument) ? argument : es6(argument, $Number);
2722                         if (typeof value === 'symbol') {
2723                                 throw new $TypeError$2('Cannot convert a Symbol value to a number');
2724                         }
2725                         if (typeof value === 'string') {
2726                                 if (isBinary(value)) {
2727                                         return this.ToNumber(parseInteger(strSlice(value, 2), 2));
2728                                 } else if (isOctal(value)) {
2729                                         return this.ToNumber(parseInteger(strSlice(value, 2), 8));
2730                                 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
2731                                         return NaN;
2732                                 } else {
2733                                         var trimmed = trim(value);
2734                                         if (trimmed !== value) {
2735                                                 return this.ToNumber(trimmed);
2736                                         }
2737                                 }
2738                         }
2739                         return $Number(value);
2740                 },
2741
2742                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
2743                 // ToInteger: ES5.ToNumber,
2744
2745                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
2746                 // ToInt32: ES5.ToInt32,
2747
2748                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
2749                 // ToUint32: ES5.ToUint32,
2750
2751                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
2752                 ToInt16: function ToInt16(argument) {
2753                         var int16bit = this.ToUint16(argument);
2754                         return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
2755                 },
2756
2757                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
2758                 // ToUint16: ES5.ToUint16,
2759
2760                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
2761                 ToInt8: function ToInt8(argument) {
2762                         var int8bit = this.ToUint8(argument);
2763                         return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
2764                 },
2765
2766                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
2767                 ToUint8: function ToUint8(argument) {
2768                         var number = this.ToNumber(argument);
2769                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2770                         var posInt = sign$1(number) * $floor($abs(number));
2771                         return mod(posInt, 0x100);
2772                 },
2773
2774                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
2775                 ToUint8Clamp: function ToUint8Clamp(argument) {
2776                         var number = this.ToNumber(argument);
2777                         if (_isNaN(number) || number <= 0) { return 0; }
2778                         if (number >= 0xFF) { return 0xFF; }
2779                         var f = $floor(argument);
2780                         if (f + 0.5 < number) { return f + 1; }
2781                         if (number < f + 0.5) { return f; }
2782                         if (f % 2 !== 0) { return f + 1; }
2783                         return f;
2784                 },
2785
2786                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
2787                 ToString: function ToString(argument) {
2788                         if (typeof argument === 'symbol') {
2789                                 throw new $TypeError$2('Cannot convert a Symbol value to a string');
2790                         }
2791                         return $String$1(argument);
2792                 },
2793
2794                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
2795                 ToObject: function ToObject(value) {
2796                         this.RequireObjectCoercible(value);
2797                         return $Object$1(value);
2798                 },
2799
2800                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
2801                 ToPropertyKey: function ToPropertyKey(argument) {
2802                         var key = this.ToPrimitive(argument, $String$1);
2803                         return typeof key === 'symbol' ? key : this.ToString(key);
2804                 },
2805
2806                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
2807                 ToLength: function ToLength(argument) {
2808                         var len = this.ToInteger(argument);
2809                         if (len <= 0) { return 0; } // includes converting -0 to +0
2810                         if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
2811                         return len;
2812                 },
2813
2814                 // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
2815                 CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
2816                         if (toStr$8(argument) !== '[object String]') {
2817                                 throw new $TypeError$2('must be a string');
2818                         }
2819                         if (argument === '-0') { return -0; }
2820                         var n = this.ToNumber(argument);
2821                         if (this.SameValue(this.ToString(n), argument)) { return n; }
2822                         return void 0;
2823                 },
2824
2825                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
2826                 RequireObjectCoercible: es5$1.CheckObjectCoercible,
2827
2828                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
2829                 IsArray: $Array.isArray || function IsArray(argument) {
2830                         return toStr$8(argument) === '[object Array]';
2831                 },
2832
2833                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
2834                 // IsCallable: ES5.IsCallable,
2835
2836                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
2837                 IsConstructor: function IsConstructor(argument) {
2838                         return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
2839                 },
2840
2841                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
2842                 IsExtensible: Object.preventExtensions
2843                         ? function IsExtensible(obj) {
2844                                 if (isPrimitive$1(obj)) {
2845                                         return false;
2846                                 }
2847                                 return $isExtensible(obj);
2848                         }
2849                         : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
2850
2851                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
2852                 IsInteger: function IsInteger(argument) {
2853                         if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) {
2854                                 return false;
2855                         }
2856                         var abs = $abs(argument);
2857                         return $floor(abs) === abs;
2858                 },
2859
2860                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
2861                 IsPropertyKey: function IsPropertyKey(argument) {
2862                         return typeof argument === 'string' || typeof argument === 'symbol';
2863                 },
2864
2865                 // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
2866                 IsRegExp: function IsRegExp(argument) {
2867                         if (!argument || typeof argument !== 'object') {
2868                                 return false;
2869                         }
2870                         if (hasSymbols$4) {
2871                                 var isRegExp = argument[$Symbol.match];
2872                                 if (typeof isRegExp !== 'undefined') {
2873                                         return es5$1.ToBoolean(isRegExp);
2874                                 }
2875                         }
2876                         return isRegex(argument);
2877                 },
2878
2879                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
2880                 // SameValue: ES5.SameValue,
2881
2882                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
2883                 SameValueZero: function SameValueZero(x, y) {
2884                         return (x === y) || (_isNaN(x) && _isNaN(y));
2885                 },
2886
2887                 /**
2888                  * 7.3.2 GetV (V, P)
2889                  * 1. Assert: IsPropertyKey(P) is true.
2890                  * 2. Let O be ToObject(V).
2891                  * 3. ReturnIfAbrupt(O).
2892                  * 4. Return O.[[Get]](P, V).
2893                  */
2894                 GetV: function GetV(V, P) {
2895                         // 7.3.2.1
2896                         if (!this.IsPropertyKey(P)) {
2897                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2898                         }
2899
2900                         // 7.3.2.2-3
2901                         var O = this.ToObject(V);
2902
2903                         // 7.3.2.4
2904                         return O[P];
2905                 },
2906
2907                 /**
2908                  * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
2909                  * 1. Assert: IsPropertyKey(P) is true.
2910                  * 2. Let func be GetV(O, P).
2911                  * 3. ReturnIfAbrupt(func).
2912                  * 4. If func is either undefined or null, return undefined.
2913                  * 5. If IsCallable(func) is false, throw a TypeError exception.
2914                  * 6. Return func.
2915                  */
2916                 GetMethod: function GetMethod(O, P) {
2917                         // 7.3.9.1
2918                         if (!this.IsPropertyKey(P)) {
2919                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2920                         }
2921
2922                         // 7.3.9.2
2923                         var func = this.GetV(O, P);
2924
2925                         // 7.3.9.4
2926                         if (func == null) {
2927                                 return void 0;
2928                         }
2929
2930                         // 7.3.9.5
2931                         if (!this.IsCallable(func)) {
2932                                 throw new $TypeError$2(P + 'is not a function');
2933                         }
2934
2935                         // 7.3.9.6
2936                         return func;
2937                 },
2938
2939                 /**
2940                  * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
2941                  * 1. Assert: Type(O) is Object.
2942                  * 2. Assert: IsPropertyKey(P) is true.
2943                  * 3. Return O.[[Get]](P, O).
2944                  */
2945                 Get: function Get(O, P) {
2946                         // 7.3.1.1
2947                         if (this.Type(O) !== 'Object') {
2948                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2949                         }
2950                         // 7.3.1.2
2951                         if (!this.IsPropertyKey(P)) {
2952                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2953                         }
2954                         // 7.3.1.3
2955                         return O[P];
2956                 },
2957
2958                 Type: function Type(x) {
2959                         if (typeof x === 'symbol') {
2960                                 return 'Symbol';
2961                         }
2962                         return es5$1.Type(x);
2963                 },
2964
2965                 // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
2966                 SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
2967                         if (this.Type(O) !== 'Object') {
2968                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2969                         }
2970                         var C = O.constructor;
2971                         if (typeof C === 'undefined') {
2972                                 return defaultConstructor;
2973                         }
2974                         if (this.Type(C) !== 'Object') {
2975                                 throw new $TypeError$2('O.constructor is not an Object');
2976                         }
2977                         var S = hasSymbols$4 && $Symbol.species ? C[$Symbol.species] : void 0;
2978                         if (S == null) {
2979                                 return defaultConstructor;
2980                         }
2981                         if (this.IsConstructor(S)) {
2982                                 return S;
2983                         }
2984                         throw new $TypeError$2('no constructor found');
2985                 },
2986
2987                 // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
2988                 CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
2989                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2990
2991                         if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
2992                                 if (!src(Desc, '[[Value]]')) {
2993                                         Desc['[[Value]]'] = void 0;
2994                                 }
2995                                 if (!src(Desc, '[[Writable]]')) {
2996                                         Desc['[[Writable]]'] = false;
2997                                 }
2998                         } else {
2999                                 if (!src(Desc, '[[Get]]')) {
3000                                         Desc['[[Get]]'] = void 0;
3001                                 }
3002                                 if (!src(Desc, '[[Set]]')) {
3003                                         Desc['[[Set]]'] = void 0;
3004                                 }
3005                         }
3006                         if (!src(Desc, '[[Enumerable]]')) {
3007                                 Desc['[[Enumerable]]'] = false;
3008                         }
3009                         if (!src(Desc, '[[Configurable]]')) {
3010                                 Desc['[[Configurable]]'] = false;
3011                         }
3012                         return Desc;
3013                 },
3014
3015                 // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
3016                 Set: function Set(O, P, V, Throw) {
3017                         if (this.Type(O) !== 'Object') {
3018                                 throw new $TypeError$2('O must be an Object');
3019                         }
3020                         if (!this.IsPropertyKey(P)) {
3021                                 throw new $TypeError$2('P must be a Property Key');
3022                         }
3023                         if (this.Type(Throw) !== 'Boolean') {
3024                                 throw new $TypeError$2('Throw must be a Boolean');
3025                         }
3026                         if (Throw) {
3027                                 O[P] = V;
3028                                 return true;
3029                         } else {
3030                                 try {
3031                                         O[P] = V;
3032                                 } catch (e) {
3033                                         return false;
3034                                 }
3035                         }
3036                 },
3037
3038                 // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
3039                 HasOwnProperty: function HasOwnProperty(O, P) {
3040                         if (this.Type(O) !== 'Object') {
3041                                 throw new $TypeError$2('O must be an Object');
3042                         }
3043                         if (!this.IsPropertyKey(P)) {
3044                                 throw new $TypeError$2('P must be a Property Key');
3045                         }
3046                         return src(O, P);
3047                 },
3048
3049                 // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
3050                 HasProperty: function HasProperty(O, P) {
3051                         if (this.Type(O) !== 'Object') {
3052                                 throw new $TypeError$2('O must be an Object');
3053                         }
3054                         if (!this.IsPropertyKey(P)) {
3055                                 throw new $TypeError$2('P must be a Property Key');
3056                         }
3057                         return P in O;
3058                 },
3059
3060                 // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
3061                 IsConcatSpreadable: function IsConcatSpreadable(O) {
3062                         if (this.Type(O) !== 'Object') {
3063                                 return false;
3064                         }
3065                         if (hasSymbols$4 && typeof $Symbol.isConcatSpreadable === 'symbol') {
3066                                 var spreadable = this.Get(O, Symbol.isConcatSpreadable);
3067                                 if (typeof spreadable !== 'undefined') {
3068                                         return this.ToBoolean(spreadable);
3069                                 }
3070                         }
3071                         return this.IsArray(O);
3072                 },
3073
3074                 // https://ecma-international.org/ecma-262/6.0/#sec-invoke
3075                 Invoke: function Invoke(O, P) {
3076                         if (!this.IsPropertyKey(P)) {
3077                                 throw new $TypeError$2('P must be a Property Key');
3078                         }
3079                         var argumentsList = arraySlice(arguments, 2);
3080                         var func = this.GetV(O, P);
3081                         return this.Call(func, O, argumentsList);
3082                 },
3083
3084                 // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
3085                 GetIterator: function GetIterator(obj, method) {
3086                         if (!hasSymbols$4) {
3087                                 throw new SyntaxError('ES.GetIterator depends on native iterator support.');
3088                         }
3089
3090                         var actualMethod = method;
3091                         if (arguments.length < 2) {
3092                                 actualMethod = this.GetMethod(obj, $Symbol.iterator);
3093                         }
3094                         var iterator = this.Call(actualMethod, obj);
3095                         if (this.Type(iterator) !== 'Object') {
3096                                 throw new $TypeError$2('iterator must return an object');
3097                         }
3098
3099                         return iterator;
3100                 },
3101
3102                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
3103                 IteratorNext: function IteratorNext(iterator, value) {
3104                         var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
3105                         if (this.Type(result) !== 'Object') {
3106                                 throw new $TypeError$2('iterator next must return an object');
3107                         }
3108                         return result;
3109                 },
3110
3111                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
3112                 IteratorComplete: function IteratorComplete(iterResult) {
3113                         if (this.Type(iterResult) !== 'Object') {
3114                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
3115                         }
3116                         return this.ToBoolean(this.Get(iterResult, 'done'));
3117                 },
3118
3119                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
3120                 IteratorValue: function IteratorValue(iterResult) {
3121                         if (this.Type(iterResult) !== 'Object') {
3122                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
3123                         }
3124                         return this.Get(iterResult, 'value');
3125                 },
3126
3127                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
3128                 IteratorStep: function IteratorStep(iterator) {
3129                         var result = this.IteratorNext(iterator);
3130                         var done = this.IteratorComplete(result);
3131                         return done === true ? false : result;
3132                 },
3133
3134                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
3135                 IteratorClose: function IteratorClose(iterator, completion) {
3136                         if (this.Type(iterator) !== 'Object') {
3137                                 throw new $TypeError$2('Assertion failed: Type(iterator) is not Object');
3138                         }
3139                         if (!this.IsCallable(completion)) {
3140                                 throw new $TypeError$2('Assertion failed: completion is not a thunk for a Completion Record');
3141                         }
3142                         var completionThunk = completion;
3143
3144                         var iteratorReturn = this.GetMethod(iterator, 'return');
3145
3146                         if (typeof iteratorReturn === 'undefined') {
3147                                 return completionThunk();
3148                         }
3149
3150                         var completionRecord;
3151                         try {
3152                                 var innerResult = this.Call(iteratorReturn, iterator, []);
3153                         } catch (e) {
3154                                 // if we hit here, then "e" is the innerResult completion that needs re-throwing
3155
3156                                 // if the completion is of type "throw", this will throw.
3157                                 completionRecord = completionThunk();
3158                                 completionThunk = null; // ensure it's not called twice.
3159
3160                                 // if not, then return the innerResult completion
3161                                 throw e;
3162                         }
3163                         completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
3164                         completionThunk = null; // ensure it's not called twice.
3165
3166                         if (this.Type(innerResult) !== 'Object') {
3167                                 throw new $TypeError$2('iterator .return must return an object');
3168                         }
3169
3170                         return completionRecord;
3171                 },
3172
3173                 // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
3174                 CreateIterResultObject: function CreateIterResultObject(value, done) {
3175                         if (this.Type(done) !== 'Boolean') {
3176                                 throw new $TypeError$2('Assertion failed: Type(done) is not Boolean');
3177                         }
3178                         return {
3179                                 value: value,
3180                                 done: done
3181                         };
3182                 },
3183
3184                 // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
3185                 RegExpExec: function RegExpExec(R, S) {
3186                         if (this.Type(R) !== 'Object') {
3187                                 throw new $TypeError$2('R must be an Object');
3188                         }
3189                         if (this.Type(S) !== 'String') {
3190                                 throw new $TypeError$2('S must be a String');
3191                         }
3192                         var exec = this.Get(R, 'exec');
3193                         if (this.IsCallable(exec)) {
3194                                 var result = this.Call(exec, R, [S]);
3195                                 if (result === null || this.Type(result) === 'Object') {
3196                                         return result;
3197                                 }
3198                                 throw new $TypeError$2('"exec" method must return `null` or an Object');
3199                         }
3200                         return regexExec$1(R, S);
3201                 },
3202
3203                 // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
3204                 ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
3205                         if (!this.IsInteger(length) || length < 0) {
3206                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0');
3207                         }
3208                         var len = length === 0 ? 0 : length;
3209                         var C;
3210                         var isArray = this.IsArray(originalArray);
3211                         if (isArray) {
3212                                 C = this.Get(originalArray, 'constructor');
3213                                 // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
3214                                 // if (this.IsConstructor(C)) {
3215                                 //      if C is another realm's Array, C = undefined
3216                                 //      Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
3217                                 // }
3218                                 if (this.Type(C) === 'Object' && hasSymbols$4 && $Symbol.species) {
3219                                         C = this.Get(C, $Symbol.species);
3220                                         if (C === null) {
3221                                                 C = void 0;
3222                                         }
3223                                 }
3224                         }
3225                         if (typeof C === 'undefined') {
3226                                 return $Array(len);
3227                         }
3228                         if (!this.IsConstructor(C)) {
3229                                 throw new $TypeError$2('C must be a constructor');
3230                         }
3231                         return new C(len); // this.Construct(C, len);
3232                 },
3233
3234                 CreateDataProperty: function CreateDataProperty(O, P, V) {
3235                         if (this.Type(O) !== 'Object') {
3236                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3237                         }
3238                         if (!this.IsPropertyKey(P)) {
3239                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3240                         }
3241                         var oldDesc = $gOPD(O, P);
3242                         var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
3243                         var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
3244                         if (immutable || !extensible) {
3245                                 return false;
3246                         }
3247                         var newDesc = {
3248                                 configurable: true,
3249                                 enumerable: true,
3250                                 value: V,
3251                                 writable: true
3252                         };
3253                         $defineProperty(O, P, newDesc);
3254                         return true;
3255                 },
3256
3257                 // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
3258                 CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
3259                         if (this.Type(O) !== 'Object') {
3260                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3261                         }
3262                         if (!this.IsPropertyKey(P)) {
3263                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3264                         }
3265                         var success = this.CreateDataProperty(O, P, V);
3266                         if (!success) {
3267                                 throw new $TypeError$2('unable to create data property');
3268                         }
3269                         return success;
3270                 },
3271
3272                 // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
3273                 ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
3274                         if (proto !== null && this.Type(proto) !== 'Object') {
3275                                 throw new $TypeError$2('Assertion failed: proto must be null or an object');
3276                         }
3277                         var slots = arguments.length < 2 ? [] : internalSlotsList;
3278                         if (slots.length > 0) {
3279                                 throw new $SyntaxError$1('es-abstract does not yet support internal slots');
3280                         }
3281
3282                         if (proto === null && !$ObjectCreate) {
3283                                 throw new $SyntaxError$1('native Object.create support is required to create null objects');
3284                         }
3285
3286                         return $ObjectCreate(proto);
3287                 },
3288
3289                 // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
3290                 AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
3291                         if (this.Type(S) !== 'String') {
3292                                 throw new $TypeError$2('S must be a String');
3293                         }
3294                         if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
3295                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0 and <= 2**53');
3296                         }
3297                         if (this.Type(unicode) !== 'Boolean') {
3298                                 throw new $TypeError$2('Assertion failed: unicode must be a Boolean');
3299                         }
3300                         if (!unicode) {
3301                                 return index + 1;
3302                         }
3303                         var length = S.length;
3304                         if ((index + 1) >= length) {
3305                                 return index + 1;
3306                         }
3307
3308                         var first = $charCodeAt(S, index);
3309                         if (first < 0xD800 || first > 0xDBFF) {
3310                                 return index + 1;
3311                         }
3312
3313                         var second = $charCodeAt(S, index + 1);
3314                         if (second < 0xDC00 || second > 0xDFFF) {
3315                                 return index + 1;
3316                         }
3317
3318                         return index + 2;
3319                 },
3320
3321                 // https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
3322                 CreateMethodProperty: function CreateMethodProperty(O, P, V) {
3323                         if (this.Type(O) !== 'Object') {
3324                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3325                         }
3326
3327                         if (!this.IsPropertyKey(P)) {
3328                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3329                         }
3330
3331                         var newDesc = {
3332                                 configurable: true,
3333                                 enumerable: false,
3334                                 value: V,
3335                                 writable: true
3336                         };
3337                         return !!$defineProperty(O, P, newDesc);
3338                 },
3339
3340                 // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
3341                 DefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {
3342                         if (this.Type(O) !== 'Object') {
3343                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3344                         }
3345
3346                         if (!this.IsPropertyKey(P)) {
3347                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3348                         }
3349
3350                         return !!$defineProperty(O, P, desc);
3351                 },
3352
3353                 // https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
3354                 DeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {
3355                         if (this.Type(O) !== 'Object') {
3356                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3357                         }
3358
3359                         if (!this.IsPropertyKey(P)) {
3360                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3361                         }
3362
3363                         var success = delete O[P];
3364                         if (!success) {
3365                                 throw new TypeError('Attempt to delete property failed.');
3366                         }
3367                         return success;
3368                 },
3369
3370                 // https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
3371                 EnumerableOwnNames: function EnumerableOwnNames(O) {
3372                         if (this.Type(O) !== 'Object') {
3373                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3374                         }
3375
3376                         return objectKeys(O);
3377                 },
3378
3379                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
3380                 thisNumberValue: function thisNumberValue(value) {
3381                         if (this.Type(value) === 'Number') {
3382                                 return value;
3383                         }
3384
3385                         return $NumberValueOf(value);
3386                 },
3387
3388                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
3389                 thisBooleanValue: function thisBooleanValue(value) {
3390                         if (this.Type(value) === 'Boolean') {
3391                                 return value;
3392                         }
3393
3394                         return $BooleanValueOf(value);
3395                 },
3396
3397                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
3398                 thisStringValue: function thisStringValue(value) {
3399                         if (this.Type(value) === 'String') {
3400                                 return value;
3401                         }
3402
3403                         return $StringValueOf(value);
3404                 },
3405
3406                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
3407                 thisTimeValue: function thisTimeValue(value) {
3408                         return $DateValueOf(value);
3409                 }
3410         });
3411
3412         delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
3413
3414         var es2015$1 = ES6;
3415
3416         var es6$1 = es2015$1;
3417
3418         var implementation$2 = function find(predicate) {
3419                 var list = es6$1.ToObject(this);
3420                 var length = es6$1.ToLength(list.length);
3421                 if (!es6$1.IsCallable(predicate)) {
3422                         throw new TypeError('Array#find: predicate must be a function');
3423                 }
3424                 if (length === 0) {
3425                         return void 0;
3426                 }
3427                 var thisArg;
3428                 if (arguments.length > 0) {
3429                         thisArg = arguments[1];
3430                 }
3431
3432                 for (var i = 0, value; i < length; i++) {
3433                         value = list[i];
3434                         // inlined for performance: if (ES.Call(predicate, thisArg, [value, i, list])) {
3435                         if (predicate.apply(thisArg, [value, i, list])) {
3436                                 return value;
3437                         }
3438                 }
3439                 return void 0;
3440         };
3441
3442         var polyfill$3 = function getPolyfill() {
3443                 // Detect if an implementation exists
3444                 // Detect early implementations which skipped holes in sparse arrays
3445                 // eslint-disable-next-line no-sparse-arrays
3446                 var implemented = Array.prototype.find && [, 1].find(function () {
3447                         return true;
3448                 }) !== 1;
3449
3450                 // eslint-disable-next-line global-require
3451                 return implemented ? Array.prototype.find : implementation$2;
3452         };
3453
3454         var shim$8 = function shimArrayPrototypeFind() {
3455                 var polyfill = polyfill$3();
3456
3457                 defineProperties_1(Array.prototype, { find: polyfill }, {
3458                         find: function () {
3459                                 return Array.prototype.find !== polyfill;
3460                         }
3461                 });
3462
3463                 return polyfill;
3464         };
3465
3466         var slice$2 = Array.prototype.slice;
3467
3468         var polyfill$4 = polyfill$3();
3469
3470         var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars
3471                 es6$1.RequireObjectCoercible(array);
3472                 var args = slice$2.call(arguments, 1);
3473                 return polyfill$4.apply(array, args);
3474         };
3475
3476         defineProperties_1(boundFindShim, {
3477                 getPolyfill: polyfill$3,
3478                 implementation: implementation$2,
3479                 shim: shim$8
3480         });
3481
3482         var array_prototype_find = boundFindShim;
3483
3484         var implementation$3 = function findIndex(predicate) {
3485                 var list = es6$1.ToObject(this);
3486                 var length = es6$1.ToLength(list.length);
3487                 if (!es6$1.IsCallable(predicate)) {
3488                         throw new TypeError('Array#findIndex: predicate must be a function');
3489                 }
3490                 if (length === 0) return -1;
3491                 var thisArg = arguments[1];
3492                 for (var i = 0, value; i < length; i++) {
3493                         value = list[i];
3494                         if (es6$1.Call(predicate, thisArg, [value, i, list])) return i;
3495                 }
3496                 return -1;
3497         };
3498
3499         var polyfill$5 = function getPolyfill() {
3500                 // Detect if an implementation exists
3501                 // Detect early implementations which skipped holes in sparse arrays
3502                 var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) {
3503                         return idx === 0;
3504                 }) === 0);
3505
3506
3507                 return implemented ? Array.prototype.findIndex : implementation$3;
3508         };
3509
3510         var shim$9 = function shimArrayPrototypeFindIndex() {
3511                 var polyfill = polyfill$5();
3512
3513                 defineProperties_1(Array.prototype, { findIndex: polyfill }, {
3514                         findIndex: function () {
3515                                 return Array.prototype.findIndex !== polyfill;
3516                         }
3517                 });
3518
3519                 return polyfill;
3520         };
3521
3522         var slice$3 = Array.prototype.slice;
3523
3524         var polyfill$6 = polyfill$5();
3525
3526         var boundShim = function findIndex(array, predicate) {
3527                 es6$1.RequireObjectCoercible(array);
3528                 var args = slice$3.call(arguments, 1);
3529                 return polyfill$6.apply(array, args);
3530         };
3531
3532         defineProperties_1(boundShim, {
3533                 implementation: implementation$3,
3534                 getPolyfill: polyfill$5,
3535                 shim: shim$9
3536         });
3537
3538         var array_prototype_findindex = boundShim;
3539
3540         var supportsDescriptors$1 = defineProperties_1.supportsDescriptors;
3541
3542         /*! https://mths.be/array-from v0.2.0 by @mathias */
3543         var implementation$4 = function from(arrayLike) {
3544                 var defineProperty = supportsDescriptors$1 ? Object.defineProperty : function put(object, key, descriptor) {
3545                         object[key] = descriptor.value;
3546                 };
3547                 var C = this;
3548                 if (arrayLike === null || typeof arrayLike === 'undefined') {
3549                         throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`');
3550                 }
3551                 var items = es6$1.ToObject(arrayLike);
3552
3553                 var mapFn, T;
3554                 if (typeof arguments[1] !== 'undefined') {
3555                         mapFn = arguments[1];
3556                         if (!es6$1.IsCallable(mapFn)) {
3557                                 throw new TypeError('When provided, the second argument to `Array.from` must be a function');
3558                         }
3559                         if (arguments.length > 2) {
3560                                 T = arguments[2];
3561                         }
3562                 }
3563
3564                 var len = es6$1.ToLength(items.length);
3565                 var A = es6$1.IsCallable(C) ? es6$1.ToObject(new C(len)) : new Array(len);
3566                 var k = 0;
3567                 var kValue, mappedValue;
3568                 while (k < len) {
3569                         kValue = items[k];
3570                         if (mapFn) {
3571                                 mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : es6$1.Call(mapFn, T, [kValue, k]);
3572                         } else {
3573                                 mappedValue = kValue;
3574                         }
3575                         defineProperty(A, k, {
3576                                 'configurable': true,
3577                                 'enumerable': true,
3578                                 'value': mappedValue,
3579                                 'writable': true
3580                         });
3581                         k += 1;
3582                 }
3583                 A.length = len;
3584                 return A;
3585         };
3586
3587         var tryCall = function (fn) {
3588                 try {
3589                         fn();
3590                         return true;
3591                 } catch (e) {
3592                         return false;
3593                 }
3594         };
3595
3596         var polyfill$7 = function getPolyfill() {
3597                 var implemented = es6$1.IsCallable(Array.from)
3598                         && tryCall(function () { Array.from({ 'length': -Infinity }); })
3599                         && !tryCall(function () { Array.from([], undefined); });
3600
3601                 return implemented ? Array.from : implementation$4;
3602         };
3603
3604         var shim$a = function shimArrayFrom() {
3605                 var polyfill = polyfill$7();
3606
3607                 defineProperties_1(Array, { 'from': polyfill }, {
3608                         'from': function () {
3609                                 return Array.from !== polyfill;
3610                         }
3611                 });
3612
3613                 return polyfill;
3614         };
3615
3616         // eslint-disable-next-line no-unused-vars
3617         var boundFromShim = function from(array) {
3618             // eslint-disable-next-line no-invalid-this
3619                 return implementation$4.apply(this || Array, arguments);
3620         };
3621
3622         defineProperties_1(boundFromShim, {
3623                 'getPolyfill': polyfill$7,
3624                 'implementation': implementation$4,
3625                 'shim': shim$a
3626         });
3627
3628         var array_from = boundFromShim;
3629
3630         var ES2016 = assign$1(assign$1({}, es2015$1), {
3631                 // https://github.com/tc39/ecma262/pull/60
3632                 SameValueNonNumber: function SameValueNonNumber(x, y) {
3633                         if (typeof x === 'number' || typeof x !== typeof y) {
3634                                 throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
3635                         }
3636                         return this.SameValue(x, y);
3637                 }
3638         });
3639
3640         var es2016 = ES2016;
3641
3642         var es7 = es2016;
3643
3644         var isEnumerable$1 = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3645
3646         var implementation$5 = function values(O) {
3647                 var obj = es7.RequireObjectCoercible(O);
3648                 var vals = [];
3649                 for (var key in obj) {
3650                         if (src(obj, key) && isEnumerable$1(obj, key)) {
3651                                 vals.push(obj[key]);
3652                         }
3653                 }
3654                 return vals;
3655         };
3656
3657         var polyfill$8 = function getPolyfill() {
3658                 return typeof Object.values === 'function' ? Object.values : implementation$5;
3659         };
3660
3661         var shim$b = function shimValues() {
3662                 var polyfill = polyfill$8();
3663                 defineProperties_1(Object, { values: polyfill }, {
3664                         values: function testValues() {
3665                                 return Object.values !== polyfill;
3666                         }
3667                 });
3668                 return polyfill;
3669         };
3670
3671         var polyfill$9 = polyfill$8();
3672
3673         defineProperties_1(polyfill$9, {
3674                 getPolyfill: polyfill$8,
3675                 implementation: implementation$5,
3676                 shim: shim$b
3677         });
3678
3679         var object_values = polyfill$9;
3680
3681         // modified from https://github.com/es-shims/es6-shim
3682
3683
3684         var canBeObject = function (obj) {
3685                 return typeof obj !== 'undefined' && obj !== null;
3686         };
3687         var hasSymbols$5 = shams();
3688         var toObject = Object;
3689         var push = functionBind.call(Function.call, Array.prototype.push);
3690         var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3691         var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null;
3692
3693         var implementation$6 = function assign(target, source1) {
3694                 if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
3695                 var objTarget = toObject(target);
3696                 var s, source, i, props, syms, value, key;
3697                 for (s = 1; s < arguments.length; ++s) {
3698                         source = toObject(arguments[s]);
3699                         props = objectKeys(source);
3700                         var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
3701                         if (getSymbols) {
3702                                 syms = getSymbols(source);
3703                                 for (i = 0; i < syms.length; ++i) {
3704                                         key = syms[i];
3705                                         if (propIsEnumerable(source, key)) {
3706                                                 push(props, key);
3707                                         }
3708                                 }
3709                         }
3710                         for (i = 0; i < props.length; ++i) {
3711                                 key = props[i];
3712                                 value = source[key];
3713                                 if (propIsEnumerable(source, key)) {
3714                                         objTarget[key] = value;
3715                                 }
3716                         }
3717                 }
3718                 return objTarget;
3719         };
3720
3721         var lacksProperEnumerationOrder = function () {
3722                 if (!Object.assign) {
3723                         return false;
3724                 }
3725                 // v8, specifically in node 4.x, has a bug with incorrect property enumeration order
3726                 // note: this does not detect the bug unless there's 20 characters
3727                 var str = 'abcdefghijklmnopqrst';
3728                 var letters = str.split('');
3729                 var map = {};
3730                 for (var i = 0; i < letters.length; ++i) {
3731                         map[letters[i]] = letters[i];
3732                 }
3733                 var obj = Object.assign({}, map);
3734                 var actual = '';
3735                 for (var k in obj) {
3736                         actual += k;
3737                 }
3738                 return str !== actual;
3739         };
3740
3741         var assignHasPendingExceptions = function () {
3742                 if (!Object.assign || !Object.preventExtensions) {
3743                         return false;
3744                 }
3745                 // Firefox 37 still has "pending exception" logic in its Object.assign implementation,
3746                 // which is 72% slower than our shim, and Firefox 40's native implementation.
3747                 var thrower = Object.preventExtensions({ 1: 2 });
3748                 try {
3749                         Object.assign(thrower, 'xy');
3750                 } catch (e) {
3751                         return thrower[1] === 'y';
3752                 }
3753                 return false;
3754         };
3755
3756         var polyfill$a = function getPolyfill() {
3757                 if (!Object.assign) {
3758                         return implementation$6;
3759                 }
3760                 if (lacksProperEnumerationOrder()) {
3761                         return implementation$6;
3762                 }
3763                 if (assignHasPendingExceptions()) {
3764                         return implementation$6;
3765                 }
3766                 return Object.assign;
3767         };
3768
3769         var shim$c = function shimAssign() {
3770                 var polyfill = polyfill$a();
3771                 defineProperties_1(
3772                         Object,
3773                         { assign: polyfill },
3774                         { assign: function () { return Object.assign !== polyfill; } }
3775                 );
3776                 return polyfill;
3777         };
3778
3779         var polyfill$b = polyfill$a();
3780
3781         defineProperties_1(polyfill$b, {
3782                 getPolyfill: polyfill$a,
3783                 implementation: implementation$6,
3784                 shim: shim$c
3785         });
3786
3787         var object_assign = polyfill$b;
3788
3789         /**
3790          * @this {Promise}
3791          */
3792         function finallyConstructor(callback) {
3793           var constructor = this.constructor;
3794           return this.then(
3795             function(value) {
3796               // @ts-ignore
3797               return constructor.resolve(callback()).then(function() {
3798                 return value;
3799               });
3800             },
3801             function(reason) {
3802               // @ts-ignore
3803               return constructor.resolve(callback()).then(function() {
3804                 // @ts-ignore
3805                 return constructor.reject(reason);
3806               });
3807             }
3808           );
3809         }
3810
3811         // Store setTimeout reference so promise-polyfill will be unaffected by
3812         // other code modifying setTimeout (like sinon.useFakeTimers())
3813         var setTimeoutFunc = setTimeout;
3814
3815         function isArray$3(x) {
3816           return Boolean(x && typeof x.length !== 'undefined');
3817         }
3818
3819         function noop$1() {}
3820
3821         // Polyfill for Function.prototype.bind
3822         function bind$2(fn, thisArg) {
3823           return function() {
3824             fn.apply(thisArg, arguments);
3825           };
3826         }
3827
3828         /**
3829          * @constructor
3830          * @param {Function} fn
3831          */
3832         function Promise$1(fn) {
3833           if (!(this instanceof Promise$1))
3834             throw new TypeError('Promises must be constructed via new');
3835           if (typeof fn !== 'function') throw new TypeError('not a function');
3836           /** @type {!number} */
3837           this._state = 0;
3838           /** @type {!boolean} */
3839           this._handled = false;
3840           /** @type {Promise|undefined} */
3841           this._value = undefined;
3842           /** @type {!Array<!Function>} */
3843           this._deferreds = [];
3844
3845           doResolve(fn, this);
3846         }
3847
3848         function handle(self, deferred) {
3849           while (self._state === 3) {
3850             self = self._value;
3851           }
3852           if (self._state === 0) {
3853             self._deferreds.push(deferred);
3854             return;
3855           }
3856           self._handled = true;
3857           Promise$1._immediateFn(function() {
3858             var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
3859             if (cb === null) {
3860               (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
3861               return;
3862             }
3863             var ret;
3864             try {
3865               ret = cb(self._value);
3866             } catch (e) {
3867               reject(deferred.promise, e);
3868               return;
3869             }
3870             resolve(deferred.promise, ret);
3871           });
3872         }
3873
3874         function resolve(self, newValue) {
3875           try {
3876             // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
3877             if (newValue === self)
3878               throw new TypeError('A promise cannot be resolved with itself.');
3879             if (
3880               newValue &&
3881               (typeof newValue === 'object' || typeof newValue === 'function')
3882             ) {
3883               var then = newValue.then;
3884               if (newValue instanceof Promise$1) {
3885                 self._state = 3;
3886                 self._value = newValue;
3887                 finale(self);
3888                 return;
3889               } else if (typeof then === 'function') {
3890                 doResolve(bind$2(then, newValue), self);
3891                 return;
3892               }
3893             }
3894             self._state = 1;
3895             self._value = newValue;
3896             finale(self);
3897           } catch (e) {
3898             reject(self, e);
3899           }
3900         }
3901
3902         function reject(self, newValue) {
3903           self._state = 2;
3904           self._value = newValue;
3905           finale(self);
3906         }
3907
3908         function finale(self) {
3909           if (self._state === 2 && self._deferreds.length === 0) {
3910             Promise$1._immediateFn(function() {
3911               if (!self._handled) {
3912                 Promise$1._unhandledRejectionFn(self._value);
3913               }
3914             });
3915           }
3916
3917           for (var i = 0, len = self._deferreds.length; i < len; i++) {
3918             handle(self, self._deferreds[i]);
3919           }
3920           self._deferreds = null;
3921         }
3922
3923         /**
3924          * @constructor
3925          */
3926         function Handler(onFulfilled, onRejected, promise) {
3927           this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
3928           this.onRejected = typeof onRejected === 'function' ? onRejected : null;
3929           this.promise = promise;
3930         }
3931
3932         /**
3933          * Take a potentially misbehaving resolver function and make sure
3934          * onFulfilled and onRejected are only called once.
3935          *
3936          * Makes no guarantees about asynchrony.
3937          */
3938         function doResolve(fn, self) {
3939           var done = false;
3940           try {
3941             fn(
3942               function(value) {
3943                 if (done) return;
3944                 done = true;
3945                 resolve(self, value);
3946               },
3947               function(reason) {
3948                 if (done) return;
3949                 done = true;
3950                 reject(self, reason);
3951               }
3952             );
3953           } catch (ex) {
3954             if (done) return;
3955             done = true;
3956             reject(self, ex);
3957           }
3958         }
3959
3960         Promise$1.prototype['catch'] = function(onRejected) {
3961           return this.then(null, onRejected);
3962         };
3963
3964         Promise$1.prototype.then = function(onFulfilled, onRejected) {
3965           // @ts-ignore
3966           var prom = new this.constructor(noop$1);
3967
3968           handle(this, new Handler(onFulfilled, onRejected, prom));
3969           return prom;
3970         };
3971
3972         Promise$1.prototype['finally'] = finallyConstructor;
3973
3974         Promise$1.all = function(arr) {
3975           return new Promise$1(function(resolve, reject) {
3976             if (!isArray$3(arr)) {
3977               return reject(new TypeError('Promise.all accepts an array'));
3978             }
3979
3980             var args = Array.prototype.slice.call(arr);
3981             if (args.length === 0) return resolve([]);
3982             var remaining = args.length;
3983
3984             function res(i, val) {
3985               try {
3986                 if (val && (typeof val === 'object' || typeof val === 'function')) {
3987                   var then = val.then;
3988                   if (typeof then === 'function') {
3989                     then.call(
3990                       val,
3991                       function(val) {
3992                         res(i, val);
3993                       },
3994                       reject
3995                     );
3996                     return;
3997                   }
3998                 }
3999                 args[i] = val;
4000                 if (--remaining === 0) {
4001                   resolve(args);
4002                 }
4003               } catch (ex) {
4004                 reject(ex);
4005               }
4006             }
4007
4008             for (var i = 0; i < args.length; i++) {
4009               res(i, args[i]);
4010             }
4011           });
4012         };
4013
4014         Promise$1.resolve = function(value) {
4015           if (value && typeof value === 'object' && value.constructor === Promise$1) {
4016             return value;
4017           }
4018
4019           return new Promise$1(function(resolve) {
4020             resolve(value);
4021           });
4022         };
4023
4024         Promise$1.reject = function(value) {
4025           return new Promise$1(function(resolve, reject) {
4026             reject(value);
4027           });
4028         };
4029
4030         Promise$1.race = function(arr) {
4031           return new Promise$1(function(resolve, reject) {
4032             if (!isArray$3(arr)) {
4033               return reject(new TypeError('Promise.race accepts an array'));
4034             }
4035
4036             for (var i = 0, len = arr.length; i < len; i++) {
4037               Promise$1.resolve(arr[i]).then(resolve, reject);
4038             }
4039           });
4040         };
4041
4042         // Use polyfill for setImmediate for performance gains
4043         Promise$1._immediateFn =
4044           // @ts-ignore
4045           (typeof setImmediate === 'function' &&
4046             function(fn) {
4047               // @ts-ignore
4048               setImmediate(fn);
4049             }) ||
4050           function(fn) {
4051             setTimeoutFunc(fn, 0);
4052           };
4053
4054         Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {
4055           if (typeof console !== 'undefined' && console) {
4056             console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
4057           }
4058         };
4059
4060         /** @suppress {undefinedVars} */
4061         var globalNS = (function() {
4062           // the only reliable means to get the global object is
4063           // `Function('return this')()`
4064           // However, this causes CSP violations in Chrome apps.
4065           if (typeof self !== 'undefined') {
4066             return self;
4067           }
4068           if (typeof window !== 'undefined') {
4069             return window;
4070           }
4071           if (typeof global !== 'undefined') {
4072             return global;
4073           }
4074           throw new Error('unable to locate global object');
4075         })();
4076
4077         if (!('Promise' in globalNS)) {
4078           globalNS['Promise'] = Promise$1;
4079         } else if (!globalNS.Promise.prototype['finally']) {
4080           globalNS.Promise.prototype['finally'] = finallyConstructor;
4081         }
4082
4083         var polyfill$c = /*#__PURE__*/Object.freeze({
4084
4085         });
4086
4087         var setAsap = createCommonjsModule(function (module) {
4088         (function (thisVar, undefined$1) {
4089                 var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) ||
4090                         typeof self === 'object' && self || thisVar;
4091
4092                 var hasSetImmediate = typeof setImmediate === 'function';
4093                 var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
4094                 var index = 0;
4095
4096                 function getNewIndex() {
4097                         if (index === 9007199254740991) {
4098                                 return 0;
4099                         }
4100                         return ++index;
4101                 }
4102
4103                 var setAsap = (function () {
4104                         var hiddenDiv, scriptEl, timeoutFn, callbacks;
4105
4106                         // Modern browsers, fastest async
4107                         if (main.MutationObserver) {
4108                                 return function setAsap(callback) {
4109                                         hiddenDiv = document.createElement("div");
4110                                         (new MutationObserver(function() {
4111                                                 callback();
4112                                                 hiddenDiv = null;
4113                                         })).observe(hiddenDiv, { attributes: true });
4114                                         hiddenDiv.setAttribute('i', '1');
4115                                 };
4116
4117                         // Browsers that support postMessage
4118                         } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
4119
4120                                 var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
4121                                 callbacks = {};
4122
4123                                 var onGlobalMessage = function (event) {
4124                                         if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
4125                                                 var i = +event.data.split(':')[1];
4126                                                 callbacks[i]();
4127                                                 delete callbacks[i];
4128                                         }
4129                                 };
4130
4131                                 main.addEventListener("message", onGlobalMessage, false);
4132
4133                                 return function setAsap(callback) {
4134                                         var i = getNewIndex();
4135                                         callbacks[i] = callback;
4136                                         main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
4137                                 };
4138
4139                                 // IE browsers without postMessage
4140                         } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
4141
4142                                 return function setAsap(callback) {
4143                                         scriptEl = document.createElement("script");
4144                                         scriptEl.onreadystatechange = function onreadystatechange() {
4145                                                 scriptEl.onreadystatechange = null;
4146                                                 scriptEl.parentNode.removeChild(scriptEl);
4147                                                 scriptEl = null;
4148                                                 callback();
4149                                         };
4150                                         document.body.appendChild(scriptEl);
4151                                 };
4152
4153                         // All other browsers and node
4154                         } else {
4155
4156                                 timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
4157                                 return function setAsap(callback) {
4158                                         timeoutFn(callback);
4159                                 };
4160                         }
4161
4162                 })();
4163
4164                 if ( module.exports) {
4165                         module.exports = setAsap;
4166                 } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) {
4167                         undefined$1(function () {
4168                                 return setAsap;
4169                         });
4170                 } else {
4171                         main.setAsap = setAsap;
4172                 }
4173         })(commonjsGlobal);
4174         });
4175
4176         var performanceNow = createCommonjsModule(function (module) {
4177         // Generated by CoffeeScript 1.12.2
4178         (function() {
4179           var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
4180
4181           if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
4182             module.exports = function() {
4183               return performance.now();
4184             };
4185           } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
4186             module.exports = function() {
4187               return (getNanoSeconds() - nodeLoadTime) / 1e6;
4188             };
4189             hrtime = process.hrtime;
4190             getNanoSeconds = function() {
4191               var hr;
4192               hr = hrtime();
4193               return hr[0] * 1e9 + hr[1];
4194             };
4195             moduleLoadTime = getNanoSeconds();
4196             upTime = process.uptime() * 1e9;
4197             nodeLoadTime = moduleLoadTime - upTime;
4198           } else if (Date.now) {
4199             module.exports = function() {
4200               return Date.now() - loadTime;
4201             };
4202             loadTime = Date.now();
4203           } else {
4204             module.exports = function() {
4205               return new Date().getTime() - loadTime;
4206             };
4207             loadTime = new Date().getTime();
4208           }
4209
4210         }).call(commonjsGlobal);
4211
4212
4213         });
4214
4215         var root = typeof window === 'undefined' ? commonjsGlobal : window
4216           , vendors = ['moz', 'webkit']
4217           , suffix = 'AnimationFrame'
4218           , raf = root['request' + suffix]
4219           , caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
4220
4221         for(var i = 0; !raf && i < vendors.length; i++) {
4222           raf = root[vendors[i] + 'Request' + suffix];
4223           caf = root[vendors[i] + 'Cancel' + suffix]
4224               || root[vendors[i] + 'CancelRequest' + suffix];
4225         }
4226
4227         // Some versions of FF have rAF but not cAF
4228         if(!raf || !caf) {
4229           var last = 0
4230             , id$3 = 0
4231             , queue = []
4232             , frameDuration = 1000 / 60;
4233
4234           raf = function(callback) {
4235             if(queue.length === 0) {
4236               var _now = performanceNow()
4237                 , next = Math.max(0, frameDuration - (_now - last));
4238               last = next + _now;
4239               setTimeout(function() {
4240                 var cp = queue.slice(0);
4241                 // Clear queue here to prevent
4242                 // callbacks from appending listeners
4243                 // to the current frame's queue
4244                 queue.length = 0;
4245                 for(var i = 0; i < cp.length; i++) {
4246                   if(!cp[i].cancelled) {
4247                     try{
4248                       cp[i].callback(last);
4249                     } catch(e) {
4250                       setTimeout(function() { throw e }, 0);
4251                     }
4252                   }
4253                 }
4254               }, Math.round(next));
4255             }
4256             queue.push({
4257               handle: ++id$3,
4258               callback: callback,
4259               cancelled: false
4260             });
4261             return id$3
4262           };
4263
4264           caf = function(handle) {
4265             for(var i = 0; i < queue.length; i++) {
4266               if(queue[i].handle === handle) {
4267                 queue[i].cancelled = true;
4268               }
4269             }
4270           };
4271         }
4272
4273         var raf_1 = function(fn) {
4274           // Wrap in a new function to prevent
4275           // `cancel` potentially being assigned
4276           // to the native rAF function
4277           return raf.call(root, fn)
4278         };
4279         var cancel = function() {
4280           caf.apply(root, arguments);
4281         };
4282         var polyfill$d = function(object) {
4283           if (!object) {
4284             object = root;
4285           }
4286           object.requestAnimationFrame = raf;
4287           object.cancelAnimationFrame = caf;
4288         };
4289         raf_1.cancel = cancel;
4290         raf_1.polyfill = polyfill$d;
4291
4292         var support = {
4293           searchParams: 'URLSearchParams' in self,
4294           iterable: 'Symbol' in self && 'iterator' in Symbol,
4295           blob:
4296             'FileReader' in self &&
4297             'Blob' in self &&
4298             (function() {
4299               try {
4300                 new Blob();
4301                 return true
4302               } catch (e) {
4303                 return false
4304               }
4305             })(),
4306           formData: 'FormData' in self,
4307           arrayBuffer: 'ArrayBuffer' in self
4308         };
4309
4310         function isDataView(obj) {
4311           return obj && DataView.prototype.isPrototypeOf(obj)
4312         }
4313
4314         if (support.arrayBuffer) {
4315           var viewClasses = [
4316             '[object Int8Array]',
4317             '[object Uint8Array]',
4318             '[object Uint8ClampedArray]',
4319             '[object Int16Array]',
4320             '[object Uint16Array]',
4321             '[object Int32Array]',
4322             '[object Uint32Array]',
4323             '[object Float32Array]',
4324             '[object Float64Array]'
4325           ];
4326
4327           var isArrayBufferView =
4328             ArrayBuffer.isView ||
4329             function(obj) {
4330               return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
4331             };
4332         }
4333
4334         function normalizeName(name) {
4335           if (typeof name !== 'string') {
4336             name = String(name);
4337           }
4338           if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
4339             throw new TypeError('Invalid character in header field name')
4340           }
4341           return name.toLowerCase()
4342         }
4343
4344         function normalizeValue(value) {
4345           if (typeof value !== 'string') {
4346             value = String(value);
4347           }
4348           return value
4349         }
4350
4351         // Build a destructive iterator for the value list
4352         function iteratorFor(items) {
4353           var iterator = {
4354             next: function() {
4355               var value = items.shift();
4356               return {done: value === undefined, value: value}
4357             }
4358           };
4359
4360           if (support.iterable) {
4361             iterator[Symbol.iterator] = function() {
4362               return iterator
4363             };
4364           }
4365
4366           return iterator
4367         }
4368
4369         function Headers(headers) {
4370           this.map = {};
4371
4372           if (headers instanceof Headers) {
4373             headers.forEach(function(value, name) {
4374               this.append(name, value);
4375             }, this);
4376           } else if (Array.isArray(headers)) {
4377             headers.forEach(function(header) {
4378               this.append(header[0], header[1]);
4379             }, this);
4380           } else if (headers) {
4381             Object.getOwnPropertyNames(headers).forEach(function(name) {
4382               this.append(name, headers[name]);
4383             }, this);
4384           }
4385         }
4386
4387         Headers.prototype.append = function(name, value) {
4388           name = normalizeName(name);
4389           value = normalizeValue(value);
4390           var oldValue = this.map[name];
4391           this.map[name] = oldValue ? oldValue + ', ' + value : value;
4392         };
4393
4394         Headers.prototype['delete'] = function(name) {
4395           delete this.map[normalizeName(name)];
4396         };
4397
4398         Headers.prototype.get = function(name) {
4399           name = normalizeName(name);
4400           return this.has(name) ? this.map[name] : null
4401         };
4402
4403         Headers.prototype.has = function(name) {
4404           return this.map.hasOwnProperty(normalizeName(name))
4405         };
4406
4407         Headers.prototype.set = function(name, value) {
4408           this.map[normalizeName(name)] = normalizeValue(value);
4409         };
4410
4411         Headers.prototype.forEach = function(callback, thisArg) {
4412           for (var name in this.map) {
4413             if (this.map.hasOwnProperty(name)) {
4414               callback.call(thisArg, this.map[name], name, this);
4415             }
4416           }
4417         };
4418
4419         Headers.prototype.keys = function() {
4420           var items = [];
4421           this.forEach(function(value, name) {
4422             items.push(name);
4423           });
4424           return iteratorFor(items)
4425         };
4426
4427         Headers.prototype.values = function() {
4428           var items = [];
4429           this.forEach(function(value) {
4430             items.push(value);
4431           });
4432           return iteratorFor(items)
4433         };
4434
4435         Headers.prototype.entries = function() {
4436           var items = [];
4437           this.forEach(function(value, name) {
4438             items.push([name, value]);
4439           });
4440           return iteratorFor(items)
4441         };
4442
4443         if (support.iterable) {
4444           Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
4445         }
4446
4447         function consumed(body) {
4448           if (body.bodyUsed) {
4449             return Promise.reject(new TypeError('Already read'))
4450           }
4451           body.bodyUsed = true;
4452         }
4453
4454         function fileReaderReady(reader) {
4455           return new Promise(function(resolve, reject) {
4456             reader.onload = function() {
4457               resolve(reader.result);
4458             };
4459             reader.onerror = function() {
4460               reject(reader.error);
4461             };
4462           })
4463         }
4464
4465         function readBlobAsArrayBuffer(blob) {
4466           var reader = new FileReader();
4467           var promise = fileReaderReady(reader);
4468           reader.readAsArrayBuffer(blob);
4469           return promise
4470         }
4471
4472         function readBlobAsText(blob) {
4473           var reader = new FileReader();
4474           var promise = fileReaderReady(reader);
4475           reader.readAsText(blob);
4476           return promise
4477         }
4478
4479         function readArrayBufferAsText(buf) {
4480           var view = new Uint8Array(buf);
4481           var chars = new Array(view.length);
4482
4483           for (var i = 0; i < view.length; i++) {
4484             chars[i] = String.fromCharCode(view[i]);
4485           }
4486           return chars.join('')
4487         }
4488
4489         function bufferClone(buf) {
4490           if (buf.slice) {
4491             return buf.slice(0)
4492           } else {
4493             var view = new Uint8Array(buf.byteLength);
4494             view.set(new Uint8Array(buf));
4495             return view.buffer
4496           }
4497         }
4498
4499         function Body() {
4500           this.bodyUsed = false;
4501
4502           this._initBody = function(body) {
4503             this._bodyInit = body;
4504             if (!body) {
4505               this._bodyText = '';
4506             } else if (typeof body === 'string') {
4507               this._bodyText = body;
4508             } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
4509               this._bodyBlob = body;
4510             } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
4511               this._bodyFormData = body;
4512             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4513               this._bodyText = body.toString();
4514             } else if (support.arrayBuffer && support.blob && isDataView(body)) {
4515               this._bodyArrayBuffer = bufferClone(body.buffer);
4516               // IE 10-11 can't handle a DataView body.
4517               this._bodyInit = new Blob([this._bodyArrayBuffer]);
4518             } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
4519               this._bodyArrayBuffer = bufferClone(body);
4520             } else {
4521               this._bodyText = body = Object.prototype.toString.call(body);
4522             }
4523
4524             if (!this.headers.get('content-type')) {
4525               if (typeof body === 'string') {
4526                 this.headers.set('content-type', 'text/plain;charset=UTF-8');
4527               } else if (this._bodyBlob && this._bodyBlob.type) {
4528                 this.headers.set('content-type', this._bodyBlob.type);
4529               } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4530                 this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
4531               }
4532             }
4533           };
4534
4535           if (support.blob) {
4536             this.blob = function() {
4537               var rejected = consumed(this);
4538               if (rejected) {
4539                 return rejected
4540               }
4541
4542               if (this._bodyBlob) {
4543                 return Promise.resolve(this._bodyBlob)
4544               } else if (this._bodyArrayBuffer) {
4545                 return Promise.resolve(new Blob([this._bodyArrayBuffer]))
4546               } else if (this._bodyFormData) {
4547                 throw new Error('could not read FormData body as blob')
4548               } else {
4549                 return Promise.resolve(new Blob([this._bodyText]))
4550               }
4551             };
4552
4553             this.arrayBuffer = function() {
4554               if (this._bodyArrayBuffer) {
4555                 return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
4556               } else {
4557                 return this.blob().then(readBlobAsArrayBuffer)
4558               }
4559             };
4560           }
4561
4562           this.text = function() {
4563             var rejected = consumed(this);
4564             if (rejected) {
4565               return rejected
4566             }
4567
4568             if (this._bodyBlob) {
4569               return readBlobAsText(this._bodyBlob)
4570             } else if (this._bodyArrayBuffer) {
4571               return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
4572             } else if (this._bodyFormData) {
4573               throw new Error('could not read FormData body as text')
4574             } else {
4575               return Promise.resolve(this._bodyText)
4576             }
4577           };
4578
4579           if (support.formData) {
4580             this.formData = function() {
4581               return this.text().then(decode)
4582             };
4583           }
4584
4585           this.json = function() {
4586             return this.text().then(JSON.parse)
4587           };
4588
4589           return this
4590         }
4591
4592         // HTTP methods whose capitalization should be normalized
4593         var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
4594
4595         function normalizeMethod(method) {
4596           var upcased = method.toUpperCase();
4597           return methods.indexOf(upcased) > -1 ? upcased : method
4598         }
4599
4600         function Request(input, options) {
4601           options = options || {};
4602           var body = options.body;
4603
4604           if (input instanceof Request) {
4605             if (input.bodyUsed) {
4606               throw new TypeError('Already read')
4607             }
4608             this.url = input.url;
4609             this.credentials = input.credentials;
4610             if (!options.headers) {
4611               this.headers = new Headers(input.headers);
4612             }
4613             this.method = input.method;
4614             this.mode = input.mode;
4615             this.signal = input.signal;
4616             if (!body && input._bodyInit != null) {
4617               body = input._bodyInit;
4618               input.bodyUsed = true;
4619             }
4620           } else {
4621             this.url = String(input);
4622           }
4623
4624           this.credentials = options.credentials || this.credentials || 'same-origin';
4625           if (options.headers || !this.headers) {
4626             this.headers = new Headers(options.headers);
4627           }
4628           this.method = normalizeMethod(options.method || this.method || 'GET');
4629           this.mode = options.mode || this.mode || null;
4630           this.signal = options.signal || this.signal;
4631           this.referrer = null;
4632
4633           if ((this.method === 'GET' || this.method === 'HEAD') && body) {
4634             throw new TypeError('Body not allowed for GET or HEAD requests')
4635           }
4636           this._initBody(body);
4637         }
4638
4639         Request.prototype.clone = function() {
4640           return new Request(this, {body: this._bodyInit})
4641         };
4642
4643         function decode(body) {
4644           var form = new FormData();
4645           body
4646             .trim()
4647             .split('&')
4648             .forEach(function(bytes) {
4649               if (bytes) {
4650                 var split = bytes.split('=');
4651                 var name = split.shift().replace(/\+/g, ' ');
4652                 var value = split.join('=').replace(/\+/g, ' ');
4653                 form.append(decodeURIComponent(name), decodeURIComponent(value));
4654               }
4655             });
4656           return form
4657         }
4658
4659         function parseHeaders(rawHeaders) {
4660           var headers = new Headers();
4661           // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
4662           // https://tools.ietf.org/html/rfc7230#section-3.2
4663           var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
4664           preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
4665             var parts = line.split(':');
4666             var key = parts.shift().trim();
4667             if (key) {
4668               var value = parts.join(':').trim();
4669               headers.append(key, value);
4670             }
4671           });
4672           return headers
4673         }
4674
4675         Body.call(Request.prototype);
4676
4677         function Response(bodyInit, options) {
4678           if (!options) {
4679             options = {};
4680           }
4681
4682           this.type = 'default';
4683           this.status = options.status === undefined ? 200 : options.status;
4684           this.ok = this.status >= 200 && this.status < 300;
4685           this.statusText = 'statusText' in options ? options.statusText : 'OK';
4686           this.headers = new Headers(options.headers);
4687           this.url = options.url || '';
4688           this._initBody(bodyInit);
4689         }
4690
4691         Body.call(Response.prototype);
4692
4693         Response.prototype.clone = function() {
4694           return new Response(this._bodyInit, {
4695             status: this.status,
4696             statusText: this.statusText,
4697             headers: new Headers(this.headers),
4698             url: this.url
4699           })
4700         };
4701
4702         Response.error = function() {
4703           var response = new Response(null, {status: 0, statusText: ''});
4704           response.type = 'error';
4705           return response
4706         };
4707
4708         var redirectStatuses = [301, 302, 303, 307, 308];
4709
4710         Response.redirect = function(url, status) {
4711           if (redirectStatuses.indexOf(status) === -1) {
4712             throw new RangeError('Invalid status code')
4713           }
4714
4715           return new Response(null, {status: status, headers: {location: url}})
4716         };
4717
4718         var DOMException$1 = self.DOMException;
4719         try {
4720           new DOMException$1();
4721         } catch (err) {
4722           DOMException$1 = function(message, name) {
4723             this.message = message;
4724             this.name = name;
4725             var error = Error(message);
4726             this.stack = error.stack;
4727           };
4728           DOMException$1.prototype = Object.create(Error.prototype);
4729           DOMException$1.prototype.constructor = DOMException$1;
4730         }
4731
4732         function fetch$1(input, init) {
4733           return new Promise(function(resolve, reject) {
4734             var request = new Request(input, init);
4735
4736             if (request.signal && request.signal.aborted) {
4737               return reject(new DOMException$1('Aborted', 'AbortError'))
4738             }
4739
4740             var xhr = new XMLHttpRequest();
4741
4742             function abortXhr() {
4743               xhr.abort();
4744             }
4745
4746             xhr.onload = function() {
4747               var options = {
4748                 status: xhr.status,
4749                 statusText: xhr.statusText,
4750                 headers: parseHeaders(xhr.getAllResponseHeaders() || '')
4751               };
4752               options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
4753               var body = 'response' in xhr ? xhr.response : xhr.responseText;
4754               resolve(new Response(body, options));
4755             };
4756
4757             xhr.onerror = function() {
4758               reject(new TypeError('Network request failed'));
4759             };
4760
4761             xhr.ontimeout = function() {
4762               reject(new TypeError('Network request failed'));
4763             };
4764
4765             xhr.onabort = function() {
4766               reject(new DOMException$1('Aborted', 'AbortError'));
4767             };
4768
4769             xhr.open(request.method, request.url, true);
4770
4771             if (request.credentials === 'include') {
4772               xhr.withCredentials = true;
4773             } else if (request.credentials === 'omit') {
4774               xhr.withCredentials = false;
4775             }
4776
4777             if ('responseType' in xhr && support.blob) {
4778               xhr.responseType = 'blob';
4779             }
4780
4781             request.headers.forEach(function(value, name) {
4782               xhr.setRequestHeader(name, value);
4783             });
4784
4785             if (request.signal) {
4786               request.signal.addEventListener('abort', abortXhr);
4787
4788               xhr.onreadystatechange = function() {
4789                 // DONE (success or failure)
4790                 if (xhr.readyState === 4) {
4791                   request.signal.removeEventListener('abort', abortXhr);
4792                 }
4793               };
4794             }
4795
4796             xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
4797           })
4798         }
4799
4800         fetch$1.polyfill = true;
4801
4802         if (!self.fetch) {
4803           self.fetch = fetch$1;
4804           self.Headers = Headers;
4805           self.Request = Request;
4806           self.Response = Response;
4807         }
4808
4809         var lib = createCommonjsModule(function (module, exports) {
4810         Object.defineProperty(exports, "__esModule", { value: true });
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821         if (!window.Set) {
4822             window.Set = es6Set;
4823         }
4824         if (!window.Map) {
4825             window.Map = es6Map;
4826         }
4827         if (!window.Promise) {
4828             window.Promise = polyfill$c;
4829             window.Promise._immediateFn = setAsap;
4830         }
4831         if (!Array.prototype.find) {
4832             array_prototype_find.shim();
4833         }
4834         if (!Array.prototype.findIndex) {
4835             array_prototype_findindex.shim();
4836         }
4837         if (!Array.from) {
4838             array_from.shim();
4839         }
4840         if (!Object.values) {
4841             object_values.shim();
4842         }
4843         if (!Object.assign) {
4844             object_assign.shim();
4845         }
4846         if (!window.requestAnimationFrame || !window.cancelAnimationFrame) {
4847             window.requestAnimationFrame = raf_1;
4848             window.cancelAnimationFrame = raf_1.cancel;
4849         }
4850
4851         var finalFetch = window.fetch;
4852         var finalPromise = window.Promise;
4853         window.fetch = function (input, init) {
4854             try {
4855                 return finalFetch(input, init);
4856             }
4857             catch (error) {
4858                 return new finalPromise(function (_, reject) { return reject(error); });
4859             }
4860         };
4861         });
4862
4863         unwrapExports(lib);
4864
4865         (function (factory) {
4866           
4867           factory();
4868         }(function () {
4869           function _classCallCheck(instance, Constructor) {
4870             if (!(instance instanceof Constructor)) {
4871               throw new TypeError("Cannot call a class as a function");
4872             }
4873           }
4874
4875           function _defineProperties(target, props) {
4876             for (var i = 0; i < props.length; i++) {
4877               var descriptor = props[i];
4878               descriptor.enumerable = descriptor.enumerable || false;
4879               descriptor.configurable = true;
4880               if ("value" in descriptor) descriptor.writable = true;
4881               Object.defineProperty(target, descriptor.key, descriptor);
4882             }
4883           }
4884
4885           function _createClass(Constructor, protoProps, staticProps) {
4886             if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4887             if (staticProps) _defineProperties(Constructor, staticProps);
4888             return Constructor;
4889           }
4890
4891           function _inherits(subClass, superClass) {
4892             if (typeof superClass !== "function" && superClass !== null) {
4893               throw new TypeError("Super expression must either be null or a function");
4894             }
4895
4896             subClass.prototype = Object.create(superClass && superClass.prototype, {
4897               constructor: {
4898                 value: subClass,
4899                 writable: true,
4900                 configurable: true
4901               }
4902             });
4903             if (superClass) _setPrototypeOf(subClass, superClass);
4904           }
4905
4906           function _getPrototypeOf(o) {
4907             _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4908               return o.__proto__ || Object.getPrototypeOf(o);
4909             };
4910             return _getPrototypeOf(o);
4911           }
4912
4913           function _setPrototypeOf(o, p) {
4914             _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4915               o.__proto__ = p;
4916               return o;
4917             };
4918
4919             return _setPrototypeOf(o, p);
4920           }
4921
4922           function _assertThisInitialized(self) {
4923             if (self === void 0) {
4924               throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4925             }
4926
4927             return self;
4928           }
4929
4930           function _possibleConstructorReturn(self, call) {
4931             if (call && (typeof call === "object" || typeof call === "function")) {
4932               return call;
4933             }
4934
4935             return _assertThisInitialized(self);
4936           }
4937
4938           function _superPropBase(object, property) {
4939             while (!Object.prototype.hasOwnProperty.call(object, property)) {
4940               object = _getPrototypeOf(object);
4941               if (object === null) break;
4942             }
4943
4944             return object;
4945           }
4946
4947           function _get(target, property, receiver) {
4948             if (typeof Reflect !== "undefined" && Reflect.get) {
4949               _get = Reflect.get;
4950             } else {
4951               _get = function _get(target, property, receiver) {
4952                 var base = _superPropBase(target, property);
4953
4954                 if (!base) return;
4955                 var desc = Object.getOwnPropertyDescriptor(base, property);
4956
4957                 if (desc.get) {
4958                   return desc.get.call(receiver);
4959                 }
4960
4961                 return desc.value;
4962               };
4963             }
4964
4965             return _get(target, property, receiver || target);
4966           }
4967
4968           var Emitter =
4969           /*#__PURE__*/
4970           function () {
4971             function Emitter() {
4972               _classCallCheck(this, Emitter);
4973
4974               Object.defineProperty(this, 'listeners', {
4975                 value: {},
4976                 writable: true,
4977                 configurable: true
4978               });
4979             }
4980
4981             _createClass(Emitter, [{
4982               key: "addEventListener",
4983               value: function addEventListener(type, callback) {
4984                 if (!(type in this.listeners)) {
4985                   this.listeners[type] = [];
4986                 }
4987
4988                 this.listeners[type].push(callback);
4989               }
4990             }, {
4991               key: "removeEventListener",
4992               value: function removeEventListener(type, callback) {
4993                 if (!(type in this.listeners)) {
4994                   return;
4995                 }
4996
4997                 var stack = this.listeners[type];
4998
4999                 for (var i = 0, l = stack.length; i < l; i++) {
5000                   if (stack[i] === callback) {
5001                     stack.splice(i, 1);
5002                     return;
5003                   }
5004                 }
5005               }
5006             }, {
5007               key: "dispatchEvent",
5008               value: function dispatchEvent(event) {
5009                 var _this = this;
5010
5011                 if (!(event.type in this.listeners)) {
5012                   return;
5013                 }
5014
5015                 var debounce = function debounce(callback) {
5016                   setTimeout(function () {
5017                     return callback.call(_this, event);
5018                   });
5019                 };
5020
5021                 var stack = this.listeners[event.type];
5022
5023                 for (var i = 0, l = stack.length; i < l; i++) {
5024                   debounce(stack[i]);
5025                 }
5026
5027                 return !event.defaultPrevented;
5028               }
5029             }]);
5030
5031             return Emitter;
5032           }();
5033
5034           var AbortSignal =
5035           /*#__PURE__*/
5036           function (_Emitter) {
5037             _inherits(AbortSignal, _Emitter);
5038
5039             function AbortSignal() {
5040               var _this2;
5041
5042               _classCallCheck(this, AbortSignal);
5043
5044               _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
5045               // constructor has failed to run, then "this.listeners" will still be undefined and then we call
5046               // the parent constructor directly instead as a workaround. For general details, see babel bug:
5047               // https://github.com/babel/babel/issues/3041
5048               // This hack was added as a fix for the issue described here:
5049               // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
5050
5051               if (!_this2.listeners) {
5052                 Emitter.call(_assertThisInitialized(_this2));
5053               } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
5054               // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
5055
5056
5057               Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {
5058                 value: false,
5059                 writable: true,
5060                 configurable: true
5061               });
5062               Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {
5063                 value: null,
5064                 writable: true,
5065                 configurable: true
5066               });
5067               return _this2;
5068             }
5069
5070             _createClass(AbortSignal, [{
5071               key: "toString",
5072               value: function toString() {
5073                 return '[object AbortSignal]';
5074               }
5075             }, {
5076               key: "dispatchEvent",
5077               value: function dispatchEvent(event) {
5078                 if (event.type === 'abort') {
5079                   this.aborted = true;
5080
5081                   if (typeof this.onabort === 'function') {
5082                     this.onabort.call(this, event);
5083                   }
5084                 }
5085
5086                 _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
5087               }
5088             }]);
5089
5090             return AbortSignal;
5091           }(Emitter);
5092           var AbortController =
5093           /*#__PURE__*/
5094           function () {
5095             function AbortController() {
5096               _classCallCheck(this, AbortController);
5097
5098               // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
5099               // we want Object.keys(new AbortController()) to be [] for compat with the native impl
5100               Object.defineProperty(this, 'signal', {
5101                 value: new AbortSignal(),
5102                 writable: true,
5103                 configurable: true
5104               });
5105             }
5106
5107             _createClass(AbortController, [{
5108               key: "abort",
5109               value: function abort() {
5110                 var event;
5111
5112                 try {
5113                   event = new Event('abort');
5114                 } catch (e) {
5115                   if (typeof document !== 'undefined') {
5116                     if (!document.createEvent) {
5117                       // For Internet Explorer 8:
5118                       event = document.createEventObject();
5119                       event.type = 'abort';
5120                     } else {
5121                       // For Internet Explorer 11:
5122                       event = document.createEvent('Event');
5123                       event.initEvent('abort', false, false);
5124                     }
5125                   } else {
5126                     // Fallback where document isn't available:
5127                     event = {
5128                       type: 'abort',
5129                       bubbles: false,
5130                       cancelable: false
5131                     };
5132                   }
5133                 }
5134
5135                 this.signal.dispatchEvent(event);
5136               }
5137             }, {
5138               key: "toString",
5139               value: function toString() {
5140                 return '[object AbortController]';
5141               }
5142             }]);
5143
5144             return AbortController;
5145           }();
5146
5147           if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
5148             // These are necessary to make sure that we get correct output for:
5149             // Object.prototype.toString.call(new AbortController())
5150             AbortController.prototype[Symbol.toStringTag] = 'AbortController';
5151             AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
5152           }
5153
5154           function polyfillNeeded(self) {
5155             if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5156               console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
5157               return true;
5158             } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5159             // defining window.Request, and this polyfill need to work on top of unfetch
5160             // so the below feature detection needs the !self.AbortController part.
5161             // The Request.prototype check is also needed because Safari versions 11.1.2
5162             // up to and including 12.1.x has a window.AbortController present but still
5163             // does NOT correctly implement abortable fetch:
5164             // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
5165
5166
5167             return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
5168           }
5169
5170           /**
5171            * Note: the "fetch.Request" default value is available for fetch imported from
5172            * the "node-fetch" package and not in browsers. This is OK since browsers
5173            * will be importing umd-polyfill.js from that path "self" is passed the
5174            * decorator so the default value will not be used (because browsers that define
5175            * fetch also has Request). One quirky setup where self.fetch exists but
5176            * self.Request does not is when the "unfetch" minimal fetch polyfill is used
5177            * on top of IE11; for this case the browser will try to use the fetch.Request
5178            * default value which in turn will be undefined but then then "if (Request)"
5179            * will ensure that you get a patched fetch but still no Request (as expected).
5180            * @param {fetch, Request = fetch.Request}
5181            * @returns {fetch: abortableFetch, Request: AbortableRequest}
5182            */
5183
5184           function abortableFetchDecorator(patchTargets) {
5185             if ('function' === typeof patchTargets) {
5186               patchTargets = {
5187                 fetch: patchTargets
5188               };
5189             }
5190
5191             var _patchTargets = patchTargets,
5192                 fetch = _patchTargets.fetch,
5193                 _patchTargets$Request = _patchTargets.Request,
5194                 NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
5195                 NativeAbortController = _patchTargets.AbortController,
5196                 _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
5197                 __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
5198
5199             if (!polyfillNeeded({
5200               fetch: fetch,
5201               Request: NativeRequest,
5202               AbortController: NativeAbortController,
5203               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
5204             })) {
5205               return {
5206                 fetch: fetch,
5207                 Request: Request
5208               };
5209             }
5210
5211             var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5212             // defining window.Request, and this polyfill need to work on top of unfetch
5213             // hence we only patch it if it's available. Also we don't patch it if signal
5214             // is already available on the Request prototype because in this case support
5215             // is present and the patching below can cause a crash since it assigns to
5216             // request.signal which is technically a read-only property. This latter error
5217             // happens when you run the main5.js node-fetch example in the repo
5218             // "abortcontroller-polyfill-examples". The exact error is:
5219             //   request.signal = init.signal;
5220             //   ^
5221             // TypeError: Cannot set property signal of #<Request> which has only a getter
5222
5223             if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5224               Request = function Request(input, init) {
5225                 var signal;
5226
5227                 if (init && init.signal) {
5228                   signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
5229                   // been installed because if we're running on top of a browser with a
5230                   // working native AbortController (i.e. the polyfill was installed due to
5231                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5232                   // fake AbortSignal to the native fetch will trigger:
5233                   // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
5234
5235                   delete init.signal;
5236                 }
5237
5238                 var request = new NativeRequest(input, init);
5239
5240                 if (signal) {
5241                   Object.defineProperty(request, 'signal', {
5242                     writable: false,
5243                     enumerable: false,
5244                     configurable: true,
5245                     value: signal
5246                   });
5247                 }
5248
5249                 return request;
5250               };
5251
5252               Request.prototype = NativeRequest.prototype;
5253             }
5254
5255             var realFetch = fetch;
5256
5257             var abortableFetch = function abortableFetch(input, init) {
5258               var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
5259
5260               if (signal) {
5261                 var abortError;
5262
5263                 try {
5264                   abortError = new DOMException('Aborted', 'AbortError');
5265                 } catch (err) {
5266                   // IE 11 does not support calling the DOMException constructor, use a
5267                   // regular error object on it instead.
5268                   abortError = new Error('Aborted');
5269                   abortError.name = 'AbortError';
5270                 } // Return early if already aborted, thus avoiding making an HTTP request
5271
5272
5273                 if (signal.aborted) {
5274                   return Promise.reject(abortError);
5275                 } // Turn an event into a promise, reject it once `abort` is dispatched
5276
5277
5278                 var cancellation = new Promise(function (_, reject) {
5279                   signal.addEventListener('abort', function () {
5280                     return reject(abortError);
5281                   }, {
5282                     once: true
5283                   });
5284                 });
5285
5286                 if (init && init.signal) {
5287                   // Never pass .signal to the native implementation when the polyfill has
5288                   // been installed because if we're running on top of a browser with a
5289                   // working native AbortController (i.e. the polyfill was installed due to
5290                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5291                   // fake AbortSignal to the native fetch will trigger:
5292                   // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
5293                   delete init.signal;
5294                 } // Return the fastest promise (don't need to wait for request to finish)
5295
5296
5297                 return Promise.race([cancellation, realFetch(input, init)]);
5298               }
5299
5300               return realFetch(input, init);
5301             };
5302
5303             return {
5304               fetch: abortableFetch,
5305               Request: Request
5306             };
5307           }
5308
5309           (function (self) {
5310
5311             if (!polyfillNeeded(self)) {
5312               return;
5313             }
5314
5315             if (!self.fetch) {
5316               console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
5317               return;
5318             }
5319
5320             var _abortableFetch = abortableFetchDecorator(self),
5321                 fetch = _abortableFetch.fetch,
5322                 Request = _abortableFetch.Request;
5323
5324             self.fetch = fetch;
5325             self.Request = Request;
5326             Object.defineProperty(self, 'AbortController', {
5327               writable: true,
5328               enumerable: false,
5329               configurable: true,
5330               value: AbortController
5331             });
5332             Object.defineProperty(self, 'AbortSignal', {
5333               writable: true,
5334               enumerable: false,
5335               configurable: true,
5336               value: AbortSignal
5337             });
5338           })(typeof self !== 'undefined' ? self : commonjsGlobal);
5339
5340         }));
5341
5342         var version = "5.9.7";
5343
5344         function d3_ascending(a, b) {
5345           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
5346         }
5347
5348         function d3_bisector(compare) {
5349           if (compare.length === 1) compare = ascendingComparator(compare);
5350           return {
5351             left: function(a, x, lo, hi) {
5352               if (lo == null) lo = 0;
5353               if (hi == null) hi = a.length;
5354               while (lo < hi) {
5355                 var mid = lo + hi >>> 1;
5356                 if (compare(a[mid], x) < 0) lo = mid + 1;
5357                 else hi = mid;
5358               }
5359               return lo;
5360             },
5361             right: function(a, x, lo, hi) {
5362               if (lo == null) lo = 0;
5363               if (hi == null) hi = a.length;
5364               while (lo < hi) {
5365                 var mid = lo + hi >>> 1;
5366                 if (compare(a[mid], x) > 0) hi = mid;
5367                 else lo = mid + 1;
5368               }
5369               return lo;
5370             }
5371           };
5372         }
5373
5374         function ascendingComparator(f) {
5375           return function(d, x) {
5376             return d3_ascending(f(d), x);
5377           };
5378         }
5379
5380         var ascendingBisect = d3_bisector(d3_ascending);
5381         var bisectRight = ascendingBisect.right;
5382         var bisectLeft = ascendingBisect.left;
5383
5384         function pairs(array, f) {
5385           if (f == null) f = pair;
5386           var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
5387           while (i < n) pairs[i] = f(p, p = array[++i]);
5388           return pairs;
5389         }
5390
5391         function pair(a, b) {
5392           return [a, b];
5393         }
5394
5395         function cross(values0, values1, reduce) {
5396           var n0 = values0.length,
5397               n1 = values1.length,
5398               values = new Array(n0 * n1),
5399               i0,
5400               i1,
5401               i,
5402               value0;
5403
5404           if (reduce == null) reduce = pair;
5405
5406           for (i0 = i = 0; i0 < n0; ++i0) {
5407             for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
5408               values[i] = reduce(value0, values1[i1]);
5409             }
5410           }
5411
5412           return values;
5413         }
5414
5415         function d3_descending(a, b) {
5416           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
5417         }
5418
5419         function number(x) {
5420           return x === null ? NaN : +x;
5421         }
5422
5423         function variance(values, valueof) {
5424           var n = values.length,
5425               m = 0,
5426               i = -1,
5427               mean = 0,
5428               value,
5429               delta,
5430               sum = 0;
5431
5432           if (valueof == null) {
5433             while (++i < n) {
5434               if (!isNaN(value = number(values[i]))) {
5435                 delta = value - mean;
5436                 mean += delta / ++m;
5437                 sum += delta * (value - mean);
5438               }
5439             }
5440           }
5441
5442           else {
5443             while (++i < n) {
5444               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5445                 delta = value - mean;
5446                 mean += delta / ++m;
5447                 sum += delta * (value - mean);
5448               }
5449             }
5450           }
5451
5452           if (m > 1) return sum / (m - 1);
5453         }
5454
5455         function deviation(array, f) {
5456           var v = variance(array, f);
5457           return v ? Math.sqrt(v) : v;
5458         }
5459
5460         function extent(values, valueof) {
5461           var n = values.length,
5462               i = -1,
5463               value,
5464               min,
5465               max;
5466
5467           if (valueof == null) {
5468             while (++i < n) { // Find the first comparable value.
5469               if ((value = values[i]) != null && value >= value) {
5470                 min = max = value;
5471                 while (++i < n) { // Compare the remaining values.
5472                   if ((value = values[i]) != null) {
5473                     if (min > value) min = value;
5474                     if (max < value) max = value;
5475                   }
5476                 }
5477               }
5478             }
5479           }
5480
5481           else {
5482             while (++i < n) { // Find the first comparable value.
5483               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5484                 min = max = value;
5485                 while (++i < n) { // Compare the remaining values.
5486                   if ((value = valueof(values[i], i, values)) != null) {
5487                     if (min > value) min = value;
5488                     if (max < value) max = value;
5489                   }
5490                 }
5491               }
5492             }
5493           }
5494
5495           return [min, max];
5496         }
5497
5498         var array$1 = Array.prototype;
5499
5500         var slice$4 = array$1.slice;
5501         var map$2 = array$1.map;
5502
5503         function constant(x) {
5504           return function() {
5505             return x;
5506           };
5507         }
5508
5509         function identity(x) {
5510           return x;
5511         }
5512
5513         function d3_range(start, stop, step) {
5514           start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
5515
5516           var i = -1,
5517               n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
5518               range = new Array(n);
5519
5520           while (++i < n) {
5521             range[i] = start + i * step;
5522           }
5523
5524           return range;
5525         }
5526
5527         var e10 = Math.sqrt(50),
5528             e5 = Math.sqrt(10),
5529             e2 = Math.sqrt(2);
5530
5531         function ticks(start, stop, count) {
5532           var reverse,
5533               i = -1,
5534               n,
5535               ticks,
5536               step;
5537
5538           stop = +stop, start = +start, count = +count;
5539           if (start === stop && count > 0) return [start];
5540           if (reverse = stop < start) n = start, start = stop, stop = n;
5541           if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
5542
5543           if (step > 0) {
5544             start = Math.ceil(start / step);
5545             stop = Math.floor(stop / step);
5546             ticks = new Array(n = Math.ceil(stop - start + 1));
5547             while (++i < n) ticks[i] = (start + i) * step;
5548           } else {
5549             start = Math.floor(start * step);
5550             stop = Math.ceil(stop * step);
5551             ticks = new Array(n = Math.ceil(start - stop + 1));
5552             while (++i < n) ticks[i] = (start - i) / step;
5553           }
5554
5555           if (reverse) ticks.reverse();
5556
5557           return ticks;
5558         }
5559
5560         function tickIncrement(start, stop, count) {
5561           var step = (stop - start) / Math.max(0, count),
5562               power = Math.floor(Math.log(step) / Math.LN10),
5563               error = step / Math.pow(10, power);
5564           return power >= 0
5565               ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
5566               : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
5567         }
5568
5569         function tickStep(start, stop, count) {
5570           var step0 = Math.abs(stop - start) / Math.max(0, count),
5571               step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
5572               error = step0 / step1;
5573           if (error >= e10) step1 *= 10;
5574           else if (error >= e5) step1 *= 5;
5575           else if (error >= e2) step1 *= 2;
5576           return stop < start ? -step1 : step1;
5577         }
5578
5579         function thresholdSturges(values) {
5580           return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
5581         }
5582
5583         function histogram() {
5584           var value = identity,
5585               domain = extent,
5586               threshold = thresholdSturges;
5587
5588           function histogram(data) {
5589             var i,
5590                 n = data.length,
5591                 x,
5592                 values = new Array(n);
5593
5594             for (i = 0; i < n; ++i) {
5595               values[i] = value(data[i], i, data);
5596             }
5597
5598             var xz = domain(values),
5599                 x0 = xz[0],
5600                 x1 = xz[1],
5601                 tz = threshold(values, x0, x1);
5602
5603             // Convert number of thresholds into uniform thresholds.
5604             if (!Array.isArray(tz)) {
5605               tz = tickStep(x0, x1, tz);
5606               tz = d3_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
5607             }
5608
5609             // Remove any thresholds outside the domain.
5610             var m = tz.length;
5611             while (tz[0] <= x0) tz.shift(), --m;
5612             while (tz[m - 1] > x1) tz.pop(), --m;
5613
5614             var bins = new Array(m + 1),
5615                 bin;
5616
5617             // Initialize bins.
5618             for (i = 0; i <= m; ++i) {
5619               bin = bins[i] = [];
5620               bin.x0 = i > 0 ? tz[i - 1] : x0;
5621               bin.x1 = i < m ? tz[i] : x1;
5622             }
5623
5624             // Assign data to bins by value, ignoring any outside the domain.
5625             for (i = 0; i < n; ++i) {
5626               x = values[i];
5627               if (x0 <= x && x <= x1) {
5628                 bins[bisectRight(tz, x, 0, m)].push(data[i]);
5629               }
5630             }
5631
5632             return bins;
5633           }
5634
5635           histogram.value = function(_) {
5636             return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
5637           };
5638
5639           histogram.domain = function(_) {
5640             return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
5641           };
5642
5643           histogram.thresholds = function(_) {
5644             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice$4.call(_)) : constant(_), histogram) : threshold;
5645           };
5646
5647           return histogram;
5648         }
5649
5650         function threshold(values, p, valueof) {
5651           if (valueof == null) valueof = number;
5652           if (!(n = values.length)) return;
5653           if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
5654           if (p >= 1) return +valueof(values[n - 1], n - 1, values);
5655           var n,
5656               i = (n - 1) * p,
5657               i0 = Math.floor(i),
5658               value0 = +valueof(values[i0], i0, values),
5659               value1 = +valueof(values[i0 + 1], i0 + 1, values);
5660           return value0 + (value1 - value0) * (i - i0);
5661         }
5662
5663         function freedmanDiaconis(values, min, max) {
5664           values = map$2.call(values, number).sort(d3_ascending);
5665           return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
5666         }
5667
5668         function scott(values, min, max) {
5669           return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
5670         }
5671
5672         function max$2(values, valueof) {
5673           var n = values.length,
5674               i = -1,
5675               value,
5676               max;
5677
5678           if (valueof == null) {
5679             while (++i < n) { // Find the first comparable value.
5680               if ((value = values[i]) != null && value >= value) {
5681                 max = value;
5682                 while (++i < n) { // Compare the remaining values.
5683                   if ((value = values[i]) != null && value > max) {
5684                     max = value;
5685                   }
5686                 }
5687               }
5688             }
5689           }
5690
5691           else {
5692             while (++i < n) { // Find the first comparable value.
5693               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5694                 max = value;
5695                 while (++i < n) { // Compare the remaining values.
5696                   if ((value = valueof(values[i], i, values)) != null && value > max) {
5697                     max = value;
5698                   }
5699                 }
5700               }
5701             }
5702           }
5703
5704           return max;
5705         }
5706
5707         function mean(values, valueof) {
5708           var n = values.length,
5709               m = n,
5710               i = -1,
5711               value,
5712               sum = 0;
5713
5714           if (valueof == null) {
5715             while (++i < n) {
5716               if (!isNaN(value = number(values[i]))) sum += value;
5717               else --m;
5718             }
5719           }
5720
5721           else {
5722             while (++i < n) {
5723               if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
5724               else --m;
5725             }
5726           }
5727
5728           if (m) return sum / m;
5729         }
5730
5731         function d3_median(values, valueof) {
5732           var n = values.length,
5733               i = -1,
5734               value,
5735               numbers = [];
5736
5737           if (valueof == null) {
5738             while (++i < n) {
5739               if (!isNaN(value = number(values[i]))) {
5740                 numbers.push(value);
5741               }
5742             }
5743           }
5744
5745           else {
5746             while (++i < n) {
5747               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5748                 numbers.push(value);
5749               }
5750             }
5751           }
5752
5753           return threshold(numbers.sort(d3_ascending), 0.5);
5754         }
5755
5756         function merge(arrays) {
5757           var n = arrays.length,
5758               m,
5759               i = -1,
5760               j = 0,
5761               merged,
5762               array;
5763
5764           while (++i < n) j += arrays[i].length;
5765           merged = new Array(j);
5766
5767           while (--n >= 0) {
5768             array = arrays[n];
5769             m = array.length;
5770             while (--m >= 0) {
5771               merged[--j] = array[m];
5772             }
5773           }
5774
5775           return merged;
5776         }
5777
5778         function min(values, valueof) {
5779           var n = values.length,
5780               i = -1,
5781               value,
5782               min;
5783
5784           if (valueof == null) {
5785             while (++i < n) { // Find the first comparable value.
5786               if ((value = values[i]) != null && value >= value) {
5787                 min = value;
5788                 while (++i < n) { // Compare the remaining values.
5789                   if ((value = values[i]) != null && min > value) {
5790                     min = value;
5791                   }
5792                 }
5793               }
5794             }
5795           }
5796
5797           else {
5798             while (++i < n) { // Find the first comparable value.
5799               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5800                 min = value;
5801                 while (++i < n) { // Compare the remaining values.
5802                   if ((value = valueof(values[i], i, values)) != null && min > value) {
5803                     min = value;
5804                   }
5805                 }
5806               }
5807             }
5808           }
5809
5810           return min;
5811         }
5812
5813         function permute(array, indexes) {
5814           var i = indexes.length, permutes = new Array(i);
5815           while (i--) permutes[i] = array[indexes[i]];
5816           return permutes;
5817         }
5818
5819         function scan(values, compare) {
5820           if (!(n = values.length)) return;
5821           var n,
5822               i = 0,
5823               j = 0,
5824               xi,
5825               xj = values[j];
5826
5827           if (compare == null) compare = d3_ascending;
5828
5829           while (++i < n) {
5830             if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
5831               xj = xi, j = i;
5832             }
5833           }
5834
5835           if (compare(xj, xj) === 0) return j;
5836         }
5837
5838         function shuffle(array, i0, i1) {
5839           var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
5840               t,
5841               i;
5842
5843           while (m) {
5844             i = Math.random() * m-- | 0;
5845             t = array[m + i0];
5846             array[m + i0] = array[i + i0];
5847             array[i + i0] = t;
5848           }
5849
5850           return array;
5851         }
5852
5853         function sum(values, valueof) {
5854           var n = values.length,
5855               i = -1,
5856               value,
5857               sum = 0;
5858
5859           if (valueof == null) {
5860             while (++i < n) {
5861               if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
5862             }
5863           }
5864
5865           else {
5866             while (++i < n) {
5867               if (value = +valueof(values[i], i, values)) sum += value;
5868             }
5869           }
5870
5871           return sum;
5872         }
5873
5874         function transpose(matrix) {
5875           if (!(n = matrix.length)) return [];
5876           for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
5877             for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
5878               row[j] = matrix[j][i];
5879             }
5880           }
5881           return transpose;
5882         }
5883
5884         function length(d) {
5885           return d.length;
5886         }
5887
5888         function zip() {
5889           return transpose(arguments);
5890         }
5891
5892         var slice$5 = Array.prototype.slice;
5893
5894         function identity$1(x) {
5895           return x;
5896         }
5897
5898         var top = 1,
5899             right = 2,
5900             bottom = 3,
5901             left = 4,
5902             epsilon = 1e-6;
5903
5904         function translateX(x) {
5905           return "translate(" + (x + 0.5) + ",0)";
5906         }
5907
5908         function translateY(y) {
5909           return "translate(0," + (y + 0.5) + ")";
5910         }
5911
5912         function number$1(scale) {
5913           return function(d) {
5914             return +scale(d);
5915           };
5916         }
5917
5918         function center(scale) {
5919           var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
5920           if (scale.round()) offset = Math.round(offset);
5921           return function(d) {
5922             return +scale(d) + offset;
5923           };
5924         }
5925
5926         function entering() {
5927           return !this.__axis;
5928         }
5929
5930         function axis(orient, scale) {
5931           var tickArguments = [],
5932               tickValues = null,
5933               tickFormat = null,
5934               tickSizeInner = 6,
5935               tickSizeOuter = 6,
5936               tickPadding = 3,
5937               k = orient === top || orient === left ? -1 : 1,
5938               x = orient === left || orient === right ? "x" : "y",
5939               transform = orient === top || orient === bottom ? translateX : translateY;
5940
5941           function axis(context) {
5942             var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
5943                 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
5944                 spacing = Math.max(tickSizeInner, 0) + tickPadding,
5945                 range = scale.range(),
5946                 range0 = +range[0] + 0.5,
5947                 range1 = +range[range.length - 1] + 0.5,
5948                 position = (scale.bandwidth ? center : number$1)(scale.copy()),
5949                 selection = context.selection ? context.selection() : context,
5950                 path = selection.selectAll(".domain").data([null]),
5951                 tick = selection.selectAll(".tick").data(values, scale).order(),
5952                 tickExit = tick.exit(),
5953                 tickEnter = tick.enter().append("g").attr("class", "tick"),
5954                 line = tick.select("line"),
5955                 text = tick.select("text");
5956
5957             path = path.merge(path.enter().insert("path", ".tick")
5958                 .attr("class", "domain")
5959                 .attr("stroke", "currentColor"));
5960
5961             tick = tick.merge(tickEnter);
5962
5963             line = line.merge(tickEnter.append("line")
5964                 .attr("stroke", "currentColor")
5965                 .attr(x + "2", k * tickSizeInner));
5966
5967             text = text.merge(tickEnter.append("text")
5968                 .attr("fill", "currentColor")
5969                 .attr(x, k * spacing)
5970                 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
5971
5972             if (context !== selection) {
5973               path = path.transition(context);
5974               tick = tick.transition(context);
5975               line = line.transition(context);
5976               text = text.transition(context);
5977
5978               tickExit = tickExit.transition(context)
5979                   .attr("opacity", epsilon)
5980                   .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
5981
5982               tickEnter
5983                   .attr("opacity", epsilon)
5984                   .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
5985             }
5986
5987             tickExit.remove();
5988
5989             path
5990                 .attr("d", orient === left || orient == right
5991                     ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
5992                     : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
5993
5994             tick
5995                 .attr("opacity", 1)
5996                 .attr("transform", function(d) { return transform(position(d)); });
5997
5998             line
5999                 .attr(x + "2", k * tickSizeInner);
6000
6001             text
6002                 .attr(x, k * spacing)
6003                 .text(format);
6004
6005             selection.filter(entering)
6006                 .attr("fill", "none")
6007                 .attr("font-size", 10)
6008                 .attr("font-family", "sans-serif")
6009                 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
6010
6011             selection
6012                 .each(function() { this.__axis = position; });
6013           }
6014
6015           axis.scale = function(_) {
6016             return arguments.length ? (scale = _, axis) : scale;
6017           };
6018
6019           axis.ticks = function() {
6020             return tickArguments = slice$5.call(arguments), axis;
6021           };
6022
6023           axis.tickArguments = function(_) {
6024             return arguments.length ? (tickArguments = _ == null ? [] : slice$5.call(_), axis) : tickArguments.slice();
6025           };
6026
6027           axis.tickValues = function(_) {
6028             return arguments.length ? (tickValues = _ == null ? null : slice$5.call(_), axis) : tickValues && tickValues.slice();
6029           };
6030
6031           axis.tickFormat = function(_) {
6032             return arguments.length ? (tickFormat = _, axis) : tickFormat;
6033           };
6034
6035           axis.tickSize = function(_) {
6036             return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
6037           };
6038
6039           axis.tickSizeInner = function(_) {
6040             return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
6041           };
6042
6043           axis.tickSizeOuter = function(_) {
6044             return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
6045           };
6046
6047           axis.tickPadding = function(_) {
6048             return arguments.length ? (tickPadding = +_, axis) : tickPadding;
6049           };
6050
6051           return axis;
6052         }
6053
6054         function axisTop(scale) {
6055           return axis(top, scale);
6056         }
6057
6058         function axisRight(scale) {
6059           return axis(right, scale);
6060         }
6061
6062         function axisBottom(scale) {
6063           return axis(bottom, scale);
6064         }
6065
6066         function axisLeft(scale) {
6067           return axis(left, scale);
6068         }
6069
6070         var noop$2 = {value: function() {}};
6071
6072         function dispatch() {
6073           for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
6074             if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
6075             _[t] = [];
6076           }
6077           return new Dispatch(_);
6078         }
6079
6080         function Dispatch(_) {
6081           this._ = _;
6082         }
6083
6084         function parseTypenames(typenames, types) {
6085           return typenames.trim().split(/^|\s+/).map(function(t) {
6086             var name = "", i = t.indexOf(".");
6087             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6088             if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
6089             return {type: t, name: name};
6090           });
6091         }
6092
6093         Dispatch.prototype = dispatch.prototype = {
6094           constructor: Dispatch,
6095           on: function(typename, callback) {
6096             var _ = this._,
6097                 T = parseTypenames(typename + "", _),
6098                 t,
6099                 i = -1,
6100                 n = T.length;
6101
6102             // If no callback was specified, return the callback of the given type and name.
6103             if (arguments.length < 2) {
6104               while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t;
6105               return;
6106             }
6107
6108             // If a type was specified, set the callback for the given type and name.
6109             // Otherwise, if a null callback was specified, remove callbacks of the given name.
6110             if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
6111             while (++i < n) {
6112               if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
6113               else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
6114             }
6115
6116             return this;
6117           },
6118           copy: function() {
6119             var copy = {}, _ = this._;
6120             for (var t in _) copy[t] = _[t].slice();
6121             return new Dispatch(copy);
6122           },
6123           call: function(type, that) {
6124             if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
6125             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
6126             for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
6127           },
6128           apply: function(type, that, args) {
6129             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
6130             for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
6131           }
6132         };
6133
6134         function get$1(type, name) {
6135           for (var i = 0, n = type.length, c; i < n; ++i) {
6136             if ((c = type[i]).name === name) {
6137               return c.value;
6138             }
6139           }
6140         }
6141
6142         function set(type, name, callback) {
6143           for (var i = 0, n = type.length; i < n; ++i) {
6144             if (type[i].name === name) {
6145               type[i] = noop$2, type = type.slice(0, i).concat(type.slice(i + 1));
6146               break;
6147             }
6148           }
6149           if (callback != null) type.push({name: name, value: callback});
6150           return type;
6151         }
6152
6153         var xhtml = "http://www.w3.org/1999/xhtml";
6154
6155         var namespaces = {
6156           svg: "http://www.w3.org/2000/svg",
6157           xhtml: xhtml,
6158           xlink: "http://www.w3.org/1999/xlink",
6159           xml: "http://www.w3.org/XML/1998/namespace",
6160           xmlns: "http://www.w3.org/2000/xmlns/"
6161         };
6162
6163         function namespace(name) {
6164           var prefix = name += "", i = prefix.indexOf(":");
6165           if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
6166           return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
6167         }
6168
6169         function creatorInherit(name) {
6170           return function() {
6171             var document = this.ownerDocument,
6172                 uri = this.namespaceURI;
6173             return uri === xhtml && document.documentElement.namespaceURI === xhtml
6174                 ? document.createElement(name)
6175                 : document.createElementNS(uri, name);
6176           };
6177         }
6178
6179         function creatorFixed(fullname) {
6180           return function() {
6181             return this.ownerDocument.createElementNS(fullname.space, fullname.local);
6182           };
6183         }
6184
6185         function creator(name) {
6186           var fullname = namespace(name);
6187           return (fullname.local
6188               ? creatorFixed
6189               : creatorInherit)(fullname);
6190         }
6191
6192         function none() {}
6193
6194         function selector(selector) {
6195           return selector == null ? none : function() {
6196             return this.querySelector(selector);
6197           };
6198         }
6199
6200         function selection_select(select) {
6201           if (typeof select !== "function") select = selector(select);
6202
6203           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6204             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
6205               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
6206                 if ("__data__" in node) subnode.__data__ = node.__data__;
6207                 subgroup[i] = subnode;
6208               }
6209             }
6210           }
6211
6212           return new Selection(subgroups, this._parents);
6213         }
6214
6215         function empty() {
6216           return [];
6217         }
6218
6219         function selectorAll(selector) {
6220           return selector == null ? empty : function() {
6221             return this.querySelectorAll(selector);
6222           };
6223         }
6224
6225         function selection_selectAll(select) {
6226           if (typeof select !== "function") select = selectorAll(select);
6227
6228           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
6229             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
6230               if (node = group[i]) {
6231                 subgroups.push(select.call(node, node.__data__, i, group));
6232                 parents.push(node);
6233               }
6234             }
6235           }
6236
6237           return new Selection(subgroups, parents);
6238         }
6239
6240         function matcher(selector) {
6241           return function() {
6242             return this.matches(selector);
6243           };
6244         }
6245
6246         function selection_filter(match) {
6247           if (typeof match !== "function") match = matcher(match);
6248
6249           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6250             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
6251               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
6252                 subgroup.push(node);
6253               }
6254             }
6255           }
6256
6257           return new Selection(subgroups, this._parents);
6258         }
6259
6260         function sparse(update) {
6261           return new Array(update.length);
6262         }
6263
6264         function selection_enter() {
6265           return new Selection(this._enter || this._groups.map(sparse), this._parents);
6266         }
6267
6268         function EnterNode(parent, datum) {
6269           this.ownerDocument = parent.ownerDocument;
6270           this.namespaceURI = parent.namespaceURI;
6271           this._next = null;
6272           this._parent = parent;
6273           this.__data__ = datum;
6274         }
6275
6276         EnterNode.prototype = {
6277           constructor: EnterNode,
6278           appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
6279           insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
6280           querySelector: function(selector) { return this._parent.querySelector(selector); },
6281           querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
6282         };
6283
6284         function constant$1(x) {
6285           return function() {
6286             return x;
6287           };
6288         }
6289
6290         var keyPrefix = "$"; // Protect against keys like “__proto__”.
6291
6292         function bindIndex(parent, group, enter, update, exit, data) {
6293           var i = 0,
6294               node,
6295               groupLength = group.length,
6296               dataLength = data.length;
6297
6298           // Put any non-null nodes that fit into update.
6299           // Put any null nodes into enter.
6300           // Put any remaining data into enter.
6301           for (; i < dataLength; ++i) {
6302             if (node = group[i]) {
6303               node.__data__ = data[i];
6304               update[i] = node;
6305             } else {
6306               enter[i] = new EnterNode(parent, data[i]);
6307             }
6308           }
6309
6310           // Put any non-null nodes that don’t fit into exit.
6311           for (; i < groupLength; ++i) {
6312             if (node = group[i]) {
6313               exit[i] = node;
6314             }
6315           }
6316         }
6317
6318         function bindKey(parent, group, enter, update, exit, data, key) {
6319           var i,
6320               node,
6321               nodeByKeyValue = {},
6322               groupLength = group.length,
6323               dataLength = data.length,
6324               keyValues = new Array(groupLength),
6325               keyValue;
6326
6327           // Compute the key for each node.
6328           // If multiple nodes have the same key, the duplicates are added to exit.
6329           for (i = 0; i < groupLength; ++i) {
6330             if (node = group[i]) {
6331               keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
6332               if (keyValue in nodeByKeyValue) {
6333                 exit[i] = node;
6334               } else {
6335                 nodeByKeyValue[keyValue] = node;
6336               }
6337             }
6338           }
6339
6340           // Compute the key for each datum.
6341           // If there a node associated with this key, join and add it to update.
6342           // If there is not (or the key is a duplicate), add it to enter.
6343           for (i = 0; i < dataLength; ++i) {
6344             keyValue = keyPrefix + key.call(parent, data[i], i, data);
6345             if (node = nodeByKeyValue[keyValue]) {
6346               update[i] = node;
6347               node.__data__ = data[i];
6348               nodeByKeyValue[keyValue] = null;
6349             } else {
6350               enter[i] = new EnterNode(parent, data[i]);
6351             }
6352           }
6353
6354           // Add any remaining nodes that were not bound to data to exit.
6355           for (i = 0; i < groupLength; ++i) {
6356             if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
6357               exit[i] = node;
6358             }
6359           }
6360         }
6361
6362         function selection_data(value, key) {
6363           if (!value) {
6364             data = new Array(this.size()), j = -1;
6365             this.each(function(d) { data[++j] = d; });
6366             return data;
6367           }
6368
6369           var bind = key ? bindKey : bindIndex,
6370               parents = this._parents,
6371               groups = this._groups;
6372
6373           if (typeof value !== "function") value = constant$1(value);
6374
6375           for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
6376             var parent = parents[j],
6377                 group = groups[j],
6378                 groupLength = group.length,
6379                 data = value.call(parent, parent && parent.__data__, j, parents),
6380                 dataLength = data.length,
6381                 enterGroup = enter[j] = new Array(dataLength),
6382                 updateGroup = update[j] = new Array(dataLength),
6383                 exitGroup = exit[j] = new Array(groupLength);
6384
6385             bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
6386
6387             // Now connect the enter nodes to their following update node, such that
6388             // appendChild can insert the materialized enter node before this node,
6389             // rather than at the end of the parent node.
6390             for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
6391               if (previous = enterGroup[i0]) {
6392                 if (i0 >= i1) i1 = i0 + 1;
6393                 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
6394                 previous._next = next || null;
6395               }
6396             }
6397           }
6398
6399           update = new Selection(update, parents);
6400           update._enter = enter;
6401           update._exit = exit;
6402           return update;
6403         }
6404
6405         function selection_exit() {
6406           return new Selection(this._exit || this._groups.map(sparse), this._parents);
6407         }
6408
6409         function selection_join(onenter, onupdate, onexit) {
6410           var enter = this.enter(), update = this, exit = this.exit();
6411           enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
6412           if (onupdate != null) update = onupdate(update);
6413           if (onexit == null) exit.remove(); else onexit(exit);
6414           return enter && update ? enter.merge(update).order() : update;
6415         }
6416
6417         function selection_merge(selection) {
6418
6419           for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
6420             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
6421               if (node = group0[i] || group1[i]) {
6422                 merge[i] = node;
6423               }
6424             }
6425           }
6426
6427           for (; j < m0; ++j) {
6428             merges[j] = groups0[j];
6429           }
6430
6431           return new Selection(merges, this._parents);
6432         }
6433
6434         function selection_order() {
6435
6436           for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
6437             for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
6438               if (node = group[i]) {
6439                 if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
6440                 next = node;
6441               }
6442             }
6443           }
6444
6445           return this;
6446         }
6447
6448         function selection_sort(compare) {
6449           if (!compare) compare = ascending;
6450
6451           function compareNode(a, b) {
6452             return a && b ? compare(a.__data__, b.__data__) : !a - !b;
6453           }
6454
6455           for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
6456             for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
6457               if (node = group[i]) {
6458                 sortgroup[i] = node;
6459               }
6460             }
6461             sortgroup.sort(compareNode);
6462           }
6463
6464           return new Selection(sortgroups, this._parents).order();
6465         }
6466
6467         function ascending(a, b) {
6468           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6469         }
6470
6471         function selection_call() {
6472           var callback = arguments[0];
6473           arguments[0] = this;
6474           callback.apply(null, arguments);
6475           return this;
6476         }
6477
6478         function selection_nodes() {
6479           var nodes = new Array(this.size()), i = -1;
6480           this.each(function() { nodes[++i] = this; });
6481           return nodes;
6482         }
6483
6484         function selection_node() {
6485
6486           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6487             for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
6488               var node = group[i];
6489               if (node) return node;
6490             }
6491           }
6492
6493           return null;
6494         }
6495
6496         function selection_size() {
6497           var size = 0;
6498           this.each(function() { ++size; });
6499           return size;
6500         }
6501
6502         function selection_empty() {
6503           return !this.node();
6504         }
6505
6506         function selection_each(callback) {
6507
6508           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6509             for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
6510               if (node = group[i]) callback.call(node, node.__data__, i, group);
6511             }
6512           }
6513
6514           return this;
6515         }
6516
6517         function attrRemove(name) {
6518           return function() {
6519             this.removeAttribute(name);
6520           };
6521         }
6522
6523         function attrRemoveNS(fullname) {
6524           return function() {
6525             this.removeAttributeNS(fullname.space, fullname.local);
6526           };
6527         }
6528
6529         function attrConstant(name, value) {
6530           return function() {
6531             this.setAttribute(name, value);
6532           };
6533         }
6534
6535         function attrConstantNS(fullname, value) {
6536           return function() {
6537             this.setAttributeNS(fullname.space, fullname.local, value);
6538           };
6539         }
6540
6541         function attrFunction(name, value) {
6542           return function() {
6543             var v = value.apply(this, arguments);
6544             if (v == null) this.removeAttribute(name);
6545             else this.setAttribute(name, v);
6546           };
6547         }
6548
6549         function attrFunctionNS(fullname, value) {
6550           return function() {
6551             var v = value.apply(this, arguments);
6552             if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
6553             else this.setAttributeNS(fullname.space, fullname.local, v);
6554           };
6555         }
6556
6557         function selection_attr(name, value) {
6558           var fullname = namespace(name);
6559
6560           if (arguments.length < 2) {
6561             var node = this.node();
6562             return fullname.local
6563                 ? node.getAttributeNS(fullname.space, fullname.local)
6564                 : node.getAttribute(fullname);
6565           }
6566
6567           return this.each((value == null
6568               ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
6569               ? (fullname.local ? attrFunctionNS : attrFunction)
6570               : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
6571         }
6572
6573         function defaultView(node) {
6574           return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
6575               || (node.document && node) // node is a Window
6576               || node.defaultView; // node is a Document
6577         }
6578
6579         function styleRemove(name) {
6580           return function() {
6581             this.style.removeProperty(name);
6582           };
6583         }
6584
6585         function styleConstant(name, value, priority) {
6586           return function() {
6587             this.style.setProperty(name, value, priority);
6588           };
6589         }
6590
6591         function styleFunction(name, value, priority) {
6592           return function() {
6593             var v = value.apply(this, arguments);
6594             if (v == null) this.style.removeProperty(name);
6595             else this.style.setProperty(name, v, priority);
6596           };
6597         }
6598
6599         function selection_style(name, value, priority) {
6600           return arguments.length > 1
6601               ? this.each((value == null
6602                     ? styleRemove : typeof value === "function"
6603                     ? styleFunction
6604                     : styleConstant)(name, value, priority == null ? "" : priority))
6605               : styleValue(this.node(), name);
6606         }
6607
6608         function styleValue(node, name) {
6609           return node.style.getPropertyValue(name)
6610               || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
6611         }
6612
6613         function propertyRemove(name) {
6614           return function() {
6615             delete this[name];
6616           };
6617         }
6618
6619         function propertyConstant(name, value) {
6620           return function() {
6621             this[name] = value;
6622           };
6623         }
6624
6625         function propertyFunction(name, value) {
6626           return function() {
6627             var v = value.apply(this, arguments);
6628             if (v == null) delete this[name];
6629             else this[name] = v;
6630           };
6631         }
6632
6633         function selection_property(name, value) {
6634           return arguments.length > 1
6635               ? this.each((value == null
6636                   ? propertyRemove : typeof value === "function"
6637                   ? propertyFunction
6638                   : propertyConstant)(name, value))
6639               : this.node()[name];
6640         }
6641
6642         function classArray(string) {
6643           return string.trim().split(/^|\s+/);
6644         }
6645
6646         function classList(node) {
6647           return node.classList || new ClassList(node);
6648         }
6649
6650         function ClassList(node) {
6651           this._node = node;
6652           this._names = classArray(node.getAttribute("class") || "");
6653         }
6654
6655         ClassList.prototype = {
6656           add: function(name) {
6657             var i = this._names.indexOf(name);
6658             if (i < 0) {
6659               this._names.push(name);
6660               this._node.setAttribute("class", this._names.join(" "));
6661             }
6662           },
6663           remove: function(name) {
6664             var i = this._names.indexOf(name);
6665             if (i >= 0) {
6666               this._names.splice(i, 1);
6667               this._node.setAttribute("class", this._names.join(" "));
6668             }
6669           },
6670           contains: function(name) {
6671             return this._names.indexOf(name) >= 0;
6672           }
6673         };
6674
6675         function classedAdd(node, names) {
6676           var list = classList(node), i = -1, n = names.length;
6677           while (++i < n) list.add(names[i]);
6678         }
6679
6680         function classedRemove(node, names) {
6681           var list = classList(node), i = -1, n = names.length;
6682           while (++i < n) list.remove(names[i]);
6683         }
6684
6685         function classedTrue(names) {
6686           return function() {
6687             classedAdd(this, names);
6688           };
6689         }
6690
6691         function classedFalse(names) {
6692           return function() {
6693             classedRemove(this, names);
6694           };
6695         }
6696
6697         function classedFunction(names, value) {
6698           return function() {
6699             (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
6700           };
6701         }
6702
6703         function selection_classed(name, value) {
6704           var names = classArray(name + "");
6705
6706           if (arguments.length < 2) {
6707             var list = classList(this.node()), i = -1, n = names.length;
6708             while (++i < n) if (!list.contains(names[i])) return false;
6709             return true;
6710           }
6711
6712           return this.each((typeof value === "function"
6713               ? classedFunction : value
6714               ? classedTrue
6715               : classedFalse)(names, value));
6716         }
6717
6718         function textRemove() {
6719           this.textContent = "";
6720         }
6721
6722         function textConstant(value) {
6723           return function() {
6724             this.textContent = value;
6725           };
6726         }
6727
6728         function textFunction(value) {
6729           return function() {
6730             var v = value.apply(this, arguments);
6731             this.textContent = v == null ? "" : v;
6732           };
6733         }
6734
6735         function selection_text(value) {
6736           return arguments.length
6737               ? this.each(value == null
6738                   ? textRemove : (typeof value === "function"
6739                   ? textFunction
6740                   : textConstant)(value))
6741               : this.node().textContent;
6742         }
6743
6744         function htmlRemove() {
6745           this.innerHTML = "";
6746         }
6747
6748         function htmlConstant(value) {
6749           return function() {
6750             this.innerHTML = value;
6751           };
6752         }
6753
6754         function htmlFunction(value) {
6755           return function() {
6756             var v = value.apply(this, arguments);
6757             this.innerHTML = v == null ? "" : v;
6758           };
6759         }
6760
6761         function selection_html(value) {
6762           return arguments.length
6763               ? this.each(value == null
6764                   ? htmlRemove : (typeof value === "function"
6765                   ? htmlFunction
6766                   : htmlConstant)(value))
6767               : this.node().innerHTML;
6768         }
6769
6770         function raise() {
6771           if (this.nextSibling) this.parentNode.appendChild(this);
6772         }
6773
6774         function selection_raise() {
6775           return this.each(raise);
6776         }
6777
6778         function lower() {
6779           if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
6780         }
6781
6782         function selection_lower() {
6783           return this.each(lower);
6784         }
6785
6786         function selection_append(name) {
6787           var create = typeof name === "function" ? name : creator(name);
6788           return this.select(function() {
6789             return this.appendChild(create.apply(this, arguments));
6790           });
6791         }
6792
6793         function constantNull() {
6794           return null;
6795         }
6796
6797         function selection_insert(name, before) {
6798           var create = typeof name === "function" ? name : creator(name),
6799               select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
6800           return this.select(function() {
6801             return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
6802           });
6803         }
6804
6805         function remove() {
6806           var parent = this.parentNode;
6807           if (parent) parent.removeChild(this);
6808         }
6809
6810         function selection_remove() {
6811           return this.each(remove);
6812         }
6813
6814         function selection_cloneShallow() {
6815           return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
6816         }
6817
6818         function selection_cloneDeep() {
6819           return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
6820         }
6821
6822         function selection_clone(deep) {
6823           return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
6824         }
6825
6826         function selection_datum(value) {
6827           return arguments.length
6828               ? this.property("__data__", value)
6829               : this.node().__data__;
6830         }
6831
6832         var filterEvents = {};
6833
6834         var event = null;
6835
6836         if (typeof document !== "undefined") {
6837           var element = document.documentElement;
6838           if (!("onmouseenter" in element)) {
6839             filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
6840           }
6841         }
6842
6843         function filterContextListener(listener, index, group) {
6844           listener = contextListener(listener, index, group);
6845           return function(event) {
6846             var related = event.relatedTarget;
6847             if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
6848               listener.call(this, event);
6849             }
6850           };
6851         }
6852
6853         function contextListener(listener, index, group) {
6854           return function(event1) {
6855             var event0 = event; // Events can be reentrant (e.g., focus).
6856             event = event1;
6857             try {
6858               listener.call(this, this.__data__, index, group);
6859             } finally {
6860               event = event0;
6861             }
6862           };
6863         }
6864
6865         function parseTypenames$1(typenames) {
6866           return typenames.trim().split(/^|\s+/).map(function(t) {
6867             var name = "", i = t.indexOf(".");
6868             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6869             return {type: t, name: name};
6870           });
6871         }
6872
6873         function onRemove(typename) {
6874           return function() {
6875             var on = this.__on;
6876             if (!on) return;
6877             for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
6878               if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
6879                 this.removeEventListener(o.type, o.listener, o.capture);
6880               } else {
6881                 on[++i] = o;
6882               }
6883             }
6884             if (++i) on.length = i;
6885             else delete this.__on;
6886           };
6887         }
6888
6889         function onAdd(typename, value, capture) {
6890           var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
6891           return function(d, i, group) {
6892             var on = this.__on, o, listener = wrap(value, i, group);
6893             if (on) for (var j = 0, m = on.length; j < m; ++j) {
6894               if ((o = on[j]).type === typename.type && o.name === typename.name) {
6895                 this.removeEventListener(o.type, o.listener, o.capture);
6896                 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
6897                 o.value = value;
6898                 return;
6899               }
6900             }
6901             this.addEventListener(typename.type, listener, capture);
6902             o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
6903             if (!on) this.__on = [o];
6904             else on.push(o);
6905           };
6906         }
6907
6908         function selection_on(typename, value, capture) {
6909           var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
6910
6911           if (arguments.length < 2) {
6912             var on = this.node().__on;
6913             if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
6914               for (i = 0, o = on[j]; i < n; ++i) {
6915                 if ((t = typenames[i]).type === o.type && t.name === o.name) {
6916                   return o.value;
6917                 }
6918               }
6919             }
6920             return;
6921           }
6922
6923           on = value ? onAdd : onRemove;
6924           if (capture == null) capture = false;
6925           for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
6926           return this;
6927         }
6928
6929         function customEvent(event1, listener, that, args) {
6930           var event0 = event;
6931           event1.sourceEvent = event;
6932           event = event1;
6933           try {
6934             return listener.apply(that, args);
6935           } finally {
6936             event = event0;
6937           }
6938         }
6939
6940         function dispatchEvent(node, type, params) {
6941           var window = defaultView(node),
6942               event = window.CustomEvent;
6943
6944           if (typeof event === "function") {
6945             event = new event(type, params);
6946           } else {
6947             event = window.document.createEvent("Event");
6948             if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
6949             else event.initEvent(type, false, false);
6950           }
6951
6952           node.dispatchEvent(event);
6953         }
6954
6955         function dispatchConstant(type, params) {
6956           return function() {
6957             return dispatchEvent(this, type, params);
6958           };
6959         }
6960
6961         function dispatchFunction(type, params) {
6962           return function() {
6963             return dispatchEvent(this, type, params.apply(this, arguments));
6964           };
6965         }
6966
6967         function selection_dispatch(type, params) {
6968           return this.each((typeof params === "function"
6969               ? dispatchFunction
6970               : dispatchConstant)(type, params));
6971         }
6972
6973         var root$1 = [null];
6974
6975         function Selection(groups, parents) {
6976           this._groups = groups;
6977           this._parents = parents;
6978         }
6979
6980         function selection() {
6981           return new Selection([[document.documentElement]], root$1);
6982         }
6983
6984         Selection.prototype = selection.prototype = {
6985           constructor: Selection,
6986           select: selection_select,
6987           selectAll: selection_selectAll,
6988           filter: selection_filter,
6989           data: selection_data,
6990           enter: selection_enter,
6991           exit: selection_exit,
6992           join: selection_join,
6993           merge: selection_merge,
6994           order: selection_order,
6995           sort: selection_sort,
6996           call: selection_call,
6997           nodes: selection_nodes,
6998           node: selection_node,
6999           size: selection_size,
7000           empty: selection_empty,
7001           each: selection_each,
7002           attr: selection_attr,
7003           style: selection_style,
7004           property: selection_property,
7005           classed: selection_classed,
7006           text: selection_text,
7007           html: selection_html,
7008           raise: selection_raise,
7009           lower: selection_lower,
7010           append: selection_append,
7011           insert: selection_insert,
7012           remove: selection_remove,
7013           clone: selection_clone,
7014           datum: selection_datum,
7015           on: selection_on,
7016           dispatch: selection_dispatch
7017         };
7018
7019         function d3_select(selector) {
7020           return typeof selector === "string"
7021               ? new Selection([[document.querySelector(selector)]], [document.documentElement])
7022               : new Selection([[selector]], root$1);
7023         }
7024
7025         function create$5(name) {
7026           return d3_select(creator(name).call(document.documentElement));
7027         }
7028
7029         var nextId = 0;
7030
7031         function local() {
7032           return new Local;
7033         }
7034
7035         function Local() {
7036           this._ = "@" + (++nextId).toString(36);
7037         }
7038
7039         Local.prototype = local.prototype = {
7040           constructor: Local,
7041           get: function(node) {
7042             var id = this._;
7043             while (!(id in node)) if (!(node = node.parentNode)) return;
7044             return node[id];
7045           },
7046           set: function(node, value) {
7047             return node[this._] = value;
7048           },
7049           remove: function(node) {
7050             return this._ in node && delete node[this._];
7051           },
7052           toString: function() {
7053             return this._;
7054           }
7055         };
7056
7057         function sourceEvent() {
7058           var current = event, source;
7059           while (source = current.sourceEvent) current = source;
7060           return current;
7061         }
7062
7063         function point(node, event) {
7064           var svg = node.ownerSVGElement || node;
7065
7066           if (svg.createSVGPoint) {
7067             var point = svg.createSVGPoint();
7068             point.x = event.clientX, point.y = event.clientY;
7069             point = point.matrixTransform(node.getScreenCTM().inverse());
7070             return [point.x, point.y];
7071           }
7072
7073           var rect = node.getBoundingClientRect();
7074           return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
7075         }
7076
7077         function d3_mouse(node) {
7078           var event = sourceEvent();
7079           if (event.changedTouches) event = event.changedTouches[0];
7080           return point(node, event);
7081         }
7082
7083         function d3_selectAll(selector) {
7084           return typeof selector === "string"
7085               ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
7086               : new Selection([selector == null ? [] : selector], root$1);
7087         }
7088
7089         function touch(node, touches, identifier) {
7090           if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
7091
7092           for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
7093             if ((touch = touches[i]).identifier === identifier) {
7094               return point(node, touch);
7095             }
7096           }
7097
7098           return null;
7099         }
7100
7101         function d3_touches(node, touches) {
7102           if (touches == null) touches = sourceEvent().touches;
7103
7104           for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
7105             points[i] = point(node, touches[i]);
7106           }
7107
7108           return points;
7109         }
7110
7111         function nopropagation() {
7112           event.stopImmediatePropagation();
7113         }
7114
7115         function noevent() {
7116           event.preventDefault();
7117           event.stopImmediatePropagation();
7118         }
7119
7120         function dragDisable(view) {
7121           var root = view.document.documentElement,
7122               selection = d3_select(view).on("dragstart.drag", noevent, true);
7123           if ("onselectstart" in root) {
7124             selection.on("selectstart.drag", noevent, true);
7125           } else {
7126             root.__noselect = root.style.MozUserSelect;
7127             root.style.MozUserSelect = "none";
7128           }
7129         }
7130
7131         function yesdrag(view, noclick) {
7132           var root = view.document.documentElement,
7133               selection = d3_select(view).on("dragstart.drag", null);
7134           if (noclick) {
7135             selection.on("click.drag", noevent, true);
7136             setTimeout(function() { selection.on("click.drag", null); }, 0);
7137           }
7138           if ("onselectstart" in root) {
7139             selection.on("selectstart.drag", null);
7140           } else {
7141             root.style.MozUserSelect = root.__noselect;
7142             delete root.__noselect;
7143           }
7144         }
7145
7146         function constant$2(x) {
7147           return function() {
7148             return x;
7149           };
7150         }
7151
7152         function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
7153           this.target = target;
7154           this.type = type;
7155           this.subject = subject;
7156           this.identifier = id;
7157           this.active = active;
7158           this.x = x;
7159           this.y = y;
7160           this.dx = dx;
7161           this.dy = dy;
7162           this._ = dispatch;
7163         }
7164
7165         DragEvent.prototype.on = function() {
7166           var value = this._.on.apply(this._, arguments);
7167           return value === this._ ? this : value;
7168         };
7169
7170         // Ignore right-click, since that should open the context menu.
7171         function defaultFilter() {
7172           return !event.button;
7173         }
7174
7175         function defaultContainer() {
7176           return this.parentNode;
7177         }
7178
7179         function defaultSubject(d) {
7180           return d == null ? {x: event.x, y: event.y} : d;
7181         }
7182
7183         function defaultTouchable() {
7184           return "ontouchstart" in this;
7185         }
7186
7187         function d3_drag() {
7188           var filter = defaultFilter,
7189               container = defaultContainer,
7190               subject = defaultSubject,
7191               touchable = defaultTouchable,
7192               gestures = {},
7193               listeners = dispatch("start", "drag", "end"),
7194               active = 0,
7195               mousedownx,
7196               mousedowny,
7197               mousemoving,
7198               touchending,
7199               clickDistance2 = 0;
7200
7201           function drag(selection) {
7202             selection
7203                 .on("mousedown.drag", mousedowned)
7204               .filter(touchable)
7205                 .on("touchstart.drag", touchstarted)
7206                 .on("touchmove.drag", touchmoved)
7207                 .on("touchend.drag touchcancel.drag", touchended)
7208                 .style("touch-action", "none")
7209                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
7210           }
7211
7212           function mousedowned() {
7213             if (touchending || !filter.apply(this, arguments)) return;
7214             var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
7215             if (!gesture) return;
7216             d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
7217             dragDisable(event.view);
7218             nopropagation();
7219             mousemoving = false;
7220             mousedownx = event.clientX;
7221             mousedowny = event.clientY;
7222             gesture("start");
7223           }
7224
7225           function mousemoved() {
7226             noevent();
7227             if (!mousemoving) {
7228               var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
7229               mousemoving = dx * dx + dy * dy > clickDistance2;
7230             }
7231             gestures.mouse("drag");
7232           }
7233
7234           function mouseupped() {
7235             d3_select(event.view).on("mousemove.drag mouseup.drag", null);
7236             yesdrag(event.view, mousemoving);
7237             noevent();
7238             gestures.mouse("end");
7239           }
7240
7241           function touchstarted() {
7242             if (!filter.apply(this, arguments)) return;
7243             var touches = event.changedTouches,
7244                 c = container.apply(this, arguments),
7245                 n = touches.length, i, gesture;
7246
7247             for (i = 0; i < n; ++i) {
7248               if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
7249                 nopropagation();
7250                 gesture("start");
7251               }
7252             }
7253           }
7254
7255           function touchmoved() {
7256             var touches = event.changedTouches,
7257                 n = touches.length, i, gesture;
7258
7259             for (i = 0; i < n; ++i) {
7260               if (gesture = gestures[touches[i].identifier]) {
7261                 noevent();
7262                 gesture("drag");
7263               }
7264             }
7265           }
7266
7267           function touchended() {
7268             var touches = event.changedTouches,
7269                 n = touches.length, i, gesture;
7270
7271             if (touchending) clearTimeout(touchending);
7272             touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
7273             for (i = 0; i < n; ++i) {
7274               if (gesture = gestures[touches[i].identifier]) {
7275                 nopropagation();
7276                 gesture("end");
7277               }
7278             }
7279           }
7280
7281           function beforestart(id, container, point, that, args) {
7282             var p = point(container, id), s, dx, dy,
7283                 sublisteners = listeners.copy();
7284
7285             if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
7286               if ((event.subject = s = subject.apply(that, args)) == null) return false;
7287               dx = s.x - p[0] || 0;
7288               dy = s.y - p[1] || 0;
7289               return true;
7290             })) return;
7291
7292             return function gesture(type) {
7293               var p0 = p, n;
7294               switch (type) {
7295                 case "start": gestures[id] = gesture, n = active++; break;
7296                 case "end": delete gestures[id], --active; // nobreak
7297                 case "drag": p = point(container, id), n = active; break;
7298               }
7299               customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
7300             };
7301           }
7302
7303           drag.filter = function(_) {
7304             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
7305           };
7306
7307           drag.container = function(_) {
7308             return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
7309           };
7310
7311           drag.subject = function(_) {
7312             return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
7313           };
7314
7315           drag.touchable = function(_) {
7316             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
7317           };
7318
7319           drag.on = function() {
7320             var value = listeners.on.apply(listeners, arguments);
7321             return value === listeners ? drag : value;
7322           };
7323
7324           drag.clickDistance = function(_) {
7325             return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
7326           };
7327
7328           return drag;
7329         }
7330
7331         function define$1(constructor, factory, prototype) {
7332           constructor.prototype = factory.prototype = prototype;
7333           prototype.constructor = constructor;
7334         }
7335
7336         function extend(parent, definition) {
7337           var prototype = Object.create(parent.prototype);
7338           for (var key in definition) prototype[key] = definition[key];
7339           return prototype;
7340         }
7341
7342         function Color() {}
7343
7344         var darker = 0.7;
7345         var brighter = 1 / darker;
7346
7347         var reI = "\\s*([+-]?\\d+)\\s*",
7348             reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
7349             reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
7350             reHex3 = /^#([0-9a-f]{3})$/,
7351             reHex6 = /^#([0-9a-f]{6})$/,
7352             reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
7353             reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
7354             reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
7355             reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
7356             reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
7357             reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
7358
7359         var named = {
7360           aliceblue: 0xf0f8ff,
7361           antiquewhite: 0xfaebd7,
7362           aqua: 0x00ffff,
7363           aquamarine: 0x7fffd4,
7364           azure: 0xf0ffff,
7365           beige: 0xf5f5dc,
7366           bisque: 0xffe4c4,
7367           black: 0x000000,
7368           blanchedalmond: 0xffebcd,
7369           blue: 0x0000ff,
7370           blueviolet: 0x8a2be2,
7371           brown: 0xa52a2a,
7372           burlywood: 0xdeb887,
7373           cadetblue: 0x5f9ea0,
7374           chartreuse: 0x7fff00,
7375           chocolate: 0xd2691e,
7376           coral: 0xff7f50,
7377           cornflowerblue: 0x6495ed,
7378           cornsilk: 0xfff8dc,
7379           crimson: 0xdc143c,
7380           cyan: 0x00ffff,
7381           darkblue: 0x00008b,
7382           darkcyan: 0x008b8b,
7383           darkgoldenrod: 0xb8860b,
7384           darkgray: 0xa9a9a9,
7385           darkgreen: 0x006400,
7386           darkgrey: 0xa9a9a9,
7387           darkkhaki: 0xbdb76b,
7388           darkmagenta: 0x8b008b,
7389           darkolivegreen: 0x556b2f,
7390           darkorange: 0xff8c00,
7391           darkorchid: 0x9932cc,
7392           darkred: 0x8b0000,
7393           darksalmon: 0xe9967a,
7394           darkseagreen: 0x8fbc8f,
7395           darkslateblue: 0x483d8b,
7396           darkslategray: 0x2f4f4f,
7397           darkslategrey: 0x2f4f4f,
7398           darkturquoise: 0x00ced1,
7399           darkviolet: 0x9400d3,
7400           deeppink: 0xff1493,
7401           deepskyblue: 0x00bfff,
7402           dimgray: 0x696969,
7403           dimgrey: 0x696969,
7404           dodgerblue: 0x1e90ff,
7405           firebrick: 0xb22222,
7406           floralwhite: 0xfffaf0,
7407           forestgreen: 0x228b22,
7408           fuchsia: 0xff00ff,
7409           gainsboro: 0xdcdcdc,
7410           ghostwhite: 0xf8f8ff,
7411           gold: 0xffd700,
7412           goldenrod: 0xdaa520,
7413           gray: 0x808080,
7414           green: 0x008000,
7415           greenyellow: 0xadff2f,
7416           grey: 0x808080,
7417           honeydew: 0xf0fff0,
7418           hotpink: 0xff69b4,
7419           indianred: 0xcd5c5c,
7420           indigo: 0x4b0082,
7421           ivory: 0xfffff0,
7422           khaki: 0xf0e68c,
7423           lavender: 0xe6e6fa,
7424           lavenderblush: 0xfff0f5,
7425           lawngreen: 0x7cfc00,
7426           lemonchiffon: 0xfffacd,
7427           lightblue: 0xadd8e6,
7428           lightcoral: 0xf08080,
7429           lightcyan: 0xe0ffff,
7430           lightgoldenrodyellow: 0xfafad2,
7431           lightgray: 0xd3d3d3,
7432           lightgreen: 0x90ee90,
7433           lightgrey: 0xd3d3d3,
7434           lightpink: 0xffb6c1,
7435           lightsalmon: 0xffa07a,
7436           lightseagreen: 0x20b2aa,
7437           lightskyblue: 0x87cefa,
7438           lightslategray: 0x778899,
7439           lightslategrey: 0x778899,
7440           lightsteelblue: 0xb0c4de,
7441           lightyellow: 0xffffe0,
7442           lime: 0x00ff00,
7443           limegreen: 0x32cd32,
7444           linen: 0xfaf0e6,
7445           magenta: 0xff00ff,
7446           maroon: 0x800000,
7447           mediumaquamarine: 0x66cdaa,
7448           mediumblue: 0x0000cd,
7449           mediumorchid: 0xba55d3,
7450           mediumpurple: 0x9370db,
7451           mediumseagreen: 0x3cb371,
7452           mediumslateblue: 0x7b68ee,
7453           mediumspringgreen: 0x00fa9a,
7454           mediumturquoise: 0x48d1cc,
7455           mediumvioletred: 0xc71585,
7456           midnightblue: 0x191970,
7457           mintcream: 0xf5fffa,
7458           mistyrose: 0xffe4e1,
7459           moccasin: 0xffe4b5,
7460           navajowhite: 0xffdead,
7461           navy: 0x000080,
7462           oldlace: 0xfdf5e6,
7463           olive: 0x808000,
7464           olivedrab: 0x6b8e23,
7465           orange: 0xffa500,
7466           orangered: 0xff4500,
7467           orchid: 0xda70d6,
7468           palegoldenrod: 0xeee8aa,
7469           palegreen: 0x98fb98,
7470           paleturquoise: 0xafeeee,
7471           palevioletred: 0xdb7093,
7472           papayawhip: 0xffefd5,
7473           peachpuff: 0xffdab9,
7474           peru: 0xcd853f,
7475           pink: 0xffc0cb,
7476           plum: 0xdda0dd,
7477           powderblue: 0xb0e0e6,
7478           purple: 0x800080,
7479           rebeccapurple: 0x663399,
7480           red: 0xff0000,
7481           rosybrown: 0xbc8f8f,
7482           royalblue: 0x4169e1,
7483           saddlebrown: 0x8b4513,
7484           salmon: 0xfa8072,
7485           sandybrown: 0xf4a460,
7486           seagreen: 0x2e8b57,
7487           seashell: 0xfff5ee,
7488           sienna: 0xa0522d,
7489           silver: 0xc0c0c0,
7490           skyblue: 0x87ceeb,
7491           slateblue: 0x6a5acd,
7492           slategray: 0x708090,
7493           slategrey: 0x708090,
7494           snow: 0xfffafa,
7495           springgreen: 0x00ff7f,
7496           steelblue: 0x4682b4,
7497           tan: 0xd2b48c,
7498           teal: 0x008080,
7499           thistle: 0xd8bfd8,
7500           tomato: 0xff6347,
7501           turquoise: 0x40e0d0,
7502           violet: 0xee82ee,
7503           wheat: 0xf5deb3,
7504           white: 0xffffff,
7505           whitesmoke: 0xf5f5f5,
7506           yellow: 0xffff00,
7507           yellowgreen: 0x9acd32
7508         };
7509
7510         define$1(Color, color, {
7511           displayable: function() {
7512             return this.rgb().displayable();
7513           },
7514           hex: function() {
7515             return this.rgb().hex();
7516           },
7517           toString: function() {
7518             return this.rgb() + "";
7519           }
7520         });
7521
7522         function color(format) {
7523           var m;
7524           format = (format + "").trim().toLowerCase();
7525           return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
7526               : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
7527               : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
7528               : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
7529               : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
7530               : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
7531               : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
7532               : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
7533               : named.hasOwnProperty(format) ? rgbn(named[format])
7534               : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
7535               : null;
7536         }
7537
7538         function rgbn(n) {
7539           return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
7540         }
7541
7542         function rgba(r, g, b, a) {
7543           if (a <= 0) r = g = b = NaN;
7544           return new Rgb(r, g, b, a);
7545         }
7546
7547         function rgbConvert(o) {
7548           if (!(o instanceof Color)) o = color(o);
7549           if (!o) return new Rgb;
7550           o = o.rgb();
7551           return new Rgb(o.r, o.g, o.b, o.opacity);
7552         }
7553
7554         function rgb(r, g, b, opacity) {
7555           return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
7556         }
7557
7558         function Rgb(r, g, b, opacity) {
7559           this.r = +r;
7560           this.g = +g;
7561           this.b = +b;
7562           this.opacity = +opacity;
7563         }
7564
7565         define$1(Rgb, rgb, extend(Color, {
7566           brighter: function(k) {
7567             k = k == null ? brighter : Math.pow(brighter, k);
7568             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7569           },
7570           darker: function(k) {
7571             k = k == null ? darker : Math.pow(darker, k);
7572             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7573           },
7574           rgb: function() {
7575             return this;
7576           },
7577           displayable: function() {
7578             return (-0.5 <= this.r && this.r < 255.5)
7579                 && (-0.5 <= this.g && this.g < 255.5)
7580                 && (-0.5 <= this.b && this.b < 255.5)
7581                 && (0 <= this.opacity && this.opacity <= 1);
7582           },
7583           hex: function() {
7584             return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
7585           },
7586           toString: function() {
7587             var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
7588             return (a === 1 ? "rgb(" : "rgba(")
7589                 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
7590                 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
7591                 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
7592                 + (a === 1 ? ")" : ", " + a + ")");
7593           }
7594         }));
7595
7596         function hex$1(value) {
7597           value = Math.max(0, Math.min(255, Math.round(value) || 0));
7598           return (value < 16 ? "0" : "") + value.toString(16);
7599         }
7600
7601         function hsla(h, s, l, a) {
7602           if (a <= 0) h = s = l = NaN;
7603           else if (l <= 0 || l >= 1) h = s = NaN;
7604           else if (s <= 0) h = NaN;
7605           return new Hsl(h, s, l, a);
7606         }
7607
7608         function hslConvert(o) {
7609           if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
7610           if (!(o instanceof Color)) o = color(o);
7611           if (!o) return new Hsl;
7612           if (o instanceof Hsl) return o;
7613           o = o.rgb();
7614           var r = o.r / 255,
7615               g = o.g / 255,
7616               b = o.b / 255,
7617               min = Math.min(r, g, b),
7618               max = Math.max(r, g, b),
7619               h = NaN,
7620               s = max - min,
7621               l = (max + min) / 2;
7622           if (s) {
7623             if (r === max) h = (g - b) / s + (g < b) * 6;
7624             else if (g === max) h = (b - r) / s + 2;
7625             else h = (r - g) / s + 4;
7626             s /= l < 0.5 ? max + min : 2 - max - min;
7627             h *= 60;
7628           } else {
7629             s = l > 0 && l < 1 ? 0 : h;
7630           }
7631           return new Hsl(h, s, l, o.opacity);
7632         }
7633
7634         function hsl(h, s, l, opacity) {
7635           return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
7636         }
7637
7638         function Hsl(h, s, l, opacity) {
7639           this.h = +h;
7640           this.s = +s;
7641           this.l = +l;
7642           this.opacity = +opacity;
7643         }
7644
7645         define$1(Hsl, hsl, extend(Color, {
7646           brighter: function(k) {
7647             k = k == null ? brighter : Math.pow(brighter, k);
7648             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7649           },
7650           darker: function(k) {
7651             k = k == null ? darker : Math.pow(darker, k);
7652             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7653           },
7654           rgb: function() {
7655             var h = this.h % 360 + (this.h < 0) * 360,
7656                 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
7657                 l = this.l,
7658                 m2 = l + (l < 0.5 ? l : 1 - l) * s,
7659                 m1 = 2 * l - m2;
7660             return new Rgb(
7661               hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
7662               hsl2rgb(h, m1, m2),
7663               hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
7664               this.opacity
7665             );
7666           },
7667           displayable: function() {
7668             return (0 <= this.s && this.s <= 1 || isNaN(this.s))
7669                 && (0 <= this.l && this.l <= 1)
7670                 && (0 <= this.opacity && this.opacity <= 1);
7671           }
7672         }));
7673
7674         /* From FvD 13.37, CSS Color Module Level 3 */
7675         function hsl2rgb(h, m1, m2) {
7676           return (h < 60 ? m1 + (m2 - m1) * h / 60
7677               : h < 180 ? m2
7678               : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
7679               : m1) * 255;
7680         }
7681
7682         var deg2rad = Math.PI / 180;
7683         var rad2deg = 180 / Math.PI;
7684
7685         // https://observablehq.com/@mbostock/lab-and-rgb
7686         var K = 18,
7687             Xn = 0.96422,
7688             Yn = 1,
7689             Zn = 0.82521,
7690             t0 = 4 / 29,
7691             t1 = 6 / 29,
7692             t2 = 3 * t1 * t1,
7693             t3 = t1 * t1 * t1;
7694
7695         function labConvert(o) {
7696           if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
7697           if (o instanceof Hcl) return hcl2lab(o);
7698           if (!(o instanceof Rgb)) o = rgbConvert(o);
7699           var r = rgb2lrgb(o.r),
7700               g = rgb2lrgb(o.g),
7701               b = rgb2lrgb(o.b),
7702               y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
7703           if (r === g && g === b) x = z = y; else {
7704             x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
7705             z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
7706           }
7707           return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
7708         }
7709
7710         function gray(l, opacity) {
7711           return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
7712         }
7713
7714         function lab(l, a, b, opacity) {
7715           return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
7716         }
7717
7718         function Lab(l, a, b, opacity) {
7719           this.l = +l;
7720           this.a = +a;
7721           this.b = +b;
7722           this.opacity = +opacity;
7723         }
7724
7725         define$1(Lab, lab, extend(Color, {
7726           brighter: function(k) {
7727             return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7728           },
7729           darker: function(k) {
7730             return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7731           },
7732           rgb: function() {
7733             var y = (this.l + 16) / 116,
7734                 x = isNaN(this.a) ? y : y + this.a / 500,
7735                 z = isNaN(this.b) ? y : y - this.b / 200;
7736             x = Xn * lab2xyz(x);
7737             y = Yn * lab2xyz(y);
7738             z = Zn * lab2xyz(z);
7739             return new Rgb(
7740               lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
7741               lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
7742               lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
7743               this.opacity
7744             );
7745           }
7746         }));
7747
7748         function xyz2lab(t) {
7749           return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7750         }
7751
7752         function lab2xyz(t) {
7753           return t > t1 ? t * t * t : t2 * (t - t0);
7754         }
7755
7756         function lrgb2rgb(x) {
7757           return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7758         }
7759
7760         function rgb2lrgb(x) {
7761           return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7762         }
7763
7764         function hclConvert(o) {
7765           if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
7766           if (!(o instanceof Lab)) o = labConvert(o);
7767           if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);
7768           var h = Math.atan2(o.b, o.a) * rad2deg;
7769           return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
7770         }
7771
7772         function lch(l, c, h, opacity) {
7773           return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7774         }
7775
7776         function hcl(h, c, l, opacity) {
7777           return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7778         }
7779
7780         function Hcl(h, c, l, opacity) {
7781           this.h = +h;
7782           this.c = +c;
7783           this.l = +l;
7784           this.opacity = +opacity;
7785         }
7786
7787         function hcl2lab(o) {
7788           if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
7789           var h = o.h * deg2rad;
7790           return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
7791         }
7792
7793         define$1(Hcl, hcl, extend(Color, {
7794           brighter: function(k) {
7795             return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
7796           },
7797           darker: function(k) {
7798             return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
7799           },
7800           rgb: function() {
7801             return hcl2lab(this).rgb();
7802           }
7803         }));
7804
7805         var A = -0.14861,
7806             B = +1.78277,
7807             C = -0.29227,
7808             D = -0.90649,
7809             E = +1.97294,
7810             ED = E * D,
7811             EB = E * B,
7812             BC_DA = B * C - D * A;
7813
7814         function cubehelixConvert(o) {
7815           if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
7816           if (!(o instanceof Rgb)) o = rgbConvert(o);
7817           var r = o.r / 255,
7818               g = o.g / 255,
7819               b = o.b / 255,
7820               l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
7821               bl = b - l,
7822               k = (E * (g - l) - C * bl) / D,
7823               s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
7824               h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
7825           return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
7826         }
7827
7828         function cubehelix(h, s, l, opacity) {
7829           return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
7830         }
7831
7832         function Cubehelix(h, s, l, opacity) {
7833           this.h = +h;
7834           this.s = +s;
7835           this.l = +l;
7836           this.opacity = +opacity;
7837         }
7838
7839         define$1(Cubehelix, cubehelix, extend(Color, {
7840           brighter: function(k) {
7841             k = k == null ? brighter : Math.pow(brighter, k);
7842             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7843           },
7844           darker: function(k) {
7845             k = k == null ? darker : Math.pow(darker, k);
7846             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7847           },
7848           rgb: function() {
7849             var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
7850                 l = +this.l,
7851                 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
7852                 cosh = Math.cos(h),
7853                 sinh = Math.sin(h);
7854             return new Rgb(
7855               255 * (l + a * (A * cosh + B * sinh)),
7856               255 * (l + a * (C * cosh + D * sinh)),
7857               255 * (l + a * (E * cosh)),
7858               this.opacity
7859             );
7860           }
7861         }));
7862
7863         function basis(t1, v0, v1, v2, v3) {
7864           var t2 = t1 * t1, t3 = t2 * t1;
7865           return ((1 - 3 * t1 + 3 * t2 - t3) * v0
7866               + (4 - 6 * t2 + 3 * t3) * v1
7867               + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
7868               + t3 * v3) / 6;
7869         }
7870
7871         function basis$1(values) {
7872           var n = values.length - 1;
7873           return function(t) {
7874             var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
7875                 v1 = values[i],
7876                 v2 = values[i + 1],
7877                 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
7878                 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
7879             return basis((t - i / n) * n, v0, v1, v2, v3);
7880           };
7881         }
7882
7883         function basisClosed(values) {
7884           var n = values.length;
7885           return function(t) {
7886             var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
7887                 v0 = values[(i + n - 1) % n],
7888                 v1 = values[i % n],
7889                 v2 = values[(i + 1) % n],
7890                 v3 = values[(i + 2) % n];
7891             return basis((t - i / n) * n, v0, v1, v2, v3);
7892           };
7893         }
7894
7895         function constant$3(x) {
7896           return function() {
7897             return x;
7898           };
7899         }
7900
7901         function linear(a, d) {
7902           return function(t) {
7903             return a + t * d;
7904           };
7905         }
7906
7907         function exponential(a, b, y) {
7908           return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
7909             return Math.pow(a + t * b, y);
7910           };
7911         }
7912
7913         function hue(a, b) {
7914           var d = b - a;
7915           return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
7916         }
7917
7918         function gamma(y) {
7919           return (y = +y) === 1 ? nogamma : function(a, b) {
7920             return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
7921           };
7922         }
7923
7924         function nogamma(a, b) {
7925           var d = b - a;
7926           return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
7927         }
7928
7929         var d3_interpolateRgb = (function rgbGamma(y) {
7930           var color = gamma(y);
7931
7932           function rgb$1(start, end) {
7933             var r = color((start = rgb(start)).r, (end = rgb(end)).r),
7934                 g = color(start.g, end.g),
7935                 b = color(start.b, end.b),
7936                 opacity = nogamma(start.opacity, end.opacity);
7937             return function(t) {
7938               start.r = r(t);
7939               start.g = g(t);
7940               start.b = b(t);
7941               start.opacity = opacity(t);
7942               return start + "";
7943             };
7944           }
7945
7946           rgb$1.gamma = rgbGamma;
7947
7948           return rgb$1;
7949         })(1);
7950
7951         function rgbSpline(spline) {
7952           return function(colors) {
7953             var n = colors.length,
7954                 r = new Array(n),
7955                 g = new Array(n),
7956                 b = new Array(n),
7957                 i, color;
7958             for (i = 0; i < n; ++i) {
7959               color = rgb(colors[i]);
7960               r[i] = color.r || 0;
7961               g[i] = color.g || 0;
7962               b[i] = color.b || 0;
7963             }
7964             r = spline(r);
7965             g = spline(g);
7966             b = spline(b);
7967             color.opacity = 1;
7968             return function(t) {
7969               color.r = r(t);
7970               color.g = g(t);
7971               color.b = b(t);
7972               return color + "";
7973             };
7974           };
7975         }
7976
7977         var rgbBasis = rgbSpline(basis$1);
7978         var rgbBasisClosed = rgbSpline(basisClosed);
7979
7980         function array$2(a, b) {
7981           var nb = b ? b.length : 0,
7982               na = a ? Math.min(nb, a.length) : 0,
7983               x = new Array(na),
7984               c = new Array(nb),
7985               i;
7986
7987           for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
7988           for (; i < nb; ++i) c[i] = b[i];
7989
7990           return function(t) {
7991             for (i = 0; i < na; ++i) c[i] = x[i](t);
7992             return c;
7993           };
7994         }
7995
7996         function date(a, b) {
7997           var d = new Date;
7998           return a = +a, b -= a, function(t) {
7999             return d.setTime(a + b * t), d;
8000           };
8001         }
8002
8003         function d3_interpolateNumber(a, b) {
8004           return a = +a, b -= a, function(t) {
8005             return a + b * t;
8006           };
8007         }
8008
8009         function object(a, b) {
8010           var i = {},
8011               c = {},
8012               k;
8013
8014           if (a === null || typeof a !== "object") a = {};
8015           if (b === null || typeof b !== "object") b = {};
8016
8017           for (k in b) {
8018             if (k in a) {
8019               i[k] = d3_interpolate(a[k], b[k]);
8020             } else {
8021               c[k] = b[k];
8022             }
8023           }
8024
8025           return function(t) {
8026             for (k in i) c[k] = i[k](t);
8027             return c;
8028           };
8029         }
8030
8031         var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
8032             reB = new RegExp(reA.source, "g");
8033
8034         function zero(b) {
8035           return function() {
8036             return b;
8037           };
8038         }
8039
8040         function one(b) {
8041           return function(t) {
8042             return b(t) + "";
8043           };
8044         }
8045
8046         function interpolateString(a, b) {
8047           var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
8048               am, // current match in a
8049               bm, // current match in b
8050               bs, // string preceding current number in b, if any
8051               i = -1, // index in s
8052               s = [], // string constants and placeholders
8053               q = []; // number interpolators
8054
8055           // Coerce inputs to strings.
8056           a = a + "", b = b + "";
8057
8058           // Interpolate pairs of numbers in a & b.
8059           while ((am = reA.exec(a))
8060               && (bm = reB.exec(b))) {
8061             if ((bs = bm.index) > bi) { // a string precedes the next number in b
8062               bs = b.slice(bi, bs);
8063               if (s[i]) s[i] += bs; // coalesce with previous string
8064               else s[++i] = bs;
8065             }
8066             if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
8067               if (s[i]) s[i] += bm; // coalesce with previous string
8068               else s[++i] = bm;
8069             } else { // interpolate non-matching numbers
8070               s[++i] = null;
8071               q.push({i: i, x: d3_interpolateNumber(am, bm)});
8072             }
8073             bi = reB.lastIndex;
8074           }
8075
8076           // Add remains of b.
8077           if (bi < b.length) {
8078             bs = b.slice(bi);
8079             if (s[i]) s[i] += bs; // coalesce with previous string
8080             else s[++i] = bs;
8081           }
8082
8083           // Special optimization for only a single match.
8084           // Otherwise, interpolate each of the numbers and rejoin the string.
8085           return s.length < 2 ? (q[0]
8086               ? one(q[0].x)
8087               : zero(b))
8088               : (b = q.length, function(t) {
8089                   for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
8090                   return s.join("");
8091                 });
8092         }
8093
8094         function d3_interpolate(a, b) {
8095           var t = typeof b, c;
8096           return b == null || t === "boolean" ? constant$3(b)
8097               : (t === "number" ? d3_interpolateNumber
8098               : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
8099               : b instanceof color ? d3_interpolateRgb
8100               : b instanceof Date ? date
8101               : Array.isArray(b) ? array$2
8102               : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
8103               : d3_interpolateNumber)(a, b);
8104         }
8105
8106         function discrete(range) {
8107           var n = range.length;
8108           return function(t) {
8109             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
8110           };
8111         }
8112
8113         function hue$1(a, b) {
8114           var i = hue(+a, +b);
8115           return function(t) {
8116             var x = i(t);
8117             return x - 360 * Math.floor(x / 360);
8118           };
8119         }
8120
8121         function interpolateRound(a, b) {
8122           return a = +a, b -= a, function(t) {
8123             return Math.round(a + b * t);
8124           };
8125         }
8126
8127         var degrees = 180 / Math.PI;
8128
8129         var identity$2 = {
8130           translateX: 0,
8131           translateY: 0,
8132           rotate: 0,
8133           skewX: 0,
8134           scaleX: 1,
8135           scaleY: 1
8136         };
8137
8138         function decompose(a, b, c, d, e, f) {
8139           var scaleX, scaleY, skewX;
8140           if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
8141           if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
8142           if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
8143           if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
8144           return {
8145             translateX: e,
8146             translateY: f,
8147             rotate: Math.atan2(b, a) * degrees,
8148             skewX: Math.atan(skewX) * degrees,
8149             scaleX: scaleX,
8150             scaleY: scaleY
8151           };
8152         }
8153
8154         var cssNode,
8155             cssRoot,
8156             cssView,
8157             svgNode;
8158
8159         function parseCss(value) {
8160           if (value === "none") return identity$2;
8161           if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
8162           cssNode.style.transform = value;
8163           value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
8164           cssRoot.removeChild(cssNode);
8165           value = value.slice(7, -1).split(",");
8166           return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
8167         }
8168
8169         function parseSvg(value) {
8170           if (value == null) return identity$2;
8171           if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
8172           svgNode.setAttribute("transform", value);
8173           if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
8174           value = value.matrix;
8175           return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
8176         }
8177
8178         function interpolateTransform(parse, pxComma, pxParen, degParen) {
8179
8180           function pop(s) {
8181             return s.length ? s.pop() + " " : "";
8182           }
8183
8184           function translate(xa, ya, xb, yb, s, q) {
8185             if (xa !== xb || ya !== yb) {
8186               var i = s.push("translate(", null, pxComma, null, pxParen);
8187               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8188             } else if (xb || yb) {
8189               s.push("translate(" + xb + pxComma + yb + pxParen);
8190             }
8191           }
8192
8193           function rotate(a, b, s, q) {
8194             if (a !== b) {
8195               if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
8196               q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8197             } else if (b) {
8198               s.push(pop(s) + "rotate(" + b + degParen);
8199             }
8200           }
8201
8202           function skewX(a, b, s, q) {
8203             if (a !== b) {
8204               q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8205             } else if (b) {
8206               s.push(pop(s) + "skewX(" + b + degParen);
8207             }
8208           }
8209
8210           function scale(xa, ya, xb, yb, s, q) {
8211             if (xa !== xb || ya !== yb) {
8212               var i = s.push(pop(s) + "scale(", null, ",", null, ")");
8213               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8214             } else if (xb !== 1 || yb !== 1) {
8215               s.push(pop(s) + "scale(" + xb + "," + yb + ")");
8216             }
8217           }
8218
8219           return function(a, b) {
8220             var s = [], // string constants and placeholders
8221                 q = []; // number interpolators
8222             a = parse(a), b = parse(b);
8223             translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
8224             rotate(a.rotate, b.rotate, s, q);
8225             skewX(a.skewX, b.skewX, s, q);
8226             scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
8227             a = b = null; // gc
8228             return function(t) {
8229               var i = -1, n = q.length, o;
8230               while (++i < n) s[(o = q[i]).i] = o.x(t);
8231               return s.join("");
8232             };
8233           };
8234         }
8235
8236         var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
8237         var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
8238
8239         var rho = Math.SQRT2,
8240             rho2 = 2,
8241             rho4 = 4,
8242             epsilon2 = 1e-12;
8243
8244         function cosh(x) {
8245           return ((x = Math.exp(x)) + 1 / x) / 2;
8246         }
8247
8248         function sinh(x) {
8249           return ((x = Math.exp(x)) - 1 / x) / 2;
8250         }
8251
8252         function tanh(x) {
8253           return ((x = Math.exp(2 * x)) - 1) / (x + 1);
8254         }
8255
8256         // p0 = [ux0, uy0, w0]
8257         // p1 = [ux1, uy1, w1]
8258         function interpolateZoom(p0, p1) {
8259           var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
8260               ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
8261               dx = ux1 - ux0,
8262               dy = uy1 - uy0,
8263               d2 = dx * dx + dy * dy,
8264               i,
8265               S;
8266
8267           // Special case for u0 ≅ u1.
8268           if (d2 < epsilon2) {
8269             S = Math.log(w1 / w0) / rho;
8270             i = function(t) {
8271               return [
8272                 ux0 + t * dx,
8273                 uy0 + t * dy,
8274                 w0 * Math.exp(rho * t * S)
8275               ];
8276             };
8277           }
8278
8279           // General case.
8280           else {
8281             var d1 = Math.sqrt(d2),
8282                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
8283                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
8284                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
8285                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
8286             S = (r1 - r0) / rho;
8287             i = function(t) {
8288               var s = t * S,
8289                   coshr0 = cosh(r0),
8290                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
8291               return [
8292                 ux0 + u * dx,
8293                 uy0 + u * dy,
8294                 w0 * coshr0 / cosh(rho * s + r0)
8295               ];
8296             };
8297           }
8298
8299           i.duration = S * 1000;
8300
8301           return i;
8302         }
8303
8304         function hsl$1(hue) {
8305           return function(start, end) {
8306             var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
8307                 s = nogamma(start.s, end.s),
8308                 l = nogamma(start.l, end.l),
8309                 opacity = nogamma(start.opacity, end.opacity);
8310             return function(t) {
8311               start.h = h(t);
8312               start.s = s(t);
8313               start.l = l(t);
8314               start.opacity = opacity(t);
8315               return start + "";
8316             };
8317           }
8318         }
8319
8320         var hsl$2 = hsl$1(hue);
8321         var hslLong = hsl$1(nogamma);
8322
8323         function lab$1(start, end) {
8324           var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
8325               a = nogamma(start.a, end.a),
8326               b = nogamma(start.b, end.b),
8327               opacity = nogamma(start.opacity, end.opacity);
8328           return function(t) {
8329             start.l = l(t);
8330             start.a = a(t);
8331             start.b = b(t);
8332             start.opacity = opacity(t);
8333             return start + "";
8334           };
8335         }
8336
8337         function hcl$1(hue) {
8338           return function(start, end) {
8339             var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
8340                 c = nogamma(start.c, end.c),
8341                 l = nogamma(start.l, end.l),
8342                 opacity = nogamma(start.opacity, end.opacity);
8343             return function(t) {
8344               start.h = h(t);
8345               start.c = c(t);
8346               start.l = l(t);
8347               start.opacity = opacity(t);
8348               return start + "";
8349             };
8350           }
8351         }
8352
8353         var hcl$2 = hcl$1(hue);
8354         var hclLong = hcl$1(nogamma);
8355
8356         function cubehelix$1(hue) {
8357           return (function cubehelixGamma(y) {
8358             y = +y;
8359
8360             function cubehelix$1(start, end) {
8361               var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
8362                   s = nogamma(start.s, end.s),
8363                   l = nogamma(start.l, end.l),
8364                   opacity = nogamma(start.opacity, end.opacity);
8365               return function(t) {
8366                 start.h = h(t);
8367                 start.s = s(t);
8368                 start.l = l(Math.pow(t, y));
8369                 start.opacity = opacity(t);
8370                 return start + "";
8371               };
8372             }
8373
8374             cubehelix$1.gamma = cubehelixGamma;
8375
8376             return cubehelix$1;
8377           })(1);
8378         }
8379
8380         var cubehelix$2 = cubehelix$1(hue);
8381         var cubehelixLong = cubehelix$1(nogamma);
8382
8383         function piecewise(interpolate, values) {
8384           var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
8385           while (i < n) I[i] = interpolate(v, v = values[++i]);
8386           return function(t) {
8387             var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
8388             return I[i](t - i);
8389           };
8390         }
8391
8392         function d3_quantize(interpolator, n) {
8393           var samples = new Array(n);
8394           for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
8395           return samples;
8396         }
8397
8398         var frame = 0, // is an animation frame pending?
8399             timeout = 0, // is a timeout pending?
8400             interval = 0, // are any timers active?
8401             pokeDelay = 1000, // how frequently we check for clock skew
8402             taskHead,
8403             taskTail,
8404             clockLast = 0,
8405             clockNow = 0,
8406             clockSkew = 0,
8407             clock = typeof performance === "object" && performance.now ? performance : Date,
8408             setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
8409
8410         function now() {
8411           return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
8412         }
8413
8414         function clearNow() {
8415           clockNow = 0;
8416         }
8417
8418         function Timer() {
8419           this._call =
8420           this._time =
8421           this._next = null;
8422         }
8423
8424         Timer.prototype = timer.prototype = {
8425           constructor: Timer,
8426           restart: function(callback, delay, time) {
8427             if (typeof callback !== "function") throw new TypeError("callback is not a function");
8428             time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
8429             if (!this._next && taskTail !== this) {
8430               if (taskTail) taskTail._next = this;
8431               else taskHead = this;
8432               taskTail = this;
8433             }
8434             this._call = callback;
8435             this._time = time;
8436             sleep();
8437           },
8438           stop: function() {
8439             if (this._call) {
8440               this._call = null;
8441               this._time = Infinity;
8442               sleep();
8443             }
8444           }
8445         };
8446
8447         function timer(callback, delay, time) {
8448           var t = new Timer;
8449           t.restart(callback, delay, time);
8450           return t;
8451         }
8452
8453         function timerFlush() {
8454           now(); // Get the current time, if not already set.
8455           ++frame; // Pretend we’ve set an alarm, if we haven’t already.
8456           var t = taskHead, e;
8457           while (t) {
8458             if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
8459             t = t._next;
8460           }
8461           --frame;
8462         }
8463
8464         function wake() {
8465           clockNow = (clockLast = clock.now()) + clockSkew;
8466           frame = timeout = 0;
8467           try {
8468             timerFlush();
8469           } finally {
8470             frame = 0;
8471             nap();
8472             clockNow = 0;
8473           }
8474         }
8475
8476         function poke() {
8477           var now = clock.now(), delay = now - clockLast;
8478           if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
8479         }
8480
8481         function nap() {
8482           var t0, t1 = taskHead, t2, time = Infinity;
8483           while (t1) {
8484             if (t1._call) {
8485               if (time > t1._time) time = t1._time;
8486               t0 = t1, t1 = t1._next;
8487             } else {
8488               t2 = t1._next, t1._next = null;
8489               t1 = t0 ? t0._next = t2 : taskHead = t2;
8490             }
8491           }
8492           taskTail = t0;
8493           sleep(time);
8494         }
8495
8496         function sleep(time) {
8497           if (frame) return; // Soonest alarm already set, or will be.
8498           if (timeout) timeout = clearTimeout(timeout);
8499           var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
8500           if (delay > 24) {
8501             if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
8502             if (interval) interval = clearInterval(interval);
8503           } else {
8504             if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
8505             frame = 1, setFrame(wake);
8506           }
8507         }
8508
8509         function d3_timeout(callback, delay, time) {
8510           var t = new Timer;
8511           delay = delay == null ? 0 : +delay;
8512           t.restart(function(elapsed) {
8513             t.stop();
8514             callback(elapsed + delay);
8515           }, delay, time);
8516           return t;
8517         }
8518
8519         function interval$1(callback, delay, time) {
8520           var t = new Timer, total = delay;
8521           if (delay == null) return t.restart(callback, delay, time), t;
8522           delay = +delay, time = time == null ? now() : +time;
8523           t.restart(function tick(elapsed) {
8524             elapsed += total;
8525             t.restart(tick, total += delay, time);
8526             callback(elapsed);
8527           }, delay, time);
8528           return t;
8529         }
8530
8531         var emptyOn = dispatch("start", "end", "cancel", "interrupt");
8532         var emptyTween = [];
8533
8534         var CREATED = 0;
8535         var SCHEDULED = 1;
8536         var STARTING = 2;
8537         var STARTED = 3;
8538         var RUNNING = 4;
8539         var ENDING = 5;
8540         var ENDED = 6;
8541
8542         function schedule(node, name, id, index, group, timing) {
8543           var schedules = node.__transition;
8544           if (!schedules) node.__transition = {};
8545           else if (id in schedules) return;
8546           create$6(node, id, {
8547             name: name,
8548             index: index, // For context during callback.
8549             group: group, // For context during callback.
8550             on: emptyOn,
8551             tween: emptyTween,
8552             time: timing.time,
8553             delay: timing.delay,
8554             duration: timing.duration,
8555             ease: timing.ease,
8556             timer: null,
8557             state: CREATED
8558           });
8559         }
8560
8561         function init(node, id) {
8562           var schedule = get$2(node, id);
8563           if (schedule.state > CREATED) throw new Error("too late; already scheduled");
8564           return schedule;
8565         }
8566
8567         function set$1(node, id) {
8568           var schedule = get$2(node, id);
8569           if (schedule.state > STARTED) throw new Error("too late; already running");
8570           return schedule;
8571         }
8572
8573         function get$2(node, id) {
8574           var schedule = node.__transition;
8575           if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
8576           return schedule;
8577         }
8578
8579         function create$6(node, id, self) {
8580           var schedules = node.__transition,
8581               tween;
8582
8583           // Initialize the self timer when the transition is created.
8584           // Note the actual delay is not known until the first callback!
8585           schedules[id] = self;
8586           self.timer = timer(schedule, 0, self.time);
8587
8588           function schedule(elapsed) {
8589             self.state = SCHEDULED;
8590             self.timer.restart(start, self.delay, self.time);
8591
8592             // If the elapsed delay is less than our first sleep, start immediately.
8593             if (self.delay <= elapsed) start(elapsed - self.delay);
8594           }
8595
8596           function start(elapsed) {
8597             var i, j, n, o;
8598
8599             // If the state is not SCHEDULED, then we previously errored on start.
8600             if (self.state !== SCHEDULED) return stop();
8601
8602             for (i in schedules) {
8603               o = schedules[i];
8604               if (o.name !== self.name) continue;
8605
8606               // While this element already has a starting transition during this frame,
8607               // defer starting an interrupting transition until that transition has a
8608               // chance to tick (and possibly end); see d3/d3-transition#54!
8609               if (o.state === STARTED) return d3_timeout(start);
8610
8611               // Interrupt the active transition, if any.
8612               if (o.state === RUNNING) {
8613                 o.state = ENDED;
8614                 o.timer.stop();
8615                 o.on.call("interrupt", node, node.__data__, o.index, o.group);
8616                 delete schedules[i];
8617               }
8618
8619               // Cancel any pre-empted transitions.
8620               else if (+i < id) {
8621                 o.state = ENDED;
8622                 o.timer.stop();
8623                 o.on.call("cancel", node, node.__data__, o.index, o.group);
8624                 delete schedules[i];
8625               }
8626             }
8627
8628             // Defer the first tick to end of the current frame; see d3/d3#1576.
8629             // Note the transition may be canceled after start and before the first tick!
8630             // Note this must be scheduled before the start event; see d3/d3-transition#16!
8631             // Assuming this is successful, subsequent callbacks go straight to tick.
8632             d3_timeout(function() {
8633               if (self.state === STARTED) {
8634                 self.state = RUNNING;
8635                 self.timer.restart(tick, self.delay, self.time);
8636                 tick(elapsed);
8637               }
8638             });
8639
8640             // Dispatch the start event.
8641             // Note this must be done before the tween are initialized.
8642             self.state = STARTING;
8643             self.on.call("start", node, node.__data__, self.index, self.group);
8644             if (self.state !== STARTING) return; // interrupted
8645             self.state = STARTED;
8646
8647             // Initialize the tween, deleting null tween.
8648             tween = new Array(n = self.tween.length);
8649             for (i = 0, j = -1; i < n; ++i) {
8650               if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
8651                 tween[++j] = o;
8652               }
8653             }
8654             tween.length = j + 1;
8655           }
8656
8657           function tick(elapsed) {
8658             var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
8659                 i = -1,
8660                 n = tween.length;
8661
8662             while (++i < n) {
8663               tween[i].call(node, t);
8664             }
8665
8666             // Dispatch the end event.
8667             if (self.state === ENDING) {
8668               self.on.call("end", node, node.__data__, self.index, self.group);
8669               stop();
8670             }
8671           }
8672
8673           function stop() {
8674             self.state = ENDED;
8675             self.timer.stop();
8676             delete schedules[id];
8677             for (var i in schedules) return; // eslint-disable-line no-unused-vars
8678             delete node.__transition;
8679           }
8680         }
8681
8682         function interrupt(node, name) {
8683           var schedules = node.__transition,
8684               schedule,
8685               active,
8686               empty = true,
8687               i;
8688
8689           if (!schedules) return;
8690
8691           name = name == null ? null : name + "";
8692
8693           for (i in schedules) {
8694             if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
8695             active = schedule.state > STARTING && schedule.state < ENDING;
8696             schedule.state = ENDED;
8697             schedule.timer.stop();
8698             schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
8699             delete schedules[i];
8700           }
8701
8702           if (empty) delete node.__transition;
8703         }
8704
8705         function selection_interrupt(name) {
8706           return this.each(function() {
8707             interrupt(this, name);
8708           });
8709         }
8710
8711         function tweenRemove(id, name) {
8712           var tween0, tween1;
8713           return function() {
8714             var schedule = set$1(this, id),
8715                 tween = schedule.tween;
8716
8717             // If this node shared tween with the previous node,
8718             // just assign the updated shared tween and we’re done!
8719             // Otherwise, copy-on-write.
8720             if (tween !== tween0) {
8721               tween1 = tween0 = tween;
8722               for (var i = 0, n = tween1.length; i < n; ++i) {
8723                 if (tween1[i].name === name) {
8724                   tween1 = tween1.slice();
8725                   tween1.splice(i, 1);
8726                   break;
8727                 }
8728               }
8729             }
8730
8731             schedule.tween = tween1;
8732           };
8733         }
8734
8735         function tweenFunction(id, name, value) {
8736           var tween0, tween1;
8737           if (typeof value !== "function") throw new Error;
8738           return function() {
8739             var schedule = set$1(this, id),
8740                 tween = schedule.tween;
8741
8742             // If this node shared tween with the previous node,
8743             // just assign the updated shared tween and we’re done!
8744             // Otherwise, copy-on-write.
8745             if (tween !== tween0) {
8746               tween1 = (tween0 = tween).slice();
8747               for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
8748                 if (tween1[i].name === name) {
8749                   tween1[i] = t;
8750                   break;
8751                 }
8752               }
8753               if (i === n) tween1.push(t);
8754             }
8755
8756             schedule.tween = tween1;
8757           };
8758         }
8759
8760         function transition_tween(name, value) {
8761           var id = this._id;
8762
8763           name += "";
8764
8765           if (arguments.length < 2) {
8766             var tween = get$2(this.node(), id).tween;
8767             for (var i = 0, n = tween.length, t; i < n; ++i) {
8768               if ((t = tween[i]).name === name) {
8769                 return t.value;
8770               }
8771             }
8772             return null;
8773           }
8774
8775           return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
8776         }
8777
8778         function tweenValue(transition, name, value) {
8779           var id = transition._id;
8780
8781           transition.each(function() {
8782             var schedule = set$1(this, id);
8783             (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
8784           });
8785
8786           return function(node) {
8787             return get$2(node, id).value[name];
8788           };
8789         }
8790
8791         function interpolate(a, b) {
8792           var c;
8793           return (typeof b === "number" ? d3_interpolateNumber
8794               : b instanceof color ? d3_interpolateRgb
8795               : (c = color(b)) ? (b = c, d3_interpolateRgb)
8796               : interpolateString)(a, b);
8797         }
8798
8799         function attrRemove$1(name) {
8800           return function() {
8801             this.removeAttribute(name);
8802           };
8803         }
8804
8805         function attrRemoveNS$1(fullname) {
8806           return function() {
8807             this.removeAttributeNS(fullname.space, fullname.local);
8808           };
8809         }
8810
8811         function attrConstant$1(name, interpolate, value1) {
8812           var string00,
8813               string1 = value1 + "",
8814               interpolate0;
8815           return function() {
8816             var string0 = this.getAttribute(name);
8817             return string0 === string1 ? null
8818                 : string0 === string00 ? interpolate0
8819                 : interpolate0 = interpolate(string00 = string0, value1);
8820           };
8821         }
8822
8823         function attrConstantNS$1(fullname, interpolate, value1) {
8824           var string00,
8825               string1 = value1 + "",
8826               interpolate0;
8827           return function() {
8828             var string0 = this.getAttributeNS(fullname.space, fullname.local);
8829             return string0 === string1 ? null
8830                 : string0 === string00 ? interpolate0
8831                 : interpolate0 = interpolate(string00 = string0, value1);
8832           };
8833         }
8834
8835         function attrFunction$1(name, interpolate, value) {
8836           var string00,
8837               string10,
8838               interpolate0;
8839           return function() {
8840             var string0, value1 = value(this), string1;
8841             if (value1 == null) return void this.removeAttribute(name);
8842             string0 = this.getAttribute(name);
8843             string1 = value1 + "";
8844             return string0 === string1 ? null
8845                 : string0 === string00 && string1 === string10 ? interpolate0
8846                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8847           };
8848         }
8849
8850         function attrFunctionNS$1(fullname, interpolate, value) {
8851           var string00,
8852               string10,
8853               interpolate0;
8854           return function() {
8855             var string0, value1 = value(this), string1;
8856             if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
8857             string0 = this.getAttributeNS(fullname.space, fullname.local);
8858             string1 = value1 + "";
8859             return string0 === string1 ? null
8860                 : string0 === string00 && string1 === string10 ? interpolate0
8861                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8862           };
8863         }
8864
8865         function transition_attr(name, value) {
8866           var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
8867           return this.attrTween(name, typeof value === "function"
8868               ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
8869               : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
8870               : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
8871         }
8872
8873         function attrInterpolate(name, i) {
8874           return function(t) {
8875             this.setAttribute(name, i(t));
8876           };
8877         }
8878
8879         function attrInterpolateNS(fullname, i) {
8880           return function(t) {
8881             this.setAttributeNS(fullname.space, fullname.local, i(t));
8882           };
8883         }
8884
8885         function attrTweenNS(fullname, value) {
8886           var t0, i0;
8887           function tween() {
8888             var i = value.apply(this, arguments);
8889             if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
8890             return t0;
8891           }
8892           tween._value = value;
8893           return tween;
8894         }
8895
8896         function attrTween(name, value) {
8897           var t0, i0;
8898           function tween() {
8899             var i = value.apply(this, arguments);
8900             if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
8901             return t0;
8902           }
8903           tween._value = value;
8904           return tween;
8905         }
8906
8907         function transition_attrTween(name, value) {
8908           var key = "attr." + name;
8909           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
8910           if (value == null) return this.tween(key, null);
8911           if (typeof value !== "function") throw new Error;
8912           var fullname = namespace(name);
8913           return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
8914         }
8915
8916         function delayFunction(id, value) {
8917           return function() {
8918             init(this, id).delay = +value.apply(this, arguments);
8919           };
8920         }
8921
8922         function delayConstant(id, value) {
8923           return value = +value, function() {
8924             init(this, id).delay = value;
8925           };
8926         }
8927
8928         function transition_delay(value) {
8929           var id = this._id;
8930
8931           return arguments.length
8932               ? this.each((typeof value === "function"
8933                   ? delayFunction
8934                   : delayConstant)(id, value))
8935               : get$2(this.node(), id).delay;
8936         }
8937
8938         function durationFunction(id, value) {
8939           return function() {
8940             set$1(this, id).duration = +value.apply(this, arguments);
8941           };
8942         }
8943
8944         function durationConstant(id, value) {
8945           return value = +value, function() {
8946             set$1(this, id).duration = value;
8947           };
8948         }
8949
8950         function transition_duration(value) {
8951           var id = this._id;
8952
8953           return arguments.length
8954               ? this.each((typeof value === "function"
8955                   ? durationFunction
8956                   : durationConstant)(id, value))
8957               : get$2(this.node(), id).duration;
8958         }
8959
8960         function easeConstant(id, value) {
8961           if (typeof value !== "function") throw new Error;
8962           return function() {
8963             set$1(this, id).ease = value;
8964           };
8965         }
8966
8967         function transition_ease(value) {
8968           var id = this._id;
8969
8970           return arguments.length
8971               ? this.each(easeConstant(id, value))
8972               : get$2(this.node(), id).ease;
8973         }
8974
8975         function transition_filter(match) {
8976           if (typeof match !== "function") match = matcher(match);
8977
8978           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8979             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
8980               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
8981                 subgroup.push(node);
8982               }
8983             }
8984           }
8985
8986           return new Transition(subgroups, this._parents, this._name, this._id);
8987         }
8988
8989         function transition_merge(transition) {
8990           if (transition._id !== this._id) throw new Error;
8991
8992           for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
8993             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
8994               if (node = group0[i] || group1[i]) {
8995                 merge[i] = node;
8996               }
8997             }
8998           }
8999
9000           for (; j < m0; ++j) {
9001             merges[j] = groups0[j];
9002           }
9003
9004           return new Transition(merges, this._parents, this._name, this._id);
9005         }
9006
9007         function start(name) {
9008           return (name + "").trim().split(/^|\s+/).every(function(t) {
9009             var i = t.indexOf(".");
9010             if (i >= 0) t = t.slice(0, i);
9011             return !t || t === "start";
9012           });
9013         }
9014
9015         function onFunction(id, name, listener) {
9016           var on0, on1, sit = start(name) ? init : set$1;
9017           return function() {
9018             var schedule = sit(this, id),
9019                 on = schedule.on;
9020
9021             // If this node shared a dispatch with the previous node,
9022             // just assign the updated shared dispatch and we’re done!
9023             // Otherwise, copy-on-write.
9024             if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
9025
9026             schedule.on = on1;
9027           };
9028         }
9029
9030         function transition_on(name, listener) {
9031           var id = this._id;
9032
9033           return arguments.length < 2
9034               ? get$2(this.node(), id).on.on(name)
9035               : this.each(onFunction(id, name, listener));
9036         }
9037
9038         function removeFunction(id) {
9039           return function() {
9040             var parent = this.parentNode;
9041             for (var i in this.__transition) if (+i !== id) return;
9042             if (parent) parent.removeChild(this);
9043           };
9044         }
9045
9046         function transition_remove() {
9047           return this.on("end.remove", removeFunction(this._id));
9048         }
9049
9050         function transition_select(select) {
9051           var name = this._name,
9052               id = this._id;
9053
9054           if (typeof select !== "function") select = selector(select);
9055
9056           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
9057             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
9058               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
9059                 if ("__data__" in node) subnode.__data__ = node.__data__;
9060                 subgroup[i] = subnode;
9061                 schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
9062               }
9063             }
9064           }
9065
9066           return new Transition(subgroups, this._parents, name, id);
9067         }
9068
9069         function transition_selectAll(select) {
9070           var name = this._name,
9071               id = this._id;
9072
9073           if (typeof select !== "function") select = selectorAll(select);
9074
9075           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
9076             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9077               if (node = group[i]) {
9078                 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) {
9079                   if (child = children[k]) {
9080                     schedule(child, name, id, k, children, inherit);
9081                   }
9082                 }
9083                 subgroups.push(children);
9084                 parents.push(node);
9085               }
9086             }
9087           }
9088
9089           return new Transition(subgroups, parents, name, id);
9090         }
9091
9092         var Selection$1 = selection.prototype.constructor;
9093
9094         function transition_selection() {
9095           return new Selection$1(this._groups, this._parents);
9096         }
9097
9098         function styleNull(name, interpolate) {
9099           var string00,
9100               string10,
9101               interpolate0;
9102           return function() {
9103             var string0 = styleValue(this, name),
9104                 string1 = (this.style.removeProperty(name), styleValue(this, name));
9105             return string0 === string1 ? null
9106                 : string0 === string00 && string1 === string10 ? interpolate0
9107                 : interpolate0 = interpolate(string00 = string0, string10 = string1);
9108           };
9109         }
9110
9111         function styleRemove$1(name) {
9112           return function() {
9113             this.style.removeProperty(name);
9114           };
9115         }
9116
9117         function styleConstant$1(name, interpolate, value1) {
9118           var string00,
9119               string1 = value1 + "",
9120               interpolate0;
9121           return function() {
9122             var string0 = styleValue(this, name);
9123             return string0 === string1 ? null
9124                 : string0 === string00 ? interpolate0
9125                 : interpolate0 = interpolate(string00 = string0, value1);
9126           };
9127         }
9128
9129         function styleFunction$1(name, interpolate, value) {
9130           var string00,
9131               string10,
9132               interpolate0;
9133           return function() {
9134             var string0 = styleValue(this, name),
9135                 value1 = value(this),
9136                 string1 = value1 + "";
9137             if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
9138             return string0 === string1 ? null
9139                 : string0 === string00 && string1 === string10 ? interpolate0
9140                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
9141           };
9142         }
9143
9144         function styleMaybeRemove(id, name) {
9145           var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
9146           return function() {
9147             var schedule = set$1(this, id),
9148                 on = schedule.on,
9149                 listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
9150
9151             // If this node shared a dispatch with the previous node,
9152             // just assign the updated shared dispatch and we’re done!
9153             // Otherwise, copy-on-write.
9154             if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
9155
9156             schedule.on = on1;
9157           };
9158         }
9159
9160         function transition_style(name, value, priority) {
9161           var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
9162           return value == null ? this
9163               .styleTween(name, styleNull(name, i))
9164               .on("end.style." + name, styleRemove$1(name))
9165             : typeof value === "function" ? this
9166               .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
9167               .each(styleMaybeRemove(this._id, name))
9168             : this
9169               .styleTween(name, styleConstant$1(name, i, value), priority)
9170               .on("end.style." + name, null);
9171         }
9172
9173         function styleInterpolate(name, i, priority) {
9174           return function(t) {
9175             this.style.setProperty(name, i(t), priority);
9176           };
9177         }
9178
9179         function styleTween(name, value, priority) {
9180           var t, i0;
9181           function tween() {
9182             var i = value.apply(this, arguments);
9183             if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
9184             return t;
9185           }
9186           tween._value = value;
9187           return tween;
9188         }
9189
9190         function transition_styleTween(name, value, priority) {
9191           var key = "style." + (name += "");
9192           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
9193           if (value == null) return this.tween(key, null);
9194           if (typeof value !== "function") throw new Error;
9195           return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
9196         }
9197
9198         function textConstant$1(value) {
9199           return function() {
9200             this.textContent = value;
9201           };
9202         }
9203
9204         function textFunction$1(value) {
9205           return function() {
9206             var value1 = value(this);
9207             this.textContent = value1 == null ? "" : value1;
9208           };
9209         }
9210
9211         function transition_text(value) {
9212           return this.tween("text", typeof value === "function"
9213               ? textFunction$1(tweenValue(this, "text", value))
9214               : textConstant$1(value == null ? "" : value + ""));
9215         }
9216
9217         function transition_transition() {
9218           var name = this._name,
9219               id0 = this._id,
9220               id1 = newId();
9221
9222           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9223             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9224               if (node = group[i]) {
9225                 var inherit = get$2(node, id0);
9226                 schedule(node, name, id1, i, group, {
9227                   time: inherit.time + inherit.delay + inherit.duration,
9228                   delay: 0,
9229                   duration: inherit.duration,
9230                   ease: inherit.ease
9231                 });
9232               }
9233             }
9234           }
9235
9236           return new Transition(groups, this._parents, name, id1);
9237         }
9238
9239         function transition_end() {
9240           var on0, on1, that = this, id = that._id, size = that.size();
9241           return new Promise(function(resolve, reject) {
9242             var cancel = {value: reject},
9243                 end = {value: function() { if (--size === 0) resolve(); }};
9244
9245             that.each(function() {
9246               var schedule = set$1(this, id),
9247                   on = schedule.on;
9248
9249               // If this node shared a dispatch with the previous node,
9250               // just assign the updated shared dispatch and we’re done!
9251               // Otherwise, copy-on-write.
9252               if (on !== on0) {
9253                 on1 = (on0 = on).copy();
9254                 on1._.cancel.push(cancel);
9255                 on1._.interrupt.push(cancel);
9256                 on1._.end.push(end);
9257               }
9258
9259               schedule.on = on1;
9260             });
9261           });
9262         }
9263
9264         var id$4 = 0;
9265
9266         function Transition(groups, parents, name, id) {
9267           this._groups = groups;
9268           this._parents = parents;
9269           this._name = name;
9270           this._id = id;
9271         }
9272
9273         function transition(name) {
9274           return selection().transition(name);
9275         }
9276
9277         function newId() {
9278           return ++id$4;
9279         }
9280
9281         var selection_prototype = selection.prototype;
9282
9283         Transition.prototype = transition.prototype = {
9284           constructor: Transition,
9285           select: transition_select,
9286           selectAll: transition_selectAll,
9287           filter: transition_filter,
9288           merge: transition_merge,
9289           selection: transition_selection,
9290           transition: transition_transition,
9291           call: selection_prototype.call,
9292           nodes: selection_prototype.nodes,
9293           node: selection_prototype.node,
9294           size: selection_prototype.size,
9295           empty: selection_prototype.empty,
9296           each: selection_prototype.each,
9297           on: transition_on,
9298           attr: transition_attr,
9299           attrTween: transition_attrTween,
9300           style: transition_style,
9301           styleTween: transition_styleTween,
9302           text: transition_text,
9303           remove: transition_remove,
9304           tween: transition_tween,
9305           delay: transition_delay,
9306           duration: transition_duration,
9307           ease: transition_ease,
9308           end: transition_end
9309         };
9310
9311         function linear$1(t) {
9312           return +t;
9313         }
9314
9315         function quadIn(t) {
9316           return t * t;
9317         }
9318
9319         function quadOut(t) {
9320           return t * (2 - t);
9321         }
9322
9323         function quadInOut(t) {
9324           return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
9325         }
9326
9327         function cubicIn(t) {
9328           return t * t * t;
9329         }
9330
9331         function cubicOut(t) {
9332           return --t * t * t + 1;
9333         }
9334
9335         function cubicInOut(t) {
9336           return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
9337         }
9338
9339         var exponent = 3;
9340
9341         var polyIn = (function custom(e) {
9342           e = +e;
9343
9344           function polyIn(t) {
9345             return Math.pow(t, e);
9346           }
9347
9348           polyIn.exponent = custom;
9349
9350           return polyIn;
9351         })(exponent);
9352
9353         var polyOut = (function custom(e) {
9354           e = +e;
9355
9356           function polyOut(t) {
9357             return 1 - Math.pow(1 - t, e);
9358           }
9359
9360           polyOut.exponent = custom;
9361
9362           return polyOut;
9363         })(exponent);
9364
9365         var polyInOut = (function custom(e) {
9366           e = +e;
9367
9368           function polyInOut(t) {
9369             return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
9370           }
9371
9372           polyInOut.exponent = custom;
9373
9374           return polyInOut;
9375         })(exponent);
9376
9377         var pi = Math.PI,
9378             halfPi = pi / 2;
9379
9380         function sinIn(t) {
9381           return 1 - Math.cos(t * halfPi);
9382         }
9383
9384         function sinOut(t) {
9385           return Math.sin(t * halfPi);
9386         }
9387
9388         function sinInOut(t) {
9389           return (1 - Math.cos(pi * t)) / 2;
9390         }
9391
9392         function expIn(t) {
9393           return Math.pow(2, 10 * t - 10);
9394         }
9395
9396         function expOut(t) {
9397           return 1 - Math.pow(2, -10 * t);
9398         }
9399
9400         function expInOut(t) {
9401           return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
9402         }
9403
9404         function circleIn(t) {
9405           return 1 - Math.sqrt(1 - t * t);
9406         }
9407
9408         function circleOut(t) {
9409           return Math.sqrt(1 - --t * t);
9410         }
9411
9412         function circleInOut(t) {
9413           return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
9414         }
9415
9416         var b1 = 4 / 11,
9417             b2 = 6 / 11,
9418             b3 = 8 / 11,
9419             b4 = 3 / 4,
9420             b5 = 9 / 11,
9421             b6 = 10 / 11,
9422             b7 = 15 / 16,
9423             b8 = 21 / 22,
9424             b9 = 63 / 64,
9425             b0 = 1 / b1 / b1;
9426
9427         function bounceIn(t) {
9428           return 1 - bounceOut(1 - t);
9429         }
9430
9431         function bounceOut(t) {
9432           return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
9433         }
9434
9435         function bounceInOut(t) {
9436           return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
9437         }
9438
9439         var overshoot = 1.70158;
9440
9441         var backIn = (function custom(s) {
9442           s = +s;
9443
9444           function backIn(t) {
9445             return t * t * ((s + 1) * t - s);
9446           }
9447
9448           backIn.overshoot = custom;
9449
9450           return backIn;
9451         })(overshoot);
9452
9453         var backOut = (function custom(s) {
9454           s = +s;
9455
9456           function backOut(t) {
9457             return --t * t * ((s + 1) * t + s) + 1;
9458           }
9459
9460           backOut.overshoot = custom;
9461
9462           return backOut;
9463         })(overshoot);
9464
9465         var backInOut = (function custom(s) {
9466           s = +s;
9467
9468           function backInOut(t) {
9469             return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
9470           }
9471
9472           backInOut.overshoot = custom;
9473
9474           return backInOut;
9475         })(overshoot);
9476
9477         var tau = 2 * Math.PI,
9478             amplitude = 1,
9479             period = 0.3;
9480
9481         var elasticIn = (function custom(a, p) {
9482           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9483
9484           function elasticIn(t) {
9485             return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
9486           }
9487
9488           elasticIn.amplitude = function(a) { return custom(a, p * tau); };
9489           elasticIn.period = function(p) { return custom(a, p); };
9490
9491           return elasticIn;
9492         })(amplitude, period);
9493
9494         var elasticOut = (function custom(a, p) {
9495           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9496
9497           function elasticOut(t) {
9498             return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
9499           }
9500
9501           elasticOut.amplitude = function(a) { return custom(a, p * tau); };
9502           elasticOut.period = function(p) { return custom(a, p); };
9503
9504           return elasticOut;
9505         })(amplitude, period);
9506
9507         var elasticInOut = (function custom(a, p) {
9508           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9509
9510           function elasticInOut(t) {
9511             return ((t = t * 2 - 1) < 0
9512                 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
9513                 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
9514           }
9515
9516           elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
9517           elasticInOut.period = function(p) { return custom(a, p); };
9518
9519           return elasticInOut;
9520         })(amplitude, period);
9521
9522         var defaultTiming = {
9523           time: null, // Set on use.
9524           delay: 0,
9525           duration: 250,
9526           ease: cubicInOut
9527         };
9528
9529         function inherit(node, id) {
9530           var timing;
9531           while (!(timing = node.__transition) || !(timing = timing[id])) {
9532             if (!(node = node.parentNode)) {
9533               return defaultTiming.time = now(), defaultTiming;
9534             }
9535           }
9536           return timing;
9537         }
9538
9539         function selection_transition(name) {
9540           var id,
9541               timing;
9542
9543           if (name instanceof Transition) {
9544             id = name._id, name = name._name;
9545           } else {
9546             id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
9547           }
9548
9549           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9550             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9551               if (node = group[i]) {
9552                 schedule(node, name, id, i, group, timing || inherit(node, id));
9553               }
9554             }
9555           }
9556
9557           return new Transition(groups, this._parents, name, id);
9558         }
9559
9560         selection.prototype.interrupt = selection_interrupt;
9561         selection.prototype.transition = selection_transition;
9562
9563         var root$2 = [null];
9564
9565         function active(node, name) {
9566           var schedules = node.__transition,
9567               schedule,
9568               i;
9569
9570           if (schedules) {
9571             name = name == null ? null : name + "";
9572             for (i in schedules) {
9573               if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
9574                 return new Transition([[node]], root$2, name, +i);
9575               }
9576             }
9577           }
9578
9579           return null;
9580         }
9581
9582         function constant$4(x) {
9583           return function() {
9584             return x;
9585           };
9586         }
9587
9588         function BrushEvent(target, type, selection) {
9589           this.target = target;
9590           this.type = type;
9591           this.selection = selection;
9592         }
9593
9594         function nopropagation$1() {
9595           event.stopImmediatePropagation();
9596         }
9597
9598         function noevent$1() {
9599           event.preventDefault();
9600           event.stopImmediatePropagation();
9601         }
9602
9603         var MODE_DRAG = {name: "drag"},
9604             MODE_SPACE = {name: "space"},
9605             MODE_HANDLE = {name: "handle"},
9606             MODE_CENTER = {name: "center"};
9607
9608         var X = {
9609           name: "x",
9610           handles: ["e", "w"].map(type),
9611           input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
9612           output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
9613         };
9614
9615         var Y = {
9616           name: "y",
9617           handles: ["n", "s"].map(type),
9618           input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
9619           output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
9620         };
9621
9622         var XY = {
9623           name: "xy",
9624           handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
9625           input: function(xy) { return xy; },
9626           output: function(xy) { return xy; }
9627         };
9628
9629         var cursors = {
9630           overlay: "crosshair",
9631           selection: "move",
9632           n: "ns-resize",
9633           e: "ew-resize",
9634           s: "ns-resize",
9635           w: "ew-resize",
9636           nw: "nwse-resize",
9637           ne: "nesw-resize",
9638           se: "nwse-resize",
9639           sw: "nesw-resize"
9640         };
9641
9642         var flipX = {
9643           e: "w",
9644           w: "e",
9645           nw: "ne",
9646           ne: "nw",
9647           se: "sw",
9648           sw: "se"
9649         };
9650
9651         var flipY = {
9652           n: "s",
9653           s: "n",
9654           nw: "sw",
9655           ne: "se",
9656           se: "ne",
9657           sw: "nw"
9658         };
9659
9660         var signsX = {
9661           overlay: +1,
9662           selection: +1,
9663           n: null,
9664           e: +1,
9665           s: null,
9666           w: -1,
9667           nw: -1,
9668           ne: +1,
9669           se: +1,
9670           sw: -1
9671         };
9672
9673         var signsY = {
9674           overlay: +1,
9675           selection: +1,
9676           n: -1,
9677           e: null,
9678           s: +1,
9679           w: null,
9680           nw: -1,
9681           ne: -1,
9682           se: +1,
9683           sw: +1
9684         };
9685
9686         function type(t) {
9687           return {type: t};
9688         }
9689
9690         // Ignore right-click, since that should open the context menu.
9691         function defaultFilter$1() {
9692           return !event.button;
9693         }
9694
9695         function defaultExtent() {
9696           var svg = this.ownerSVGElement || this;
9697           return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
9698         }
9699
9700         // Like d3.local, but with the name “__brush” rather than auto-generated.
9701         function local$1(node) {
9702           while (!node.__brush) if (!(node = node.parentNode)) return;
9703           return node.__brush;
9704         }
9705
9706         function empty$1(extent) {
9707           return extent[0][0] === extent[1][0]
9708               || extent[0][1] === extent[1][1];
9709         }
9710
9711         function brushSelection(node) {
9712           var state = node.__brush;
9713           return state ? state.dim.output(state.selection) : null;
9714         }
9715
9716         function brushX() {
9717           return brush$1(X);
9718         }
9719
9720         function brushY() {
9721           return brush$1(Y);
9722         }
9723
9724         function brush() {
9725           return brush$1(XY);
9726         }
9727
9728         function brush$1(dim) {
9729           var extent = defaultExtent,
9730               filter = defaultFilter$1,
9731               listeners = dispatch(brush, "start", "brush", "end"),
9732               handleSize = 6,
9733               touchending;
9734
9735           function brush(group) {
9736             var overlay = group
9737                 .property("__brush", initialize)
9738               .selectAll(".overlay")
9739               .data([type("overlay")]);
9740
9741             overlay.enter().append("rect")
9742                 .attr("class", "overlay")
9743                 .attr("pointer-events", "all")
9744                 .attr("cursor", cursors.overlay)
9745               .merge(overlay)
9746                 .each(function() {
9747                   var extent = local$1(this).extent;
9748                   d3_select(this)
9749                       .attr("x", extent[0][0])
9750                       .attr("y", extent[0][1])
9751                       .attr("width", extent[1][0] - extent[0][0])
9752                       .attr("height", extent[1][1] - extent[0][1]);
9753                 });
9754
9755             group.selectAll(".selection")
9756               .data([type("selection")])
9757               .enter().append("rect")
9758                 .attr("class", "selection")
9759                 .attr("cursor", cursors.selection)
9760                 .attr("fill", "#777")
9761                 .attr("fill-opacity", 0.3)
9762                 .attr("stroke", "#fff")
9763                 .attr("shape-rendering", "crispEdges");
9764
9765             var handle = group.selectAll(".handle")
9766               .data(dim.handles, function(d) { return d.type; });
9767
9768             handle.exit().remove();
9769
9770             handle.enter().append("rect")
9771                 .attr("class", function(d) { return "handle handle--" + d.type; })
9772                 .attr("cursor", function(d) { return cursors[d.type]; });
9773
9774             group
9775                 .each(redraw)
9776                 .attr("fill", "none")
9777                 .attr("pointer-events", "all")
9778                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
9779                 .on("mousedown.brush touchstart.brush", started);
9780           }
9781
9782           brush.move = function(group, selection) {
9783             if (group.selection) {
9784               group
9785                   .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
9786                   .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
9787                   .tween("brush", function() {
9788                     var that = this,
9789                         state = that.__brush,
9790                         emit = emitter(that, arguments),
9791                         selection0 = state.selection,
9792                         selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
9793                         i = d3_interpolate(selection0, selection1);
9794
9795                     function tween(t) {
9796                       state.selection = t === 1 && empty$1(selection1) ? null : i(t);
9797                       redraw.call(that);
9798                       emit.brush();
9799                     }
9800
9801                     return selection0 && selection1 ? tween : tween(1);
9802                   });
9803             } else {
9804               group
9805                   .each(function() {
9806                     var that = this,
9807                         args = arguments,
9808                         state = that.__brush,
9809                         selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
9810                         emit = emitter(that, args).beforestart();
9811
9812                     interrupt(that);
9813                     state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
9814                     redraw.call(that);
9815                     emit.start().brush().end();
9816                   });
9817             }
9818           };
9819
9820           function redraw() {
9821             var group = d3_select(this),
9822                 selection = local$1(this).selection;
9823
9824             if (selection) {
9825               group.selectAll(".selection")
9826                   .style("display", null)
9827                   .attr("x", selection[0][0])
9828                   .attr("y", selection[0][1])
9829                   .attr("width", selection[1][0] - selection[0][0])
9830                   .attr("height", selection[1][1] - selection[0][1]);
9831
9832               group.selectAll(".handle")
9833                   .style("display", null)
9834                   .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
9835                   .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
9836                   .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
9837                   .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
9838             }
9839
9840             else {
9841               group.selectAll(".selection,.handle")
9842                   .style("display", "none")
9843                   .attr("x", null)
9844                   .attr("y", null)
9845                   .attr("width", null)
9846                   .attr("height", null);
9847             }
9848           }
9849
9850           function emitter(that, args) {
9851             return that.__brush.emitter || new Emitter(that, args);
9852           }
9853
9854           function Emitter(that, args) {
9855             this.that = that;
9856             this.args = args;
9857             this.state = that.__brush;
9858             this.active = 0;
9859           }
9860
9861           Emitter.prototype = {
9862             beforestart: function() {
9863               if (++this.active === 1) this.state.emitter = this, this.starting = true;
9864               return this;
9865             },
9866             start: function() {
9867               if (this.starting) this.starting = false, this.emit("start");
9868               return this;
9869             },
9870             brush: function() {
9871               this.emit("brush");
9872               return this;
9873             },
9874             end: function() {
9875               if (--this.active === 0) delete this.state.emitter, this.emit("end");
9876               return this;
9877             },
9878             emit: function(type) {
9879               customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
9880             }
9881           };
9882
9883           function started() {
9884             if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
9885             else if (touchending) return;
9886             if (!filter.apply(this, arguments)) return;
9887
9888             var that = this,
9889                 type = event.target.__data__.type,
9890                 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
9891                 signX = dim === Y ? null : signsX[type],
9892                 signY = dim === X ? null : signsY[type],
9893                 state = local$1(that),
9894                 extent = state.extent,
9895                 selection = state.selection,
9896                 W = extent[0][0], w0, w1,
9897                 N = extent[0][1], n0, n1,
9898                 E = extent[1][0], e0, e1,
9899                 S = extent[1][1], s0, s1,
9900                 dx,
9901                 dy,
9902                 moving,
9903                 shifting = signX && signY && event.shiftKey,
9904                 lockX,
9905                 lockY,
9906                 point0 = d3_mouse(that),
9907                 point = point0,
9908                 emit = emitter(that, arguments).beforestart();
9909
9910             if (type === "overlay") {
9911               state.selection = selection = [
9912                 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
9913                 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
9914               ];
9915             } else {
9916               w0 = selection[0][0];
9917               n0 = selection[0][1];
9918               e0 = selection[1][0];
9919               s0 = selection[1][1];
9920             }
9921
9922             w1 = w0;
9923             n1 = n0;
9924             e1 = e0;
9925             s1 = s0;
9926
9927             var group = d3_select(that)
9928                 .attr("pointer-events", "none");
9929
9930             var overlay = group.selectAll(".overlay")
9931                 .attr("cursor", cursors[type]);
9932
9933             if (event.touches) {
9934               group
9935                   .on("touchmove.brush", moved, true)
9936                   .on("touchend.brush touchcancel.brush", ended, true);
9937             } else {
9938               var view = d3_select(event.view)
9939                   .on("keydown.brush", keydowned, true)
9940                   .on("keyup.brush", keyupped, true)
9941                   .on("mousemove.brush", moved, true)
9942                   .on("mouseup.brush", ended, true);
9943
9944               dragDisable(event.view);
9945             }
9946
9947             nopropagation$1();
9948             interrupt(that);
9949             redraw.call(that);
9950             emit.start();
9951
9952             function moved() {
9953               var point1 = d3_mouse(that);
9954               if (shifting && !lockX && !lockY) {
9955                 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
9956                 else lockX = true;
9957               }
9958               point = point1;
9959               moving = true;
9960               noevent$1();
9961               move();
9962             }
9963
9964             function move() {
9965               var t;
9966
9967               dx = point[0] - point0[0];
9968               dy = point[1] - point0[1];
9969
9970               switch (mode) {
9971                 case MODE_SPACE:
9972                 case MODE_DRAG: {
9973                   if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
9974                   if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
9975                   break;
9976                 }
9977                 case MODE_HANDLE: {
9978                   if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
9979                   else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
9980                   if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
9981                   else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
9982                   break;
9983                 }
9984                 case MODE_CENTER: {
9985                   if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
9986                   if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
9987                   break;
9988                 }
9989               }
9990
9991               if (e1 < w1) {
9992                 signX *= -1;
9993                 t = w0, w0 = e0, e0 = t;
9994                 t = w1, w1 = e1, e1 = t;
9995                 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
9996               }
9997
9998               if (s1 < n1) {
9999                 signY *= -1;
10000                 t = n0, n0 = s0, s0 = t;
10001                 t = n1, n1 = s1, s1 = t;
10002                 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
10003               }
10004
10005               if (state.selection) selection = state.selection; // May be set by brush.move!
10006               if (lockX) w1 = selection[0][0], e1 = selection[1][0];
10007               if (lockY) n1 = selection[0][1], s1 = selection[1][1];
10008
10009               if (selection[0][0] !== w1
10010                   || selection[0][1] !== n1
10011                   || selection[1][0] !== e1
10012                   || selection[1][1] !== s1) {
10013                 state.selection = [[w1, n1], [e1, s1]];
10014                 redraw.call(that);
10015                 emit.brush();
10016               }
10017             }
10018
10019             function ended() {
10020               nopropagation$1();
10021               if (event.touches) {
10022                 if (event.touches.length) return;
10023                 if (touchending) clearTimeout(touchending);
10024                 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
10025                 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
10026               } else {
10027                 yesdrag(event.view, moving);
10028                 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
10029               }
10030               group.attr("pointer-events", "all");
10031               overlay.attr("cursor", cursors.overlay);
10032               if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
10033               if (empty$1(selection)) state.selection = null, redraw.call(that);
10034               emit.end();
10035             }
10036
10037             function keydowned() {
10038               switch (event.keyCode) {
10039                 case 16: { // SHIFT
10040                   shifting = signX && signY;
10041                   break;
10042                 }
10043                 case 18: { // ALT
10044                   if (mode === MODE_HANDLE) {
10045                     if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
10046                     if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
10047                     mode = MODE_CENTER;
10048                     move();
10049                   }
10050                   break;
10051                 }
10052                 case 32: { // SPACE; takes priority over ALT
10053                   if (mode === MODE_HANDLE || mode === MODE_CENTER) {
10054                     if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
10055                     if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
10056                     mode = MODE_SPACE;
10057                     overlay.attr("cursor", cursors.selection);
10058                     move();
10059                   }
10060                   break;
10061                 }
10062                 default: return;
10063               }
10064               noevent$1();
10065             }
10066
10067             function keyupped() {
10068               switch (event.keyCode) {
10069                 case 16: { // SHIFT
10070                   if (shifting) {
10071                     lockX = lockY = shifting = false;
10072                     move();
10073                   }
10074                   break;
10075                 }
10076                 case 18: { // ALT
10077                   if (mode === MODE_CENTER) {
10078                     if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
10079                     if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
10080                     mode = MODE_HANDLE;
10081                     move();
10082                   }
10083                   break;
10084                 }
10085                 case 32: { // SPACE
10086                   if (mode === MODE_SPACE) {
10087                     if (event.altKey) {
10088                       if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
10089                       if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
10090                       mode = MODE_CENTER;
10091                     } else {
10092                       if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
10093                       if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
10094                       mode = MODE_HANDLE;
10095                     }
10096                     overlay.attr("cursor", cursors[type]);
10097                     move();
10098                   }
10099                   break;
10100                 }
10101                 default: return;
10102               }
10103               noevent$1();
10104             }
10105           }
10106
10107           function initialize() {
10108             var state = this.__brush || {selection: null};
10109             state.extent = extent.apply(this, arguments);
10110             state.dim = dim;
10111             return state;
10112           }
10113
10114           brush.extent = function(_) {
10115             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
10116           };
10117
10118           brush.filter = function(_) {
10119             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
10120           };
10121
10122           brush.handleSize = function(_) {
10123             return arguments.length ? (handleSize = +_, brush) : handleSize;
10124           };
10125
10126           brush.on = function() {
10127             var value = listeners.on.apply(listeners, arguments);
10128             return value === listeners ? brush : value;
10129           };
10130
10131           return brush;
10132         }
10133
10134         var cos = Math.cos;
10135         var sin = Math.sin;
10136         var pi$1 = Math.PI;
10137         var halfPi$1 = pi$1 / 2;
10138         var tau$1 = pi$1 * 2;
10139         var max$3 = Math.max;
10140
10141         function compareValue(compare) {
10142           return function(a, b) {
10143             return compare(
10144               a.source.value + a.target.value,
10145               b.source.value + b.target.value
10146             );
10147           };
10148         }
10149
10150         function chord() {
10151           var padAngle = 0,
10152               sortGroups = null,
10153               sortSubgroups = null,
10154               sortChords = null;
10155
10156           function chord(matrix) {
10157             var n = matrix.length,
10158                 groupSums = [],
10159                 groupIndex = d3_range(n),
10160                 subgroupIndex = [],
10161                 chords = [],
10162                 groups = chords.groups = new Array(n),
10163                 subgroups = new Array(n * n),
10164                 k,
10165                 x,
10166                 x0,
10167                 dx,
10168                 i,
10169                 j;
10170
10171             // Compute the sum.
10172             k = 0, i = -1; while (++i < n) {
10173               x = 0, j = -1; while (++j < n) {
10174                 x += matrix[i][j];
10175               }
10176               groupSums.push(x);
10177               subgroupIndex.push(d3_range(n));
10178               k += x;
10179             }
10180
10181             // Sort groups…
10182             if (sortGroups) groupIndex.sort(function(a, b) {
10183               return sortGroups(groupSums[a], groupSums[b]);
10184             });
10185
10186             // Sort subgroups…
10187             if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
10188               d.sort(function(a, b) {
10189                 return sortSubgroups(matrix[i][a], matrix[i][b]);
10190               });
10191             });
10192
10193             // Convert the sum to scaling factor for [0, 2pi].
10194             // TODO Allow start and end angle to be specified?
10195             // TODO Allow padding to be specified as percentage?
10196             k = max$3(0, tau$1 - padAngle * n) / k;
10197             dx = k ? padAngle : tau$1 / n;
10198
10199             // Compute the start and end angle for each group and subgroup.
10200             // Note: Opera has a bug reordering object literal properties!
10201             x = 0, i = -1; while (++i < n) {
10202               x0 = x, j = -1; while (++j < n) {
10203                 var di = groupIndex[i],
10204                     dj = subgroupIndex[di][j],
10205                     v = matrix[di][dj],
10206                     a0 = x,
10207                     a1 = x += v * k;
10208                 subgroups[dj * n + di] = {
10209                   index: di,
10210                   subindex: dj,
10211                   startAngle: a0,
10212                   endAngle: a1,
10213                   value: v
10214                 };
10215               }
10216               groups[di] = {
10217                 index: di,
10218                 startAngle: x0,
10219                 endAngle: x,
10220                 value: groupSums[di]
10221               };
10222               x += dx;
10223             }
10224
10225             // Generate chords for each (non-empty) subgroup-subgroup link.
10226             i = -1; while (++i < n) {
10227               j = i - 1; while (++j < n) {
10228                 var source = subgroups[j * n + i],
10229                     target = subgroups[i * n + j];
10230                 if (source.value || target.value) {
10231                   chords.push(source.value < target.value
10232                       ? {source: target, target: source}
10233                       : {source: source, target: target});
10234                 }
10235               }
10236             }
10237
10238             return sortChords ? chords.sort(sortChords) : chords;
10239           }
10240
10241           chord.padAngle = function(_) {
10242             return arguments.length ? (padAngle = max$3(0, _), chord) : padAngle;
10243           };
10244
10245           chord.sortGroups = function(_) {
10246             return arguments.length ? (sortGroups = _, chord) : sortGroups;
10247           };
10248
10249           chord.sortSubgroups = function(_) {
10250             return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
10251           };
10252
10253           chord.sortChords = function(_) {
10254             return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
10255           };
10256
10257           return chord;
10258         }
10259
10260         var slice$6 = Array.prototype.slice;
10261
10262         function constant$5(x) {
10263           return function() {
10264             return x;
10265           };
10266         }
10267
10268         var pi$2 = Math.PI,
10269             tau$2 = 2 * pi$2,
10270             epsilon$1 = 1e-6,
10271             tauEpsilon = tau$2 - epsilon$1;
10272
10273         function Path() {
10274           this._x0 = this._y0 = // start of current subpath
10275           this._x1 = this._y1 = null; // end of current subpath
10276           this._ = "";
10277         }
10278
10279         function path() {
10280           return new Path;
10281         }
10282
10283         Path.prototype = path.prototype = {
10284           constructor: Path,
10285           moveTo: function(x, y) {
10286             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
10287           },
10288           closePath: function() {
10289             if (this._x1 !== null) {
10290               this._x1 = this._x0, this._y1 = this._y0;
10291               this._ += "Z";
10292             }
10293           },
10294           lineTo: function(x, y) {
10295             this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
10296           },
10297           quadraticCurveTo: function(x1, y1, x, y) {
10298             this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10299           },
10300           bezierCurveTo: function(x1, y1, x2, y2, x, y) {
10301             this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10302           },
10303           arcTo: function(x1, y1, x2, y2, r) {
10304             x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
10305             var x0 = this._x1,
10306                 y0 = this._y1,
10307                 x21 = x2 - x1,
10308                 y21 = y2 - y1,
10309                 x01 = x0 - x1,
10310                 y01 = y0 - y1,
10311                 l01_2 = x01 * x01 + y01 * y01;
10312
10313             // Is the radius negative? Error.
10314             if (r < 0) throw new Error("negative radius: " + r);
10315
10316             // Is this path empty? Move to (x1,y1).
10317             if (this._x1 === null) {
10318               this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
10319             }
10320
10321             // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
10322             else if (!(l01_2 > epsilon$1));
10323
10324             // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
10325             // Equivalently, is (x1,y1) coincident with (x2,y2)?
10326             // Or, is the radius zero? Line to (x1,y1).
10327             else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
10328               this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
10329             }
10330
10331             // Otherwise, draw an arc!
10332             else {
10333               var x20 = x2 - x0,
10334                   y20 = y2 - y0,
10335                   l21_2 = x21 * x21 + y21 * y21,
10336                   l20_2 = x20 * x20 + y20 * y20,
10337                   l21 = Math.sqrt(l21_2),
10338                   l01 = Math.sqrt(l01_2),
10339                   l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
10340                   t01 = l / l01,
10341                   t21 = l / l21;
10342
10343               // If the start tangent is not coincident with (x0,y0), line to.
10344               if (Math.abs(t01 - 1) > epsilon$1) {
10345                 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
10346               }
10347
10348               this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
10349             }
10350           },
10351           arc: function(x, y, r, a0, a1, ccw) {
10352             x = +x, y = +y, r = +r;
10353             var dx = r * Math.cos(a0),
10354                 dy = r * Math.sin(a0),
10355                 x0 = x + dx,
10356                 y0 = y + dy,
10357                 cw = 1 ^ ccw,
10358                 da = ccw ? a0 - a1 : a1 - a0;
10359
10360             // Is the radius negative? Error.
10361             if (r < 0) throw new Error("negative radius: " + r);
10362
10363             // Is this path empty? Move to (x0,y0).
10364             if (this._x1 === null) {
10365               this._ += "M" + x0 + "," + y0;
10366             }
10367
10368             // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
10369             else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
10370               this._ += "L" + x0 + "," + y0;
10371             }
10372
10373             // Is this arc empty? We’re done.
10374             if (!r) return;
10375
10376             // Does the angle go the wrong way? Flip the direction.
10377             if (da < 0) da = da % tau$2 + tau$2;
10378
10379             // Is this a complete circle? Draw two arcs to complete the circle.
10380             if (da > tauEpsilon) {
10381               this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
10382             }
10383
10384             // Is this arc non-empty? Draw an arc!
10385             else if (da > epsilon$1) {
10386               this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
10387             }
10388           },
10389           rect: function(x, y, w, h) {
10390             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
10391           },
10392           toString: function() {
10393             return this._;
10394           }
10395         };
10396
10397         function defaultSource(d) {
10398           return d.source;
10399         }
10400
10401         function defaultTarget(d) {
10402           return d.target;
10403         }
10404
10405         function defaultRadius(d) {
10406           return d.radius;
10407         }
10408
10409         function defaultStartAngle(d) {
10410           return d.startAngle;
10411         }
10412
10413         function defaultEndAngle(d) {
10414           return d.endAngle;
10415         }
10416
10417         function ribbon() {
10418           var source = defaultSource,
10419               target = defaultTarget,
10420               radius = defaultRadius,
10421               startAngle = defaultStartAngle,
10422               endAngle = defaultEndAngle,
10423               context = null;
10424
10425           function ribbon() {
10426             var buffer,
10427                 argv = slice$6.call(arguments),
10428                 s = source.apply(this, argv),
10429                 t = target.apply(this, argv),
10430                 sr = +radius.apply(this, (argv[0] = s, argv)),
10431                 sa0 = startAngle.apply(this, argv) - halfPi$1,
10432                 sa1 = endAngle.apply(this, argv) - halfPi$1,
10433                 sx0 = sr * cos(sa0),
10434                 sy0 = sr * sin(sa0),
10435                 tr = +radius.apply(this, (argv[0] = t, argv)),
10436                 ta0 = startAngle.apply(this, argv) - halfPi$1,
10437                 ta1 = endAngle.apply(this, argv) - halfPi$1;
10438
10439             if (!context) context = buffer = path();
10440
10441             context.moveTo(sx0, sy0);
10442             context.arc(0, 0, sr, sa0, sa1);
10443             if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
10444               context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
10445               context.arc(0, 0, tr, ta0, ta1);
10446             }
10447             context.quadraticCurveTo(0, 0, sx0, sy0);
10448             context.closePath();
10449
10450             if (buffer) return context = null, buffer + "" || null;
10451           }
10452
10453           ribbon.radius = function(_) {
10454             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
10455           };
10456
10457           ribbon.startAngle = function(_) {
10458             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
10459           };
10460
10461           ribbon.endAngle = function(_) {
10462             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
10463           };
10464
10465           ribbon.source = function(_) {
10466             return arguments.length ? (source = _, ribbon) : source;
10467           };
10468
10469           ribbon.target = function(_) {
10470             return arguments.length ? (target = _, ribbon) : target;
10471           };
10472
10473           ribbon.context = function(_) {
10474             return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
10475           };
10476
10477           return ribbon;
10478         }
10479
10480         var prefix = "$";
10481
10482         function Map$1() {}
10483
10484         Map$1.prototype = map$3.prototype = {
10485           constructor: Map$1,
10486           has: function(key) {
10487             return (prefix + key) in this;
10488           },
10489           get: function(key) {
10490             return this[prefix + key];
10491           },
10492           set: function(key, value) {
10493             this[prefix + key] = value;
10494             return this;
10495           },
10496           remove: function(key) {
10497             var property = prefix + key;
10498             return property in this && delete this[property];
10499           },
10500           clear: function() {
10501             for (var property in this) if (property[0] === prefix) delete this[property];
10502           },
10503           keys: function() {
10504             var keys = [];
10505             for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
10506             return keys;
10507           },
10508           values: function() {
10509             var values = [];
10510             for (var property in this) if (property[0] === prefix) values.push(this[property]);
10511             return values;
10512           },
10513           entries: function() {
10514             var entries = [];
10515             for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
10516             return entries;
10517           },
10518           size: function() {
10519             var size = 0;
10520             for (var property in this) if (property[0] === prefix) ++size;
10521             return size;
10522           },
10523           empty: function() {
10524             for (var property in this) if (property[0] === prefix) return false;
10525             return true;
10526           },
10527           each: function(f) {
10528             for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
10529           }
10530         };
10531
10532         function map$3(object, f) {
10533           var map = new Map$1;
10534
10535           // Copy constructor.
10536           if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
10537
10538           // Index array by numeric index or specified key function.
10539           else if (Array.isArray(object)) {
10540             var i = -1,
10541                 n = object.length,
10542                 o;
10543
10544             if (f == null) while (++i < n) map.set(i, object[i]);
10545             else while (++i < n) map.set(f(o = object[i], i, object), o);
10546           }
10547
10548           // Convert object to map.
10549           else if (object) for (var key in object) map.set(key, object[key]);
10550
10551           return map;
10552         }
10553
10554         function nest() {
10555           var keys = [],
10556               sortKeys = [],
10557               sortValues,
10558               rollup,
10559               nest;
10560
10561           function apply(array, depth, createResult, setResult) {
10562             if (depth >= keys.length) {
10563               if (sortValues != null) array.sort(sortValues);
10564               return rollup != null ? rollup(array) : array;
10565             }
10566
10567             var i = -1,
10568                 n = array.length,
10569                 key = keys[depth++],
10570                 keyValue,
10571                 value,
10572                 valuesByKey = map$3(),
10573                 values,
10574                 result = createResult();
10575
10576             while (++i < n) {
10577               if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
10578                 values.push(value);
10579               } else {
10580                 valuesByKey.set(keyValue, [value]);
10581               }
10582             }
10583
10584             valuesByKey.each(function(values, key) {
10585               setResult(result, key, apply(values, depth, createResult, setResult));
10586             });
10587
10588             return result;
10589           }
10590
10591           function entries(map, depth) {
10592             if (++depth > keys.length) return map;
10593             var array, sortKey = sortKeys[depth - 1];
10594             if (rollup != null && depth >= keys.length) array = map.entries();
10595             else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
10596             return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
10597           }
10598
10599           return nest = {
10600             object: function(array) { return apply(array, 0, createObject, setObject); },
10601             map: function(array) { return apply(array, 0, createMap, setMap); },
10602             entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
10603             key: function(d) { keys.push(d); return nest; },
10604             sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
10605             sortValues: function(order) { sortValues = order; return nest; },
10606             rollup: function(f) { rollup = f; return nest; }
10607           };
10608         }
10609
10610         function createObject() {
10611           return {};
10612         }
10613
10614         function setObject(object, key, value) {
10615           object[key] = value;
10616         }
10617
10618         function createMap() {
10619           return map$3();
10620         }
10621
10622         function setMap(map, key, value) {
10623           map.set(key, value);
10624         }
10625
10626         function Set$1() {}
10627
10628         var proto = map$3.prototype;
10629
10630         Set$1.prototype = set$2.prototype = {
10631           constructor: Set$1,
10632           has: proto.has,
10633           add: function(value) {
10634             value += "";
10635             this[prefix + value] = value;
10636             return this;
10637           },
10638           remove: proto.remove,
10639           clear: proto.clear,
10640           values: proto.keys,
10641           size: proto.size,
10642           empty: proto.empty,
10643           each: proto.each
10644         };
10645
10646         function set$2(object, f) {
10647           var set = new Set$1;
10648
10649           // Copy constructor.
10650           if (object instanceof Set$1) object.each(function(value) { set.add(value); });
10651
10652           // Otherwise, assume it’s an array.
10653           else if (object) {
10654             var i = -1, n = object.length;
10655             if (f == null) while (++i < n) set.add(object[i]);
10656             else while (++i < n) set.add(f(object[i], i, object));
10657           }
10658
10659           return set;
10660         }
10661
10662         function keys$3(map) {
10663           var keys = [];
10664           for (var key in map) keys.push(key);
10665           return keys;
10666         }
10667
10668         function values(map) {
10669           var values = [];
10670           for (var key in map) values.push(map[key]);
10671           return values;
10672         }
10673
10674         function entries(map) {
10675           var entries = [];
10676           for (var key in map) entries.push({key: key, value: map[key]});
10677           return entries;
10678         }
10679
10680         var array$3 = Array.prototype;
10681
10682         var slice$7 = array$3.slice;
10683
10684         function ascending$1(a, b) {
10685           return a - b;
10686         }
10687
10688         function area(ring) {
10689           var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
10690           while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
10691           return area;
10692         }
10693
10694         function constant$6(x) {
10695           return function() {
10696             return x;
10697           };
10698         }
10699
10700         function contains$1(ring, hole) {
10701           var i = -1, n = hole.length, c;
10702           while (++i < n) if (c = ringContains(ring, hole[i])) return c;
10703           return 0;
10704         }
10705
10706         function ringContains(ring, point) {
10707           var x = point[0], y = point[1], contains = -1;
10708           for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
10709             var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
10710             if (segmentContains(pi, pj, point)) return 0;
10711             if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
10712           }
10713           return contains;
10714         }
10715
10716         function segmentContains(a, b, c) {
10717           var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
10718         }
10719
10720         function collinear(a, b, c) {
10721           return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
10722         }
10723
10724         function within(p, q, r) {
10725           return p <= q && q <= r || r <= q && q <= p;
10726         }
10727
10728         function noop$3() {}
10729
10730         var cases = [
10731           [],
10732           [[[1.0, 1.5], [0.5, 1.0]]],
10733           [[[1.5, 1.0], [1.0, 1.5]]],
10734           [[[1.5, 1.0], [0.5, 1.0]]],
10735           [[[1.0, 0.5], [1.5, 1.0]]],
10736           [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
10737           [[[1.0, 0.5], [1.0, 1.5]]],
10738           [[[1.0, 0.5], [0.5, 1.0]]],
10739           [[[0.5, 1.0], [1.0, 0.5]]],
10740           [[[1.0, 1.5], [1.0, 0.5]]],
10741           [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
10742           [[[1.5, 1.0], [1.0, 0.5]]],
10743           [[[0.5, 1.0], [1.5, 1.0]]],
10744           [[[1.0, 1.5], [1.5, 1.0]]],
10745           [[[0.5, 1.0], [1.0, 1.5]]],
10746           []
10747         ];
10748
10749         function contours() {
10750           var dx = 1,
10751               dy = 1,
10752               threshold = thresholdSturges,
10753               smooth = smoothLinear;
10754
10755           function contours(values) {
10756             var tz = threshold(values);
10757
10758             // Convert number of thresholds into uniform thresholds.
10759             if (!Array.isArray(tz)) {
10760               var domain = extent(values), start = domain[0], stop = domain[1];
10761               tz = tickStep(start, stop, tz);
10762               tz = d3_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
10763             } else {
10764               tz = tz.slice().sort(ascending$1);
10765             }
10766
10767             return tz.map(function(value) {
10768               return contour(values, value);
10769             });
10770           }
10771
10772           // Accumulate, smooth contour rings, assign holes to exterior rings.
10773           // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
10774           function contour(values, value) {
10775             var polygons = [],
10776                 holes = [];
10777
10778             isorings(values, value, function(ring) {
10779               smooth(ring, values, value);
10780               if (area(ring) > 0) polygons.push([ring]);
10781               else holes.push(ring);
10782             });
10783
10784             holes.forEach(function(hole) {
10785               for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
10786                 if (contains$1((polygon = polygons[i])[0], hole) !== -1) {
10787                   polygon.push(hole);
10788                   return;
10789                 }
10790               }
10791             });
10792
10793             return {
10794               type: "MultiPolygon",
10795               value: value,
10796               coordinates: polygons
10797             };
10798           }
10799
10800           // Marching squares with isolines stitched into rings.
10801           // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
10802           function isorings(values, value, callback) {
10803             var fragmentByStart = new Array,
10804                 fragmentByEnd = new Array,
10805                 x, y, t0, t1, t2, t3;
10806
10807             // Special case for the first row (y = -1, t2 = t3 = 0).
10808             x = y = -1;
10809             t1 = values[0] >= value;
10810             cases[t1 << 1].forEach(stitch);
10811             while (++x < dx - 1) {
10812               t0 = t1, t1 = values[x + 1] >= value;
10813               cases[t0 | t1 << 1].forEach(stitch);
10814             }
10815             cases[t1 << 0].forEach(stitch);
10816
10817             // General case for the intermediate rows.
10818             while (++y < dy - 1) {
10819               x = -1;
10820               t1 = values[y * dx + dx] >= value;
10821               t2 = values[y * dx] >= value;
10822               cases[t1 << 1 | t2 << 2].forEach(stitch);
10823               while (++x < dx - 1) {
10824                 t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
10825                 t3 = t2, t2 = values[y * dx + x + 1] >= value;
10826                 cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
10827               }
10828               cases[t1 | t2 << 3].forEach(stitch);
10829             }
10830
10831             // Special case for the last row (y = dy - 1, t0 = t1 = 0).
10832             x = -1;
10833             t2 = values[y * dx] >= value;
10834             cases[t2 << 2].forEach(stitch);
10835             while (++x < dx - 1) {
10836               t3 = t2, t2 = values[y * dx + x + 1] >= value;
10837               cases[t2 << 2 | t3 << 3].forEach(stitch);
10838             }
10839             cases[t2 << 3].forEach(stitch);
10840
10841             function stitch(line) {
10842               var start = [line[0][0] + x, line[0][1] + y],
10843                   end = [line[1][0] + x, line[1][1] + y],
10844                   startIndex = index(start),
10845                   endIndex = index(end),
10846                   f, g;
10847               if (f = fragmentByEnd[startIndex]) {
10848                 if (g = fragmentByStart[endIndex]) {
10849                   delete fragmentByEnd[f.end];
10850                   delete fragmentByStart[g.start];
10851                   if (f === g) {
10852                     f.ring.push(end);
10853                     callback(f.ring);
10854                   } else {
10855                     fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
10856                   }
10857                 } else {
10858                   delete fragmentByEnd[f.end];
10859                   f.ring.push(end);
10860                   fragmentByEnd[f.end = endIndex] = f;
10861                 }
10862               } else if (f = fragmentByStart[endIndex]) {
10863                 if (g = fragmentByEnd[startIndex]) {
10864                   delete fragmentByStart[f.start];
10865                   delete fragmentByEnd[g.end];
10866                   if (f === g) {
10867                     f.ring.push(end);
10868                     callback(f.ring);
10869                   } else {
10870                     fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
10871                   }
10872                 } else {
10873                   delete fragmentByStart[f.start];
10874                   f.ring.unshift(start);
10875                   fragmentByStart[f.start = startIndex] = f;
10876                 }
10877               } else {
10878                 fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
10879               }
10880             }
10881           }
10882
10883           function index(point) {
10884             return point[0] * 2 + point[1] * (dx + 1) * 4;
10885           }
10886
10887           function smoothLinear(ring, values, value) {
10888             ring.forEach(function(point) {
10889               var x = point[0],
10890                   y = point[1],
10891                   xt = x | 0,
10892                   yt = y | 0,
10893                   v0,
10894                   v1 = values[yt * dx + xt];
10895               if (x > 0 && x < dx && xt === x) {
10896                 v0 = values[yt * dx + xt - 1];
10897                 point[0] = x + (value - v0) / (v1 - v0) - 0.5;
10898               }
10899               if (y > 0 && y < dy && yt === y) {
10900                 v0 = values[(yt - 1) * dx + xt];
10901                 point[1] = y + (value - v0) / (v1 - v0) - 0.5;
10902               }
10903             });
10904           }
10905
10906           contours.contour = contour;
10907
10908           contours.size = function(_) {
10909             if (!arguments.length) return [dx, dy];
10910             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10911             if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
10912             return dx = _0, dy = _1, contours;
10913           };
10914
10915           contours.thresholds = function(_) {
10916             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), contours) : threshold;
10917           };
10918
10919           contours.smooth = function(_) {
10920             return arguments.length ? (smooth = _ ? smoothLinear : noop$3, contours) : smooth === smoothLinear;
10921           };
10922
10923           return contours;
10924         }
10925
10926         // TODO Optimize edge cases.
10927         // TODO Optimize index calculation.
10928         // TODO Optimize arguments.
10929         function blurX(source, target, r) {
10930           var n = source.width,
10931               m = source.height,
10932               w = (r << 1) + 1;
10933           for (var j = 0; j < m; ++j) {
10934             for (var i = 0, sr = 0; i < n + r; ++i) {
10935               if (i < n) {
10936                 sr += source.data[i + j * n];
10937               }
10938               if (i >= r) {
10939                 if (i >= w) {
10940                   sr -= source.data[i - w + j * n];
10941                 }
10942                 target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
10943               }
10944             }
10945           }
10946         }
10947
10948         // TODO Optimize edge cases.
10949         // TODO Optimize index calculation.
10950         // TODO Optimize arguments.
10951         function blurY(source, target, r) {
10952           var n = source.width,
10953               m = source.height,
10954               w = (r << 1) + 1;
10955           for (var i = 0; i < n; ++i) {
10956             for (var j = 0, sr = 0; j < m + r; ++j) {
10957               if (j < m) {
10958                 sr += source.data[i + j * n];
10959               }
10960               if (j >= r) {
10961                 if (j >= w) {
10962                   sr -= source.data[i + (j - w) * n];
10963                 }
10964                 target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
10965               }
10966             }
10967           }
10968         }
10969
10970         function defaultX(d) {
10971           return d[0];
10972         }
10973
10974         function defaultY(d) {
10975           return d[1];
10976         }
10977
10978         function defaultWeight() {
10979           return 1;
10980         }
10981
10982         function density() {
10983           var x = defaultX,
10984               y = defaultY,
10985               weight = defaultWeight,
10986               dx = 960,
10987               dy = 500,
10988               r = 20, // blur radius
10989               k = 2, // log2(grid cell size)
10990               o = r * 3, // grid offset, to pad for blur
10991               n = (dx + o * 2) >> k, // grid width
10992               m = (dy + o * 2) >> k, // grid height
10993               threshold = constant$6(20);
10994
10995           function density(data) {
10996             var values0 = new Float32Array(n * m),
10997                 values1 = new Float32Array(n * m);
10998
10999             data.forEach(function(d, i, data) {
11000               var xi = (+x(d, i, data) + o) >> k,
11001                   yi = (+y(d, i, data) + o) >> k,
11002                   wi = +weight(d, i, data);
11003               if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
11004                 values0[xi + yi * n] += wi;
11005               }
11006             });
11007
11008             // TODO Optimize.
11009             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
11010             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
11011             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
11012             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
11013             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
11014             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
11015
11016             var tz = threshold(values0);
11017
11018             // Convert number of thresholds into uniform thresholds.
11019             if (!Array.isArray(tz)) {
11020               var stop = max$2(values0);
11021               tz = tickStep(0, stop, tz);
11022               tz = d3_range(0, Math.floor(stop / tz) * tz, tz);
11023               tz.shift();
11024             }
11025
11026             return contours()
11027                 .thresholds(tz)
11028                 .size([n, m])
11029               (values0)
11030                 .map(transform);
11031           }
11032
11033           function transform(geometry) {
11034             geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
11035             geometry.coordinates.forEach(transformPolygon);
11036             return geometry;
11037           }
11038
11039           function transformPolygon(coordinates) {
11040             coordinates.forEach(transformRing);
11041           }
11042
11043           function transformRing(coordinates) {
11044             coordinates.forEach(transformPoint);
11045           }
11046
11047           // TODO Optimize.
11048           function transformPoint(coordinates) {
11049             coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
11050             coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
11051           }
11052
11053           function resize() {
11054             o = r * 3;
11055             n = (dx + o * 2) >> k;
11056             m = (dy + o * 2) >> k;
11057             return density;
11058           }
11059
11060           density.x = function(_) {
11061             return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x;
11062           };
11063
11064           density.y = function(_) {
11065             return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y;
11066           };
11067
11068           density.weight = function(_) {
11069             return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight;
11070           };
11071
11072           density.size = function(_) {
11073             if (!arguments.length) return [dx, dy];
11074             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
11075             if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
11076             return dx = _0, dy = _1, resize();
11077           };
11078
11079           density.cellSize = function(_) {
11080             if (!arguments.length) return 1 << k;
11081             if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
11082             return k = Math.floor(Math.log(_) / Math.LN2), resize();
11083           };
11084
11085           density.thresholds = function(_) {
11086             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), density) : threshold;
11087           };
11088
11089           density.bandwidth = function(_) {
11090             if (!arguments.length) return Math.sqrt(r * (r + 1));
11091             if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
11092             return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
11093           };
11094
11095           return density;
11096         }
11097
11098         var EOL = {},
11099             EOF = {},
11100             QUOTE = 34,
11101             NEWLINE = 10,
11102             RETURN = 13;
11103
11104         function objectConverter(columns) {
11105           return new Function("d", "return {" + columns.map(function(name, i) {
11106             return JSON.stringify(name) + ": d[" + i + "]";
11107           }).join(",") + "}");
11108         }
11109
11110         function customConverter(columns, f) {
11111           var object = objectConverter(columns);
11112           return function(row, i) {
11113             return f(object(row), i, columns);
11114           };
11115         }
11116
11117         // Compute unique columns in order of discovery.
11118         function inferColumns(rows) {
11119           var columnSet = Object.create(null),
11120               columns = [];
11121
11122           rows.forEach(function(row) {
11123             for (var column in row) {
11124               if (!(column in columnSet)) {
11125                 columns.push(columnSet[column] = column);
11126               }
11127             }
11128           });
11129
11130           return columns;
11131         }
11132
11133         function pad(value, width) {
11134           var s = value + "", length = s.length;
11135           return length < width ? new Array(width - length + 1).join(0) + s : s;
11136         }
11137
11138         function formatYear(year) {
11139           return year < 0 ? "-" + pad(-year, 6)
11140             : year > 9999 ? "+" + pad(year, 6)
11141             : pad(year, 4);
11142         }
11143
11144         function formatDate(date) {
11145           var hours = date.getUTCHours(),
11146               minutes = date.getUTCMinutes(),
11147               seconds = date.getUTCSeconds(),
11148               milliseconds = date.getUTCMilliseconds();
11149           return isNaN(date) ? "Invalid Date"
11150               : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
11151               + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
11152               : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
11153               : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
11154               : "");
11155         }
11156
11157         function dsvFormat(delimiter) {
11158           var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
11159               DELIMITER = delimiter.charCodeAt(0);
11160
11161           function parse(text, f) {
11162             var convert, columns, rows = parseRows(text, function(row, i) {
11163               if (convert) return convert(row, i - 1);
11164               columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
11165             });
11166             rows.columns = columns || [];
11167             return rows;
11168           }
11169
11170           function parseRows(text, f) {
11171             var rows = [], // output rows
11172                 N = text.length,
11173                 I = 0, // current character index
11174                 n = 0, // current line number
11175                 t, // current token
11176                 eof = N <= 0, // current token followed by EOF?
11177                 eol = false; // current token followed by EOL?
11178
11179             // Strip the trailing newline.
11180             if (text.charCodeAt(N - 1) === NEWLINE) --N;
11181             if (text.charCodeAt(N - 1) === RETURN) --N;
11182
11183             function token() {
11184               if (eof) return EOF;
11185               if (eol) return eol = false, EOL;
11186
11187               // Unescape quotes.
11188               var i, j = I, c;
11189               if (text.charCodeAt(j) === QUOTE) {
11190                 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
11191                 if ((i = I) >= N) eof = true;
11192                 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
11193                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11194                 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
11195               }
11196
11197               // Find next delimiter or newline.
11198               while (I < N) {
11199                 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
11200                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11201                 else if (c !== DELIMITER) continue;
11202                 return text.slice(j, i);
11203               }
11204
11205               // Return last token before EOF.
11206               return eof = true, text.slice(j, N);
11207             }
11208
11209             while ((t = token()) !== EOF) {
11210               var row = [];
11211               while (t !== EOL && t !== EOF) row.push(t), t = token();
11212               if (f && (row = f(row, n++)) == null) continue;
11213               rows.push(row);
11214             }
11215
11216             return rows;
11217           }
11218
11219           function preformatBody(rows, columns) {
11220             return rows.map(function(row) {
11221               return columns.map(function(column) {
11222                 return formatValue(row[column]);
11223               }).join(delimiter);
11224             });
11225           }
11226
11227           function format(rows, columns) {
11228             if (columns == null) columns = inferColumns(rows);
11229             return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
11230           }
11231
11232           function formatBody(rows, columns) {
11233             if (columns == null) columns = inferColumns(rows);
11234             return preformatBody(rows, columns).join("\n");
11235           }
11236
11237           function formatRows(rows) {
11238             return rows.map(formatRow).join("\n");
11239           }
11240
11241           function formatRow(row) {
11242             return row.map(formatValue).join(delimiter);
11243           }
11244
11245           function formatValue(value) {
11246             return value == null ? ""
11247                 : value instanceof Date ? formatDate(value)
11248                 : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
11249                 : value;
11250           }
11251
11252           return {
11253             parse: parse,
11254             parseRows: parseRows,
11255             format: format,
11256             formatBody: formatBody,
11257             formatRows: formatRows
11258           };
11259         }
11260
11261         var csv = dsvFormat(",");
11262
11263         var csvParse = csv.parse;
11264         var csvParseRows = csv.parseRows;
11265         var csvFormat = csv.format;
11266         var csvFormatBody = csv.formatBody;
11267         var csvFormatRows = csv.formatRows;
11268
11269         var tsv = dsvFormat("\t");
11270
11271         var tsvParse = tsv.parse;
11272         var tsvParseRows = tsv.parseRows;
11273         var tsvFormat = tsv.format;
11274         var tsvFormatBody = tsv.formatBody;
11275         var tsvFormatRows = tsv.formatRows;
11276
11277         function autoType(object) {
11278           for (var key in object) {
11279             var value = object[key].trim(), number;
11280             if (!value) value = null;
11281             else if (value === "true") value = true;
11282             else if (value === "false") value = false;
11283             else if (value === "NaN") value = NaN;
11284             else if (!isNaN(number = +value)) value = number;
11285             else if (/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(value)) value = new Date(value);
11286             else continue;
11287             object[key] = value;
11288           }
11289           return object;
11290         }
11291
11292         function responseBlob(response) {
11293           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11294           return response.blob();
11295         }
11296
11297         function blob(input, init) {
11298           return fetch(input, init).then(responseBlob);
11299         }
11300
11301         function responseArrayBuffer(response) {
11302           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11303           return response.arrayBuffer();
11304         }
11305
11306         function buffer(input, init) {
11307           return fetch(input, init).then(responseArrayBuffer);
11308         }
11309
11310         function responseText(response) {
11311           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11312           return response.text();
11313         }
11314
11315         function d3_text(input, init) {
11316           return fetch(input, init).then(responseText);
11317         }
11318
11319         function dsvParse(parse) {
11320           return function(input, init, row) {
11321             if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
11322             return d3_text(input, init).then(function(response) {
11323               return parse(response, row);
11324             });
11325           };
11326         }
11327
11328         function dsv(delimiter, input, init, row) {
11329           if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
11330           var format = dsvFormat(delimiter);
11331           return d3_text(input, init).then(function(response) {
11332             return format.parse(response, row);
11333           });
11334         }
11335
11336         var csv$1 = dsvParse(csvParse);
11337         var tsv$1 = dsvParse(tsvParse);
11338
11339         function image(input, init) {
11340           return new Promise(function(resolve, reject) {
11341             var image = new Image;
11342             for (var key in init) image[key] = init[key];
11343             image.onerror = reject;
11344             image.onload = function() { resolve(image); };
11345             image.src = input;
11346           });
11347         }
11348
11349         function responseJson(response) {
11350           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11351           return response.json();
11352         }
11353
11354         function d3_json(input, init) {
11355           return fetch(input, init).then(responseJson);
11356         }
11357
11358         function parser(type) {
11359           return function(input, init)  {
11360             return d3_text(input, init).then(function(text) {
11361               return (new DOMParser).parseFromString(text, type);
11362             });
11363           };
11364         }
11365
11366         var d3_xml = parser("application/xml");
11367
11368         var html = parser("text/html");
11369
11370         var svg = parser("image/svg+xml");
11371
11372         function center$1(x, y) {
11373           var nodes;
11374
11375           if (x == null) x = 0;
11376           if (y == null) y = 0;
11377
11378           function force() {
11379             var i,
11380                 n = nodes.length,
11381                 node,
11382                 sx = 0,
11383                 sy = 0;
11384
11385             for (i = 0; i < n; ++i) {
11386               node = nodes[i], sx += node.x, sy += node.y;
11387             }
11388
11389             for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
11390               node = nodes[i], node.x -= sx, node.y -= sy;
11391             }
11392           }
11393
11394           force.initialize = function(_) {
11395             nodes = _;
11396           };
11397
11398           force.x = function(_) {
11399             return arguments.length ? (x = +_, force) : x;
11400           };
11401
11402           force.y = function(_) {
11403             return arguments.length ? (y = +_, force) : y;
11404           };
11405
11406           return force;
11407         }
11408
11409         function constant$7(x) {
11410           return function() {
11411             return x;
11412           };
11413         }
11414
11415         function jiggle() {
11416           return (Math.random() - 0.5) * 1e-6;
11417         }
11418
11419         function tree_add(d) {
11420           var x = +this._x.call(null, d),
11421               y = +this._y.call(null, d);
11422           return add(this.cover(x, y), x, y, d);
11423         }
11424
11425         function add(tree, x, y, d) {
11426           if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
11427
11428           var parent,
11429               node = tree._root,
11430               leaf = {data: d},
11431               x0 = tree._x0,
11432               y0 = tree._y0,
11433               x1 = tree._x1,
11434               y1 = tree._y1,
11435               xm,
11436               ym,
11437               xp,
11438               yp,
11439               right,
11440               bottom,
11441               i,
11442               j;
11443
11444           // If the tree is empty, initialize the root as a leaf.
11445           if (!node) return tree._root = leaf, tree;
11446
11447           // Find the existing leaf for the new point, or add it.
11448           while (node.length) {
11449             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11450             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11451             if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
11452           }
11453
11454           // Is the new point is exactly coincident with the existing point?
11455           xp = +tree._x.call(null, node.data);
11456           yp = +tree._y.call(null, node.data);
11457           if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
11458
11459           // Otherwise, split the leaf node until the old and new point are separated.
11460           do {
11461             parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
11462             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11463             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11464           } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
11465           return parent[j] = node, parent[i] = leaf, tree;
11466         }
11467
11468         function addAll(data) {
11469           var d, i, n = data.length,
11470               x,
11471               y,
11472               xz = new Array(n),
11473               yz = new Array(n),
11474               x0 = Infinity,
11475               y0 = Infinity,
11476               x1 = -Infinity,
11477               y1 = -Infinity;
11478
11479           // Compute the points and their extent.
11480           for (i = 0; i < n; ++i) {
11481             if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
11482             xz[i] = x;
11483             yz[i] = y;
11484             if (x < x0) x0 = x;
11485             if (x > x1) x1 = x;
11486             if (y < y0) y0 = y;
11487             if (y > y1) y1 = y;
11488           }
11489
11490           // If there were no (valid) points, abort.
11491           if (x0 > x1 || y0 > y1) return this;
11492
11493           // Expand the tree to cover the new points.
11494           this.cover(x0, y0).cover(x1, y1);
11495
11496           // Add the new points.
11497           for (i = 0; i < n; ++i) {
11498             add(this, xz[i], yz[i], data[i]);
11499           }
11500
11501           return this;
11502         }
11503
11504         function tree_cover(x, y) {
11505           if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
11506
11507           var x0 = this._x0,
11508               y0 = this._y0,
11509               x1 = this._x1,
11510               y1 = this._y1;
11511
11512           // If the quadtree has no extent, initialize them.
11513           // Integer extent are necessary so that if we later double the extent,
11514           // the existing quadrant boundaries don’t change due to floating point error!
11515           if (isNaN(x0)) {
11516             x1 = (x0 = Math.floor(x)) + 1;
11517             y1 = (y0 = Math.floor(y)) + 1;
11518           }
11519
11520           // Otherwise, double repeatedly to cover.
11521           else {
11522             var z = x1 - x0,
11523                 node = this._root,
11524                 parent,
11525                 i;
11526
11527             while (x0 > x || x >= x1 || y0 > y || y >= y1) {
11528               i = (y < y0) << 1 | (x < x0);
11529               parent = new Array(4), parent[i] = node, node = parent, z *= 2;
11530               switch (i) {
11531                 case 0: x1 = x0 + z, y1 = y0 + z; break;
11532                 case 1: x0 = x1 - z, y1 = y0 + z; break;
11533                 case 2: x1 = x0 + z, y0 = y1 - z; break;
11534                 case 3: x0 = x1 - z, y0 = y1 - z; break;
11535               }
11536             }
11537
11538             if (this._root && this._root.length) this._root = node;
11539           }
11540
11541           this._x0 = x0;
11542           this._y0 = y0;
11543           this._x1 = x1;
11544           this._y1 = y1;
11545           return this;
11546         }
11547
11548         function tree_data() {
11549           var data = [];
11550           this.visit(function(node) {
11551             if (!node.length) do data.push(node.data); while (node = node.next)
11552           });
11553           return data;
11554         }
11555
11556         function tree_extent(_) {
11557           return arguments.length
11558               ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
11559               : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
11560         }
11561
11562         function Quad(node, x0, y0, x1, y1) {
11563           this.node = node;
11564           this.x0 = x0;
11565           this.y0 = y0;
11566           this.x1 = x1;
11567           this.y1 = y1;
11568         }
11569
11570         function tree_find(x, y, radius) {
11571           var data,
11572               x0 = this._x0,
11573               y0 = this._y0,
11574               x1,
11575               y1,
11576               x2,
11577               y2,
11578               x3 = this._x1,
11579               y3 = this._y1,
11580               quads = [],
11581               node = this._root,
11582               q,
11583               i;
11584
11585           if (node) quads.push(new Quad(node, x0, y0, x3, y3));
11586           if (radius == null) radius = Infinity;
11587           else {
11588             x0 = x - radius, y0 = y - radius;
11589             x3 = x + radius, y3 = y + radius;
11590             radius *= radius;
11591           }
11592
11593           while (q = quads.pop()) {
11594
11595             // Stop searching if this quadrant can’t contain a closer node.
11596             if (!(node = q.node)
11597                 || (x1 = q.x0) > x3
11598                 || (y1 = q.y0) > y3
11599                 || (x2 = q.x1) < x0
11600                 || (y2 = q.y1) < y0) continue;
11601
11602             // Bisect the current quadrant.
11603             if (node.length) {
11604               var xm = (x1 + x2) / 2,
11605                   ym = (y1 + y2) / 2;
11606
11607               quads.push(
11608                 new Quad(node[3], xm, ym, x2, y2),
11609                 new Quad(node[2], x1, ym, xm, y2),
11610                 new Quad(node[1], xm, y1, x2, ym),
11611                 new Quad(node[0], x1, y1, xm, ym)
11612               );
11613
11614               // Visit the closest quadrant first.
11615               if (i = (y >= ym) << 1 | (x >= xm)) {
11616                 q = quads[quads.length - 1];
11617                 quads[quads.length - 1] = quads[quads.length - 1 - i];
11618                 quads[quads.length - 1 - i] = q;
11619               }
11620             }
11621
11622             // Visit this point. (Visiting coincident points isn’t necessary!)
11623             else {
11624               var dx = x - +this._x.call(null, node.data),
11625                   dy = y - +this._y.call(null, node.data),
11626                   d2 = dx * dx + dy * dy;
11627               if (d2 < radius) {
11628                 var d = Math.sqrt(radius = d2);
11629                 x0 = x - d, y0 = y - d;
11630                 x3 = x + d, y3 = y + d;
11631                 data = node.data;
11632               }
11633             }
11634           }
11635
11636           return data;
11637         }
11638
11639         function tree_remove(d) {
11640           if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
11641
11642           var parent,
11643               node = this._root,
11644               retainer,
11645               previous,
11646               next,
11647               x0 = this._x0,
11648               y0 = this._y0,
11649               x1 = this._x1,
11650               y1 = this._y1,
11651               x,
11652               y,
11653               xm,
11654               ym,
11655               right,
11656               bottom,
11657               i,
11658               j;
11659
11660           // If the tree is empty, initialize the root as a leaf.
11661           if (!node) return this;
11662
11663           // Find the leaf node for the point.
11664           // While descending, also retain the deepest parent with a non-removed sibling.
11665           if (node.length) while (true) {
11666             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11667             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11668             if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
11669             if (!node.length) break;
11670             if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
11671           }
11672
11673           // Find the point to remove.
11674           while (node.data !== d) if (!(previous = node, node = node.next)) return this;
11675           if (next = node.next) delete node.next;
11676
11677           // If there are multiple coincident points, remove just the point.
11678           if (previous) return (next ? previous.next = next : delete previous.next), this;
11679
11680           // If this is the root point, remove it.
11681           if (!parent) return this._root = next, this;
11682
11683           // Remove this leaf.
11684           next ? parent[i] = next : delete parent[i];
11685
11686           // If the parent now contains exactly one leaf, collapse superfluous parents.
11687           if ((node = parent[0] || parent[1] || parent[2] || parent[3])
11688               && node === (parent[3] || parent[2] || parent[1] || parent[0])
11689               && !node.length) {
11690             if (retainer) retainer[j] = node;
11691             else this._root = node;
11692           }
11693
11694           return this;
11695         }
11696
11697         function removeAll(data) {
11698           for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
11699           return this;
11700         }
11701
11702         function tree_root() {
11703           return this._root;
11704         }
11705
11706         function tree_size() {
11707           var size = 0;
11708           this.visit(function(node) {
11709             if (!node.length) do ++size; while (node = node.next)
11710           });
11711           return size;
11712         }
11713
11714         function tree_visit(callback) {
11715           var quads = [], q, node = this._root, child, x0, y0, x1, y1;
11716           if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
11717           while (q = quads.pop()) {
11718             if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
11719               var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11720               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11721               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11722               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11723               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11724             }
11725           }
11726           return this;
11727         }
11728
11729         function tree_visitAfter(callback) {
11730           var quads = [], next = [], q;
11731           if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
11732           while (q = quads.pop()) {
11733             var node = q.node;
11734             if (node.length) {
11735               var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11736               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11737               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11738               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11739               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11740             }
11741             next.push(q);
11742           }
11743           while (q = next.pop()) {
11744             callback(q.node, q.x0, q.y0, q.x1, q.y1);
11745           }
11746           return this;
11747         }
11748
11749         function defaultX$1(d) {
11750           return d[0];
11751         }
11752
11753         function tree_x(_) {
11754           return arguments.length ? (this._x = _, this) : this._x;
11755         }
11756
11757         function defaultY$1(d) {
11758           return d[1];
11759         }
11760
11761         function tree_y(_) {
11762           return arguments.length ? (this._y = _, this) : this._y;
11763         }
11764
11765         function quadtree(nodes, x, y) {
11766           var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN);
11767           return nodes == null ? tree : tree.addAll(nodes);
11768         }
11769
11770         function Quadtree(x, y, x0, y0, x1, y1) {
11771           this._x = x;
11772           this._y = y;
11773           this._x0 = x0;
11774           this._y0 = y0;
11775           this._x1 = x1;
11776           this._y1 = y1;
11777           this._root = undefined;
11778         }
11779
11780         function leaf_copy(leaf) {
11781           var copy = {data: leaf.data}, next = copy;
11782           while (leaf = leaf.next) next = next.next = {data: leaf.data};
11783           return copy;
11784         }
11785
11786         var treeProto = quadtree.prototype = Quadtree.prototype;
11787
11788         treeProto.copy = function() {
11789           var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
11790               node = this._root,
11791               nodes,
11792               child;
11793
11794           if (!node) return copy;
11795
11796           if (!node.length) return copy._root = leaf_copy(node), copy;
11797
11798           nodes = [{source: node, target: copy._root = new Array(4)}];
11799           while (node = nodes.pop()) {
11800             for (var i = 0; i < 4; ++i) {
11801               if (child = node.source[i]) {
11802                 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
11803                 else node.target[i] = leaf_copy(child);
11804               }
11805             }
11806           }
11807
11808           return copy;
11809         };
11810
11811         treeProto.add = tree_add;
11812         treeProto.addAll = addAll;
11813         treeProto.cover = tree_cover;
11814         treeProto.data = tree_data;
11815         treeProto.extent = tree_extent;
11816         treeProto.find = tree_find;
11817         treeProto.remove = tree_remove;
11818         treeProto.removeAll = removeAll;
11819         treeProto.root = tree_root;
11820         treeProto.size = tree_size;
11821         treeProto.visit = tree_visit;
11822         treeProto.visitAfter = tree_visitAfter;
11823         treeProto.x = tree_x;
11824         treeProto.y = tree_y;
11825
11826         function x(d) {
11827           return d.x + d.vx;
11828         }
11829
11830         function y(d) {
11831           return d.y + d.vy;
11832         }
11833
11834         function collide(radius) {
11835           var nodes,
11836               radii,
11837               strength = 1,
11838               iterations = 1;
11839
11840           if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius);
11841
11842           function force() {
11843             var i, n = nodes.length,
11844                 tree,
11845                 node,
11846                 xi,
11847                 yi,
11848                 ri,
11849                 ri2;
11850
11851             for (var k = 0; k < iterations; ++k) {
11852               tree = quadtree(nodes, x, y).visitAfter(prepare);
11853               for (i = 0; i < n; ++i) {
11854                 node = nodes[i];
11855                 ri = radii[node.index], ri2 = ri * ri;
11856                 xi = node.x + node.vx;
11857                 yi = node.y + node.vy;
11858                 tree.visit(apply);
11859               }
11860             }
11861
11862             function apply(quad, x0, y0, x1, y1) {
11863               var data = quad.data, rj = quad.r, r = ri + rj;
11864               if (data) {
11865                 if (data.index > node.index) {
11866                   var x = xi - data.x - data.vx,
11867                       y = yi - data.y - data.vy,
11868                       l = x * x + y * y;
11869                   if (l < r * r) {
11870                     if (x === 0) x = jiggle(), l += x * x;
11871                     if (y === 0) y = jiggle(), l += y * y;
11872                     l = (r - (l = Math.sqrt(l))) / l * strength;
11873                     node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
11874                     node.vy += (y *= l) * r;
11875                     data.vx -= x * (r = 1 - r);
11876                     data.vy -= y * r;
11877                   }
11878                 }
11879                 return;
11880               }
11881               return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
11882             }
11883           }
11884
11885           function prepare(quad) {
11886             if (quad.data) return quad.r = radii[quad.data.index];
11887             for (var i = quad.r = 0; i < 4; ++i) {
11888               if (quad[i] && quad[i].r > quad.r) {
11889                 quad.r = quad[i].r;
11890               }
11891             }
11892           }
11893
11894           function initialize() {
11895             if (!nodes) return;
11896             var i, n = nodes.length, node;
11897             radii = new Array(n);
11898             for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
11899           }
11900
11901           force.initialize = function(_) {
11902             nodes = _;
11903             initialize();
11904           };
11905
11906           force.iterations = function(_) {
11907             return arguments.length ? (iterations = +_, force) : iterations;
11908           };
11909
11910           force.strength = function(_) {
11911             return arguments.length ? (strength = +_, force) : strength;
11912           };
11913
11914           force.radius = function(_) {
11915             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
11916           };
11917
11918           return force;
11919         }
11920
11921         function index(d) {
11922           return d.index;
11923         }
11924
11925         function find(nodeById, nodeId) {
11926           var node = nodeById.get(nodeId);
11927           if (!node) throw new Error("missing: " + nodeId);
11928           return node;
11929         }
11930
11931         function link(links) {
11932           var id = index,
11933               strength = defaultStrength,
11934               strengths,
11935               distance = constant$7(30),
11936               distances,
11937               nodes,
11938               count,
11939               bias,
11940               iterations = 1;
11941
11942           if (links == null) links = [];
11943
11944           function defaultStrength(link) {
11945             return 1 / Math.min(count[link.source.index], count[link.target.index]);
11946           }
11947
11948           function force(alpha) {
11949             for (var k = 0, n = links.length; k < iterations; ++k) {
11950               for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
11951                 link = links[i], source = link.source, target = link.target;
11952                 x = target.x + target.vx - source.x - source.vx || jiggle();
11953                 y = target.y + target.vy - source.y - source.vy || jiggle();
11954                 l = Math.sqrt(x * x + y * y);
11955                 l = (l - distances[i]) / l * alpha * strengths[i];
11956                 x *= l, y *= l;
11957                 target.vx -= x * (b = bias[i]);
11958                 target.vy -= y * b;
11959                 source.vx += x * (b = 1 - b);
11960                 source.vy += y * b;
11961               }
11962             }
11963           }
11964
11965           function initialize() {
11966             if (!nodes) return;
11967
11968             var i,
11969                 n = nodes.length,
11970                 m = links.length,
11971                 nodeById = map$3(nodes, id),
11972                 link;
11973
11974             for (i = 0, count = new Array(n); i < m; ++i) {
11975               link = links[i], link.index = i;
11976               if (typeof link.source !== "object") link.source = find(nodeById, link.source);
11977               if (typeof link.target !== "object") link.target = find(nodeById, link.target);
11978               count[link.source.index] = (count[link.source.index] || 0) + 1;
11979               count[link.target.index] = (count[link.target.index] || 0) + 1;
11980             }
11981
11982             for (i = 0, bias = new Array(m); i < m; ++i) {
11983               link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
11984             }
11985
11986             strengths = new Array(m), initializeStrength();
11987             distances = new Array(m), initializeDistance();
11988           }
11989
11990           function initializeStrength() {
11991             if (!nodes) return;
11992
11993             for (var i = 0, n = links.length; i < n; ++i) {
11994               strengths[i] = +strength(links[i], i, links);
11995             }
11996           }
11997
11998           function initializeDistance() {
11999             if (!nodes) return;
12000
12001             for (var i = 0, n = links.length; i < n; ++i) {
12002               distances[i] = +distance(links[i], i, links);
12003             }
12004           }
12005
12006           force.initialize = function(_) {
12007             nodes = _;
12008             initialize();
12009           };
12010
12011           force.links = function(_) {
12012             return arguments.length ? (links = _, initialize(), force) : links;
12013           };
12014
12015           force.id = function(_) {
12016             return arguments.length ? (id = _, force) : id;
12017           };
12018
12019           force.iterations = function(_) {
12020             return arguments.length ? (iterations = +_, force) : iterations;
12021           };
12022
12023           force.strength = function(_) {
12024             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength;
12025           };
12026
12027           force.distance = function(_) {
12028             return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance;
12029           };
12030
12031           return force;
12032         }
12033
12034         function x$1(d) {
12035           return d.x;
12036         }
12037
12038         function y$1(d) {
12039           return d.y;
12040         }
12041
12042         var initialRadius = 10,
12043             initialAngle = Math.PI * (3 - Math.sqrt(5));
12044
12045         function simulation(nodes) {
12046           var simulation,
12047               alpha = 1,
12048               alphaMin = 0.001,
12049               alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
12050               alphaTarget = 0,
12051               velocityDecay = 0.6,
12052               forces = map$3(),
12053               stepper = timer(step),
12054               event = dispatch("tick", "end");
12055
12056           if (nodes == null) nodes = [];
12057
12058           function step() {
12059             tick();
12060             event.call("tick", simulation);
12061             if (alpha < alphaMin) {
12062               stepper.stop();
12063               event.call("end", simulation);
12064             }
12065           }
12066
12067           function tick(iterations) {
12068             var i, n = nodes.length, node;
12069
12070             if (iterations === undefined) iterations = 1;
12071
12072             for (var k = 0; k < iterations; ++k) {
12073               alpha += (alphaTarget - alpha) * alphaDecay;
12074
12075               forces.each(function (force) {
12076                 force(alpha);
12077               });
12078
12079               for (i = 0; i < n; ++i) {
12080                 node = nodes[i];
12081                 if (node.fx == null) node.x += node.vx *= velocityDecay;
12082                 else node.x = node.fx, node.vx = 0;
12083                 if (node.fy == null) node.y += node.vy *= velocityDecay;
12084                 else node.y = node.fy, node.vy = 0;
12085               }
12086             }
12087
12088             return simulation;
12089           }
12090
12091           function initializeNodes() {
12092             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12093               node = nodes[i], node.index = i;
12094               if (node.fx != null) node.x = node.fx;
12095               if (node.fy != null) node.y = node.fy;
12096               if (isNaN(node.x) || isNaN(node.y)) {
12097                 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
12098                 node.x = radius * Math.cos(angle);
12099                 node.y = radius * Math.sin(angle);
12100               }
12101               if (isNaN(node.vx) || isNaN(node.vy)) {
12102                 node.vx = node.vy = 0;
12103               }
12104             }
12105           }
12106
12107           function initializeForce(force) {
12108             if (force.initialize) force.initialize(nodes);
12109             return force;
12110           }
12111
12112           initializeNodes();
12113
12114           return simulation = {
12115             tick: tick,
12116
12117             restart: function() {
12118               return stepper.restart(step), simulation;
12119             },
12120
12121             stop: function() {
12122               return stepper.stop(), simulation;
12123             },
12124
12125             nodes: function(_) {
12126               return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
12127             },
12128
12129             alpha: function(_) {
12130               return arguments.length ? (alpha = +_, simulation) : alpha;
12131             },
12132
12133             alphaMin: function(_) {
12134               return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
12135             },
12136
12137             alphaDecay: function(_) {
12138               return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
12139             },
12140
12141             alphaTarget: function(_) {
12142               return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
12143             },
12144
12145             velocityDecay: function(_) {
12146               return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
12147             },
12148
12149             force: function(name, _) {
12150               return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
12151             },
12152
12153             find: function(x, y, radius) {
12154               var i = 0,
12155                   n = nodes.length,
12156                   dx,
12157                   dy,
12158                   d2,
12159                   node,
12160                   closest;
12161
12162               if (radius == null) radius = Infinity;
12163               else radius *= radius;
12164
12165               for (i = 0; i < n; ++i) {
12166                 node = nodes[i];
12167                 dx = x - node.x;
12168                 dy = y - node.y;
12169                 d2 = dx * dx + dy * dy;
12170                 if (d2 < radius) closest = node, radius = d2;
12171               }
12172
12173               return closest;
12174             },
12175
12176             on: function(name, _) {
12177               return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
12178             }
12179           };
12180         }
12181
12182         function manyBody() {
12183           var nodes,
12184               node,
12185               alpha,
12186               strength = constant$7(-30),
12187               strengths,
12188               distanceMin2 = 1,
12189               distanceMax2 = Infinity,
12190               theta2 = 0.81;
12191
12192           function force(_) {
12193             var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
12194             for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
12195           }
12196
12197           function initialize() {
12198             if (!nodes) return;
12199             var i, n = nodes.length, node;
12200             strengths = new Array(n);
12201             for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
12202           }
12203
12204           function accumulate(quad) {
12205             var strength = 0, q, c, weight = 0, x, y, i;
12206
12207             // For internal nodes, accumulate forces from child quadrants.
12208             if (quad.length) {
12209               for (x = y = i = 0; i < 4; ++i) {
12210                 if ((q = quad[i]) && (c = Math.abs(q.value))) {
12211                   strength += q.value, weight += c, x += c * q.x, y += c * q.y;
12212                 }
12213               }
12214               quad.x = x / weight;
12215               quad.y = y / weight;
12216             }
12217
12218             // For leaf nodes, accumulate forces from coincident quadrants.
12219             else {
12220               q = quad;
12221               q.x = q.data.x;
12222               q.y = q.data.y;
12223               do strength += strengths[q.data.index];
12224               while (q = q.next);
12225             }
12226
12227             quad.value = strength;
12228           }
12229
12230           function apply(quad, x1, _, x2) {
12231             if (!quad.value) return true;
12232
12233             var x = quad.x - node.x,
12234                 y = quad.y - node.y,
12235                 w = x2 - x1,
12236                 l = x * x + y * y;
12237
12238             // Apply the Barnes-Hut approximation if possible.
12239             // Limit forces for very close nodes; randomize direction if coincident.
12240             if (w * w / theta2 < l) {
12241               if (l < distanceMax2) {
12242                 if (x === 0) x = jiggle(), l += x * x;
12243                 if (y === 0) y = jiggle(), l += y * y;
12244                 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12245                 node.vx += x * quad.value * alpha / l;
12246                 node.vy += y * quad.value * alpha / l;
12247               }
12248               return true;
12249             }
12250
12251             // Otherwise, process points directly.
12252             else if (quad.length || l >= distanceMax2) return;
12253
12254             // Limit forces for very close nodes; randomize direction if coincident.
12255             if (quad.data !== node || quad.next) {
12256               if (x === 0) x = jiggle(), l += x * x;
12257               if (y === 0) y = jiggle(), l += y * y;
12258               if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12259             }
12260
12261             do if (quad.data !== node) {
12262               w = strengths[quad.data.index] * alpha / l;
12263               node.vx += x * w;
12264               node.vy += y * w;
12265             } while (quad = quad.next);
12266           }
12267
12268           force.initialize = function(_) {
12269             nodes = _;
12270             initialize();
12271           };
12272
12273           force.strength = function(_) {
12274             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12275           };
12276
12277           force.distanceMin = function(_) {
12278             return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
12279           };
12280
12281           force.distanceMax = function(_) {
12282             return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
12283           };
12284
12285           force.theta = function(_) {
12286             return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
12287           };
12288
12289           return force;
12290         }
12291
12292         function radial(radius, x, y) {
12293           var nodes,
12294               strength = constant$7(0.1),
12295               strengths,
12296               radiuses;
12297
12298           if (typeof radius !== "function") radius = constant$7(+radius);
12299           if (x == null) x = 0;
12300           if (y == null) y = 0;
12301
12302           function force(alpha) {
12303             for (var i = 0, n = nodes.length; i < n; ++i) {
12304               var node = nodes[i],
12305                   dx = node.x - x || 1e-6,
12306                   dy = node.y - y || 1e-6,
12307                   r = Math.sqrt(dx * dx + dy * dy),
12308                   k = (radiuses[i] - r) * strengths[i] * alpha / r;
12309               node.vx += dx * k;
12310               node.vy += dy * k;
12311             }
12312           }
12313
12314           function initialize() {
12315             if (!nodes) return;
12316             var i, n = nodes.length;
12317             strengths = new Array(n);
12318             radiuses = new Array(n);
12319             for (i = 0; i < n; ++i) {
12320               radiuses[i] = +radius(nodes[i], i, nodes);
12321               strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
12322             }
12323           }
12324
12325           force.initialize = function(_) {
12326             nodes = _, initialize();
12327           };
12328
12329           force.strength = function(_) {
12330             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12331           };
12332
12333           force.radius = function(_) {
12334             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
12335           };
12336
12337           force.x = function(_) {
12338             return arguments.length ? (x = +_, force) : x;
12339           };
12340
12341           force.y = function(_) {
12342             return arguments.length ? (y = +_, force) : y;
12343           };
12344
12345           return force;
12346         }
12347
12348         function x$2(x) {
12349           var strength = constant$7(0.1),
12350               nodes,
12351               strengths,
12352               xz;
12353
12354           if (typeof x !== "function") x = constant$7(x == null ? 0 : +x);
12355
12356           function force(alpha) {
12357             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12358               node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
12359             }
12360           }
12361
12362           function initialize() {
12363             if (!nodes) return;
12364             var i, n = nodes.length;
12365             strengths = new Array(n);
12366             xz = new Array(n);
12367             for (i = 0; i < n; ++i) {
12368               strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12369             }
12370           }
12371
12372           force.initialize = function(_) {
12373             nodes = _;
12374             initialize();
12375           };
12376
12377           force.strength = function(_) {
12378             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12379           };
12380
12381           force.x = function(_) {
12382             return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x;
12383           };
12384
12385           return force;
12386         }
12387
12388         function y$2(y) {
12389           var strength = constant$7(0.1),
12390               nodes,
12391               strengths,
12392               yz;
12393
12394           if (typeof y !== "function") y = constant$7(y == null ? 0 : +y);
12395
12396           function force(alpha) {
12397             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12398               node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
12399             }
12400           }
12401
12402           function initialize() {
12403             if (!nodes) return;
12404             var i, n = nodes.length;
12405             strengths = new Array(n);
12406             yz = new Array(n);
12407             for (i = 0; i < n; ++i) {
12408               strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12409             }
12410           }
12411
12412           force.initialize = function(_) {
12413             nodes = _;
12414             initialize();
12415           };
12416
12417           force.strength = function(_) {
12418             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12419           };
12420
12421           force.y = function(_) {
12422             return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y;
12423           };
12424
12425           return force;
12426         }
12427
12428         // Computes the decimal coefficient and exponent of the specified number x with
12429         // significant digits p, where x is positive and p is in [1, 21] or undefined.
12430         // For example, formatDecimal(1.23) returns ["123", 0].
12431         function formatDecimal(x, p) {
12432           if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
12433           var i, coefficient = x.slice(0, i);
12434
12435           // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
12436           // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
12437           return [
12438             coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
12439             +x.slice(i + 1)
12440           ];
12441         }
12442
12443         function exponent$1(x) {
12444           return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
12445         }
12446
12447         function formatGroup(grouping, thousands) {
12448           return function(value, width) {
12449             var i = value.length,
12450                 t = [],
12451                 j = 0,
12452                 g = grouping[0],
12453                 length = 0;
12454
12455             while (i > 0 && g > 0) {
12456               if (length + g + 1 > width) g = Math.max(1, width - length);
12457               t.push(value.substring(i -= g, i + g));
12458               if ((length += g + 1) > width) break;
12459               g = grouping[j = (j + 1) % grouping.length];
12460             }
12461
12462             return t.reverse().join(thousands);
12463           };
12464         }
12465
12466         function formatNumerals(numerals) {
12467           return function(value) {
12468             return value.replace(/[0-9]/g, function(i) {
12469               return numerals[+i];
12470             });
12471           };
12472         }
12473
12474         // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
12475         var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
12476
12477         function formatSpecifier(specifier) {
12478           return new FormatSpecifier(specifier);
12479         }
12480
12481         formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
12482
12483         function FormatSpecifier(specifier) {
12484           if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
12485           var match;
12486           this.fill = match[1] || " ";
12487           this.align = match[2] || ">";
12488           this.sign = match[3] || "-";
12489           this.symbol = match[4] || "";
12490           this.zero = !!match[5];
12491           this.width = match[6] && +match[6];
12492           this.comma = !!match[7];
12493           this.precision = match[8] && +match[8].slice(1);
12494           this.trim = !!match[9];
12495           this.type = match[10] || "";
12496         }
12497
12498         FormatSpecifier.prototype.toString = function() {
12499           return this.fill
12500               + this.align
12501               + this.sign
12502               + this.symbol
12503               + (this.zero ? "0" : "")
12504               + (this.width == null ? "" : Math.max(1, this.width | 0))
12505               + (this.comma ? "," : "")
12506               + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
12507               + (this.trim ? "~" : "")
12508               + this.type;
12509         };
12510
12511         // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
12512         function formatTrim(s) {
12513           out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
12514             switch (s[i]) {
12515               case ".": i0 = i1 = i; break;
12516               case "0": if (i0 === 0) i0 = i; i1 = i; break;
12517               default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;
12518             }
12519           }
12520           return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
12521         }
12522
12523         var prefixExponent;
12524
12525         function formatPrefixAuto(x, p) {
12526           var d = formatDecimal(x, p);
12527           if (!d) return x + "";
12528           var coefficient = d[0],
12529               exponent = d[1],
12530               i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
12531               n = coefficient.length;
12532           return i === n ? coefficient
12533               : i > n ? coefficient + new Array(i - n + 1).join("0")
12534               : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
12535               : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
12536         }
12537
12538         function formatRounded(x, p) {
12539           var d = formatDecimal(x, p);
12540           if (!d) return x + "";
12541           var coefficient = d[0],
12542               exponent = d[1];
12543           return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
12544               : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
12545               : coefficient + new Array(exponent - coefficient.length + 2).join("0");
12546         }
12547
12548         var formatTypes = {
12549           "%": function(x, p) { return (x * 100).toFixed(p); },
12550           "b": function(x) { return Math.round(x).toString(2); },
12551           "c": function(x) { return x + ""; },
12552           "d": function(x) { return Math.round(x).toString(10); },
12553           "e": function(x, p) { return x.toExponential(p); },
12554           "f": function(x, p) { return x.toFixed(p); },
12555           "g": function(x, p) { return x.toPrecision(p); },
12556           "o": function(x) { return Math.round(x).toString(8); },
12557           "p": function(x, p) { return formatRounded(x * 100, p); },
12558           "r": formatRounded,
12559           "s": formatPrefixAuto,
12560           "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
12561           "x": function(x) { return Math.round(x).toString(16); }
12562         };
12563
12564         function identity$3(x) {
12565           return x;
12566         }
12567
12568         var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
12569
12570         function formatLocale(locale) {
12571           var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
12572               currency = locale.currency,
12573               decimal = locale.decimal,
12574               numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
12575               percent = locale.percent || "%";
12576
12577           function newFormat(specifier) {
12578             specifier = formatSpecifier(specifier);
12579
12580             var fill = specifier.fill,
12581                 align = specifier.align,
12582                 sign = specifier.sign,
12583                 symbol = specifier.symbol,
12584                 zero = specifier.zero,
12585                 width = specifier.width,
12586                 comma = specifier.comma,
12587                 precision = specifier.precision,
12588                 trim = specifier.trim,
12589                 type = specifier.type;
12590
12591             // The "n" type is an alias for ",g".
12592             if (type === "n") comma = true, type = "g";
12593
12594             // The "" type, and any invalid type, is an alias for ".12~g".
12595             else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = "g";
12596
12597             // If zero fill is specified, padding goes after sign and before digits.
12598             if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
12599
12600             // Compute the prefix and suffix.
12601             // For SI-prefix, the suffix is lazily computed.
12602             var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
12603                 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
12604
12605             // What format function should we use?
12606             // Is this an integer type?
12607             // Can this type generate exponential notation?
12608             var formatType = formatTypes[type],
12609                 maybeSuffix = /[defgprs%]/.test(type);
12610
12611             // Set the default precision if not specified,
12612             // or clamp the specified precision to the supported range.
12613             // For significant precision, it must be in [1, 21].
12614             // For fixed precision, it must be in [0, 20].
12615             precision = precision == null ? 6
12616                 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
12617                 : Math.max(0, Math.min(20, precision));
12618
12619             function format(value) {
12620               var valuePrefix = prefix,
12621                   valueSuffix = suffix,
12622                   i, n, c;
12623
12624               if (type === "c") {
12625                 valueSuffix = formatType(value) + valueSuffix;
12626                 value = "";
12627               } else {
12628                 value = +value;
12629
12630                 // Perform the initial formatting.
12631                 var valueNegative = value < 0;
12632                 value = formatType(Math.abs(value), precision);
12633
12634                 // Trim insignificant zeros.
12635                 if (trim) value = formatTrim(value);
12636
12637                 // If a negative value rounds to zero during formatting, treat as positive.
12638                 if (valueNegative && +value === 0) valueNegative = false;
12639
12640                 // Compute the prefix and suffix.
12641                 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
12642                 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
12643
12644                 // Break the formatted value into the integer “value” part that can be
12645                 // grouped, and fractional or exponential “suffix” part that is not.
12646                 if (maybeSuffix) {
12647                   i = -1, n = value.length;
12648                   while (++i < n) {
12649                     if (c = value.charCodeAt(i), 48 > c || c > 57) {
12650                       valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
12651                       value = value.slice(0, i);
12652                       break;
12653                     }
12654                   }
12655                 }
12656               }
12657
12658               // If the fill character is not "0", grouping is applied before padding.
12659               if (comma && !zero) value = group(value, Infinity);
12660
12661               // Compute the padding.
12662               var length = valuePrefix.length + value.length + valueSuffix.length,
12663                   padding = length < width ? new Array(width - length + 1).join(fill) : "";
12664
12665               // If the fill character is "0", grouping is applied after padding.
12666               if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
12667
12668               // Reconstruct the final output based on the desired alignment.
12669               switch (align) {
12670                 case "<": value = valuePrefix + value + valueSuffix + padding; break;
12671                 case "=": value = valuePrefix + padding + value + valueSuffix; break;
12672                 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
12673                 default: value = padding + valuePrefix + value + valueSuffix; break;
12674               }
12675
12676               return numerals(value);
12677             }
12678
12679             format.toString = function() {
12680               return specifier + "";
12681             };
12682
12683             return format;
12684           }
12685
12686           function formatPrefix(specifier, value) {
12687             var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
12688                 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
12689                 k = Math.pow(10, -e),
12690                 prefix = prefixes[8 + e / 3];
12691             return function(value) {
12692               return f(k * value) + prefix;
12693             };
12694           }
12695
12696           return {
12697             format: newFormat,
12698             formatPrefix: formatPrefix
12699           };
12700         }
12701
12702         var locale;
12703         var format;
12704         var formatPrefix;
12705
12706         defaultLocale({
12707           decimal: ".",
12708           thousands: ",",
12709           grouping: [3],
12710           currency: ["$", ""]
12711         });
12712
12713         function defaultLocale(definition) {
12714           locale = formatLocale(definition);
12715           format = locale.format;
12716           formatPrefix = locale.formatPrefix;
12717           return locale;
12718         }
12719
12720         function precisionFixed(step) {
12721           return Math.max(0, -exponent$1(Math.abs(step)));
12722         }
12723
12724         function precisionPrefix(step, value) {
12725           return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
12726         }
12727
12728         function precisionRound(step, max) {
12729           step = Math.abs(step), max = Math.abs(max) - step;
12730           return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
12731         }
12732
12733         // Adds floating point numbers with twice the normal precision.
12734         // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
12735         // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
12736         // 305–363 (1997).
12737         // Code adapted from GeographicLib by Charles F. F. Karney,
12738         // http://geographiclib.sourceforge.net/
12739
12740         function adder() {
12741           return new Adder;
12742         }
12743
12744         function Adder() {
12745           this.reset();
12746         }
12747
12748         Adder.prototype = {
12749           constructor: Adder,
12750           reset: function() {
12751             this.s = // rounded value
12752             this.t = 0; // exact error
12753           },
12754           add: function(y) {
12755             add$1(temp, y, this.t);
12756             add$1(this, temp.s, this.s);
12757             if (this.s) this.t += temp.t;
12758             else this.s = temp.t;
12759           },
12760           valueOf: function() {
12761             return this.s;
12762           }
12763         };
12764
12765         var temp = new Adder;
12766
12767         function add$1(adder, a, b) {
12768           var x = adder.s = a + b,
12769               bv = x - a,
12770               av = x - bv;
12771           adder.t = (a - av) + (b - bv);
12772         }
12773
12774         var epsilon$2 = 1e-6;
12775         var epsilon2$1 = 1e-12;
12776         var pi$3 = Math.PI;
12777         var halfPi$2 = pi$3 / 2;
12778         var quarterPi = pi$3 / 4;
12779         var tau$3 = pi$3 * 2;
12780
12781         var degrees$1 = 180 / pi$3;
12782         var radians = pi$3 / 180;
12783
12784         var abs$2 = Math.abs;
12785         var atan = Math.atan;
12786         var atan2 = Math.atan2;
12787         var cos$1 = Math.cos;
12788         var ceil = Math.ceil;
12789         var exp = Math.exp;
12790         var log = Math.log;
12791         var pow = Math.pow;
12792         var sin$1 = Math.sin;
12793         var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
12794         var sqrt = Math.sqrt;
12795         var tan = Math.tan;
12796
12797         function acos(x) {
12798           return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
12799         }
12800
12801         function asin(x) {
12802           return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
12803         }
12804
12805         function haversin(x) {
12806           return (x = sin$1(x / 2)) * x;
12807         }
12808
12809         function noop$4() {}
12810
12811         function streamGeometry(geometry, stream) {
12812           if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
12813             streamGeometryType[geometry.type](geometry, stream);
12814           }
12815         }
12816
12817         var streamObjectType = {
12818           Feature: function(object, stream) {
12819             streamGeometry(object.geometry, stream);
12820           },
12821           FeatureCollection: function(object, stream) {
12822             var features = object.features, i = -1, n = features.length;
12823             while (++i < n) streamGeometry(features[i].geometry, stream);
12824           }
12825         };
12826
12827         var streamGeometryType = {
12828           Sphere: function(object, stream) {
12829             stream.sphere();
12830           },
12831           Point: function(object, stream) {
12832             object = object.coordinates;
12833             stream.point(object[0], object[1], object[2]);
12834           },
12835           MultiPoint: function(object, stream) {
12836             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12837             while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
12838           },
12839           LineString: function(object, stream) {
12840             streamLine(object.coordinates, stream, 0);
12841           },
12842           MultiLineString: function(object, stream) {
12843             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12844             while (++i < n) streamLine(coordinates[i], stream, 0);
12845           },
12846           Polygon: function(object, stream) {
12847             streamPolygon(object.coordinates, stream);
12848           },
12849           MultiPolygon: function(object, stream) {
12850             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12851             while (++i < n) streamPolygon(coordinates[i], stream);
12852           },
12853           GeometryCollection: function(object, stream) {
12854             var geometries = object.geometries, i = -1, n = geometries.length;
12855             while (++i < n) streamGeometry(geometries[i], stream);
12856           }
12857         };
12858
12859         function streamLine(coordinates, stream, closed) {
12860           var i = -1, n = coordinates.length - closed, coordinate;
12861           stream.lineStart();
12862           while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
12863           stream.lineEnd();
12864         }
12865
12866         function streamPolygon(coordinates, stream) {
12867           var i = -1, n = coordinates.length;
12868           stream.polygonStart();
12869           while (++i < n) streamLine(coordinates[i], stream, 1);
12870           stream.polygonEnd();
12871         }
12872
12873         function d3_geoStream(object, stream) {
12874           if (object && streamObjectType.hasOwnProperty(object.type)) {
12875             streamObjectType[object.type](object, stream);
12876           } else {
12877             streamGeometry(object, stream);
12878           }
12879         }
12880
12881         var areaRingSum = adder();
12882
12883         var areaSum = adder(),
12884             lambda00,
12885             phi00,
12886             lambda0,
12887             cosPhi0,
12888             sinPhi0;
12889
12890         var areaStream = {
12891           point: noop$4,
12892           lineStart: noop$4,
12893           lineEnd: noop$4,
12894           polygonStart: function() {
12895             areaRingSum.reset();
12896             areaStream.lineStart = areaRingStart;
12897             areaStream.lineEnd = areaRingEnd;
12898           },
12899           polygonEnd: function() {
12900             var areaRing = +areaRingSum;
12901             areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
12902             this.lineStart = this.lineEnd = this.point = noop$4;
12903           },
12904           sphere: function() {
12905             areaSum.add(tau$3);
12906           }
12907         };
12908
12909         function areaRingStart() {
12910           areaStream.point = areaPointFirst;
12911         }
12912
12913         function areaRingEnd() {
12914           areaPoint(lambda00, phi00);
12915         }
12916
12917         function areaPointFirst(lambda, phi) {
12918           areaStream.point = areaPoint;
12919           lambda00 = lambda, phi00 = phi;
12920           lambda *= radians, phi *= radians;
12921           lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
12922         }
12923
12924         function areaPoint(lambda, phi) {
12925           lambda *= radians, phi *= radians;
12926           phi = phi / 2 + quarterPi; // half the angular distance from south pole
12927
12928           // Spherical excess E for a spherical triangle with vertices: south pole,
12929           // previous point, current point.  Uses a formula derived from Cagnoli’s
12930           // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
12931           var dLambda = lambda - lambda0,
12932               sdLambda = dLambda >= 0 ? 1 : -1,
12933               adLambda = sdLambda * dLambda,
12934               cosPhi = cos$1(phi),
12935               sinPhi = sin$1(phi),
12936               k = sinPhi0 * sinPhi,
12937               u = cosPhi0 * cosPhi + k * cos$1(adLambda),
12938               v = k * sdLambda * sin$1(adLambda);
12939           areaRingSum.add(atan2(v, u));
12940
12941           // Advance the previous points.
12942           lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
12943         }
12944
12945         function d3_geoArea(object) {
12946           areaSum.reset();
12947           d3_geoStream(object, areaStream);
12948           return areaSum * 2;
12949         }
12950
12951         function spherical(cartesian) {
12952           return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
12953         }
12954
12955         function cartesian(spherical) {
12956           var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
12957           return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
12958         }
12959
12960         function cartesianDot(a, b) {
12961           return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
12962         }
12963
12964         function cartesianCross(a, b) {
12965           return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
12966         }
12967
12968         // TODO return a
12969         function cartesianAddInPlace(a, b) {
12970           a[0] += b[0], a[1] += b[1], a[2] += b[2];
12971         }
12972
12973         function cartesianScale(vector, k) {
12974           return [vector[0] * k, vector[1] * k, vector[2] * k];
12975         }
12976
12977         // TODO return d
12978         function cartesianNormalizeInPlace(d) {
12979           var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
12980           d[0] /= l, d[1] /= l, d[2] /= l;
12981         }
12982
12983         var lambda0$1, phi0, lambda1, phi1, // bounds
12984             lambda2, // previous lambda-coordinate
12985             lambda00$1, phi00$1, // first point
12986             p0, // previous 3D point
12987             deltaSum = adder(),
12988             ranges,
12989             range;
12990
12991         var boundsStream = {
12992           point: boundsPoint,
12993           lineStart: boundsLineStart,
12994           lineEnd: boundsLineEnd,
12995           polygonStart: function() {
12996             boundsStream.point = boundsRingPoint;
12997             boundsStream.lineStart = boundsRingStart;
12998             boundsStream.lineEnd = boundsRingEnd;
12999             deltaSum.reset();
13000             areaStream.polygonStart();
13001           },
13002           polygonEnd: function() {
13003             areaStream.polygonEnd();
13004             boundsStream.point = boundsPoint;
13005             boundsStream.lineStart = boundsLineStart;
13006             boundsStream.lineEnd = boundsLineEnd;
13007             if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
13008             else if (deltaSum > epsilon$2) phi1 = 90;
13009             else if (deltaSum < -epsilon$2) phi0 = -90;
13010             range[0] = lambda0$1, range[1] = lambda1;
13011           },
13012           sphere: function() {
13013             lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
13014           }
13015         };
13016
13017         function boundsPoint(lambda, phi) {
13018           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
13019           if (phi < phi0) phi0 = phi;
13020           if (phi > phi1) phi1 = phi;
13021         }
13022
13023         function linePoint(lambda, phi) {
13024           var p = cartesian([lambda * radians, phi * radians]);
13025           if (p0) {
13026             var normal = cartesianCross(p0, p),
13027                 equatorial = [normal[1], -normal[0], 0],
13028                 inflection = cartesianCross(equatorial, normal);
13029             cartesianNormalizeInPlace(inflection);
13030             inflection = spherical(inflection);
13031             var delta = lambda - lambda2,
13032                 sign = delta > 0 ? 1 : -1,
13033                 lambdai = inflection[0] * degrees$1 * sign,
13034                 phii,
13035                 antimeridian = abs$2(delta) > 180;
13036             if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
13037               phii = inflection[1] * degrees$1;
13038               if (phii > phi1) phi1 = phii;
13039             } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
13040               phii = -inflection[1] * degrees$1;
13041               if (phii < phi0) phi0 = phii;
13042             } else {
13043               if (phi < phi0) phi0 = phi;
13044               if (phi > phi1) phi1 = phi;
13045             }
13046             if (antimeridian) {
13047               if (lambda < lambda2) {
13048                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
13049               } else {
13050                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
13051               }
13052             } else {
13053               if (lambda1 >= lambda0$1) {
13054                 if (lambda < lambda0$1) lambda0$1 = lambda;
13055                 if (lambda > lambda1) lambda1 = lambda;
13056               } else {
13057                 if (lambda > lambda2) {
13058                   if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
13059                 } else {
13060                   if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
13061                 }
13062               }
13063             }
13064           } else {
13065             ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
13066           }
13067           if (phi < phi0) phi0 = phi;
13068           if (phi > phi1) phi1 = phi;
13069           p0 = p, lambda2 = lambda;
13070         }
13071
13072         function boundsLineStart() {
13073           boundsStream.point = linePoint;
13074         }
13075
13076         function boundsLineEnd() {
13077           range[0] = lambda0$1, range[1] = lambda1;
13078           boundsStream.point = boundsPoint;
13079           p0 = null;
13080         }
13081
13082         function boundsRingPoint(lambda, phi) {
13083           if (p0) {
13084             var delta = lambda - lambda2;
13085             deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
13086           } else {
13087             lambda00$1 = lambda, phi00$1 = phi;
13088           }
13089           areaStream.point(lambda, phi);
13090           linePoint(lambda, phi);
13091         }
13092
13093         function boundsRingStart() {
13094           areaStream.lineStart();
13095         }
13096
13097         function boundsRingEnd() {
13098           boundsRingPoint(lambda00$1, phi00$1);
13099           areaStream.lineEnd();
13100           if (abs$2(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
13101           range[0] = lambda0$1, range[1] = lambda1;
13102           p0 = null;
13103         }
13104
13105         // Finds the left-right distance between two longitudes.
13106         // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
13107         // the distance between ±180° to be 360°.
13108         function angle(lambda0, lambda1) {
13109           return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
13110         }
13111
13112         function rangeCompare(a, b) {
13113           return a[0] - b[0];
13114         }
13115
13116         function rangeContains(range, x) {
13117           return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
13118         }
13119
13120         function d3_geoBounds(feature) {
13121           var i, n, a, b, merged, deltaMax, delta;
13122
13123           phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
13124           ranges = [];
13125           d3_geoStream(feature, boundsStream);
13126
13127           // First, sort ranges by their minimum longitudes.
13128           if (n = ranges.length) {
13129             ranges.sort(rangeCompare);
13130
13131             // Then, merge any ranges that overlap.
13132             for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
13133               b = ranges[i];
13134               if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
13135                 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
13136                 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
13137               } else {
13138                 merged.push(a = b);
13139               }
13140             }
13141
13142             // Finally, find the largest gap between the merged ranges.
13143             // The final bounding box will be the inverse of this gap.
13144             for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
13145               b = merged[i];
13146               if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
13147             }
13148           }
13149
13150           ranges = range = null;
13151
13152           return lambda0$1 === Infinity || phi0 === Infinity
13153               ? [[NaN, NaN], [NaN, NaN]]
13154               : [[lambda0$1, phi0], [lambda1, phi1]];
13155         }
13156
13157         var W0, W1,
13158             X0, Y0, Z0,
13159             X1, Y1, Z1,
13160             X2, Y2, Z2,
13161             lambda00$2, phi00$2, // first point
13162             x0, y0, z0; // previous point
13163
13164         var centroidStream = {
13165           sphere: noop$4,
13166           point: centroidPoint,
13167           lineStart: centroidLineStart,
13168           lineEnd: centroidLineEnd,
13169           polygonStart: function() {
13170             centroidStream.lineStart = centroidRingStart;
13171             centroidStream.lineEnd = centroidRingEnd;
13172           },
13173           polygonEnd: function() {
13174             centroidStream.lineStart = centroidLineStart;
13175             centroidStream.lineEnd = centroidLineEnd;
13176           }
13177         };
13178
13179         // Arithmetic mean of Cartesian vectors.
13180         function centroidPoint(lambda, phi) {
13181           lambda *= radians, phi *= radians;
13182           var cosPhi = cos$1(phi);
13183           centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
13184         }
13185
13186         function centroidPointCartesian(x, y, z) {
13187           ++W0;
13188           X0 += (x - X0) / W0;
13189           Y0 += (y - Y0) / W0;
13190           Z0 += (z - Z0) / W0;
13191         }
13192
13193         function centroidLineStart() {
13194           centroidStream.point = centroidLinePointFirst;
13195         }
13196
13197         function centroidLinePointFirst(lambda, phi) {
13198           lambda *= radians, phi *= radians;
13199           var cosPhi = cos$1(phi);
13200           x0 = cosPhi * cos$1(lambda);
13201           y0 = cosPhi * sin$1(lambda);
13202           z0 = sin$1(phi);
13203           centroidStream.point = centroidLinePoint;
13204           centroidPointCartesian(x0, y0, z0);
13205         }
13206
13207         function centroidLinePoint(lambda, phi) {
13208           lambda *= radians, phi *= radians;
13209           var cosPhi = cos$1(phi),
13210               x = cosPhi * cos$1(lambda),
13211               y = cosPhi * sin$1(lambda),
13212               z = sin$1(phi),
13213               w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
13214           W1 += w;
13215           X1 += w * (x0 + (x0 = x));
13216           Y1 += w * (y0 + (y0 = y));
13217           Z1 += w * (z0 + (z0 = z));
13218           centroidPointCartesian(x0, y0, z0);
13219         }
13220
13221         function centroidLineEnd() {
13222           centroidStream.point = centroidPoint;
13223         }
13224
13225         // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
13226         // J. Applied Mechanics 42, 239 (1975).
13227         function centroidRingStart() {
13228           centroidStream.point = centroidRingPointFirst;
13229         }
13230
13231         function centroidRingEnd() {
13232           centroidRingPoint(lambda00$2, phi00$2);
13233           centroidStream.point = centroidPoint;
13234         }
13235
13236         function centroidRingPointFirst(lambda, phi) {
13237           lambda00$2 = lambda, phi00$2 = phi;
13238           lambda *= radians, phi *= radians;
13239           centroidStream.point = centroidRingPoint;
13240           var cosPhi = cos$1(phi);
13241           x0 = cosPhi * cos$1(lambda);
13242           y0 = cosPhi * sin$1(lambda);
13243           z0 = sin$1(phi);
13244           centroidPointCartesian(x0, y0, z0);
13245         }
13246
13247         function centroidRingPoint(lambda, phi) {
13248           lambda *= radians, phi *= radians;
13249           var cosPhi = cos$1(phi),
13250               x = cosPhi * cos$1(lambda),
13251               y = cosPhi * sin$1(lambda),
13252               z = sin$1(phi),
13253               cx = y0 * z - z0 * y,
13254               cy = z0 * x - x0 * z,
13255               cz = x0 * y - y0 * x,
13256               m = sqrt(cx * cx + cy * cy + cz * cz),
13257               w = asin(m), // line weight = angle
13258               v = m && -w / m; // area weight multiplier
13259           X2 += v * cx;
13260           Y2 += v * cy;
13261           Z2 += v * cz;
13262           W1 += w;
13263           X1 += w * (x0 + (x0 = x));
13264           Y1 += w * (y0 + (y0 = y));
13265           Z1 += w * (z0 + (z0 = z));
13266           centroidPointCartesian(x0, y0, z0);
13267         }
13268
13269         function d3_geoCentroid(object) {
13270           W0 = W1 =
13271           X0 = Y0 = Z0 =
13272           X1 = Y1 = Z1 =
13273           X2 = Y2 = Z2 = 0;
13274           d3_geoStream(object, centroidStream);
13275
13276           var x = X2,
13277               y = Y2,
13278               z = Z2,
13279               m = x * x + y * y + z * z;
13280
13281           // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
13282           if (m < epsilon2$1) {
13283             x = X1, y = Y1, z = Z1;
13284             // If the feature has zero length, fall back to arithmetic mean of point vectors.
13285             if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
13286             m = x * x + y * y + z * z;
13287             // If the feature still has an undefined ccentroid, then return.
13288             if (m < epsilon2$1) return [NaN, NaN];
13289           }
13290
13291           return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
13292         }
13293
13294         function constant$8(x) {
13295           return function() {
13296             return x;
13297           };
13298         }
13299
13300         function compose(a, b) {
13301
13302           function compose(x, y) {
13303             return x = a(x, y), b(x[0], x[1]);
13304           }
13305
13306           if (a.invert && b.invert) compose.invert = function(x, y) {
13307             return x = b.invert(x, y), x && a.invert(x[0], x[1]);
13308           };
13309
13310           return compose;
13311         }
13312
13313         function rotationIdentity(lambda, phi) {
13314           return [abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi];
13315         }
13316
13317         rotationIdentity.invert = rotationIdentity;
13318
13319         function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
13320           return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
13321             : rotationLambda(deltaLambda))
13322             : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
13323             : rotationIdentity);
13324         }
13325
13326         function forwardRotationLambda(deltaLambda) {
13327           return function(lambda, phi) {
13328             return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
13329           };
13330         }
13331
13332         function rotationLambda(deltaLambda) {
13333           var rotation = forwardRotationLambda(deltaLambda);
13334           rotation.invert = forwardRotationLambda(-deltaLambda);
13335           return rotation;
13336         }
13337
13338         function rotationPhiGamma(deltaPhi, deltaGamma) {
13339           var cosDeltaPhi = cos$1(deltaPhi),
13340               sinDeltaPhi = sin$1(deltaPhi),
13341               cosDeltaGamma = cos$1(deltaGamma),
13342               sinDeltaGamma = sin$1(deltaGamma);
13343
13344           function rotation(lambda, phi) {
13345             var cosPhi = cos$1(phi),
13346                 x = cos$1(lambda) * cosPhi,
13347                 y = sin$1(lambda) * cosPhi,
13348                 z = sin$1(phi),
13349                 k = z * cosDeltaPhi + x * sinDeltaPhi;
13350             return [
13351               atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
13352               asin(k * cosDeltaGamma + y * sinDeltaGamma)
13353             ];
13354           }
13355
13356           rotation.invert = function(lambda, phi) {
13357             var cosPhi = cos$1(phi),
13358                 x = cos$1(lambda) * cosPhi,
13359                 y = sin$1(lambda) * cosPhi,
13360                 z = sin$1(phi),
13361                 k = z * cosDeltaGamma - y * sinDeltaGamma;
13362             return [
13363               atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
13364               asin(k * cosDeltaPhi - x * sinDeltaPhi)
13365             ];
13366           };
13367
13368           return rotation;
13369         }
13370
13371         function rotation(rotate) {
13372           rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
13373
13374           function forward(coordinates) {
13375             coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
13376             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13377           }
13378
13379           forward.invert = function(coordinates) {
13380             coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
13381             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13382           };
13383
13384           return forward;
13385         }
13386
13387         // Generates a circle centered at [0°, 0°], with a given radius and precision.
13388         function circleStream(stream, radius, delta, direction, t0, t1) {
13389           if (!delta) return;
13390           var cosRadius = cos$1(radius),
13391               sinRadius = sin$1(radius),
13392               step = direction * delta;
13393           if (t0 == null) {
13394             t0 = radius + direction * tau$3;
13395             t1 = radius - step / 2;
13396           } else {
13397             t0 = circleRadius(cosRadius, t0);
13398             t1 = circleRadius(cosRadius, t1);
13399             if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
13400           }
13401           for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
13402             point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
13403             stream.point(point[0], point[1]);
13404           }
13405         }
13406
13407         // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
13408         function circleRadius(cosRadius, point) {
13409           point = cartesian(point), point[0] -= cosRadius;
13410           cartesianNormalizeInPlace(point);
13411           var radius = acos(-point[1]);
13412           return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
13413         }
13414
13415         function circle() {
13416           var center = constant$8([0, 0]),
13417               radius = constant$8(90),
13418               precision = constant$8(6),
13419               ring,
13420               rotate,
13421               stream = {point: point};
13422
13423           function point(x, y) {
13424             ring.push(x = rotate(x, y));
13425             x[0] *= degrees$1, x[1] *= degrees$1;
13426           }
13427
13428           function circle() {
13429             var c = center.apply(this, arguments),
13430                 r = radius.apply(this, arguments) * radians,
13431                 p = precision.apply(this, arguments) * radians;
13432             ring = [];
13433             rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
13434             circleStream(stream, r, p, 1);
13435             c = {type: "Polygon", coordinates: [ring]};
13436             ring = rotate = null;
13437             return c;
13438           }
13439
13440           circle.center = function(_) {
13441             return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center;
13442           };
13443
13444           circle.radius = function(_) {
13445             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius;
13446           };
13447
13448           circle.precision = function(_) {
13449             return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision;
13450           };
13451
13452           return circle;
13453         }
13454
13455         function clipBuffer() {
13456           var lines = [],
13457               line;
13458           return {
13459             point: function(x, y) {
13460               line.push([x, y]);
13461             },
13462             lineStart: function() {
13463               lines.push(line = []);
13464             },
13465             lineEnd: noop$4,
13466             rejoin: function() {
13467               if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
13468             },
13469             result: function() {
13470               var result = lines;
13471               lines = [];
13472               line = null;
13473               return result;
13474             }
13475           };
13476         }
13477
13478         function pointEqual(a, b) {
13479           return abs$2(a[0] - b[0]) < epsilon$2 && abs$2(a[1] - b[1]) < epsilon$2;
13480         }
13481
13482         function Intersection(point, points, other, entry) {
13483           this.x = point;
13484           this.z = points;
13485           this.o = other; // another intersection
13486           this.e = entry; // is an entry?
13487           this.v = false; // visited
13488           this.n = this.p = null; // next & previous
13489         }
13490
13491         // A generalized polygon clipping algorithm: given a polygon that has been cut
13492         // into its visible line segments, and rejoins the segments by interpolating
13493         // along the clip edge.
13494         function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
13495           var subject = [],
13496               clip = [],
13497               i,
13498               n;
13499
13500           segments.forEach(function(segment) {
13501             if ((n = segment.length - 1) <= 0) return;
13502             var n, p0 = segment[0], p1 = segment[n], x;
13503
13504             // If the first and last points of a segment are coincident, then treat as a
13505             // closed ring. TODO if all rings are closed, then the winding order of the
13506             // exterior ring should be checked.
13507             if (pointEqual(p0, p1)) {
13508               stream.lineStart();
13509               for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
13510               stream.lineEnd();
13511               return;
13512             }
13513
13514             subject.push(x = new Intersection(p0, segment, null, true));
13515             clip.push(x.o = new Intersection(p0, null, x, false));
13516             subject.push(x = new Intersection(p1, segment, null, false));
13517             clip.push(x.o = new Intersection(p1, null, x, true));
13518           });
13519
13520           if (!subject.length) return;
13521
13522           clip.sort(compareIntersection);
13523           link$1(subject);
13524           link$1(clip);
13525
13526           for (i = 0, n = clip.length; i < n; ++i) {
13527             clip[i].e = startInside = !startInside;
13528           }
13529
13530           var start = subject[0],
13531               points,
13532               point;
13533
13534           while (1) {
13535             // Find first unvisited intersection.
13536             var current = start,
13537                 isSubject = true;
13538             while (current.v) if ((current = current.n) === start) return;
13539             points = current.z;
13540             stream.lineStart();
13541             do {
13542               current.v = current.o.v = true;
13543               if (current.e) {
13544                 if (isSubject) {
13545                   for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
13546                 } else {
13547                   interpolate(current.x, current.n.x, 1, stream);
13548                 }
13549                 current = current.n;
13550               } else {
13551                 if (isSubject) {
13552                   points = current.p.z;
13553                   for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
13554                 } else {
13555                   interpolate(current.x, current.p.x, -1, stream);
13556                 }
13557                 current = current.p;
13558               }
13559               current = current.o;
13560               points = current.z;
13561               isSubject = !isSubject;
13562             } while (!current.v);
13563             stream.lineEnd();
13564           }
13565         }
13566
13567         function link$1(array) {
13568           if (!(n = array.length)) return;
13569           var n,
13570               i = 0,
13571               a = array[0],
13572               b;
13573           while (++i < n) {
13574             a.n = b = array[i];
13575             b.p = a;
13576             a = b;
13577           }
13578           a.n = b = array[0];
13579           b.p = a;
13580         }
13581
13582         var sum$1 = adder();
13583
13584         function longitude(point) {
13585           if (abs$2(point[0]) <= pi$3)
13586             return point[0];
13587           else
13588             return sign$2(point[0]) * ((abs$2(point[0]) + pi$3) % tau$3 - pi$3);
13589         }
13590
13591         function polygonContains(polygon, point) {
13592           var lambda = longitude(point),
13593               phi = point[1],
13594               sinPhi = sin$1(phi),
13595               normal = [sin$1(lambda), -cos$1(lambda), 0],
13596               angle = 0,
13597               winding = 0;
13598
13599           sum$1.reset();
13600
13601           if (sinPhi === 1) phi = halfPi$2 + epsilon$2;
13602           else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2;
13603
13604           for (var i = 0, n = polygon.length; i < n; ++i) {
13605             if (!(m = (ring = polygon[i]).length)) continue;
13606             var ring,
13607                 m,
13608                 point0 = ring[m - 1],
13609                 lambda0 = longitude(point0),
13610                 phi0 = point0[1] / 2 + quarterPi,
13611                 sinPhi0 = sin$1(phi0),
13612                 cosPhi0 = cos$1(phi0);
13613
13614             for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
13615               var point1 = ring[j],
13616                   lambda1 = longitude(point1),
13617                   phi1 = point1[1] / 2 + quarterPi,
13618                   sinPhi1 = sin$1(phi1),
13619                   cosPhi1 = cos$1(phi1),
13620                   delta = lambda1 - lambda0,
13621                   sign = delta >= 0 ? 1 : -1,
13622                   absDelta = sign * delta,
13623                   antimeridian = absDelta > pi$3,
13624                   k = sinPhi0 * sinPhi1;
13625
13626               sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
13627               angle += antimeridian ? delta + sign * tau$3 : delta;
13628
13629               // Are the longitudes either side of the point’s meridian (lambda),
13630               // and are the latitudes smaller than the parallel (phi)?
13631               if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
13632                 var arc = cartesianCross(cartesian(point0), cartesian(point1));
13633                 cartesianNormalizeInPlace(arc);
13634                 var intersection = cartesianCross(normal, arc);
13635                 cartesianNormalizeInPlace(intersection);
13636                 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
13637                 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
13638                   winding += antimeridian ^ delta >= 0 ? 1 : -1;
13639                 }
13640               }
13641             }
13642           }
13643
13644           // First, determine whether the South pole is inside or outside:
13645           //
13646           // It is inside if:
13647           // * the polygon winds around it in a clockwise direction.
13648           // * the polygon does not (cumulatively) wind around it, but has a negative
13649           //   (counter-clockwise) area.
13650           //
13651           // Second, count the (signed) number of times a segment crosses a lambda
13652           // from the point to the South pole.  If it is zero, then the point is the
13653           // same side as the South pole.
13654
13655           return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
13656         }
13657
13658         function clip(pointVisible, clipLine, interpolate, start) {
13659           return function(sink) {
13660             var line = clipLine(sink),
13661                 ringBuffer = clipBuffer(),
13662                 ringSink = clipLine(ringBuffer),
13663                 polygonStarted = false,
13664                 polygon,
13665                 segments,
13666                 ring;
13667
13668             var clip = {
13669               point: point,
13670               lineStart: lineStart,
13671               lineEnd: lineEnd,
13672               polygonStart: function() {
13673                 clip.point = pointRing;
13674                 clip.lineStart = ringStart;
13675                 clip.lineEnd = ringEnd;
13676                 segments = [];
13677                 polygon = [];
13678               },
13679               polygonEnd: function() {
13680                 clip.point = point;
13681                 clip.lineStart = lineStart;
13682                 clip.lineEnd = lineEnd;
13683                 segments = merge(segments);
13684                 var startInside = polygonContains(polygon, start);
13685                 if (segments.length) {
13686                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13687                   clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
13688                 } else if (startInside) {
13689                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13690                   sink.lineStart();
13691                   interpolate(null, null, 1, sink);
13692                   sink.lineEnd();
13693                 }
13694                 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
13695                 segments = polygon = null;
13696               },
13697               sphere: function() {
13698                 sink.polygonStart();
13699                 sink.lineStart();
13700                 interpolate(null, null, 1, sink);
13701                 sink.lineEnd();
13702                 sink.polygonEnd();
13703               }
13704             };
13705
13706             function point(lambda, phi) {
13707               if (pointVisible(lambda, phi)) sink.point(lambda, phi);
13708             }
13709
13710             function pointLine(lambda, phi) {
13711               line.point(lambda, phi);
13712             }
13713
13714             function lineStart() {
13715               clip.point = pointLine;
13716               line.lineStart();
13717             }
13718
13719             function lineEnd() {
13720               clip.point = point;
13721               line.lineEnd();
13722             }
13723
13724             function pointRing(lambda, phi) {
13725               ring.push([lambda, phi]);
13726               ringSink.point(lambda, phi);
13727             }
13728
13729             function ringStart() {
13730               ringSink.lineStart();
13731               ring = [];
13732             }
13733
13734             function ringEnd() {
13735               pointRing(ring[0][0], ring[0][1]);
13736               ringSink.lineEnd();
13737
13738               var clean = ringSink.clean(),
13739                   ringSegments = ringBuffer.result(),
13740                   i, n = ringSegments.length, m,
13741                   segment,
13742                   point;
13743
13744               ring.pop();
13745               polygon.push(ring);
13746               ring = null;
13747
13748               if (!n) return;
13749
13750               // No intersections.
13751               if (clean & 1) {
13752                 segment = ringSegments[0];
13753                 if ((m = segment.length - 1) > 0) {
13754                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13755                   sink.lineStart();
13756                   for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
13757                   sink.lineEnd();
13758                 }
13759                 return;
13760               }
13761
13762               // Rejoin connected segments.
13763               // TODO reuse ringBuffer.rejoin()?
13764               if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
13765
13766               segments.push(ringSegments.filter(validSegment));
13767             }
13768
13769             return clip;
13770           };
13771         }
13772
13773         function validSegment(segment) {
13774           return segment.length > 1;
13775         }
13776
13777         // Intersections are sorted along the clip edge. For both antimeridian cutting
13778         // and circle clipping, the same comparison is used.
13779         function compareIntersection(a, b) {
13780           return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
13781                - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
13782         }
13783
13784         var clipAntimeridian = clip(
13785           function() { return true; },
13786           clipAntimeridianLine,
13787           clipAntimeridianInterpolate,
13788           [-pi$3, -halfPi$2]
13789         );
13790
13791         // Takes a line and cuts into visible segments. Return values: 0 - there were
13792         // intersections or the line was empty; 1 - no intersections; 2 - there were
13793         // intersections, and the first and last segments should be rejoined.
13794         function clipAntimeridianLine(stream) {
13795           var lambda0 = NaN,
13796               phi0 = NaN,
13797               sign0 = NaN,
13798               clean; // no intersections
13799
13800           return {
13801             lineStart: function() {
13802               stream.lineStart();
13803               clean = 1;
13804             },
13805             point: function(lambda1, phi1) {
13806               var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
13807                   delta = abs$2(lambda1 - lambda0);
13808               if (abs$2(delta - pi$3) < epsilon$2) { // line crosses a pole
13809                 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
13810                 stream.point(sign0, phi0);
13811                 stream.lineEnd();
13812                 stream.lineStart();
13813                 stream.point(sign1, phi0);
13814                 stream.point(lambda1, phi0);
13815                 clean = 0;
13816               } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
13817                 if (abs$2(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
13818                 if (abs$2(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
13819                 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
13820                 stream.point(sign0, phi0);
13821                 stream.lineEnd();
13822                 stream.lineStart();
13823                 stream.point(sign1, phi0);
13824                 clean = 0;
13825               }
13826               stream.point(lambda0 = lambda1, phi0 = phi1);
13827               sign0 = sign1;
13828             },
13829             lineEnd: function() {
13830               stream.lineEnd();
13831               lambda0 = phi0 = NaN;
13832             },
13833             clean: function() {
13834               return 2 - clean; // if intersections, rejoin first and last segments
13835             }
13836           };
13837         }
13838
13839         function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
13840           var cosPhi0,
13841               cosPhi1,
13842               sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
13843           return abs$2(sinLambda0Lambda1) > epsilon$2
13844               ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
13845                   - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
13846                   / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
13847               : (phi0 + phi1) / 2;
13848         }
13849
13850         function clipAntimeridianInterpolate(from, to, direction, stream) {
13851           var phi;
13852           if (from == null) {
13853             phi = direction * halfPi$2;
13854             stream.point(-pi$3, phi);
13855             stream.point(0, phi);
13856             stream.point(pi$3, phi);
13857             stream.point(pi$3, 0);
13858             stream.point(pi$3, -phi);
13859             stream.point(0, -phi);
13860             stream.point(-pi$3, -phi);
13861             stream.point(-pi$3, 0);
13862             stream.point(-pi$3, phi);
13863           } else if (abs$2(from[0] - to[0]) > epsilon$2) {
13864             var lambda = from[0] < to[0] ? pi$3 : -pi$3;
13865             phi = direction * lambda / 2;
13866             stream.point(-lambda, phi);
13867             stream.point(0, phi);
13868             stream.point(lambda, phi);
13869           } else {
13870             stream.point(to[0], to[1]);
13871           }
13872         }
13873
13874         function clipCircle(radius) {
13875           var cr = cos$1(radius),
13876               delta = 6 * radians,
13877               smallRadius = cr > 0,
13878               notHemisphere = abs$2(cr) > epsilon$2; // TODO optimise for this common case
13879
13880           function interpolate(from, to, direction, stream) {
13881             circleStream(stream, radius, delta, direction, from, to);
13882           }
13883
13884           function visible(lambda, phi) {
13885             return cos$1(lambda) * cos$1(phi) > cr;
13886           }
13887
13888           // Takes a line and cuts into visible segments. Return values used for polygon
13889           // clipping: 0 - there were intersections or the line was empty; 1 - no
13890           // intersections 2 - there were intersections, and the first and last segments
13891           // should be rejoined.
13892           function clipLine(stream) {
13893             var point0, // previous point
13894                 c0, // code for previous point
13895                 v0, // visibility of previous point
13896                 v00, // visibility of first point
13897                 clean; // no intersections
13898             return {
13899               lineStart: function() {
13900                 v00 = v0 = false;
13901                 clean = 1;
13902               },
13903               point: function(lambda, phi) {
13904                 var point1 = [lambda, phi],
13905                     point2,
13906                     v = visible(lambda, phi),
13907                     c = smallRadius
13908                       ? v ? 0 : code(lambda, phi)
13909                       : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
13910                 if (!point0 && (v00 = v0 = v)) stream.lineStart();
13911                 // Handle degeneracies.
13912                 // TODO ignore if not clipping polygons.
13913                 if (v !== v0) {
13914                   point2 = intersect(point0, point1);
13915                   if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
13916                     point1[0] += epsilon$2;
13917                     point1[1] += epsilon$2;
13918                     v = visible(point1[0], point1[1]);
13919                   }
13920                 }
13921                 if (v !== v0) {
13922                   clean = 0;
13923                   if (v) {
13924                     // outside going in
13925                     stream.lineStart();
13926                     point2 = intersect(point1, point0);
13927                     stream.point(point2[0], point2[1]);
13928                   } else {
13929                     // inside going out
13930                     point2 = intersect(point0, point1);
13931                     stream.point(point2[0], point2[1]);
13932                     stream.lineEnd();
13933                   }
13934                   point0 = point2;
13935                 } else if (notHemisphere && point0 && smallRadius ^ v) {
13936                   var t;
13937                   // If the codes for two points are different, or are both zero,
13938                   // and there this segment intersects with the small circle.
13939                   if (!(c & c0) && (t = intersect(point1, point0, true))) {
13940                     clean = 0;
13941                     if (smallRadius) {
13942                       stream.lineStart();
13943                       stream.point(t[0][0], t[0][1]);
13944                       stream.point(t[1][0], t[1][1]);
13945                       stream.lineEnd();
13946                     } else {
13947                       stream.point(t[1][0], t[1][1]);
13948                       stream.lineEnd();
13949                       stream.lineStart();
13950                       stream.point(t[0][0], t[0][1]);
13951                     }
13952                   }
13953                 }
13954                 if (v && (!point0 || !pointEqual(point0, point1))) {
13955                   stream.point(point1[0], point1[1]);
13956                 }
13957                 point0 = point1, v0 = v, c0 = c;
13958               },
13959               lineEnd: function() {
13960                 if (v0) stream.lineEnd();
13961                 point0 = null;
13962               },
13963               // Rejoin first and last segments if there were intersections and the first
13964               // and last points were visible.
13965               clean: function() {
13966                 return clean | ((v00 && v0) << 1);
13967               }
13968             };
13969           }
13970
13971           // Intersects the great circle between a and b with the clip circle.
13972           function intersect(a, b, two) {
13973             var pa = cartesian(a),
13974                 pb = cartesian(b);
13975
13976             // We have two planes, n1.p = d1 and n2.p = d2.
13977             // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
13978             var n1 = [1, 0, 0], // normal
13979                 n2 = cartesianCross(pa, pb),
13980                 n2n2 = cartesianDot(n2, n2),
13981                 n1n2 = n2[0], // cartesianDot(n1, n2),
13982                 determinant = n2n2 - n1n2 * n1n2;
13983
13984             // Two polar points.
13985             if (!determinant) return !two && a;
13986
13987             var c1 =  cr * n2n2 / determinant,
13988                 c2 = -cr * n1n2 / determinant,
13989                 n1xn2 = cartesianCross(n1, n2),
13990                 A = cartesianScale(n1, c1),
13991                 B = cartesianScale(n2, c2);
13992             cartesianAddInPlace(A, B);
13993
13994             // Solve |p(t)|^2 = 1.
13995             var u = n1xn2,
13996                 w = cartesianDot(A, u),
13997                 uu = cartesianDot(u, u),
13998                 t2 = w * w - uu * (cartesianDot(A, A) - 1);
13999
14000             if (t2 < 0) return;
14001
14002             var t = sqrt(t2),
14003                 q = cartesianScale(u, (-w - t) / uu);
14004             cartesianAddInPlace(q, A);
14005             q = spherical(q);
14006
14007             if (!two) return q;
14008
14009             // Two intersection points.
14010             var lambda0 = a[0],
14011                 lambda1 = b[0],
14012                 phi0 = a[1],
14013                 phi1 = b[1],
14014                 z;
14015
14016             if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
14017
14018             var delta = lambda1 - lambda0,
14019                 polar = abs$2(delta - pi$3) < epsilon$2,
14020                 meridian = polar || delta < epsilon$2;
14021
14022             if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
14023
14024             // Check that the first point is between a and b.
14025             if (meridian
14026                 ? polar
14027                   ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
14028                   : phi0 <= q[1] && q[1] <= phi1
14029                 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
14030               var q1 = cartesianScale(u, (-w + t) / uu);
14031               cartesianAddInPlace(q1, A);
14032               return [q, spherical(q1)];
14033             }
14034           }
14035
14036           // Generates a 4-bit vector representing the location of a point relative to
14037           // the small circle's bounding box.
14038           function code(lambda, phi) {
14039             var r = smallRadius ? radius : pi$3 - radius,
14040                 code = 0;
14041             if (lambda < -r) code |= 1; // left
14042             else if (lambda > r) code |= 2; // right
14043             if (phi < -r) code |= 4; // below
14044             else if (phi > r) code |= 8; // above
14045             return code;
14046           }
14047
14048           return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
14049         }
14050
14051         function clipLine(a, b, x0, y0, x1, y1) {
14052           var ax = a[0],
14053               ay = a[1],
14054               bx = b[0],
14055               by = b[1],
14056               t0 = 0,
14057               t1 = 1,
14058               dx = bx - ax,
14059               dy = by - ay,
14060               r;
14061
14062           r = x0 - ax;
14063           if (!dx && r > 0) return;
14064           r /= dx;
14065           if (dx < 0) {
14066             if (r < t0) return;
14067             if (r < t1) t1 = r;
14068           } else if (dx > 0) {
14069             if (r > t1) return;
14070             if (r > t0) t0 = r;
14071           }
14072
14073           r = x1 - ax;
14074           if (!dx && r < 0) return;
14075           r /= dx;
14076           if (dx < 0) {
14077             if (r > t1) return;
14078             if (r > t0) t0 = r;
14079           } else if (dx > 0) {
14080             if (r < t0) return;
14081             if (r < t1) t1 = r;
14082           }
14083
14084           r = y0 - ay;
14085           if (!dy && r > 0) return;
14086           r /= dy;
14087           if (dy < 0) {
14088             if (r < t0) return;
14089             if (r < t1) t1 = r;
14090           } else if (dy > 0) {
14091             if (r > t1) return;
14092             if (r > t0) t0 = r;
14093           }
14094
14095           r = y1 - ay;
14096           if (!dy && r < 0) return;
14097           r /= dy;
14098           if (dy < 0) {
14099             if (r > t1) return;
14100             if (r > t0) t0 = r;
14101           } else if (dy > 0) {
14102             if (r < t0) return;
14103             if (r < t1) t1 = r;
14104           }
14105
14106           if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
14107           if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
14108           return true;
14109         }
14110
14111         var clipMax = 1e9, clipMin = -clipMax;
14112
14113         // TODO Use d3-polygon’s polygonContains here for the ring check?
14114         // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
14115
14116         function clipRectangle(x0, y0, x1, y1) {
14117
14118           function visible(x, y) {
14119             return x0 <= x && x <= x1 && y0 <= y && y <= y1;
14120           }
14121
14122           function interpolate(from, to, direction, stream) {
14123             var a = 0, a1 = 0;
14124             if (from == null
14125                 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
14126                 || comparePoint(from, to) < 0 ^ direction > 0) {
14127               do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
14128               while ((a = (a + direction + 4) % 4) !== a1);
14129             } else {
14130               stream.point(to[0], to[1]);
14131             }
14132           }
14133
14134           function corner(p, direction) {
14135             return abs$2(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
14136                 : abs$2(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
14137                 : abs$2(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
14138                 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
14139           }
14140
14141           function compareIntersection(a, b) {
14142             return comparePoint(a.x, b.x);
14143           }
14144
14145           function comparePoint(a, b) {
14146             var ca = corner(a, 1),
14147                 cb = corner(b, 1);
14148             return ca !== cb ? ca - cb
14149                 : ca === 0 ? b[1] - a[1]
14150                 : ca === 1 ? a[0] - b[0]
14151                 : ca === 2 ? a[1] - b[1]
14152                 : b[0] - a[0];
14153           }
14154
14155           return function(stream) {
14156             var activeStream = stream,
14157                 bufferStream = clipBuffer(),
14158                 segments,
14159                 polygon,
14160                 ring,
14161                 x__, y__, v__, // first point
14162                 x_, y_, v_, // previous point
14163                 first,
14164                 clean;
14165
14166             var clipStream = {
14167               point: point,
14168               lineStart: lineStart,
14169               lineEnd: lineEnd,
14170               polygonStart: polygonStart,
14171               polygonEnd: polygonEnd
14172             };
14173
14174             function point(x, y) {
14175               if (visible(x, y)) activeStream.point(x, y);
14176             }
14177
14178             function polygonInside() {
14179               var winding = 0;
14180
14181               for (var i = 0, n = polygon.length; i < n; ++i) {
14182                 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
14183                   a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
14184                   if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
14185                   else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
14186                 }
14187               }
14188
14189               return winding;
14190             }
14191
14192             // Buffer geometry within a polygon and then clip it en masse.
14193             function polygonStart() {
14194               activeStream = bufferStream, segments = [], polygon = [], clean = true;
14195             }
14196
14197             function polygonEnd() {
14198               var startInside = polygonInside(),
14199                   cleanInside = clean && startInside,
14200                   visible = (segments = merge(segments)).length;
14201               if (cleanInside || visible) {
14202                 stream.polygonStart();
14203                 if (cleanInside) {
14204                   stream.lineStart();
14205                   interpolate(null, null, 1, stream);
14206                   stream.lineEnd();
14207                 }
14208                 if (visible) {
14209                   clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
14210                 }
14211                 stream.polygonEnd();
14212               }
14213               activeStream = stream, segments = polygon = ring = null;
14214             }
14215
14216             function lineStart() {
14217               clipStream.point = linePoint;
14218               if (polygon) polygon.push(ring = []);
14219               first = true;
14220               v_ = false;
14221               x_ = y_ = NaN;
14222             }
14223
14224             // TODO rather than special-case polygons, simply handle them separately.
14225             // Ideally, coincident intersection points should be jittered to avoid
14226             // clipping issues.
14227             function lineEnd() {
14228               if (segments) {
14229                 linePoint(x__, y__);
14230                 if (v__ && v_) bufferStream.rejoin();
14231                 segments.push(bufferStream.result());
14232               }
14233               clipStream.point = point;
14234               if (v_) activeStream.lineEnd();
14235             }
14236
14237             function linePoint(x, y) {
14238               var v = visible(x, y);
14239               if (polygon) ring.push([x, y]);
14240               if (first) {
14241                 x__ = x, y__ = y, v__ = v;
14242                 first = false;
14243                 if (v) {
14244                   activeStream.lineStart();
14245                   activeStream.point(x, y);
14246                 }
14247               } else {
14248                 if (v && v_) activeStream.point(x, y);
14249                 else {
14250                   var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
14251                       b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
14252                   if (clipLine(a, b, x0, y0, x1, y1)) {
14253                     if (!v_) {
14254                       activeStream.lineStart();
14255                       activeStream.point(a[0], a[1]);
14256                     }
14257                     activeStream.point(b[0], b[1]);
14258                     if (!v) activeStream.lineEnd();
14259                     clean = false;
14260                   } else if (v) {
14261                     activeStream.lineStart();
14262                     activeStream.point(x, y);
14263                     clean = false;
14264                   }
14265                 }
14266               }
14267               x_ = x, y_ = y, v_ = v;
14268             }
14269
14270             return clipStream;
14271           };
14272         }
14273
14274         function extent$1() {
14275           var x0 = 0,
14276               y0 = 0,
14277               x1 = 960,
14278               y1 = 500,
14279               cache,
14280               cacheStream,
14281               clip;
14282
14283           return clip = {
14284             stream: function(stream) {
14285               return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
14286             },
14287             extent: function(_) {
14288               return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
14289             }
14290           };
14291         }
14292
14293         var lengthSum = adder(),
14294             lambda0$2,
14295             sinPhi0$1,
14296             cosPhi0$1;
14297
14298         var lengthStream = {
14299           sphere: noop$4,
14300           point: noop$4,
14301           lineStart: lengthLineStart,
14302           lineEnd: noop$4,
14303           polygonStart: noop$4,
14304           polygonEnd: noop$4
14305         };
14306
14307         function lengthLineStart() {
14308           lengthStream.point = lengthPointFirst;
14309           lengthStream.lineEnd = lengthLineEnd;
14310         }
14311
14312         function lengthLineEnd() {
14313           lengthStream.point = lengthStream.lineEnd = noop$4;
14314         }
14315
14316         function lengthPointFirst(lambda, phi) {
14317           lambda *= radians, phi *= radians;
14318           lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
14319           lengthStream.point = lengthPoint;
14320         }
14321
14322         function lengthPoint(lambda, phi) {
14323           lambda *= radians, phi *= radians;
14324           var sinPhi = sin$1(phi),
14325               cosPhi = cos$1(phi),
14326               delta = abs$2(lambda - lambda0$2),
14327               cosDelta = cos$1(delta),
14328               sinDelta = sin$1(delta),
14329               x = cosPhi * sinDelta,
14330               y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
14331               z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
14332           lengthSum.add(atan2(sqrt(x * x + y * y), z));
14333           lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
14334         }
14335
14336         function d3_geoLength(object) {
14337           lengthSum.reset();
14338           d3_geoStream(object, lengthStream);
14339           return +lengthSum;
14340         }
14341
14342         var coordinates = [null, null],
14343             object$1 = {type: "LineString", coordinates: coordinates};
14344
14345         function distance(a, b) {
14346           coordinates[0] = a;
14347           coordinates[1] = b;
14348           return d3_geoLength(object$1);
14349         }
14350
14351         var containsObjectType = {
14352           Feature: function(object, point) {
14353             return containsGeometry(object.geometry, point);
14354           },
14355           FeatureCollection: function(object, point) {
14356             var features = object.features, i = -1, n = features.length;
14357             while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
14358             return false;
14359           }
14360         };
14361
14362         var containsGeometryType = {
14363           Sphere: function() {
14364             return true;
14365           },
14366           Point: function(object, point) {
14367             return containsPoint(object.coordinates, point);
14368           },
14369           MultiPoint: function(object, point) {
14370             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14371             while (++i < n) if (containsPoint(coordinates[i], point)) return true;
14372             return false;
14373           },
14374           LineString: function(object, point) {
14375             return containsLine(object.coordinates, point);
14376           },
14377           MultiLineString: function(object, point) {
14378             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14379             while (++i < n) if (containsLine(coordinates[i], point)) return true;
14380             return false;
14381           },
14382           Polygon: function(object, point) {
14383             return containsPolygon(object.coordinates, point);
14384           },
14385           MultiPolygon: function(object, point) {
14386             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14387             while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
14388             return false;
14389           },
14390           GeometryCollection: function(object, point) {
14391             var geometries = object.geometries, i = -1, n = geometries.length;
14392             while (++i < n) if (containsGeometry(geometries[i], point)) return true;
14393             return false;
14394           }
14395         };
14396
14397         function containsGeometry(geometry, point) {
14398           return geometry && containsGeometryType.hasOwnProperty(geometry.type)
14399               ? containsGeometryType[geometry.type](geometry, point)
14400               : false;
14401         }
14402
14403         function containsPoint(coordinates, point) {
14404           return distance(coordinates, point) === 0;
14405         }
14406
14407         function containsLine(coordinates, point) {
14408           var ao, bo, ab;
14409           for (var i = 0, n = coordinates.length; i < n; i++) {
14410             bo = distance(coordinates[i], point);
14411             if (bo === 0) return true;
14412             if (i > 0) {
14413               ab = distance(coordinates[i], coordinates[i - 1]);
14414               if (
14415                 ab > 0 &&
14416                 ao <= ab &&
14417                 bo <= ab &&
14418                 (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab
14419               )
14420                 return true;
14421             }
14422             ao = bo;
14423           }
14424           return false;
14425         }
14426
14427         function containsPolygon(coordinates, point) {
14428           return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
14429         }
14430
14431         function ringRadians(ring) {
14432           return ring = ring.map(pointRadians), ring.pop(), ring;
14433         }
14434
14435         function pointRadians(point) {
14436           return [point[0] * radians, point[1] * radians];
14437         }
14438
14439         function contains$2(object, point) {
14440           return (object && containsObjectType.hasOwnProperty(object.type)
14441               ? containsObjectType[object.type]
14442               : containsGeometry)(object, point);
14443         }
14444
14445         function graticuleX(y0, y1, dy) {
14446           var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
14447           return function(x) { return y.map(function(y) { return [x, y]; }); };
14448         }
14449
14450         function graticuleY(x0, x1, dx) {
14451           var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
14452           return function(y) { return x.map(function(x) { return [x, y]; }); };
14453         }
14454
14455         function graticule() {
14456           var x1, x0, X1, X0,
14457               y1, y0, Y1, Y0,
14458               dx = 10, dy = dx, DX = 90, DY = 360,
14459               x, y, X, Y,
14460               precision = 2.5;
14461
14462           function graticule() {
14463             return {type: "MultiLineString", coordinates: lines()};
14464           }
14465
14466           function lines() {
14467             return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
14468                 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
14469                 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$2(x % DX) > epsilon$2; }).map(x))
14470                 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$2(y % DY) > epsilon$2; }).map(y));
14471           }
14472
14473           graticule.lines = function() {
14474             return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
14475           };
14476
14477           graticule.outline = function() {
14478             return {
14479               type: "Polygon",
14480               coordinates: [
14481                 X(X0).concat(
14482                 Y(Y1).slice(1),
14483                 X(X1).reverse().slice(1),
14484                 Y(Y0).reverse().slice(1))
14485               ]
14486             };
14487           };
14488
14489           graticule.extent = function(_) {
14490             if (!arguments.length) return graticule.extentMinor();
14491             return graticule.extentMajor(_).extentMinor(_);
14492           };
14493
14494           graticule.extentMajor = function(_) {
14495             if (!arguments.length) return [[X0, Y0], [X1, Y1]];
14496             X0 = +_[0][0], X1 = +_[1][0];
14497             Y0 = +_[0][1], Y1 = +_[1][1];
14498             if (X0 > X1) _ = X0, X0 = X1, X1 = _;
14499             if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
14500             return graticule.precision(precision);
14501           };
14502
14503           graticule.extentMinor = function(_) {
14504             if (!arguments.length) return [[x0, y0], [x1, y1]];
14505             x0 = +_[0][0], x1 = +_[1][0];
14506             y0 = +_[0][1], y1 = +_[1][1];
14507             if (x0 > x1) _ = x0, x0 = x1, x1 = _;
14508             if (y0 > y1) _ = y0, y0 = y1, y1 = _;
14509             return graticule.precision(precision);
14510           };
14511
14512           graticule.step = function(_) {
14513             if (!arguments.length) return graticule.stepMinor();
14514             return graticule.stepMajor(_).stepMinor(_);
14515           };
14516
14517           graticule.stepMajor = function(_) {
14518             if (!arguments.length) return [DX, DY];
14519             DX = +_[0], DY = +_[1];
14520             return graticule;
14521           };
14522
14523           graticule.stepMinor = function(_) {
14524             if (!arguments.length) return [dx, dy];
14525             dx = +_[0], dy = +_[1];
14526             return graticule;
14527           };
14528
14529           graticule.precision = function(_) {
14530             if (!arguments.length) return precision;
14531             precision = +_;
14532             x = graticuleX(y0, y1, 90);
14533             y = graticuleY(x0, x1, precision);
14534             X = graticuleX(Y0, Y1, 90);
14535             Y = graticuleY(X0, X1, precision);
14536             return graticule;
14537           };
14538
14539           return graticule
14540               .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
14541               .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
14542         }
14543
14544         function graticule10() {
14545           return graticule()();
14546         }
14547
14548         function interpolate$1(a, b) {
14549           var x0 = a[0] * radians,
14550               y0 = a[1] * radians,
14551               x1 = b[0] * radians,
14552               y1 = b[1] * radians,
14553               cy0 = cos$1(y0),
14554               sy0 = sin$1(y0),
14555               cy1 = cos$1(y1),
14556               sy1 = sin$1(y1),
14557               kx0 = cy0 * cos$1(x0),
14558               ky0 = cy0 * sin$1(x0),
14559               kx1 = cy1 * cos$1(x1),
14560               ky1 = cy1 * sin$1(x1),
14561               d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
14562               k = sin$1(d);
14563
14564           var interpolate = d ? function(t) {
14565             var B = sin$1(t *= d) / k,
14566                 A = sin$1(d - t) / k,
14567                 x = A * kx0 + B * kx1,
14568                 y = A * ky0 + B * ky1,
14569                 z = A * sy0 + B * sy1;
14570             return [
14571               atan2(y, x) * degrees$1,
14572               atan2(z, sqrt(x * x + y * y)) * degrees$1
14573             ];
14574           } : function() {
14575             return [x0 * degrees$1, y0 * degrees$1];
14576           };
14577
14578           interpolate.distance = d;
14579
14580           return interpolate;
14581         }
14582
14583         function identity$4(x) {
14584           return x;
14585         }
14586
14587         var areaSum$1 = adder(),
14588             areaRingSum$1 = adder(),
14589             x00,
14590             y00,
14591             x0$1,
14592             y0$1;
14593
14594         var areaStream$1 = {
14595           point: noop$4,
14596           lineStart: noop$4,
14597           lineEnd: noop$4,
14598           polygonStart: function() {
14599             areaStream$1.lineStart = areaRingStart$1;
14600             areaStream$1.lineEnd = areaRingEnd$1;
14601           },
14602           polygonEnd: function() {
14603             areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$4;
14604             areaSum$1.add(abs$2(areaRingSum$1));
14605             areaRingSum$1.reset();
14606           },
14607           result: function() {
14608             var area = areaSum$1 / 2;
14609             areaSum$1.reset();
14610             return area;
14611           }
14612         };
14613
14614         function areaRingStart$1() {
14615           areaStream$1.point = areaPointFirst$1;
14616         }
14617
14618         function areaPointFirst$1(x, y) {
14619           areaStream$1.point = areaPoint$1;
14620           x00 = x0$1 = x, y00 = y0$1 = y;
14621         }
14622
14623         function areaPoint$1(x, y) {
14624           areaRingSum$1.add(y0$1 * x - x0$1 * y);
14625           x0$1 = x, y0$1 = y;
14626         }
14627
14628         function areaRingEnd$1() {
14629           areaPoint$1(x00, y00);
14630         }
14631
14632         var x0$2 = Infinity,
14633             y0$2 = x0$2,
14634             x1 = -x0$2,
14635             y1 = x1;
14636
14637         var boundsStream$1 = {
14638           point: boundsPoint$1,
14639           lineStart: noop$4,
14640           lineEnd: noop$4,
14641           polygonStart: noop$4,
14642           polygonEnd: noop$4,
14643           result: function() {
14644             var bounds = [[x0$2, y0$2], [x1, y1]];
14645             x1 = y1 = -(y0$2 = x0$2 = Infinity);
14646             return bounds;
14647           }
14648         };
14649
14650         function boundsPoint$1(x, y) {
14651           if (x < x0$2) x0$2 = x;
14652           if (x > x1) x1 = x;
14653           if (y < y0$2) y0$2 = y;
14654           if (y > y1) y1 = y;
14655         }
14656
14657         // TODO Enforce positive area for exterior, negative area for interior?
14658
14659         var X0$1 = 0,
14660             Y0$1 = 0,
14661             Z0$1 = 0,
14662             X1$1 = 0,
14663             Y1$1 = 0,
14664             Z1$1 = 0,
14665             X2$1 = 0,
14666             Y2$1 = 0,
14667             Z2$1 = 0,
14668             x00$1,
14669             y00$1,
14670             x0$3,
14671             y0$3;
14672
14673         var centroidStream$1 = {
14674           point: centroidPoint$1,
14675           lineStart: centroidLineStart$1,
14676           lineEnd: centroidLineEnd$1,
14677           polygonStart: function() {
14678             centroidStream$1.lineStart = centroidRingStart$1;
14679             centroidStream$1.lineEnd = centroidRingEnd$1;
14680           },
14681           polygonEnd: function() {
14682             centroidStream$1.point = centroidPoint$1;
14683             centroidStream$1.lineStart = centroidLineStart$1;
14684             centroidStream$1.lineEnd = centroidLineEnd$1;
14685           },
14686           result: function() {
14687             var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
14688                 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
14689                 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
14690                 : [NaN, NaN];
14691             X0$1 = Y0$1 = Z0$1 =
14692             X1$1 = Y1$1 = Z1$1 =
14693             X2$1 = Y2$1 = Z2$1 = 0;
14694             return centroid;
14695           }
14696         };
14697
14698         function centroidPoint$1(x, y) {
14699           X0$1 += x;
14700           Y0$1 += y;
14701           ++Z0$1;
14702         }
14703
14704         function centroidLineStart$1() {
14705           centroidStream$1.point = centroidPointFirstLine;
14706         }
14707
14708         function centroidPointFirstLine(x, y) {
14709           centroidStream$1.point = centroidPointLine;
14710           centroidPoint$1(x0$3 = x, y0$3 = y);
14711         }
14712
14713         function centroidPointLine(x, y) {
14714           var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
14715           X1$1 += z * (x0$3 + x) / 2;
14716           Y1$1 += z * (y0$3 + y) / 2;
14717           Z1$1 += z;
14718           centroidPoint$1(x0$3 = x, y0$3 = y);
14719         }
14720
14721         function centroidLineEnd$1() {
14722           centroidStream$1.point = centroidPoint$1;
14723         }
14724
14725         function centroidRingStart$1() {
14726           centroidStream$1.point = centroidPointFirstRing;
14727         }
14728
14729         function centroidRingEnd$1() {
14730           centroidPointRing(x00$1, y00$1);
14731         }
14732
14733         function centroidPointFirstRing(x, y) {
14734           centroidStream$1.point = centroidPointRing;
14735           centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
14736         }
14737
14738         function centroidPointRing(x, y) {
14739           var dx = x - x0$3,
14740               dy = y - y0$3,
14741               z = sqrt(dx * dx + dy * dy);
14742
14743           X1$1 += z * (x0$3 + x) / 2;
14744           Y1$1 += z * (y0$3 + y) / 2;
14745           Z1$1 += z;
14746
14747           z = y0$3 * x - x0$3 * y;
14748           X2$1 += z * (x0$3 + x);
14749           Y2$1 += z * (y0$3 + y);
14750           Z2$1 += z * 3;
14751           centroidPoint$1(x0$3 = x, y0$3 = y);
14752         }
14753
14754         function PathContext(context) {
14755           this._context = context;
14756         }
14757
14758         PathContext.prototype = {
14759           _radius: 4.5,
14760           pointRadius: function(_) {
14761             return this._radius = _, this;
14762           },
14763           polygonStart: function() {
14764             this._line = 0;
14765           },
14766           polygonEnd: function() {
14767             this._line = NaN;
14768           },
14769           lineStart: function() {
14770             this._point = 0;
14771           },
14772           lineEnd: function() {
14773             if (this._line === 0) this._context.closePath();
14774             this._point = NaN;
14775           },
14776           point: function(x, y) {
14777             switch (this._point) {
14778               case 0: {
14779                 this._context.moveTo(x, y);
14780                 this._point = 1;
14781                 break;
14782               }
14783               case 1: {
14784                 this._context.lineTo(x, y);
14785                 break;
14786               }
14787               default: {
14788                 this._context.moveTo(x + this._radius, y);
14789                 this._context.arc(x, y, this._radius, 0, tau$3);
14790                 break;
14791               }
14792             }
14793           },
14794           result: noop$4
14795         };
14796
14797         var lengthSum$1 = adder(),
14798             lengthRing,
14799             x00$2,
14800             y00$2,
14801             x0$4,
14802             y0$4;
14803
14804         var lengthStream$1 = {
14805           point: noop$4,
14806           lineStart: function() {
14807             lengthStream$1.point = lengthPointFirst$1;
14808           },
14809           lineEnd: function() {
14810             if (lengthRing) lengthPoint$1(x00$2, y00$2);
14811             lengthStream$1.point = noop$4;
14812           },
14813           polygonStart: function() {
14814             lengthRing = true;
14815           },
14816           polygonEnd: function() {
14817             lengthRing = null;
14818           },
14819           result: function() {
14820             var length = +lengthSum$1;
14821             lengthSum$1.reset();
14822             return length;
14823           }
14824         };
14825
14826         function lengthPointFirst$1(x, y) {
14827           lengthStream$1.point = lengthPoint$1;
14828           x00$2 = x0$4 = x, y00$2 = y0$4 = y;
14829         }
14830
14831         function lengthPoint$1(x, y) {
14832           x0$4 -= x, y0$4 -= y;
14833           lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
14834           x0$4 = x, y0$4 = y;
14835         }
14836
14837         function PathString() {
14838           this._string = [];
14839         }
14840
14841         PathString.prototype = {
14842           _radius: 4.5,
14843           _circle: circle$1(4.5),
14844           pointRadius: function(_) {
14845             if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
14846             return this;
14847           },
14848           polygonStart: function() {
14849             this._line = 0;
14850           },
14851           polygonEnd: function() {
14852             this._line = NaN;
14853           },
14854           lineStart: function() {
14855             this._point = 0;
14856           },
14857           lineEnd: function() {
14858             if (this._line === 0) this._string.push("Z");
14859             this._point = NaN;
14860           },
14861           point: function(x, y) {
14862             switch (this._point) {
14863               case 0: {
14864                 this._string.push("M", x, ",", y);
14865                 this._point = 1;
14866                 break;
14867               }
14868               case 1: {
14869                 this._string.push("L", x, ",", y);
14870                 break;
14871               }
14872               default: {
14873                 if (this._circle == null) this._circle = circle$1(this._radius);
14874                 this._string.push("M", x, ",", y, this._circle);
14875                 break;
14876               }
14877             }
14878           },
14879           result: function() {
14880             if (this._string.length) {
14881               var result = this._string.join("");
14882               this._string = [];
14883               return result;
14884             } else {
14885               return null;
14886             }
14887           }
14888         };
14889
14890         function circle$1(radius) {
14891           return "m0," + radius
14892               + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
14893               + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
14894               + "z";
14895         }
14896
14897         function d3_geoPath(projection, context) {
14898           var pointRadius = 4.5,
14899               projectionStream,
14900               contextStream;
14901
14902           function path(object) {
14903             if (object) {
14904               if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
14905               d3_geoStream(object, projectionStream(contextStream));
14906             }
14907             return contextStream.result();
14908           }
14909
14910           path.area = function(object) {
14911             d3_geoStream(object, projectionStream(areaStream$1));
14912             return areaStream$1.result();
14913           };
14914
14915           path.measure = function(object) {
14916             d3_geoStream(object, projectionStream(lengthStream$1));
14917             return lengthStream$1.result();
14918           };
14919
14920           path.bounds = function(object) {
14921             d3_geoStream(object, projectionStream(boundsStream$1));
14922             return boundsStream$1.result();
14923           };
14924
14925           path.centroid = function(object) {
14926             d3_geoStream(object, projectionStream(centroidStream$1));
14927             return centroidStream$1.result();
14928           };
14929
14930           path.projection = function(_) {
14931             return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
14932           };
14933
14934           path.context = function(_) {
14935             if (!arguments.length) return context;
14936             contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
14937             if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
14938             return path;
14939           };
14940
14941           path.pointRadius = function(_) {
14942             if (!arguments.length) return pointRadius;
14943             pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
14944             return path;
14945           };
14946
14947           return path.projection(projection).context(context);
14948         }
14949
14950         function d3_geoTransform(methods) {
14951           return {
14952             stream: transformer(methods)
14953           };
14954         }
14955
14956         function transformer(methods) {
14957           return function(stream) {
14958             var s = new TransformStream;
14959             for (var key in methods) s[key] = methods[key];
14960             s.stream = stream;
14961             return s;
14962           };
14963         }
14964
14965         function TransformStream() {}
14966
14967         TransformStream.prototype = {
14968           constructor: TransformStream,
14969           point: function(x, y) { this.stream.point(x, y); },
14970           sphere: function() { this.stream.sphere(); },
14971           lineStart: function() { this.stream.lineStart(); },
14972           lineEnd: function() { this.stream.lineEnd(); },
14973           polygonStart: function() { this.stream.polygonStart(); },
14974           polygonEnd: function() { this.stream.polygonEnd(); }
14975         };
14976
14977         function fit(projection, fitBounds, object) {
14978           var clip = projection.clipExtent && projection.clipExtent();
14979           projection.scale(150).translate([0, 0]);
14980           if (clip != null) projection.clipExtent(null);
14981           d3_geoStream(object, projection.stream(boundsStream$1));
14982           fitBounds(boundsStream$1.result());
14983           if (clip != null) projection.clipExtent(clip);
14984           return projection;
14985         }
14986
14987         function fitExtent(projection, extent, object) {
14988           return fit(projection, function(b) {
14989             var w = extent[1][0] - extent[0][0],
14990                 h = extent[1][1] - extent[0][1],
14991                 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
14992                 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
14993                 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
14994             projection.scale(150 * k).translate([x, y]);
14995           }, object);
14996         }
14997
14998         function fitSize(projection, size, object) {
14999           return fitExtent(projection, [[0, 0], size], object);
15000         }
15001
15002         function fitWidth(projection, width, object) {
15003           return fit(projection, function(b) {
15004             var w = +width,
15005                 k = w / (b[1][0] - b[0][0]),
15006                 x = (w - k * (b[1][0] + b[0][0])) / 2,
15007                 y = -k * b[0][1];
15008             projection.scale(150 * k).translate([x, y]);
15009           }, object);
15010         }
15011
15012         function fitHeight(projection, height, object) {
15013           return fit(projection, function(b) {
15014             var h = +height,
15015                 k = h / (b[1][1] - b[0][1]),
15016                 x = -k * b[0][0],
15017                 y = (h - k * (b[1][1] + b[0][1])) / 2;
15018             projection.scale(150 * k).translate([x, y]);
15019           }, object);
15020         }
15021
15022         var maxDepth = 16, // maximum depth of subdivision
15023             cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
15024
15025         function resample(project, delta2) {
15026           return +delta2 ? resample$1(project, delta2) : resampleNone(project);
15027         }
15028
15029         function resampleNone(project) {
15030           return transformer({
15031             point: function(x, y) {
15032               x = project(x, y);
15033               this.stream.point(x[0], x[1]);
15034             }
15035           });
15036         }
15037
15038         function resample$1(project, delta2) {
15039
15040           function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
15041             var dx = x1 - x0,
15042                 dy = y1 - y0,
15043                 d2 = dx * dx + dy * dy;
15044             if (d2 > 4 * delta2 && depth--) {
15045               var a = a0 + a1,
15046                   b = b0 + b1,
15047                   c = c0 + c1,
15048                   m = sqrt(a * a + b * b + c * c),
15049                   phi2 = asin(c /= m),
15050                   lambda2 = abs$2(abs$2(c) - 1) < epsilon$2 || abs$2(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
15051                   p = project(lambda2, phi2),
15052                   x2 = p[0],
15053                   y2 = p[1],
15054                   dx2 = x2 - x0,
15055                   dy2 = y2 - y0,
15056                   dz = dy * dx2 - dx * dy2;
15057               if (dz * dz / d2 > delta2 // perpendicular projected distance
15058                   || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
15059                   || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
15060                 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
15061                 stream.point(x2, y2);
15062                 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
15063               }
15064             }
15065           }
15066           return function(stream) {
15067             var lambda00, x00, y00, a00, b00, c00, // first point
15068                 lambda0, x0, y0, a0, b0, c0; // previous point
15069
15070             var resampleStream = {
15071               point: point,
15072               lineStart: lineStart,
15073               lineEnd: lineEnd,
15074               polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
15075               polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
15076             };
15077
15078             function point(x, y) {
15079               x = project(x, y);
15080               stream.point(x[0], x[1]);
15081             }
15082
15083             function lineStart() {
15084               x0 = NaN;
15085               resampleStream.point = linePoint;
15086               stream.lineStart();
15087             }
15088
15089             function linePoint(lambda, phi) {
15090               var c = cartesian([lambda, phi]), p = project(lambda, phi);
15091               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
15092               stream.point(x0, y0);
15093             }
15094
15095             function lineEnd() {
15096               resampleStream.point = point;
15097               stream.lineEnd();
15098             }
15099
15100             function ringStart() {
15101               lineStart();
15102               resampleStream.point = ringPoint;
15103               resampleStream.lineEnd = ringEnd;
15104             }
15105
15106             function ringPoint(lambda, phi) {
15107               linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
15108               resampleStream.point = linePoint;
15109             }
15110
15111             function ringEnd() {
15112               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
15113               resampleStream.lineEnd = lineEnd;
15114               lineEnd();
15115             }
15116
15117             return resampleStream;
15118           };
15119         }
15120
15121         var transformRadians = transformer({
15122           point: function(x, y) {
15123             this.stream.point(x * radians, y * radians);
15124           }
15125         });
15126
15127         function transformRotate(rotate) {
15128           return transformer({
15129             point: function(x, y) {
15130               var r = rotate(x, y);
15131               return this.stream.point(r[0], r[1]);
15132             }
15133           });
15134         }
15135
15136         function scaleTranslate(k, dx, dy) {
15137           function transform(x, y) {
15138             return [dx + k * x, dy - k * y];
15139           }
15140           transform.invert = function(x, y) {
15141             return [(x - dx) / k, (dy - y) / k];
15142           };
15143           return transform;
15144         }
15145
15146         function scaleTranslateRotate(k, dx, dy, alpha) {
15147           var cosAlpha = cos$1(alpha),
15148               sinAlpha = sin$1(alpha),
15149               a = cosAlpha * k,
15150               b = sinAlpha * k,
15151               ai = cosAlpha / k,
15152               bi = sinAlpha / k,
15153               ci = (sinAlpha * dy - cosAlpha * dx) / k,
15154               fi = (sinAlpha * dx + cosAlpha * dy) / k;
15155           function transform(x, y) {
15156             return [a * x - b * y + dx, dy - b * x - a * y];
15157           }
15158           transform.invert = function(x, y) {
15159             return [ai * x - bi * y + ci, fi - bi * x - ai * y];
15160           };
15161           return transform;
15162         }
15163
15164         function projection(project) {
15165           return projectionMutator(function() { return project; })();
15166         }
15167
15168         function projectionMutator(projectAt) {
15169           var project,
15170               k = 150, // scale
15171               x = 480, y = 250, // translate
15172               lambda = 0, phi = 0, // center
15173               deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
15174               alpha = 0, // post-rotate
15175               theta = null, preclip = clipAntimeridian, // pre-clip angle
15176               x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent
15177               delta2 = 0.5, // precision
15178               projectResample,
15179               projectTransform,
15180               projectRotateTransform,
15181               cache,
15182               cacheStream;
15183
15184           function projection(point) {
15185             return projectRotateTransform(point[0] * radians, point[1] * radians);
15186           }
15187
15188           function invert(point) {
15189             point = projectRotateTransform.invert(point[0], point[1]);
15190             return point && [point[0] * degrees$1, point[1] * degrees$1];
15191           }
15192
15193           projection.stream = function(stream) {
15194             return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
15195           };
15196
15197           projection.preclip = function(_) {
15198             return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
15199           };
15200
15201           projection.postclip = function(_) {
15202             return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15203           };
15204
15205           projection.clipAngle = function(_) {
15206             return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
15207           };
15208
15209           projection.clipExtent = function(_) {
15210             return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
15211           };
15212
15213           projection.scale = function(_) {
15214             return arguments.length ? (k = +_, recenter()) : k;
15215           };
15216
15217           projection.translate = function(_) {
15218             return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
15219           };
15220
15221           projection.center = function(_) {
15222             return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
15223           };
15224
15225           projection.rotate = function(_) {
15226             return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
15227           };
15228
15229           projection.angle = function(_) {
15230             return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
15231           };
15232
15233           projection.precision = function(_) {
15234             return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
15235           };
15236
15237           projection.fitExtent = function(extent, object) {
15238             return fitExtent(projection, extent, object);
15239           };
15240
15241           projection.fitSize = function(size, object) {
15242             return fitSize(projection, size, object);
15243           };
15244
15245           projection.fitWidth = function(width, object) {
15246             return fitWidth(projection, width, object);
15247           };
15248
15249           projection.fitHeight = function(height, object) {
15250             return fitHeight(projection, height, object);
15251           };
15252
15253           function recenter() {
15254             var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
15255                 transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
15256             rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
15257             projectTransform = compose(project, transform);
15258             projectRotateTransform = compose(rotate, projectTransform);
15259             projectResample = resample(projectTransform, delta2);
15260             return reset();
15261           }
15262
15263           function reset() {
15264             cache = cacheStream = null;
15265             return projection;
15266           }
15267
15268           return function() {
15269             project = projectAt.apply(this, arguments);
15270             projection.invert = project.invert && invert;
15271             return recenter();
15272           };
15273         }
15274
15275         function conicProjection(projectAt) {
15276           var phi0 = 0,
15277               phi1 = pi$3 / 3,
15278               m = projectionMutator(projectAt),
15279               p = m(phi0, phi1);
15280
15281           p.parallels = function(_) {
15282             return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
15283           };
15284
15285           return p;
15286         }
15287
15288         function cylindricalEqualAreaRaw(phi0) {
15289           var cosPhi0 = cos$1(phi0);
15290
15291           function forward(lambda, phi) {
15292             return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
15293           }
15294
15295           forward.invert = function(x, y) {
15296             return [x / cosPhi0, asin(y * cosPhi0)];
15297           };
15298
15299           return forward;
15300         }
15301
15302         function conicEqualAreaRaw(y0, y1) {
15303           var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
15304
15305           // Are the parallels symmetrical around the Equator?
15306           if (abs$2(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
15307
15308           var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
15309
15310           function project(x, y) {
15311             var r = sqrt(c - 2 * n * sin$1(y)) / n;
15312             return [r * sin$1(x *= n), r0 - r * cos$1(x)];
15313           }
15314
15315           project.invert = function(x, y) {
15316             var r0y = r0 - y;
15317             return [atan2(x, abs$2(r0y)) / n * sign$2(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
15318           };
15319
15320           return project;
15321         }
15322
15323         function conicEqualArea() {
15324           return conicProjection(conicEqualAreaRaw)
15325               .scale(155.424)
15326               .center([0, 33.6442]);
15327         }
15328
15329         function albers() {
15330           return conicEqualArea()
15331               .parallels([29.5, 45.5])
15332               .scale(1070)
15333               .translate([480, 250])
15334               .rotate([96, 0])
15335               .center([-0.6, 38.7]);
15336         }
15337
15338         // The projections must have mutually exclusive clip regions on the sphere,
15339         // as this will avoid emitting interleaving lines and polygons.
15340         function multiplex(streams) {
15341           var n = streams.length;
15342           return {
15343             point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
15344             sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
15345             lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
15346             lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
15347             polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
15348             polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
15349           };
15350         }
15351
15352         // A composite projection for the United States, configured by default for
15353         // 960×500. The projection also works quite well at 960×600 if you change the
15354         // scale to 1285 and adjust the translate accordingly. The set of standard
15355         // parallels for each region comes from USGS, which is published here:
15356         // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
15357         function albersUsa() {
15358           var cache,
15359               cacheStream,
15360               lower48 = albers(), lower48Point,
15361               alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
15362               hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
15363               point, pointStream = {point: function(x, y) { point = [x, y]; }};
15364
15365           function albersUsa(coordinates) {
15366             var x = coordinates[0], y = coordinates[1];
15367             return point = null,
15368                 (lower48Point.point(x, y), point)
15369                 || (alaskaPoint.point(x, y), point)
15370                 || (hawaiiPoint.point(x, y), point);
15371           }
15372
15373           albersUsa.invert = function(coordinates) {
15374             var k = lower48.scale(),
15375                 t = lower48.translate(),
15376                 x = (coordinates[0] - t[0]) / k,
15377                 y = (coordinates[1] - t[1]) / k;
15378             return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
15379                 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
15380                 : lower48).invert(coordinates);
15381           };
15382
15383           albersUsa.stream = function(stream) {
15384             return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
15385           };
15386
15387           albersUsa.precision = function(_) {
15388             if (!arguments.length) return lower48.precision();
15389             lower48.precision(_), alaska.precision(_), hawaii.precision(_);
15390             return reset();
15391           };
15392
15393           albersUsa.scale = function(_) {
15394             if (!arguments.length) return lower48.scale();
15395             lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
15396             return albersUsa.translate(lower48.translate());
15397           };
15398
15399           albersUsa.translate = function(_) {
15400             if (!arguments.length) return lower48.translate();
15401             var k = lower48.scale(), x = +_[0], y = +_[1];
15402
15403             lower48Point = lower48
15404                 .translate(_)
15405                 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
15406                 .stream(pointStream);
15407
15408             alaskaPoint = alaska
15409                 .translate([x - 0.307 * k, y + 0.201 * k])
15410                 .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
15411                 .stream(pointStream);
15412
15413             hawaiiPoint = hawaii
15414                 .translate([x - 0.205 * k, y + 0.212 * k])
15415                 .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
15416                 .stream(pointStream);
15417
15418             return reset();
15419           };
15420
15421           albersUsa.fitExtent = function(extent, object) {
15422             return fitExtent(albersUsa, extent, object);
15423           };
15424
15425           albersUsa.fitSize = function(size, object) {
15426             return fitSize(albersUsa, size, object);
15427           };
15428
15429           albersUsa.fitWidth = function(width, object) {
15430             return fitWidth(albersUsa, width, object);
15431           };
15432
15433           albersUsa.fitHeight = function(height, object) {
15434             return fitHeight(albersUsa, height, object);
15435           };
15436
15437           function reset() {
15438             cache = cacheStream = null;
15439             return albersUsa;
15440           }
15441
15442           return albersUsa.scale(1070);
15443         }
15444
15445         function azimuthalRaw(scale) {
15446           return function(x, y) {
15447             var cx = cos$1(x),
15448                 cy = cos$1(y),
15449                 k = scale(cx * cy);
15450             return [
15451               k * cy * sin$1(x),
15452               k * sin$1(y)
15453             ];
15454           }
15455         }
15456
15457         function azimuthalInvert(angle) {
15458           return function(x, y) {
15459             var z = sqrt(x * x + y * y),
15460                 c = angle(z),
15461                 sc = sin$1(c),
15462                 cc = cos$1(c);
15463             return [
15464               atan2(x * sc, z * cc),
15465               asin(z && y * sc / z)
15466             ];
15467           }
15468         }
15469
15470         var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
15471           return sqrt(2 / (1 + cxcy));
15472         });
15473
15474         azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
15475           return 2 * asin(z / 2);
15476         });
15477
15478         function azimuthalEqualArea() {
15479           return projection(azimuthalEqualAreaRaw)
15480               .scale(124.75)
15481               .clipAngle(180 - 1e-3);
15482         }
15483
15484         var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
15485           return (c = acos(c)) && c / sin$1(c);
15486         });
15487
15488         azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
15489           return z;
15490         });
15491
15492         function azimuthalEquidistant() {
15493           return projection(azimuthalEquidistantRaw)
15494               .scale(79.4188)
15495               .clipAngle(180 - 1e-3);
15496         }
15497
15498         function mercatorRaw(lambda, phi) {
15499           return [lambda, log(tan((halfPi$2 + phi) / 2))];
15500         }
15501
15502         mercatorRaw.invert = function(x, y) {
15503           return [x, 2 * atan(exp(y)) - halfPi$2];
15504         };
15505
15506         function mercator() {
15507           return mercatorProjection(mercatorRaw)
15508               .scale(961 / tau$3);
15509         }
15510
15511         function mercatorProjection(project) {
15512           var m = projection(project),
15513               center = m.center,
15514               scale = m.scale,
15515               translate = m.translate,
15516               clipExtent = m.clipExtent,
15517               x0 = null, y0, x1, y1; // clip extent
15518
15519           m.scale = function(_) {
15520             return arguments.length ? (scale(_), reclip()) : scale();
15521           };
15522
15523           m.translate = function(_) {
15524             return arguments.length ? (translate(_), reclip()) : translate();
15525           };
15526
15527           m.center = function(_) {
15528             return arguments.length ? (center(_), reclip()) : center();
15529           };
15530
15531           m.clipExtent = function(_) {
15532             return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
15533           };
15534
15535           function reclip() {
15536             var k = pi$3 * scale(),
15537                 t = m(rotation(m.rotate()).invert([0, 0]));
15538             return clipExtent(x0 == null
15539                 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
15540                 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
15541                 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
15542           }
15543
15544           return reclip();
15545         }
15546
15547         function tany(y) {
15548           return tan((halfPi$2 + y) / 2);
15549         }
15550
15551         function conicConformalRaw(y0, y1) {
15552           var cy0 = cos$1(y0),
15553               n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
15554               f = cy0 * pow(tany(y0), n) / n;
15555
15556           if (!n) return mercatorRaw;
15557
15558           function project(x, y) {
15559             if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
15560             else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
15561             var r = f / pow(tany(y), n);
15562             return [r * sin$1(n * x), f - r * cos$1(n * x)];
15563           }
15564
15565           project.invert = function(x, y) {
15566             var fy = f - y, r = sign$2(n) * sqrt(x * x + fy * fy);
15567             return [atan2(x, abs$2(fy)) / n * sign$2(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
15568           };
15569
15570           return project;
15571         }
15572
15573         function conicConformal() {
15574           return conicProjection(conicConformalRaw)
15575               .scale(109.5)
15576               .parallels([30, 30]);
15577         }
15578
15579         function equirectangularRaw(lambda, phi) {
15580           return [lambda, phi];
15581         }
15582
15583         equirectangularRaw.invert = equirectangularRaw;
15584
15585         function equirectangular() {
15586           return projection(equirectangularRaw)
15587               .scale(152.63);
15588         }
15589
15590         function conicEquidistantRaw(y0, y1) {
15591           var cy0 = cos$1(y0),
15592               n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
15593               g = cy0 / n + y0;
15594
15595           if (abs$2(n) < epsilon$2) return equirectangularRaw;
15596
15597           function project(x, y) {
15598             var gy = g - y, nx = n * x;
15599             return [gy * sin$1(nx), g - gy * cos$1(nx)];
15600           }
15601
15602           project.invert = function(x, y) {
15603             var gy = g - y;
15604             return [atan2(x, abs$2(gy)) / n * sign$2(gy), g - sign$2(n) * sqrt(x * x + gy * gy)];
15605           };
15606
15607           return project;
15608         }
15609
15610         function conicEquidistant() {
15611           return conicProjection(conicEquidistantRaw)
15612               .scale(131.154)
15613               .center([0, 13.9389]);
15614         }
15615
15616         var A1 = 1.340264,
15617             A2 = -0.081106,
15618             A3 = 0.000893,
15619             A4 = 0.003796,
15620             M = sqrt(3) / 2,
15621             iterations = 12;
15622
15623         function equalEarthRaw(lambda, phi) {
15624           var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
15625           return [
15626             lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
15627             l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
15628           ];
15629         }
15630
15631         equalEarthRaw.invert = function(x, y) {
15632           var l = y, l2 = l * l, l6 = l2 * l2 * l2;
15633           for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
15634             fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
15635             fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
15636             l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
15637             if (abs$2(delta) < epsilon2$1) break;
15638           }
15639           return [
15640             M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),
15641             asin(sin$1(l) / M)
15642           ];
15643         };
15644
15645         function equalEarth() {
15646           return projection(equalEarthRaw)
15647               .scale(177.158);
15648         }
15649
15650         function gnomonicRaw(x, y) {
15651           var cy = cos$1(y), k = cos$1(x) * cy;
15652           return [cy * sin$1(x) / k, sin$1(y) / k];
15653         }
15654
15655         gnomonicRaw.invert = azimuthalInvert(atan);
15656
15657         function gnomonic() {
15658           return projection(gnomonicRaw)
15659               .scale(144.049)
15660               .clipAngle(60);
15661         }
15662
15663         function scaleTranslate$1(kx, ky, tx, ty) {
15664           return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
15665             point: function(x, y) {
15666               this.stream.point(x * kx + tx, y * ky + ty);
15667             }
15668           });
15669         }
15670
15671         function d3_geoIdentity() {
15672           var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
15673               x0 = null, y0, x1, y1, // clip extent
15674               postclip = identity$4,
15675               cache,
15676               cacheStream,
15677               projection;
15678
15679           function reset() {
15680             cache = cacheStream = null;
15681             return projection;
15682           }
15683
15684           return projection = {
15685             stream: function(stream) {
15686               return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
15687             },
15688             postclip: function(_) {
15689               return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15690             },
15691             clipExtent: function(_) {
15692               return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
15693             },
15694             scale: function(_) {
15695               return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k;
15696             },
15697             translate: function(_) {
15698               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
15699             },
15700             reflectX: function(_) {
15701               return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
15702             },
15703             reflectY: function(_) {
15704               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
15705             },
15706             fitExtent: function(extent, object) {
15707               return fitExtent(projection, extent, object);
15708             },
15709             fitSize: function(size, object) {
15710               return fitSize(projection, size, object);
15711             },
15712             fitWidth: function(width, object) {
15713               return fitWidth(projection, width, object);
15714             },
15715             fitHeight: function(height, object) {
15716               return fitHeight(projection, height, object);
15717             }
15718           };
15719         }
15720
15721         function naturalEarth1Raw(lambda, phi) {
15722           var phi2 = phi * phi, phi4 = phi2 * phi2;
15723           return [
15724             lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
15725             phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
15726           ];
15727         }
15728
15729         naturalEarth1Raw.invert = function(x, y) {
15730           var phi = y, i = 25, delta;
15731           do {
15732             var phi2 = phi * phi, phi4 = phi2 * phi2;
15733             phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
15734                 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
15735           } while (abs$2(delta) > epsilon$2 && --i > 0);
15736           return [
15737             x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
15738             phi
15739           ];
15740         };
15741
15742         function naturalEarth1() {
15743           return projection(naturalEarth1Raw)
15744               .scale(175.295);
15745         }
15746
15747         function orthographicRaw(x, y) {
15748           return [cos$1(y) * sin$1(x), sin$1(y)];
15749         }
15750
15751         orthographicRaw.invert = azimuthalInvert(asin);
15752
15753         function orthographic() {
15754           return projection(orthographicRaw)
15755               .scale(249.5)
15756               .clipAngle(90 + epsilon$2);
15757         }
15758
15759         function stereographicRaw(x, y) {
15760           var cy = cos$1(y), k = 1 + cos$1(x) * cy;
15761           return [cy * sin$1(x) / k, sin$1(y) / k];
15762         }
15763
15764         stereographicRaw.invert = azimuthalInvert(function(z) {
15765           return 2 * atan(z);
15766         });
15767
15768         function stereographic() {
15769           return projection(stereographicRaw)
15770               .scale(250)
15771               .clipAngle(142);
15772         }
15773
15774         function transverseMercatorRaw(lambda, phi) {
15775           return [log(tan((halfPi$2 + phi) / 2)), -lambda];
15776         }
15777
15778         transverseMercatorRaw.invert = function(x, y) {
15779           return [-y, 2 * atan(exp(x)) - halfPi$2];
15780         };
15781
15782         function transverseMercator() {
15783           var m = mercatorProjection(transverseMercatorRaw),
15784               center = m.center,
15785               rotate = m.rotate;
15786
15787           m.center = function(_) {
15788             return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
15789           };
15790
15791           m.rotate = function(_) {
15792             return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
15793           };
15794
15795           return rotate([0, 0, 90])
15796               .scale(159.155);
15797         }
15798
15799         function defaultSeparation(a, b) {
15800           return a.parent === b.parent ? 1 : 2;
15801         }
15802
15803         function meanX(children) {
15804           return children.reduce(meanXReduce, 0) / children.length;
15805         }
15806
15807         function meanXReduce(x, c) {
15808           return x + c.x;
15809         }
15810
15811         function maxY(children) {
15812           return 1 + children.reduce(maxYReduce, 0);
15813         }
15814
15815         function maxYReduce(y, c) {
15816           return Math.max(y, c.y);
15817         }
15818
15819         function leafLeft(node) {
15820           var children;
15821           while (children = node.children) node = children[0];
15822           return node;
15823         }
15824
15825         function leafRight(node) {
15826           var children;
15827           while (children = node.children) node = children[children.length - 1];
15828           return node;
15829         }
15830
15831         function cluster() {
15832           var separation = defaultSeparation,
15833               dx = 1,
15834               dy = 1,
15835               nodeSize = false;
15836
15837           function cluster(root) {
15838             var previousNode,
15839                 x = 0;
15840
15841             // First walk, computing the initial x & y values.
15842             root.eachAfter(function(node) {
15843               var children = node.children;
15844               if (children) {
15845                 node.x = meanX(children);
15846                 node.y = maxY(children);
15847               } else {
15848                 node.x = previousNode ? x += separation(node, previousNode) : 0;
15849                 node.y = 0;
15850                 previousNode = node;
15851               }
15852             });
15853
15854             var left = leafLeft(root),
15855                 right = leafRight(root),
15856                 x0 = left.x - separation(left, right) / 2,
15857                 x1 = right.x + separation(right, left) / 2;
15858
15859             // Second walk, normalizing x & y to the desired size.
15860             return root.eachAfter(nodeSize ? function(node) {
15861               node.x = (node.x - root.x) * dx;
15862               node.y = (root.y - node.y) * dy;
15863             } : function(node) {
15864               node.x = (node.x - x0) / (x1 - x0) * dx;
15865               node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
15866             });
15867           }
15868
15869           cluster.separation = function(x) {
15870             return arguments.length ? (separation = x, cluster) : separation;
15871           };
15872
15873           cluster.size = function(x) {
15874             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
15875           };
15876
15877           cluster.nodeSize = function(x) {
15878             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
15879           };
15880
15881           return cluster;
15882         }
15883
15884         function count(node) {
15885           var sum = 0,
15886               children = node.children,
15887               i = children && children.length;
15888           if (!i) sum = 1;
15889           else while (--i >= 0) sum += children[i].value;
15890           node.value = sum;
15891         }
15892
15893         function node_count() {
15894           return this.eachAfter(count);
15895         }
15896
15897         function node_each(callback) {
15898           var node = this, current, next = [node], children, i, n;
15899           do {
15900             current = next.reverse(), next = [];
15901             while (node = current.pop()) {
15902               callback(node), children = node.children;
15903               if (children) for (i = 0, n = children.length; i < n; ++i) {
15904                 next.push(children[i]);
15905               }
15906             }
15907           } while (next.length);
15908           return this;
15909         }
15910
15911         function node_eachBefore(callback) {
15912           var node = this, nodes = [node], children, i;
15913           while (node = nodes.pop()) {
15914             callback(node), children = node.children;
15915             if (children) for (i = children.length - 1; i >= 0; --i) {
15916               nodes.push(children[i]);
15917             }
15918           }
15919           return this;
15920         }
15921
15922         function node_eachAfter(callback) {
15923           var node = this, nodes = [node], next = [], children, i, n;
15924           while (node = nodes.pop()) {
15925             next.push(node), children = node.children;
15926             if (children) for (i = 0, n = children.length; i < n; ++i) {
15927               nodes.push(children[i]);
15928             }
15929           }
15930           while (node = next.pop()) {
15931             callback(node);
15932           }
15933           return this;
15934         }
15935
15936         function node_sum(value) {
15937           return this.eachAfter(function(node) {
15938             var sum = +value(node.data) || 0,
15939                 children = node.children,
15940                 i = children && children.length;
15941             while (--i >= 0) sum += children[i].value;
15942             node.value = sum;
15943           });
15944         }
15945
15946         function node_sort(compare) {
15947           return this.eachBefore(function(node) {
15948             if (node.children) {
15949               node.children.sort(compare);
15950             }
15951           });
15952         }
15953
15954         function node_path(end) {
15955           var start = this,
15956               ancestor = leastCommonAncestor(start, end),
15957               nodes = [start];
15958           while (start !== ancestor) {
15959             start = start.parent;
15960             nodes.push(start);
15961           }
15962           var k = nodes.length;
15963           while (end !== ancestor) {
15964             nodes.splice(k, 0, end);
15965             end = end.parent;
15966           }
15967           return nodes;
15968         }
15969
15970         function leastCommonAncestor(a, b) {
15971           if (a === b) return a;
15972           var aNodes = a.ancestors(),
15973               bNodes = b.ancestors(),
15974               c = null;
15975           a = aNodes.pop();
15976           b = bNodes.pop();
15977           while (a === b) {
15978             c = a;
15979             a = aNodes.pop();
15980             b = bNodes.pop();
15981           }
15982           return c;
15983         }
15984
15985         function node_ancestors() {
15986           var node = this, nodes = [node];
15987           while (node = node.parent) {
15988             nodes.push(node);
15989           }
15990           return nodes;
15991         }
15992
15993         function node_descendants() {
15994           var nodes = [];
15995           this.each(function(node) {
15996             nodes.push(node);
15997           });
15998           return nodes;
15999         }
16000
16001         function node_leaves() {
16002           var leaves = [];
16003           this.eachBefore(function(node) {
16004             if (!node.children) {
16005               leaves.push(node);
16006             }
16007           });
16008           return leaves;
16009         }
16010
16011         function node_links() {
16012           var root = this, links = [];
16013           root.each(function(node) {
16014             if (node !== root) { // Don’t include the root’s parent, if any.
16015               links.push({source: node.parent, target: node});
16016             }
16017           });
16018           return links;
16019         }
16020
16021         function hierarchy(data, children) {
16022           var root = new Node(data),
16023               valued = +data.value && (root.value = data.value),
16024               node,
16025               nodes = [root],
16026               child,
16027               childs,
16028               i,
16029               n;
16030
16031           if (children == null) children = defaultChildren;
16032
16033           while (node = nodes.pop()) {
16034             if (valued) node.value = +node.data.value;
16035             if ((childs = children(node.data)) && (n = childs.length)) {
16036               node.children = new Array(n);
16037               for (i = n - 1; i >= 0; --i) {
16038                 nodes.push(child = node.children[i] = new Node(childs[i]));
16039                 child.parent = node;
16040                 child.depth = node.depth + 1;
16041               }
16042             }
16043           }
16044
16045           return root.eachBefore(computeHeight);
16046         }
16047
16048         function node_copy() {
16049           return hierarchy(this).eachBefore(copyData);
16050         }
16051
16052         function defaultChildren(d) {
16053           return d.children;
16054         }
16055
16056         function copyData(node) {
16057           node.data = node.data.data;
16058         }
16059
16060         function computeHeight(node) {
16061           var height = 0;
16062           do node.height = height;
16063           while ((node = node.parent) && (node.height < ++height));
16064         }
16065
16066         function Node(data) {
16067           this.data = data;
16068           this.depth =
16069           this.height = 0;
16070           this.parent = null;
16071         }
16072
16073         Node.prototype = hierarchy.prototype = {
16074           constructor: Node,
16075           count: node_count,
16076           each: node_each,
16077           eachAfter: node_eachAfter,
16078           eachBefore: node_eachBefore,
16079           sum: node_sum,
16080           sort: node_sort,
16081           path: node_path,
16082           ancestors: node_ancestors,
16083           descendants: node_descendants,
16084           leaves: node_leaves,
16085           links: node_links,
16086           copy: node_copy
16087         };
16088
16089         var slice$8 = Array.prototype.slice;
16090
16091         function shuffle$1(array) {
16092           var m = array.length,
16093               t,
16094               i;
16095
16096           while (m) {
16097             i = Math.random() * m-- | 0;
16098             t = array[m];
16099             array[m] = array[i];
16100             array[i] = t;
16101           }
16102
16103           return array;
16104         }
16105
16106         function enclose(circles) {
16107           var i = 0, n = (circles = shuffle$1(slice$8.call(circles))).length, B = [], p, e;
16108
16109           while (i < n) {
16110             p = circles[i];
16111             if (e && enclosesWeak(e, p)) ++i;
16112             else e = encloseBasis(B = extendBasis(B, p)), i = 0;
16113           }
16114
16115           return e;
16116         }
16117
16118         function extendBasis(B, p) {
16119           var i, j;
16120
16121           if (enclosesWeakAll(p, B)) return [p];
16122
16123           // If we get here then B must have at least one element.
16124           for (i = 0; i < B.length; ++i) {
16125             if (enclosesNot(p, B[i])
16126                 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
16127               return [B[i], p];
16128             }
16129           }
16130
16131           // If we get here then B must have at least two elements.
16132           for (i = 0; i < B.length - 1; ++i) {
16133             for (j = i + 1; j < B.length; ++j) {
16134               if (enclosesNot(encloseBasis2(B[i], B[j]), p)
16135                   && enclosesNot(encloseBasis2(B[i], p), B[j])
16136                   && enclosesNot(encloseBasis2(B[j], p), B[i])
16137                   && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
16138                 return [B[i], B[j], p];
16139               }
16140             }
16141           }
16142
16143           // If we get here then something is very wrong.
16144           throw new Error;
16145         }
16146
16147         function enclosesNot(a, b) {
16148           var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
16149           return dr < 0 || dr * dr < dx * dx + dy * dy;
16150         }
16151
16152         function enclosesWeak(a, b) {
16153           var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16154           return dr > 0 && dr * dr > dx * dx + dy * dy;
16155         }
16156
16157         function enclosesWeakAll(a, B) {
16158           for (var i = 0; i < B.length; ++i) {
16159             if (!enclosesWeak(a, B[i])) {
16160               return false;
16161             }
16162           }
16163           return true;
16164         }
16165
16166         function encloseBasis(B) {
16167           switch (B.length) {
16168             case 1: return encloseBasis1(B[0]);
16169             case 2: return encloseBasis2(B[0], B[1]);
16170             case 3: return encloseBasis3(B[0], B[1], B[2]);
16171           }
16172         }
16173
16174         function encloseBasis1(a) {
16175           return {
16176             x: a.x,
16177             y: a.y,
16178             r: a.r
16179           };
16180         }
16181
16182         function encloseBasis2(a, b) {
16183           var x1 = a.x, y1 = a.y, r1 = a.r,
16184               x2 = b.x, y2 = b.y, r2 = b.r,
16185               x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
16186               l = Math.sqrt(x21 * x21 + y21 * y21);
16187           return {
16188             x: (x1 + x2 + x21 / l * r21) / 2,
16189             y: (y1 + y2 + y21 / l * r21) / 2,
16190             r: (l + r1 + r2) / 2
16191           };
16192         }
16193
16194         function encloseBasis3(a, b, c) {
16195           var x1 = a.x, y1 = a.y, r1 = a.r,
16196               x2 = b.x, y2 = b.y, r2 = b.r,
16197               x3 = c.x, y3 = c.y, r3 = c.r,
16198               a2 = x1 - x2,
16199               a3 = x1 - x3,
16200               b2 = y1 - y2,
16201               b3 = y1 - y3,
16202               c2 = r2 - r1,
16203               c3 = r3 - r1,
16204               d1 = x1 * x1 + y1 * y1 - r1 * r1,
16205               d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
16206               d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
16207               ab = a3 * b2 - a2 * b3,
16208               xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
16209               xb = (b3 * c2 - b2 * c3) / ab,
16210               ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
16211               yb = (a2 * c3 - a3 * c2) / ab,
16212               A = xb * xb + yb * yb - 1,
16213               B = 2 * (r1 + xa * xb + ya * yb),
16214               C = xa * xa + ya * ya - r1 * r1,
16215               r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
16216           return {
16217             x: x1 + xa + xb * r,
16218             y: y1 + ya + yb * r,
16219             r: r
16220           };
16221         }
16222
16223         function place(b, a, c) {
16224           var dx = b.x - a.x, x, a2,
16225               dy = b.y - a.y, y, b2,
16226               d2 = dx * dx + dy * dy;
16227           if (d2) {
16228             a2 = a.r + c.r, a2 *= a2;
16229             b2 = b.r + c.r, b2 *= b2;
16230             if (a2 > b2) {
16231               x = (d2 + b2 - a2) / (2 * d2);
16232               y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
16233               c.x = b.x - x * dx - y * dy;
16234               c.y = b.y - x * dy + y * dx;
16235             } else {
16236               x = (d2 + a2 - b2) / (2 * d2);
16237               y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
16238               c.x = a.x + x * dx - y * dy;
16239               c.y = a.y + x * dy + y * dx;
16240             }
16241           } else {
16242             c.x = a.x + c.r;
16243             c.y = a.y;
16244           }
16245         }
16246
16247         function intersects(a, b) {
16248           var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16249           return dr > 0 && dr * dr > dx * dx + dy * dy;
16250         }
16251
16252         function score(node) {
16253           var a = node._,
16254               b = node.next._,
16255               ab = a.r + b.r,
16256               dx = (a.x * b.r + b.x * a.r) / ab,
16257               dy = (a.y * b.r + b.y * a.r) / ab;
16258           return dx * dx + dy * dy;
16259         }
16260
16261         function Node$1(circle) {
16262           this._ = circle;
16263           this.next = null;
16264           this.previous = null;
16265         }
16266
16267         function packEnclose(circles) {
16268           if (!(n = circles.length)) return 0;
16269
16270           var a, b, c, n, aa, ca, i, j, k, sj, sk;
16271
16272           // Place the first circle.
16273           a = circles[0], a.x = 0, a.y = 0;
16274           if (!(n > 1)) return a.r;
16275
16276           // Place the second circle.
16277           b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
16278           if (!(n > 2)) return a.r + b.r;
16279
16280           // Place the third circle.
16281           place(b, a, c = circles[2]);
16282
16283           // Initialize the front-chain using the first three circles a, b and c.
16284           a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
16285           a.next = c.previous = b;
16286           b.next = a.previous = c;
16287           c.next = b.previous = a;
16288
16289           // Attempt to place each remaining circle…
16290           pack: for (i = 3; i < n; ++i) {
16291             place(a._, b._, c = circles[i]), c = new Node$1(c);
16292
16293             // Find the closest intersecting circle on the front-chain, if any.
16294             // “Closeness” is determined by linear distance along the front-chain.
16295             // “Ahead” or “behind” is likewise determined by linear distance.
16296             j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
16297             do {
16298               if (sj <= sk) {
16299                 if (intersects(j._, c._)) {
16300                   b = j, a.next = b, b.previous = a, --i;
16301                   continue pack;
16302                 }
16303                 sj += j._.r, j = j.next;
16304               } else {
16305                 if (intersects(k._, c._)) {
16306                   a = k, a.next = b, b.previous = a, --i;
16307                   continue pack;
16308                 }
16309                 sk += k._.r, k = k.previous;
16310               }
16311             } while (j !== k.next);
16312
16313             // Success! Insert the new circle c between a and b.
16314             c.previous = a, c.next = b, a.next = b.previous = b = c;
16315
16316             // Compute the new closest circle pair to the centroid.
16317             aa = score(a);
16318             while ((c = c.next) !== b) {
16319               if ((ca = score(c)) < aa) {
16320                 a = c, aa = ca;
16321               }
16322             }
16323             b = a.next;
16324           }
16325
16326           // Compute the enclosing circle of the front chain.
16327           a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
16328
16329           // Translate the circles to put the enclosing circle around the origin.
16330           for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
16331
16332           return c.r;
16333         }
16334
16335         function siblings(circles) {
16336           packEnclose(circles);
16337           return circles;
16338         }
16339
16340         function optional(f) {
16341           return f == null ? null : required(f);
16342         }
16343
16344         function required(f) {
16345           if (typeof f !== "function") throw new Error;
16346           return f;
16347         }
16348
16349         function constantZero() {
16350           return 0;
16351         }
16352
16353         function constant$9(x) {
16354           return function() {
16355             return x;
16356           };
16357         }
16358
16359         function defaultRadius$1(d) {
16360           return Math.sqrt(d.value);
16361         }
16362
16363         function index$1() {
16364           var radius = null,
16365               dx = 1,
16366               dy = 1,
16367               padding = constantZero;
16368
16369           function pack(root) {
16370             root.x = dx / 2, root.y = dy / 2;
16371             if (radius) {
16372               root.eachBefore(radiusLeaf(radius))
16373                   .eachAfter(packChildren(padding, 0.5))
16374                   .eachBefore(translateChild(1));
16375             } else {
16376               root.eachBefore(radiusLeaf(defaultRadius$1))
16377                   .eachAfter(packChildren(constantZero, 1))
16378                   .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
16379                   .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
16380             }
16381             return root;
16382           }
16383
16384           pack.radius = function(x) {
16385             return arguments.length ? (radius = optional(x), pack) : radius;
16386           };
16387
16388           pack.size = function(x) {
16389             return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
16390           };
16391
16392           pack.padding = function(x) {
16393             return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding;
16394           };
16395
16396           return pack;
16397         }
16398
16399         function radiusLeaf(radius) {
16400           return function(node) {
16401             if (!node.children) {
16402               node.r = Math.max(0, +radius(node) || 0);
16403             }
16404           };
16405         }
16406
16407         function packChildren(padding, k) {
16408           return function(node) {
16409             if (children = node.children) {
16410               var children,
16411                   i,
16412                   n = children.length,
16413                   r = padding(node) * k || 0,
16414                   e;
16415
16416               if (r) for (i = 0; i < n; ++i) children[i].r += r;
16417               e = packEnclose(children);
16418               if (r) for (i = 0; i < n; ++i) children[i].r -= r;
16419               node.r = e + r;
16420             }
16421           };
16422         }
16423
16424         function translateChild(k) {
16425           return function(node) {
16426             var parent = node.parent;
16427             node.r *= k;
16428             if (parent) {
16429               node.x = parent.x + k * node.x;
16430               node.y = parent.y + k * node.y;
16431             }
16432           };
16433         }
16434
16435         function roundNode(node) {
16436           node.x0 = Math.round(node.x0);
16437           node.y0 = Math.round(node.y0);
16438           node.x1 = Math.round(node.x1);
16439           node.y1 = Math.round(node.y1);
16440         }
16441
16442         function treemapDice(parent, x0, y0, x1, y1) {
16443           var nodes = parent.children,
16444               node,
16445               i = -1,
16446               n = nodes.length,
16447               k = parent.value && (x1 - x0) / parent.value;
16448
16449           while (++i < n) {
16450             node = nodes[i], node.y0 = y0, node.y1 = y1;
16451             node.x0 = x0, node.x1 = x0 += node.value * k;
16452           }
16453         }
16454
16455         function partition() {
16456           var dx = 1,
16457               dy = 1,
16458               padding = 0,
16459               round = false;
16460
16461           function partition(root) {
16462             var n = root.height + 1;
16463             root.x0 =
16464             root.y0 = padding;
16465             root.x1 = dx;
16466             root.y1 = dy / n;
16467             root.eachBefore(positionNode(dy, n));
16468             if (round) root.eachBefore(roundNode);
16469             return root;
16470           }
16471
16472           function positionNode(dy, n) {
16473             return function(node) {
16474               if (node.children) {
16475                 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
16476               }
16477               var x0 = node.x0,
16478                   y0 = node.y0,
16479                   x1 = node.x1 - padding,
16480                   y1 = node.y1 - padding;
16481               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16482               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16483               node.x0 = x0;
16484               node.y0 = y0;
16485               node.x1 = x1;
16486               node.y1 = y1;
16487             };
16488           }
16489
16490           partition.round = function(x) {
16491             return arguments.length ? (round = !!x, partition) : round;
16492           };
16493
16494           partition.size = function(x) {
16495             return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
16496           };
16497
16498           partition.padding = function(x) {
16499             return arguments.length ? (padding = +x, partition) : padding;
16500           };
16501
16502           return partition;
16503         }
16504
16505         var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
16506             preroot = {depth: -1},
16507             ambiguous = {};
16508
16509         function defaultId(d) {
16510           return d.id;
16511         }
16512
16513         function defaultParentId(d) {
16514           return d.parentId;
16515         }
16516
16517         function stratify() {
16518           var id = defaultId,
16519               parentId = defaultParentId;
16520
16521           function stratify(data) {
16522             var d,
16523                 i,
16524                 n = data.length,
16525                 root,
16526                 parent,
16527                 node,
16528                 nodes = new Array(n),
16529                 nodeId,
16530                 nodeKey,
16531                 nodeByKey = {};
16532
16533             for (i = 0; i < n; ++i) {
16534               d = data[i], node = nodes[i] = new Node(d);
16535               if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
16536                 nodeKey = keyPrefix$1 + (node.id = nodeId);
16537                 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
16538               }
16539             }
16540
16541             for (i = 0; i < n; ++i) {
16542               node = nodes[i], nodeId = parentId(data[i], i, data);
16543               if (nodeId == null || !(nodeId += "")) {
16544                 if (root) throw new Error("multiple roots");
16545                 root = node;
16546               } else {
16547                 parent = nodeByKey[keyPrefix$1 + nodeId];
16548                 if (!parent) throw new Error("missing: " + nodeId);
16549                 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
16550                 if (parent.children) parent.children.push(node);
16551                 else parent.children = [node];
16552                 node.parent = parent;
16553               }
16554             }
16555
16556             if (!root) throw new Error("no root");
16557             root.parent = preroot;
16558             root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
16559             root.parent = null;
16560             if (n > 0) throw new Error("cycle");
16561
16562             return root;
16563           }
16564
16565           stratify.id = function(x) {
16566             return arguments.length ? (id = required(x), stratify) : id;
16567           };
16568
16569           stratify.parentId = function(x) {
16570             return arguments.length ? (parentId = required(x), stratify) : parentId;
16571           };
16572
16573           return stratify;
16574         }
16575
16576         function defaultSeparation$1(a, b) {
16577           return a.parent === b.parent ? 1 : 2;
16578         }
16579
16580         // function radialSeparation(a, b) {
16581         //   return (a.parent === b.parent ? 1 : 2) / a.depth;
16582         // }
16583
16584         // This function is used to traverse the left contour of a subtree (or
16585         // subforest). It returns the successor of v on this contour. This successor is
16586         // either given by the leftmost child of v or by the thread of v. The function
16587         // returns null if and only if v is on the highest level of its subtree.
16588         function nextLeft(v) {
16589           var children = v.children;
16590           return children ? children[0] : v.t;
16591         }
16592
16593         // This function works analogously to nextLeft.
16594         function nextRight(v) {
16595           var children = v.children;
16596           return children ? children[children.length - 1] : v.t;
16597         }
16598
16599         // Shifts the current subtree rooted at w+. This is done by increasing
16600         // prelim(w+) and mod(w+) by shift.
16601         function moveSubtree(wm, wp, shift) {
16602           var change = shift / (wp.i - wm.i);
16603           wp.c -= change;
16604           wp.s += shift;
16605           wm.c += change;
16606           wp.z += shift;
16607           wp.m += shift;
16608         }
16609
16610         // All other shifts, applied to the smaller subtrees between w- and w+, are
16611         // performed by this function. To prepare the shifts, we have to adjust
16612         // change(w+), shift(w+), and change(w-).
16613         function executeShifts(v) {
16614           var shift = 0,
16615               change = 0,
16616               children = v.children,
16617               i = children.length,
16618               w;
16619           while (--i >= 0) {
16620             w = children[i];
16621             w.z += shift;
16622             w.m += shift;
16623             shift += w.s + (change += w.c);
16624           }
16625         }
16626
16627         // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
16628         // returns the specified (default) ancestor.
16629         function nextAncestor(vim, v, ancestor) {
16630           return vim.a.parent === v.parent ? vim.a : ancestor;
16631         }
16632
16633         function TreeNode(node, i) {
16634           this._ = node;
16635           this.parent = null;
16636           this.children = null;
16637           this.A = null; // default ancestor
16638           this.a = this; // ancestor
16639           this.z = 0; // prelim
16640           this.m = 0; // mod
16641           this.c = 0; // change
16642           this.s = 0; // shift
16643           this.t = null; // thread
16644           this.i = i; // number
16645         }
16646
16647         TreeNode.prototype = Object.create(Node.prototype);
16648
16649         function treeRoot(root) {
16650           var tree = new TreeNode(root, 0),
16651               node,
16652               nodes = [tree],
16653               child,
16654               children,
16655               i,
16656               n;
16657
16658           while (node = nodes.pop()) {
16659             if (children = node._.children) {
16660               node.children = new Array(n = children.length);
16661               for (i = n - 1; i >= 0; --i) {
16662                 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
16663                 child.parent = node;
16664               }
16665             }
16666           }
16667
16668           (tree.parent = new TreeNode(null, 0)).children = [tree];
16669           return tree;
16670         }
16671
16672         // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
16673         function tree() {
16674           var separation = defaultSeparation$1,
16675               dx = 1,
16676               dy = 1,
16677               nodeSize = null;
16678
16679           function tree(root) {
16680             var t = treeRoot(root);
16681
16682             // Compute the layout using Buchheim et al.’s algorithm.
16683             t.eachAfter(firstWalk), t.parent.m = -t.z;
16684             t.eachBefore(secondWalk);
16685
16686             // If a fixed node size is specified, scale x and y.
16687             if (nodeSize) root.eachBefore(sizeNode);
16688
16689             // If a fixed tree size is specified, scale x and y based on the extent.
16690             // Compute the left-most, right-most, and depth-most nodes for extents.
16691             else {
16692               var left = root,
16693                   right = root,
16694                   bottom = root;
16695               root.eachBefore(function(node) {
16696                 if (node.x < left.x) left = node;
16697                 if (node.x > right.x) right = node;
16698                 if (node.depth > bottom.depth) bottom = node;
16699               });
16700               var s = left === right ? 1 : separation(left, right) / 2,
16701                   tx = s - left.x,
16702                   kx = dx / (right.x + s + tx),
16703                   ky = dy / (bottom.depth || 1);
16704               root.eachBefore(function(node) {
16705                 node.x = (node.x + tx) * kx;
16706                 node.y = node.depth * ky;
16707               });
16708             }
16709
16710             return root;
16711           }
16712
16713           // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
16714           // applied recursively to the children of v, as well as the function
16715           // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
16716           // node v is placed to the midpoint of its outermost children.
16717           function firstWalk(v) {
16718             var children = v.children,
16719                 siblings = v.parent.children,
16720                 w = v.i ? siblings[v.i - 1] : null;
16721             if (children) {
16722               executeShifts(v);
16723               var midpoint = (children[0].z + children[children.length - 1].z) / 2;
16724               if (w) {
16725                 v.z = w.z + separation(v._, w._);
16726                 v.m = v.z - midpoint;
16727               } else {
16728                 v.z = midpoint;
16729               }
16730             } else if (w) {
16731               v.z = w.z + separation(v._, w._);
16732             }
16733             v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
16734           }
16735
16736           // Computes all real x-coordinates by summing up the modifiers recursively.
16737           function secondWalk(v) {
16738             v._.x = v.z + v.parent.m;
16739             v.m += v.parent.m;
16740           }
16741
16742           // The core of the algorithm. Here, a new subtree is combined with the
16743           // previous subtrees. Threads are used to traverse the inside and outside
16744           // contours of the left and right subtree up to the highest common level. The
16745           // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
16746           // superscript o means outside and i means inside, the subscript - means left
16747           // subtree and + means right subtree. For summing up the modifiers along the
16748           // contour, we use respective variables si+, si-, so-, and so+. Whenever two
16749           // nodes of the inside contours conflict, we compute the left one of the
16750           // greatest uncommon ancestors using the function ANCESTOR and call MOVE
16751           // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
16752           // Finally, we add a new thread (if necessary).
16753           function apportion(v, w, ancestor) {
16754             if (w) {
16755               var vip = v,
16756                   vop = v,
16757                   vim = w,
16758                   vom = vip.parent.children[0],
16759                   sip = vip.m,
16760                   sop = vop.m,
16761                   sim = vim.m,
16762                   som = vom.m,
16763                   shift;
16764               while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
16765                 vom = nextLeft(vom);
16766                 vop = nextRight(vop);
16767                 vop.a = v;
16768                 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
16769                 if (shift > 0) {
16770                   moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
16771                   sip += shift;
16772                   sop += shift;
16773                 }
16774                 sim += vim.m;
16775                 sip += vip.m;
16776                 som += vom.m;
16777                 sop += vop.m;
16778               }
16779               if (vim && !nextRight(vop)) {
16780                 vop.t = vim;
16781                 vop.m += sim - sop;
16782               }
16783               if (vip && !nextLeft(vom)) {
16784                 vom.t = vip;
16785                 vom.m += sip - som;
16786                 ancestor = v;
16787               }
16788             }
16789             return ancestor;
16790           }
16791
16792           function sizeNode(node) {
16793             node.x *= dx;
16794             node.y = node.depth * dy;
16795           }
16796
16797           tree.separation = function(x) {
16798             return arguments.length ? (separation = x, tree) : separation;
16799           };
16800
16801           tree.size = function(x) {
16802             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
16803           };
16804
16805           tree.nodeSize = function(x) {
16806             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
16807           };
16808
16809           return tree;
16810         }
16811
16812         function treemapSlice(parent, x0, y0, x1, y1) {
16813           var nodes = parent.children,
16814               node,
16815               i = -1,
16816               n = nodes.length,
16817               k = parent.value && (y1 - y0) / parent.value;
16818
16819           while (++i < n) {
16820             node = nodes[i], node.x0 = x0, node.x1 = x1;
16821             node.y0 = y0, node.y1 = y0 += node.value * k;
16822           }
16823         }
16824
16825         var phi = (1 + Math.sqrt(5)) / 2;
16826
16827         function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
16828           var rows = [],
16829               nodes = parent.children,
16830               row,
16831               nodeValue,
16832               i0 = 0,
16833               i1 = 0,
16834               n = nodes.length,
16835               dx, dy,
16836               value = parent.value,
16837               sumValue,
16838               minValue,
16839               maxValue,
16840               newRatio,
16841               minRatio,
16842               alpha,
16843               beta;
16844
16845           while (i0 < n) {
16846             dx = x1 - x0, dy = y1 - y0;
16847
16848             // Find the next non-empty node.
16849             do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
16850             minValue = maxValue = sumValue;
16851             alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
16852             beta = sumValue * sumValue * alpha;
16853             minRatio = Math.max(maxValue / beta, beta / minValue);
16854
16855             // Keep adding nodes while the aspect ratio maintains or improves.
16856             for (; i1 < n; ++i1) {
16857               sumValue += nodeValue = nodes[i1].value;
16858               if (nodeValue < minValue) minValue = nodeValue;
16859               if (nodeValue > maxValue) maxValue = nodeValue;
16860               beta = sumValue * sumValue * alpha;
16861               newRatio = Math.max(maxValue / beta, beta / minValue);
16862               if (newRatio > minRatio) { sumValue -= nodeValue; break; }
16863               minRatio = newRatio;
16864             }
16865
16866             // Position and record the row orientation.
16867             rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
16868             if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
16869             else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
16870             value -= sumValue, i0 = i1;
16871           }
16872
16873           return rows;
16874         }
16875
16876         var squarify = (function custom(ratio) {
16877
16878           function squarify(parent, x0, y0, x1, y1) {
16879             squarifyRatio(ratio, parent, x0, y0, x1, y1);
16880           }
16881
16882           squarify.ratio = function(x) {
16883             return custom((x = +x) > 1 ? x : 1);
16884           };
16885
16886           return squarify;
16887         })(phi);
16888
16889         function index$2() {
16890           var tile = squarify,
16891               round = false,
16892               dx = 1,
16893               dy = 1,
16894               paddingStack = [0],
16895               paddingInner = constantZero,
16896               paddingTop = constantZero,
16897               paddingRight = constantZero,
16898               paddingBottom = constantZero,
16899               paddingLeft = constantZero;
16900
16901           function treemap(root) {
16902             root.x0 =
16903             root.y0 = 0;
16904             root.x1 = dx;
16905             root.y1 = dy;
16906             root.eachBefore(positionNode);
16907             paddingStack = [0];
16908             if (round) root.eachBefore(roundNode);
16909             return root;
16910           }
16911
16912           function positionNode(node) {
16913             var p = paddingStack[node.depth],
16914                 x0 = node.x0 + p,
16915                 y0 = node.y0 + p,
16916                 x1 = node.x1 - p,
16917                 y1 = node.y1 - p;
16918             if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16919             if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16920             node.x0 = x0;
16921             node.y0 = y0;
16922             node.x1 = x1;
16923             node.y1 = y1;
16924             if (node.children) {
16925               p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
16926               x0 += paddingLeft(node) - p;
16927               y0 += paddingTop(node) - p;
16928               x1 -= paddingRight(node) - p;
16929               y1 -= paddingBottom(node) - p;
16930               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16931               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16932               tile(node, x0, y0, x1, y1);
16933             }
16934           }
16935
16936           treemap.round = function(x) {
16937             return arguments.length ? (round = !!x, treemap) : round;
16938           };
16939
16940           treemap.size = function(x) {
16941             return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
16942           };
16943
16944           treemap.tile = function(x) {
16945             return arguments.length ? (tile = required(x), treemap) : tile;
16946           };
16947
16948           treemap.padding = function(x) {
16949             return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
16950           };
16951
16952           treemap.paddingInner = function(x) {
16953             return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner;
16954           };
16955
16956           treemap.paddingOuter = function(x) {
16957             return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
16958           };
16959
16960           treemap.paddingTop = function(x) {
16961             return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop;
16962           };
16963
16964           treemap.paddingRight = function(x) {
16965             return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight;
16966           };
16967
16968           treemap.paddingBottom = function(x) {
16969             return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom;
16970           };
16971
16972           treemap.paddingLeft = function(x) {
16973             return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft;
16974           };
16975
16976           return treemap;
16977         }
16978
16979         function binary(parent, x0, y0, x1, y1) {
16980           var nodes = parent.children,
16981               i, n = nodes.length,
16982               sum, sums = new Array(n + 1);
16983
16984           for (sums[0] = sum = i = 0; i < n; ++i) {
16985             sums[i + 1] = sum += nodes[i].value;
16986           }
16987
16988           partition(0, n, parent.value, x0, y0, x1, y1);
16989
16990           function partition(i, j, value, x0, y0, x1, y1) {
16991             if (i >= j - 1) {
16992               var node = nodes[i];
16993               node.x0 = x0, node.y0 = y0;
16994               node.x1 = x1, node.y1 = y1;
16995               return;
16996             }
16997
16998             var valueOffset = sums[i],
16999                 valueTarget = (value / 2) + valueOffset,
17000                 k = i + 1,
17001                 hi = j - 1;
17002
17003             while (k < hi) {
17004               var mid = k + hi >>> 1;
17005               if (sums[mid] < valueTarget) k = mid + 1;
17006               else hi = mid;
17007             }
17008
17009             if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
17010
17011             var valueLeft = sums[k] - valueOffset,
17012                 valueRight = value - valueLeft;
17013
17014             if ((x1 - x0) > (y1 - y0)) {
17015               var xk = (x0 * valueRight + x1 * valueLeft) / value;
17016               partition(i, k, valueLeft, x0, y0, xk, y1);
17017               partition(k, j, valueRight, xk, y0, x1, y1);
17018             } else {
17019               var yk = (y0 * valueRight + y1 * valueLeft) / value;
17020               partition(i, k, valueLeft, x0, y0, x1, yk);
17021               partition(k, j, valueRight, x0, yk, x1, y1);
17022             }
17023           }
17024         }
17025
17026         function sliceDice(parent, x0, y0, x1, y1) {
17027           (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
17028         }
17029
17030         var resquarify = (function custom(ratio) {
17031
17032           function resquarify(parent, x0, y0, x1, y1) {
17033             if ((rows = parent._squarify) && (rows.ratio === ratio)) {
17034               var rows,
17035                   row,
17036                   nodes,
17037                   i,
17038                   j = -1,
17039                   n,
17040                   m = rows.length,
17041                   value = parent.value;
17042
17043               while (++j < m) {
17044                 row = rows[j], nodes = row.children;
17045                 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
17046                 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
17047                 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
17048                 value -= row.value;
17049               }
17050             } else {
17051               parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
17052               rows.ratio = ratio;
17053             }
17054           }
17055
17056           resquarify.ratio = function(x) {
17057             return custom((x = +x) > 1 ? x : 1);
17058           };
17059
17060           return resquarify;
17061         })(phi);
17062
17063         function d3_polygonArea(polygon) {
17064           var i = -1,
17065               n = polygon.length,
17066               a,
17067               b = polygon[n - 1],
17068               area = 0;
17069
17070           while (++i < n) {
17071             a = b;
17072             b = polygon[i];
17073             area += a[1] * b[0] - a[0] * b[1];
17074           }
17075
17076           return area / 2;
17077         }
17078
17079         function d3_polygonCentroid(polygon) {
17080           var i = -1,
17081               n = polygon.length,
17082               x = 0,
17083               y = 0,
17084               a,
17085               b = polygon[n - 1],
17086               c,
17087               k = 0;
17088
17089           while (++i < n) {
17090             a = b;
17091             b = polygon[i];
17092             k += c = a[0] * b[1] - b[0] * a[1];
17093             x += (a[0] + b[0]) * c;
17094             y += (a[1] + b[1]) * c;
17095           }
17096
17097           return k *= 3, [x / k, y / k];
17098         }
17099
17100         // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
17101         // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
17102         // right, +y is up). Returns a positive value if ABC is counter-clockwise,
17103         // negative if clockwise, and zero if the points are collinear.
17104         function cross$1(a, b, c) {
17105           return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
17106         }
17107
17108         function lexicographicOrder(a, b) {
17109           return a[0] - b[0] || a[1] - b[1];
17110         }
17111
17112         // Computes the upper convex hull per the monotone chain algorithm.
17113         // Assumes points.length >= 3, is sorted by x, unique in y.
17114         // Returns an array of indices into points in left-to-right order.
17115         function computeUpperHullIndexes(points) {
17116           var n = points.length,
17117               indexes = [0, 1],
17118               size = 2;
17119
17120           for (var i = 2; i < n; ++i) {
17121             while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
17122             indexes[size++] = i;
17123           }
17124
17125           return indexes.slice(0, size); // remove popped points
17126         }
17127
17128         function d3_polygonHull(points) {
17129           if ((n = points.length) < 3) return null;
17130
17131           var i,
17132               n,
17133               sortedPoints = new Array(n),
17134               flippedPoints = new Array(n);
17135
17136           for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
17137           sortedPoints.sort(lexicographicOrder);
17138           for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
17139
17140           var upperIndexes = computeUpperHullIndexes(sortedPoints),
17141               lowerIndexes = computeUpperHullIndexes(flippedPoints);
17142
17143           // Construct the hull polygon, removing possible duplicate endpoints.
17144           var skipLeft = lowerIndexes[0] === upperIndexes[0],
17145               skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
17146               hull = [];
17147
17148           // Add upper hull in right-to-l order.
17149           // Then add lower hull in left-to-right order.
17150           for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
17151           for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
17152
17153           return hull;
17154         }
17155
17156         function contains$3(polygon, point) {
17157           var n = polygon.length,
17158               p = polygon[n - 1],
17159               x = point[0], y = point[1],
17160               x0 = p[0], y0 = p[1],
17161               x1, y1,
17162               inside = false;
17163
17164           for (var i = 0; i < n; ++i) {
17165             p = polygon[i], x1 = p[0], y1 = p[1];
17166             if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
17167             x0 = x1, y0 = y1;
17168           }
17169
17170           return inside;
17171         }
17172
17173         function length$1(polygon) {
17174           var i = -1,
17175               n = polygon.length,
17176               b = polygon[n - 1],
17177               xa,
17178               ya,
17179               xb = b[0],
17180               yb = b[1],
17181               perimeter = 0;
17182
17183           while (++i < n) {
17184             xa = xb;
17185             ya = yb;
17186             b = polygon[i];
17187             xb = b[0];
17188             yb = b[1];
17189             xa -= xb;
17190             ya -= yb;
17191             perimeter += Math.sqrt(xa * xa + ya * ya);
17192           }
17193
17194           return perimeter;
17195         }
17196
17197         function defaultSource$1() {
17198           return Math.random();
17199         }
17200
17201         var uniform = (function sourceRandomUniform(source) {
17202           function randomUniform(min, max) {
17203             min = min == null ? 0 : +min;
17204             max = max == null ? 1 : +max;
17205             if (arguments.length === 1) max = min, min = 0;
17206             else max -= min;
17207             return function() {
17208               return source() * max + min;
17209             };
17210           }
17211
17212           randomUniform.source = sourceRandomUniform;
17213
17214           return randomUniform;
17215         })(defaultSource$1);
17216
17217         var normal = (function sourceRandomNormal(source) {
17218           function randomNormal(mu, sigma) {
17219             var x, r;
17220             mu = mu == null ? 0 : +mu;
17221             sigma = sigma == null ? 1 : +sigma;
17222             return function() {
17223               var y;
17224
17225               // If available, use the second previously-generated uniform random.
17226               if (x != null) y = x, x = null;
17227
17228               // Otherwise, generate a new x and y.
17229               else do {
17230                 x = source() * 2 - 1;
17231                 y = source() * 2 - 1;
17232                 r = x * x + y * y;
17233               } while (!r || r > 1);
17234
17235               return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
17236             };
17237           }
17238
17239           randomNormal.source = sourceRandomNormal;
17240
17241           return randomNormal;
17242         })(defaultSource$1);
17243
17244         var logNormal = (function sourceRandomLogNormal(source) {
17245           function randomLogNormal() {
17246             var randomNormal = normal.source(source).apply(this, arguments);
17247             return function() {
17248               return Math.exp(randomNormal());
17249             };
17250           }
17251
17252           randomLogNormal.source = sourceRandomLogNormal;
17253
17254           return randomLogNormal;
17255         })(defaultSource$1);
17256
17257         var irwinHall = (function sourceRandomIrwinHall(source) {
17258           function randomIrwinHall(n) {
17259             return function() {
17260               for (var sum = 0, i = 0; i < n; ++i) sum += source();
17261               return sum;
17262             };
17263           }
17264
17265           randomIrwinHall.source = sourceRandomIrwinHall;
17266
17267           return randomIrwinHall;
17268         })(defaultSource$1);
17269
17270         var bates = (function sourceRandomBates(source) {
17271           function randomBates(n) {
17272             var randomIrwinHall = irwinHall.source(source)(n);
17273             return function() {
17274               return randomIrwinHall() / n;
17275             };
17276           }
17277
17278           randomBates.source = sourceRandomBates;
17279
17280           return randomBates;
17281         })(defaultSource$1);
17282
17283         var exponential$1 = (function sourceRandomExponential(source) {
17284           function randomExponential(lambda) {
17285             return function() {
17286               return -Math.log(1 - source()) / lambda;
17287             };
17288           }
17289
17290           randomExponential.source = sourceRandomExponential;
17291
17292           return randomExponential;
17293         })(defaultSource$1);
17294
17295         function initRange(domain, range) {
17296           switch (arguments.length) {
17297             case 0: break;
17298             case 1: this.range(domain); break;
17299             default: this.range(range).domain(domain); break;
17300           }
17301           return this;
17302         }
17303
17304         function initInterpolator(domain, interpolator) {
17305           switch (arguments.length) {
17306             case 0: break;
17307             case 1: this.interpolator(domain); break;
17308             default: this.interpolator(interpolator).domain(domain); break;
17309           }
17310           return this;
17311         }
17312
17313         var array$4 = Array.prototype;
17314
17315         var map$4 = array$4.map;
17316         var slice$9 = array$4.slice;
17317
17318         var implicit = {name: "implicit"};
17319
17320         function ordinal() {
17321           var index = map$3(),
17322               domain = [],
17323               range = [],
17324               unknown = implicit;
17325
17326           function scale(d) {
17327             var key = d + "", i = index.get(key);
17328             if (!i) {
17329               if (unknown !== implicit) return unknown;
17330               index.set(key, i = domain.push(d));
17331             }
17332             return range[(i - 1) % range.length];
17333           }
17334
17335           scale.domain = function(_) {
17336             if (!arguments.length) return domain.slice();
17337             domain = [], index = map$3();
17338             var i = -1, n = _.length, d, key;
17339             while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
17340             return scale;
17341           };
17342
17343           scale.range = function(_) {
17344             return arguments.length ? (range = slice$9.call(_), scale) : range.slice();
17345           };
17346
17347           scale.unknown = function(_) {
17348             return arguments.length ? (unknown = _, scale) : unknown;
17349           };
17350
17351           scale.copy = function() {
17352             return ordinal(domain, range).unknown(unknown);
17353           };
17354
17355           initRange.apply(scale, arguments);
17356
17357           return scale;
17358         }
17359
17360         function band() {
17361           var scale = ordinal().unknown(undefined),
17362               domain = scale.domain,
17363               ordinalRange = scale.range,
17364               range = [0, 1],
17365               step,
17366               bandwidth,
17367               round = false,
17368               paddingInner = 0,
17369               paddingOuter = 0,
17370               align = 0.5;
17371
17372           delete scale.unknown;
17373
17374           function rescale() {
17375             var n = domain().length,
17376                 reverse = range[1] < range[0],
17377                 start = range[reverse - 0],
17378                 stop = range[1 - reverse];
17379             step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
17380             if (round) step = Math.floor(step);
17381             start += (stop - start - step * (n - paddingInner)) * align;
17382             bandwidth = step * (1 - paddingInner);
17383             if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
17384             var values = d3_range(n).map(function(i) { return start + step * i; });
17385             return ordinalRange(reverse ? values.reverse() : values);
17386           }
17387
17388           scale.domain = function(_) {
17389             return arguments.length ? (domain(_), rescale()) : domain();
17390           };
17391
17392           scale.range = function(_) {
17393             return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
17394           };
17395
17396           scale.rangeRound = function(_) {
17397             return range = [+_[0], +_[1]], round = true, rescale();
17398           };
17399
17400           scale.bandwidth = function() {
17401             return bandwidth;
17402           };
17403
17404           scale.step = function() {
17405             return step;
17406           };
17407
17408           scale.round = function(_) {
17409             return arguments.length ? (round = !!_, rescale()) : round;
17410           };
17411
17412           scale.padding = function(_) {
17413             return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
17414           };
17415
17416           scale.paddingInner = function(_) {
17417             return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
17418           };
17419
17420           scale.paddingOuter = function(_) {
17421             return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
17422           };
17423
17424           scale.align = function(_) {
17425             return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
17426           };
17427
17428           scale.copy = function() {
17429             return band(domain(), range)
17430                 .round(round)
17431                 .paddingInner(paddingInner)
17432                 .paddingOuter(paddingOuter)
17433                 .align(align);
17434           };
17435
17436           return initRange.apply(rescale(), arguments);
17437         }
17438
17439         function pointish(scale) {
17440           var copy = scale.copy;
17441
17442           scale.padding = scale.paddingOuter;
17443           delete scale.paddingInner;
17444           delete scale.paddingOuter;
17445
17446           scale.copy = function() {
17447             return pointish(copy());
17448           };
17449
17450           return scale;
17451         }
17452
17453         function point$1() {
17454           return pointish(band.apply(null, arguments).paddingInner(1));
17455         }
17456
17457         function constant$a(x) {
17458           return function() {
17459             return x;
17460           };
17461         }
17462
17463         function number$2(x) {
17464           return +x;
17465         }
17466
17467         var unit = [0, 1];
17468
17469         function identity$5(x) {
17470           return x;
17471         }
17472
17473         function normalize(a, b) {
17474           return (b -= (a = +a))
17475               ? function(x) { return (x - a) / b; }
17476               : constant$a(isNaN(b) ? NaN : 0.5);
17477         }
17478
17479         function clamper(domain) {
17480           var a = domain[0], b = domain[domain.length - 1], t;
17481           if (a > b) t = a, a = b, b = t;
17482           return function(x) { return Math.max(a, Math.min(b, x)); };
17483         }
17484
17485         // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
17486         // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
17487         function bimap(domain, range, interpolate) {
17488           var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
17489           if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
17490           else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
17491           return function(x) { return r0(d0(x)); };
17492         }
17493
17494         function polymap(domain, range, interpolate) {
17495           var j = Math.min(domain.length, range.length) - 1,
17496               d = new Array(j),
17497               r = new Array(j),
17498               i = -1;
17499
17500           // Reverse descending domains.
17501           if (domain[j] < domain[0]) {
17502             domain = domain.slice().reverse();
17503             range = range.slice().reverse();
17504           }
17505
17506           while (++i < j) {
17507             d[i] = normalize(domain[i], domain[i + 1]);
17508             r[i] = interpolate(range[i], range[i + 1]);
17509           }
17510
17511           return function(x) {
17512             var i = bisectRight(domain, x, 1, j) - 1;
17513             return r[i](d[i](x));
17514           };
17515         }
17516
17517         function copy$1(source, target) {
17518           return target
17519               .domain(source.domain())
17520               .range(source.range())
17521               .interpolate(source.interpolate())
17522               .clamp(source.clamp())
17523               .unknown(source.unknown());
17524         }
17525
17526         function transformer$1() {
17527           var domain = unit,
17528               range = unit,
17529               interpolate = d3_interpolate,
17530               transform,
17531               untransform,
17532               unknown,
17533               clamp = identity$5,
17534               piecewise,
17535               output,
17536               input;
17537
17538           function rescale() {
17539             piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
17540             output = input = null;
17541             return scale;
17542           }
17543
17544           function scale(x) {
17545             return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
17546           }
17547
17548           scale.invert = function(y) {
17549             return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
17550           };
17551
17552           scale.domain = function(_) {
17553             return arguments.length ? (domain = map$4.call(_, number$2), clamp === identity$5 || (clamp = clamper(domain)), rescale()) : domain.slice();
17554           };
17555
17556           scale.range = function(_) {
17557             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17558           };
17559
17560           scale.rangeRound = function(_) {
17561             return range = slice$9.call(_), interpolate = interpolateRound, rescale();
17562           };
17563
17564           scale.clamp = function(_) {
17565             return arguments.length ? (clamp = _ ? clamper(domain) : identity$5, scale) : clamp !== identity$5;
17566           };
17567
17568           scale.interpolate = function(_) {
17569             return arguments.length ? (interpolate = _, rescale()) : interpolate;
17570           };
17571
17572           scale.unknown = function(_) {
17573             return arguments.length ? (unknown = _, scale) : unknown;
17574           };
17575
17576           return function(t, u) {
17577             transform = t, untransform = u;
17578             return rescale();
17579           };
17580         }
17581
17582         function continuous(transform, untransform) {
17583           return transformer$1()(transform, untransform);
17584         }
17585
17586         function tickFormat(start, stop, count, specifier) {
17587           var step = tickStep(start, stop, count),
17588               precision;
17589           specifier = formatSpecifier(specifier == null ? ",f" : specifier);
17590           switch (specifier.type) {
17591             case "s": {
17592               var value = Math.max(Math.abs(start), Math.abs(stop));
17593               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
17594               return formatPrefix(specifier, value);
17595             }
17596             case "":
17597             case "e":
17598             case "g":
17599             case "p":
17600             case "r": {
17601               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
17602               break;
17603             }
17604             case "f":
17605             case "%": {
17606               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
17607               break;
17608             }
17609           }
17610           return format(specifier);
17611         }
17612
17613         function linearish(scale) {
17614           var domain = scale.domain;
17615
17616           scale.ticks = function(count) {
17617             var d = domain();
17618             return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
17619           };
17620
17621           scale.tickFormat = function(count, specifier) {
17622             var d = domain();
17623             return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
17624           };
17625
17626           scale.nice = function(count) {
17627             if (count == null) count = 10;
17628
17629             var d = domain(),
17630                 i0 = 0,
17631                 i1 = d.length - 1,
17632                 start = d[i0],
17633                 stop = d[i1],
17634                 step;
17635
17636             if (stop < start) {
17637               step = start, start = stop, stop = step;
17638               step = i0, i0 = i1, i1 = step;
17639             }
17640
17641             step = tickIncrement(start, stop, count);
17642
17643             if (step > 0) {
17644               start = Math.floor(start / step) * step;
17645               stop = Math.ceil(stop / step) * step;
17646               step = tickIncrement(start, stop, count);
17647             } else if (step < 0) {
17648               start = Math.ceil(start * step) / step;
17649               stop = Math.floor(stop * step) / step;
17650               step = tickIncrement(start, stop, count);
17651             }
17652
17653             if (step > 0) {
17654               d[i0] = Math.floor(start / step) * step;
17655               d[i1] = Math.ceil(stop / step) * step;
17656               domain(d);
17657             } else if (step < 0) {
17658               d[i0] = Math.ceil(start * step) / step;
17659               d[i1] = Math.floor(stop * step) / step;
17660               domain(d);
17661             }
17662
17663             return scale;
17664           };
17665
17666           return scale;
17667         }
17668
17669         function linear$2() {
17670           var scale = continuous(identity$5, identity$5);
17671
17672           scale.copy = function() {
17673             return copy$1(scale, linear$2());
17674           };
17675
17676           initRange.apply(scale, arguments);
17677
17678           return linearish(scale);
17679         }
17680
17681         function identity$6(domain) {
17682           var unknown;
17683
17684           function scale(x) {
17685             return isNaN(x = +x) ? unknown : x;
17686           }
17687
17688           scale.invert = scale;
17689
17690           scale.domain = scale.range = function(_) {
17691             return arguments.length ? (domain = map$4.call(_, number$2), scale) : domain.slice();
17692           };
17693
17694           scale.unknown = function(_) {
17695             return arguments.length ? (unknown = _, scale) : unknown;
17696           };
17697
17698           scale.copy = function() {
17699             return identity$6(domain).unknown(unknown);
17700           };
17701
17702           domain = arguments.length ? map$4.call(domain, number$2) : [0, 1];
17703
17704           return linearish(scale);
17705         }
17706
17707         function nice(domain, interval) {
17708           domain = domain.slice();
17709
17710           var i0 = 0,
17711               i1 = domain.length - 1,
17712               x0 = domain[i0],
17713               x1 = domain[i1],
17714               t;
17715
17716           if (x1 < x0) {
17717             t = i0, i0 = i1, i1 = t;
17718             t = x0, x0 = x1, x1 = t;
17719           }
17720
17721           domain[i0] = interval.floor(x0);
17722           domain[i1] = interval.ceil(x1);
17723           return domain;
17724         }
17725
17726         function transformLog(x) {
17727           return Math.log(x);
17728         }
17729
17730         function transformExp(x) {
17731           return Math.exp(x);
17732         }
17733
17734         function transformLogn(x) {
17735           return -Math.log(-x);
17736         }
17737
17738         function transformExpn(x) {
17739           return -Math.exp(-x);
17740         }
17741
17742         function pow10(x) {
17743           return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
17744         }
17745
17746         function powp(base) {
17747           return base === 10 ? pow10
17748               : base === Math.E ? Math.exp
17749               : function(x) { return Math.pow(base, x); };
17750         }
17751
17752         function logp(base) {
17753           return base === Math.E ? Math.log
17754               : base === 10 && Math.log10
17755               || base === 2 && Math.log2
17756               || (base = Math.log(base), function(x) { return Math.log(x) / base; });
17757         }
17758
17759         function reflect(f) {
17760           return function(x) {
17761             return -f(-x);
17762           };
17763         }
17764
17765         function loggish(transform) {
17766           var scale = transform(transformLog, transformExp),
17767               domain = scale.domain,
17768               base = 10,
17769               logs,
17770               pows;
17771
17772           function rescale() {
17773             logs = logp(base), pows = powp(base);
17774             if (domain()[0] < 0) {
17775               logs = reflect(logs), pows = reflect(pows);
17776               transform(transformLogn, transformExpn);
17777             } else {
17778               transform(transformLog, transformExp);
17779             }
17780             return scale;
17781           }
17782
17783           scale.base = function(_) {
17784             return arguments.length ? (base = +_, rescale()) : base;
17785           };
17786
17787           scale.domain = function(_) {
17788             return arguments.length ? (domain(_), rescale()) : domain();
17789           };
17790
17791           scale.ticks = function(count) {
17792             var d = domain(),
17793                 u = d[0],
17794                 v = d[d.length - 1],
17795                 r;
17796
17797             if (r = v < u) i = u, u = v, v = i;
17798
17799             var i = logs(u),
17800                 j = logs(v),
17801                 p,
17802                 k,
17803                 t,
17804                 n = count == null ? 10 : +count,
17805                 z = [];
17806
17807             if (!(base % 1) && j - i < n) {
17808               i = Math.round(i) - 1, j = Math.round(j) + 1;
17809               if (u > 0) for (; i < j; ++i) {
17810                 for (k = 1, p = pows(i); k < base; ++k) {
17811                   t = p * k;
17812                   if (t < u) continue;
17813                   if (t > v) break;
17814                   z.push(t);
17815                 }
17816               } else for (; i < j; ++i) {
17817                 for (k = base - 1, p = pows(i); k >= 1; --k) {
17818                   t = p * k;
17819                   if (t < u) continue;
17820                   if (t > v) break;
17821                   z.push(t);
17822                 }
17823               }
17824             } else {
17825               z = ticks(i, j, Math.min(j - i, n)).map(pows);
17826             }
17827
17828             return r ? z.reverse() : z;
17829           };
17830
17831           scale.tickFormat = function(count, specifier) {
17832             if (specifier == null) specifier = base === 10 ? ".0e" : ",";
17833             if (typeof specifier !== "function") specifier = format(specifier);
17834             if (count === Infinity) return specifier;
17835             if (count == null) count = 10;
17836             var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
17837             return function(d) {
17838               var i = d / pows(Math.round(logs(d)));
17839               if (i * base < base - 0.5) i *= base;
17840               return i <= k ? specifier(d) : "";
17841             };
17842           };
17843
17844           scale.nice = function() {
17845             return domain(nice(domain(), {
17846               floor: function(x) { return pows(Math.floor(logs(x))); },
17847               ceil: function(x) { return pows(Math.ceil(logs(x))); }
17848             }));
17849           };
17850
17851           return scale;
17852         }
17853
17854         function log$1() {
17855           var scale = loggish(transformer$1()).domain([1, 10]);
17856
17857           scale.copy = function() {
17858             return copy$1(scale, log$1()).base(scale.base());
17859           };
17860
17861           initRange.apply(scale, arguments);
17862
17863           return scale;
17864         }
17865
17866         function transformSymlog(c) {
17867           return function(x) {
17868             return Math.sign(x) * Math.log1p(Math.abs(x / c));
17869           };
17870         }
17871
17872         function transformSymexp(c) {
17873           return function(x) {
17874             return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
17875           };
17876         }
17877
17878         function symlogish(transform) {
17879           var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
17880
17881           scale.constant = function(_) {
17882             return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
17883           };
17884
17885           return linearish(scale);
17886         }
17887
17888         function symlog() {
17889           var scale = symlogish(transformer$1());
17890
17891           scale.copy = function() {
17892             return copy$1(scale, symlog()).constant(scale.constant());
17893           };
17894
17895           return initRange.apply(scale, arguments);
17896         }
17897
17898         function transformPow(exponent) {
17899           return function(x) {
17900             return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
17901           };
17902         }
17903
17904         function transformSqrt(x) {
17905           return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
17906         }
17907
17908         function transformSquare(x) {
17909           return x < 0 ? -x * x : x * x;
17910         }
17911
17912         function powish(transform) {
17913           var scale = transform(identity$5, identity$5),
17914               exponent = 1;
17915
17916           function rescale() {
17917             return exponent === 1 ? transform(identity$5, identity$5)
17918                 : exponent === 0.5 ? transform(transformSqrt, transformSquare)
17919                 : transform(transformPow(exponent), transformPow(1 / exponent));
17920           }
17921
17922           scale.exponent = function(_) {
17923             return arguments.length ? (exponent = +_, rescale()) : exponent;
17924           };
17925
17926           return linearish(scale);
17927         }
17928
17929         function pow$1() {
17930           var scale = powish(transformer$1());
17931
17932           scale.copy = function() {
17933             return copy$1(scale, pow$1()).exponent(scale.exponent());
17934           };
17935
17936           initRange.apply(scale, arguments);
17937
17938           return scale;
17939         }
17940
17941         function sqrt$1() {
17942           return pow$1.apply(null, arguments).exponent(0.5);
17943         }
17944
17945         function quantile() {
17946           var domain = [],
17947               range = [],
17948               thresholds = [],
17949               unknown;
17950
17951           function rescale() {
17952             var i = 0, n = Math.max(1, range.length);
17953             thresholds = new Array(n - 1);
17954             while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
17955             return scale;
17956           }
17957
17958           function scale(x) {
17959             return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
17960           }
17961
17962           scale.invertExtent = function(y) {
17963             var i = range.indexOf(y);
17964             return i < 0 ? [NaN, NaN] : [
17965               i > 0 ? thresholds[i - 1] : domain[0],
17966               i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
17967             ];
17968           };
17969
17970           scale.domain = function(_) {
17971             if (!arguments.length) return domain.slice();
17972             domain = [];
17973             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
17974             domain.sort(d3_ascending);
17975             return rescale();
17976           };
17977
17978           scale.range = function(_) {
17979             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17980           };
17981
17982           scale.unknown = function(_) {
17983             return arguments.length ? (unknown = _, scale) : unknown;
17984           };
17985
17986           scale.quantiles = function() {
17987             return thresholds.slice();
17988           };
17989
17990           scale.copy = function() {
17991             return quantile()
17992                 .domain(domain)
17993                 .range(range)
17994                 .unknown(unknown);
17995           };
17996
17997           return initRange.apply(scale, arguments);
17998         }
17999
18000         function quantize() {
18001           var x0 = 0,
18002               x1 = 1,
18003               n = 1,
18004               domain = [0.5],
18005               range = [0, 1],
18006               unknown;
18007
18008           function scale(x) {
18009             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
18010           }
18011
18012           function rescale() {
18013             var i = -1;
18014             domain = new Array(n);
18015             while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
18016             return scale;
18017           }
18018
18019           scale.domain = function(_) {
18020             return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
18021           };
18022
18023           scale.range = function(_) {
18024             return arguments.length ? (n = (range = slice$9.call(_)).length - 1, rescale()) : range.slice();
18025           };
18026
18027           scale.invertExtent = function(y) {
18028             var i = range.indexOf(y);
18029             return i < 0 ? [NaN, NaN]
18030                 : i < 1 ? [x0, domain[0]]
18031                 : i >= n ? [domain[n - 1], x1]
18032                 : [domain[i - 1], domain[i]];
18033           };
18034
18035           scale.unknown = function(_) {
18036             return arguments.length ? (unknown = _, scale) : scale;
18037           };
18038
18039           scale.thresholds = function() {
18040             return domain.slice();
18041           };
18042
18043           scale.copy = function() {
18044             return quantize()
18045                 .domain([x0, x1])
18046                 .range(range)
18047                 .unknown(unknown);
18048           };
18049
18050           return initRange.apply(linearish(scale), arguments);
18051         }
18052
18053         function threshold$1() {
18054           var domain = [0.5],
18055               range = [0, 1],
18056               unknown,
18057               n = 1;
18058
18059           function scale(x) {
18060             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
18061           }
18062
18063           scale.domain = function(_) {
18064             return arguments.length ? (domain = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
18065           };
18066
18067           scale.range = function(_) {
18068             return arguments.length ? (range = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
18069           };
18070
18071           scale.invertExtent = function(y) {
18072             var i = range.indexOf(y);
18073             return [domain[i - 1], domain[i]];
18074           };
18075
18076           scale.unknown = function(_) {
18077             return arguments.length ? (unknown = _, scale) : unknown;
18078           };
18079
18080           scale.copy = function() {
18081             return threshold$1()
18082                 .domain(domain)
18083                 .range(range)
18084                 .unknown(unknown);
18085           };
18086
18087           return initRange.apply(scale, arguments);
18088         }
18089
18090         var t0$1 = new Date,
18091             t1$1 = new Date;
18092
18093         function newInterval(floori, offseti, count, field) {
18094
18095           function interval(date) {
18096             return floori(date = new Date(+date)), date;
18097           }
18098
18099           interval.floor = interval;
18100
18101           interval.ceil = function(date) {
18102             return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
18103           };
18104
18105           interval.round = function(date) {
18106             var d0 = interval(date),
18107                 d1 = interval.ceil(date);
18108             return date - d0 < d1 - date ? d0 : d1;
18109           };
18110
18111           interval.offset = function(date, step) {
18112             return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
18113           };
18114
18115           interval.range = function(start, stop, step) {
18116             var range = [], previous;
18117             start = interval.ceil(start);
18118             step = step == null ? 1 : Math.floor(step);
18119             if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
18120             do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
18121             while (previous < start && start < stop);
18122             return range;
18123           };
18124
18125           interval.filter = function(test) {
18126             return newInterval(function(date) {
18127               if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
18128             }, function(date, step) {
18129               if (date >= date) {
18130                 if (step < 0) while (++step <= 0) {
18131                   while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
18132                 } else while (--step >= 0) {
18133                   while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
18134                 }
18135               }
18136             });
18137           };
18138
18139           if (count) {
18140             interval.count = function(start, end) {
18141               t0$1.setTime(+start), t1$1.setTime(+end);
18142               floori(t0$1), floori(t1$1);
18143               return Math.floor(count(t0$1, t1$1));
18144             };
18145
18146             interval.every = function(step) {
18147               step = Math.floor(step);
18148               return !isFinite(step) || !(step > 0) ? null
18149                   : !(step > 1) ? interval
18150                   : interval.filter(field
18151                       ? function(d) { return field(d) % step === 0; }
18152                       : function(d) { return interval.count(0, d) % step === 0; });
18153             };
18154           }
18155
18156           return interval;
18157         }
18158
18159         var millisecond = newInterval(function() {
18160           // noop
18161         }, function(date, step) {
18162           date.setTime(+date + step);
18163         }, function(start, end) {
18164           return end - start;
18165         });
18166
18167         // An optimized implementation for this simple case.
18168         millisecond.every = function(k) {
18169           k = Math.floor(k);
18170           if (!isFinite(k) || !(k > 0)) return null;
18171           if (!(k > 1)) return millisecond;
18172           return newInterval(function(date) {
18173             date.setTime(Math.floor(date / k) * k);
18174           }, function(date, step) {
18175             date.setTime(+date + step * k);
18176           }, function(start, end) {
18177             return (end - start) / k;
18178           });
18179         };
18180         var milliseconds = millisecond.range;
18181
18182         var durationSecond = 1e3;
18183         var durationMinute = 6e4;
18184         var durationHour = 36e5;
18185         var durationDay = 864e5;
18186         var durationWeek = 6048e5;
18187
18188         var second = newInterval(function(date) {
18189           date.setTime(date - date.getMilliseconds());
18190         }, function(date, step) {
18191           date.setTime(+date + step * durationSecond);
18192         }, function(start, end) {
18193           return (end - start) / durationSecond;
18194         }, function(date) {
18195           return date.getUTCSeconds();
18196         });
18197         var seconds = second.range;
18198
18199         var minute = newInterval(function(date) {
18200           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
18201         }, function(date, step) {
18202           date.setTime(+date + step * durationMinute);
18203         }, function(start, end) {
18204           return (end - start) / durationMinute;
18205         }, function(date) {
18206           return date.getMinutes();
18207         });
18208         var minutes = minute.range;
18209
18210         var hour = newInterval(function(date) {
18211           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
18212         }, function(date, step) {
18213           date.setTime(+date + step * durationHour);
18214         }, function(start, end) {
18215           return (end - start) / durationHour;
18216         }, function(date) {
18217           return date.getHours();
18218         });
18219         var hours = hour.range;
18220
18221         var day = newInterval(function(date) {
18222           date.setHours(0, 0, 0, 0);
18223         }, function(date, step) {
18224           date.setDate(date.getDate() + step);
18225         }, function(start, end) {
18226           return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
18227         }, function(date) {
18228           return date.getDate() - 1;
18229         });
18230         var days = day.range;
18231
18232         function weekday(i) {
18233           return newInterval(function(date) {
18234             date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
18235             date.setHours(0, 0, 0, 0);
18236           }, function(date, step) {
18237             date.setDate(date.getDate() + step * 7);
18238           }, function(start, end) {
18239             return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
18240           });
18241         }
18242
18243         var sunday = weekday(0);
18244         var monday = weekday(1);
18245         var tuesday = weekday(2);
18246         var wednesday = weekday(3);
18247         var thursday = weekday(4);
18248         var friday = weekday(5);
18249         var saturday = weekday(6);
18250
18251         var sundays = sunday.range;
18252         var mondays = monday.range;
18253         var tuesdays = tuesday.range;
18254         var wednesdays = wednesday.range;
18255         var thursdays = thursday.range;
18256         var fridays = friday.range;
18257         var saturdays = saturday.range;
18258
18259         var month = newInterval(function(date) {
18260           date.setDate(1);
18261           date.setHours(0, 0, 0, 0);
18262         }, function(date, step) {
18263           date.setMonth(date.getMonth() + step);
18264         }, function(start, end) {
18265           return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
18266         }, function(date) {
18267           return date.getMonth();
18268         });
18269         var months = month.range;
18270
18271         var year = newInterval(function(date) {
18272           date.setMonth(0, 1);
18273           date.setHours(0, 0, 0, 0);
18274         }, function(date, step) {
18275           date.setFullYear(date.getFullYear() + step);
18276         }, function(start, end) {
18277           return end.getFullYear() - start.getFullYear();
18278         }, function(date) {
18279           return date.getFullYear();
18280         });
18281
18282         // An optimized implementation for this simple case.
18283         year.every = function(k) {
18284           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18285             date.setFullYear(Math.floor(date.getFullYear() / k) * k);
18286             date.setMonth(0, 1);
18287             date.setHours(0, 0, 0, 0);
18288           }, function(date, step) {
18289             date.setFullYear(date.getFullYear() + step * k);
18290           });
18291         };
18292         var years = year.range;
18293
18294         var utcMinute = newInterval(function(date) {
18295           date.setUTCSeconds(0, 0);
18296         }, function(date, step) {
18297           date.setTime(+date + step * durationMinute);
18298         }, function(start, end) {
18299           return (end - start) / durationMinute;
18300         }, function(date) {
18301           return date.getUTCMinutes();
18302         });
18303         var utcMinutes = utcMinute.range;
18304
18305         var utcHour = newInterval(function(date) {
18306           date.setUTCMinutes(0, 0, 0);
18307         }, function(date, step) {
18308           date.setTime(+date + step * durationHour);
18309         }, function(start, end) {
18310           return (end - start) / durationHour;
18311         }, function(date) {
18312           return date.getUTCHours();
18313         });
18314         var utcHours = utcHour.range;
18315
18316         var utcDay = newInterval(function(date) {
18317           date.setUTCHours(0, 0, 0, 0);
18318         }, function(date, step) {
18319           date.setUTCDate(date.getUTCDate() + step);
18320         }, function(start, end) {
18321           return (end - start) / durationDay;
18322         }, function(date) {
18323           return date.getUTCDate() - 1;
18324         });
18325         var utcDays = utcDay.range;
18326
18327         function utcWeekday(i) {
18328           return newInterval(function(date) {
18329             date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
18330             date.setUTCHours(0, 0, 0, 0);
18331           }, function(date, step) {
18332             date.setUTCDate(date.getUTCDate() + step * 7);
18333           }, function(start, end) {
18334             return (end - start) / durationWeek;
18335           });
18336         }
18337
18338         var utcSunday = utcWeekday(0);
18339         var utcMonday = utcWeekday(1);
18340         var utcTuesday = utcWeekday(2);
18341         var utcWednesday = utcWeekday(3);
18342         var utcThursday = utcWeekday(4);
18343         var utcFriday = utcWeekday(5);
18344         var utcSaturday = utcWeekday(6);
18345
18346         var utcSundays = utcSunday.range;
18347         var utcMondays = utcMonday.range;
18348         var utcTuesdays = utcTuesday.range;
18349         var utcWednesdays = utcWednesday.range;
18350         var utcThursdays = utcThursday.range;
18351         var utcFridays = utcFriday.range;
18352         var utcSaturdays = utcSaturday.range;
18353
18354         var utcMonth = newInterval(function(date) {
18355           date.setUTCDate(1);
18356           date.setUTCHours(0, 0, 0, 0);
18357         }, function(date, step) {
18358           date.setUTCMonth(date.getUTCMonth() + step);
18359         }, function(start, end) {
18360           return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
18361         }, function(date) {
18362           return date.getUTCMonth();
18363         });
18364         var utcMonths = utcMonth.range;
18365
18366         var utcYear = newInterval(function(date) {
18367           date.setUTCMonth(0, 1);
18368           date.setUTCHours(0, 0, 0, 0);
18369         }, function(date, step) {
18370           date.setUTCFullYear(date.getUTCFullYear() + step);
18371         }, function(start, end) {
18372           return end.getUTCFullYear() - start.getUTCFullYear();
18373         }, function(date) {
18374           return date.getUTCFullYear();
18375         });
18376
18377         // An optimized implementation for this simple case.
18378         utcYear.every = function(k) {
18379           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18380             date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
18381             date.setUTCMonth(0, 1);
18382             date.setUTCHours(0, 0, 0, 0);
18383           }, function(date, step) {
18384             date.setUTCFullYear(date.getUTCFullYear() + step * k);
18385           });
18386         };
18387         var utcYears = utcYear.range;
18388
18389         function localDate(d) {
18390           if (0 <= d.y && d.y < 100) {
18391             var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
18392             date.setFullYear(d.y);
18393             return date;
18394           }
18395           return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
18396         }
18397
18398         function utcDate(d) {
18399           if (0 <= d.y && d.y < 100) {
18400             var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
18401             date.setUTCFullYear(d.y);
18402             return date;
18403           }
18404           return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
18405         }
18406
18407         function newYear(y) {
18408           return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
18409         }
18410
18411         function formatLocale$1(locale) {
18412           var locale_dateTime = locale.dateTime,
18413               locale_date = locale.date,
18414               locale_time = locale.time,
18415               locale_periods = locale.periods,
18416               locale_weekdays = locale.days,
18417               locale_shortWeekdays = locale.shortDays,
18418               locale_months = locale.months,
18419               locale_shortMonths = locale.shortMonths;
18420
18421           var periodRe = formatRe(locale_periods),
18422               periodLookup = formatLookup(locale_periods),
18423               weekdayRe = formatRe(locale_weekdays),
18424               weekdayLookup = formatLookup(locale_weekdays),
18425               shortWeekdayRe = formatRe(locale_shortWeekdays),
18426               shortWeekdayLookup = formatLookup(locale_shortWeekdays),
18427               monthRe = formatRe(locale_months),
18428               monthLookup = formatLookup(locale_months),
18429               shortMonthRe = formatRe(locale_shortMonths),
18430               shortMonthLookup = formatLookup(locale_shortMonths);
18431
18432           var formats = {
18433             "a": formatShortWeekday,
18434             "A": formatWeekday,
18435             "b": formatShortMonth,
18436             "B": formatMonth,
18437             "c": null,
18438             "d": formatDayOfMonth,
18439             "e": formatDayOfMonth,
18440             "f": formatMicroseconds,
18441             "H": formatHour24,
18442             "I": formatHour12,
18443             "j": formatDayOfYear,
18444             "L": formatMilliseconds,
18445             "m": formatMonthNumber,
18446             "M": formatMinutes,
18447             "p": formatPeriod,
18448             "Q": formatUnixTimestamp,
18449             "s": formatUnixTimestampSeconds,
18450             "S": formatSeconds,
18451             "u": formatWeekdayNumberMonday,
18452             "U": formatWeekNumberSunday,
18453             "V": formatWeekNumberISO,
18454             "w": formatWeekdayNumberSunday,
18455             "W": formatWeekNumberMonday,
18456             "x": null,
18457             "X": null,
18458             "y": formatYear$1,
18459             "Y": formatFullYear,
18460             "Z": formatZone,
18461             "%": formatLiteralPercent
18462           };
18463
18464           var utcFormats = {
18465             "a": formatUTCShortWeekday,
18466             "A": formatUTCWeekday,
18467             "b": formatUTCShortMonth,
18468             "B": formatUTCMonth,
18469             "c": null,
18470             "d": formatUTCDayOfMonth,
18471             "e": formatUTCDayOfMonth,
18472             "f": formatUTCMicroseconds,
18473             "H": formatUTCHour24,
18474             "I": formatUTCHour12,
18475             "j": formatUTCDayOfYear,
18476             "L": formatUTCMilliseconds,
18477             "m": formatUTCMonthNumber,
18478             "M": formatUTCMinutes,
18479             "p": formatUTCPeriod,
18480             "Q": formatUnixTimestamp,
18481             "s": formatUnixTimestampSeconds,
18482             "S": formatUTCSeconds,
18483             "u": formatUTCWeekdayNumberMonday,
18484             "U": formatUTCWeekNumberSunday,
18485             "V": formatUTCWeekNumberISO,
18486             "w": formatUTCWeekdayNumberSunday,
18487             "W": formatUTCWeekNumberMonday,
18488             "x": null,
18489             "X": null,
18490             "y": formatUTCYear,
18491             "Y": formatUTCFullYear,
18492             "Z": formatUTCZone,
18493             "%": formatLiteralPercent
18494           };
18495
18496           var parses = {
18497             "a": parseShortWeekday,
18498             "A": parseWeekday,
18499             "b": parseShortMonth,
18500             "B": parseMonth,
18501             "c": parseLocaleDateTime,
18502             "d": parseDayOfMonth,
18503             "e": parseDayOfMonth,
18504             "f": parseMicroseconds,
18505             "H": parseHour24,
18506             "I": parseHour24,
18507             "j": parseDayOfYear,
18508             "L": parseMilliseconds,
18509             "m": parseMonthNumber,
18510             "M": parseMinutes,
18511             "p": parsePeriod,
18512             "Q": parseUnixTimestamp,
18513             "s": parseUnixTimestampSeconds,
18514             "S": parseSeconds,
18515             "u": parseWeekdayNumberMonday,
18516             "U": parseWeekNumberSunday,
18517             "V": parseWeekNumberISO,
18518             "w": parseWeekdayNumberSunday,
18519             "W": parseWeekNumberMonday,
18520             "x": parseLocaleDate,
18521             "X": parseLocaleTime,
18522             "y": parseYear,
18523             "Y": parseFullYear,
18524             "Z": parseZone,
18525             "%": parseLiteralPercent
18526           };
18527
18528           // These recursive directive definitions must be deferred.
18529           formats.x = newFormat(locale_date, formats);
18530           formats.X = newFormat(locale_time, formats);
18531           formats.c = newFormat(locale_dateTime, formats);
18532           utcFormats.x = newFormat(locale_date, utcFormats);
18533           utcFormats.X = newFormat(locale_time, utcFormats);
18534           utcFormats.c = newFormat(locale_dateTime, utcFormats);
18535
18536           function newFormat(specifier, formats) {
18537             return function(date) {
18538               var string = [],
18539                   i = -1,
18540                   j = 0,
18541                   n = specifier.length,
18542                   c,
18543                   pad,
18544                   format;
18545
18546               if (!(date instanceof Date)) date = new Date(+date);
18547
18548               while (++i < n) {
18549                 if (specifier.charCodeAt(i) === 37) {
18550                   string.push(specifier.slice(j, i));
18551                   if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
18552                   else pad = c === "e" ? " " : "0";
18553                   if (format = formats[c]) c = format(date, pad);
18554                   string.push(c);
18555                   j = i + 1;
18556                 }
18557               }
18558
18559               string.push(specifier.slice(j, i));
18560               return string.join("");
18561             };
18562           }
18563
18564           function newParse(specifier, newDate) {
18565             return function(string) {
18566               var d = newYear(1900),
18567                   i = parseSpecifier(d, specifier, string += "", 0),
18568                   week, day$1;
18569               if (i != string.length) return null;
18570
18571               // If a UNIX timestamp is specified, return it.
18572               if ("Q" in d) return new Date(d.Q);
18573
18574               // The am-pm flag is 0 for AM, and 1 for PM.
18575               if ("p" in d) d.H = d.H % 12 + d.p * 12;
18576
18577               // Convert day-of-week and week-of-year to day-of-year.
18578               if ("V" in d) {
18579                 if (d.V < 1 || d.V > 53) return null;
18580                 if (!("w" in d)) d.w = 1;
18581                 if ("Z" in d) {
18582                   week = utcDate(newYear(d.y)), day$1 = week.getUTCDay();
18583                   week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
18584                   week = utcDay.offset(week, (d.V - 1) * 7);
18585                   d.y = week.getUTCFullYear();
18586                   d.m = week.getUTCMonth();
18587                   d.d = week.getUTCDate() + (d.w + 6) % 7;
18588                 } else {
18589                   week = newDate(newYear(d.y)), day$1 = week.getDay();
18590                   week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week);
18591                   week = day.offset(week, (d.V - 1) * 7);
18592                   d.y = week.getFullYear();
18593                   d.m = week.getMonth();
18594                   d.d = week.getDate() + (d.w + 6) % 7;
18595                 }
18596               } else if ("W" in d || "U" in d) {
18597                 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
18598                 day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
18599                 d.m = 0;
18600                 d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7;
18601               }
18602
18603               // If a time zone is specified, all fields are interpreted as UTC and then
18604               // offset according to the specified time zone.
18605               if ("Z" in d) {
18606                 d.H += d.Z / 100 | 0;
18607                 d.M += d.Z % 100;
18608                 return utcDate(d);
18609               }
18610
18611               // Otherwise, all fields are in local time.
18612               return newDate(d);
18613             };
18614           }
18615
18616           function parseSpecifier(d, specifier, string, j) {
18617             var i = 0,
18618                 n = specifier.length,
18619                 m = string.length,
18620                 c,
18621                 parse;
18622
18623             while (i < n) {
18624               if (j >= m) return -1;
18625               c = specifier.charCodeAt(i++);
18626               if (c === 37) {
18627                 c = specifier.charAt(i++);
18628                 parse = parses[c in pads ? specifier.charAt(i++) : c];
18629                 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
18630               } else if (c != string.charCodeAt(j++)) {
18631                 return -1;
18632               }
18633             }
18634
18635             return j;
18636           }
18637
18638           function parsePeriod(d, string, i) {
18639             var n = periodRe.exec(string.slice(i));
18640             return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18641           }
18642
18643           function parseShortWeekday(d, string, i) {
18644             var n = shortWeekdayRe.exec(string.slice(i));
18645             return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18646           }
18647
18648           function parseWeekday(d, string, i) {
18649             var n = weekdayRe.exec(string.slice(i));
18650             return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18651           }
18652
18653           function parseShortMonth(d, string, i) {
18654             var n = shortMonthRe.exec(string.slice(i));
18655             return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18656           }
18657
18658           function parseMonth(d, string, i) {
18659             var n = monthRe.exec(string.slice(i));
18660             return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18661           }
18662
18663           function parseLocaleDateTime(d, string, i) {
18664             return parseSpecifier(d, locale_dateTime, string, i);
18665           }
18666
18667           function parseLocaleDate(d, string, i) {
18668             return parseSpecifier(d, locale_date, string, i);
18669           }
18670
18671           function parseLocaleTime(d, string, i) {
18672             return parseSpecifier(d, locale_time, string, i);
18673           }
18674
18675           function formatShortWeekday(d) {
18676             return locale_shortWeekdays[d.getDay()];
18677           }
18678
18679           function formatWeekday(d) {
18680             return locale_weekdays[d.getDay()];
18681           }
18682
18683           function formatShortMonth(d) {
18684             return locale_shortMonths[d.getMonth()];
18685           }
18686
18687           function formatMonth(d) {
18688             return locale_months[d.getMonth()];
18689           }
18690
18691           function formatPeriod(d) {
18692             return locale_periods[+(d.getHours() >= 12)];
18693           }
18694
18695           function formatUTCShortWeekday(d) {
18696             return locale_shortWeekdays[d.getUTCDay()];
18697           }
18698
18699           function formatUTCWeekday(d) {
18700             return locale_weekdays[d.getUTCDay()];
18701           }
18702
18703           function formatUTCShortMonth(d) {
18704             return locale_shortMonths[d.getUTCMonth()];
18705           }
18706
18707           function formatUTCMonth(d) {
18708             return locale_months[d.getUTCMonth()];
18709           }
18710
18711           function formatUTCPeriod(d) {
18712             return locale_periods[+(d.getUTCHours() >= 12)];
18713           }
18714
18715           return {
18716             format: function(specifier) {
18717               var f = newFormat(specifier += "", formats);
18718               f.toString = function() { return specifier; };
18719               return f;
18720             },
18721             parse: function(specifier) {
18722               var p = newParse(specifier += "", localDate);
18723               p.toString = function() { return specifier; };
18724               return p;
18725             },
18726             utcFormat: function(specifier) {
18727               var f = newFormat(specifier += "", utcFormats);
18728               f.toString = function() { return specifier; };
18729               return f;
18730             },
18731             utcParse: function(specifier) {
18732               var p = newParse(specifier, utcDate);
18733               p.toString = function() { return specifier; };
18734               return p;
18735             }
18736           };
18737         }
18738
18739         var pads = {"-": "", "_": " ", "0": "0"},
18740             numberRe = /^\s*\d+/, // note: ignores next directive
18741             percentRe = /^%/,
18742             requoteRe = /[\\^$*+?|[\]().{}]/g;
18743
18744         function pad$1(value, fill, width) {
18745           var sign = value < 0 ? "-" : "",
18746               string = (sign ? -value : value) + "",
18747               length = string.length;
18748           return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
18749         }
18750
18751         function requote(s) {
18752           return s.replace(requoteRe, "\\$&");
18753         }
18754
18755         function formatRe(names) {
18756           return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
18757         }
18758
18759         function formatLookup(names) {
18760           var map = {}, i = -1, n = names.length;
18761           while (++i < n) map[names[i].toLowerCase()] = i;
18762           return map;
18763         }
18764
18765         function parseWeekdayNumberSunday(d, string, i) {
18766           var n = numberRe.exec(string.slice(i, i + 1));
18767           return n ? (d.w = +n[0], i + n[0].length) : -1;
18768         }
18769
18770         function parseWeekdayNumberMonday(d, string, i) {
18771           var n = numberRe.exec(string.slice(i, i + 1));
18772           return n ? (d.u = +n[0], i + n[0].length) : -1;
18773         }
18774
18775         function parseWeekNumberSunday(d, string, i) {
18776           var n = numberRe.exec(string.slice(i, i + 2));
18777           return n ? (d.U = +n[0], i + n[0].length) : -1;
18778         }
18779
18780         function parseWeekNumberISO(d, string, i) {
18781           var n = numberRe.exec(string.slice(i, i + 2));
18782           return n ? (d.V = +n[0], i + n[0].length) : -1;
18783         }
18784
18785         function parseWeekNumberMonday(d, string, i) {
18786           var n = numberRe.exec(string.slice(i, i + 2));
18787           return n ? (d.W = +n[0], i + n[0].length) : -1;
18788         }
18789
18790         function parseFullYear(d, string, i) {
18791           var n = numberRe.exec(string.slice(i, i + 4));
18792           return n ? (d.y = +n[0], i + n[0].length) : -1;
18793         }
18794
18795         function parseYear(d, string, i) {
18796           var n = numberRe.exec(string.slice(i, i + 2));
18797           return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
18798         }
18799
18800         function parseZone(d, string, i) {
18801           var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
18802           return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
18803         }
18804
18805         function parseMonthNumber(d, string, i) {
18806           var n = numberRe.exec(string.slice(i, i + 2));
18807           return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
18808         }
18809
18810         function parseDayOfMonth(d, string, i) {
18811           var n = numberRe.exec(string.slice(i, i + 2));
18812           return n ? (d.d = +n[0], i + n[0].length) : -1;
18813         }
18814
18815         function parseDayOfYear(d, string, i) {
18816           var n = numberRe.exec(string.slice(i, i + 3));
18817           return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
18818         }
18819
18820         function parseHour24(d, string, i) {
18821           var n = numberRe.exec(string.slice(i, i + 2));
18822           return n ? (d.H = +n[0], i + n[0].length) : -1;
18823         }
18824
18825         function parseMinutes(d, string, i) {
18826           var n = numberRe.exec(string.slice(i, i + 2));
18827           return n ? (d.M = +n[0], i + n[0].length) : -1;
18828         }
18829
18830         function parseSeconds(d, string, i) {
18831           var n = numberRe.exec(string.slice(i, i + 2));
18832           return n ? (d.S = +n[0], i + n[0].length) : -1;
18833         }
18834
18835         function parseMilliseconds(d, string, i) {
18836           var n = numberRe.exec(string.slice(i, i + 3));
18837           return n ? (d.L = +n[0], i + n[0].length) : -1;
18838         }
18839
18840         function parseMicroseconds(d, string, i) {
18841           var n = numberRe.exec(string.slice(i, i + 6));
18842           return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
18843         }
18844
18845         function parseLiteralPercent(d, string, i) {
18846           var n = percentRe.exec(string.slice(i, i + 1));
18847           return n ? i + n[0].length : -1;
18848         }
18849
18850         function parseUnixTimestamp(d, string, i) {
18851           var n = numberRe.exec(string.slice(i));
18852           return n ? (d.Q = +n[0], i + n[0].length) : -1;
18853         }
18854
18855         function parseUnixTimestampSeconds(d, string, i) {
18856           var n = numberRe.exec(string.slice(i));
18857           return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
18858         }
18859
18860         function formatDayOfMonth(d, p) {
18861           return pad$1(d.getDate(), p, 2);
18862         }
18863
18864         function formatHour24(d, p) {
18865           return pad$1(d.getHours(), p, 2);
18866         }
18867
18868         function formatHour12(d, p) {
18869           return pad$1(d.getHours() % 12 || 12, p, 2);
18870         }
18871
18872         function formatDayOfYear(d, p) {
18873           return pad$1(1 + day.count(year(d), d), p, 3);
18874         }
18875
18876         function formatMilliseconds(d, p) {
18877           return pad$1(d.getMilliseconds(), p, 3);
18878         }
18879
18880         function formatMicroseconds(d, p) {
18881           return formatMilliseconds(d, p) + "000";
18882         }
18883
18884         function formatMonthNumber(d, p) {
18885           return pad$1(d.getMonth() + 1, p, 2);
18886         }
18887
18888         function formatMinutes(d, p) {
18889           return pad$1(d.getMinutes(), p, 2);
18890         }
18891
18892         function formatSeconds(d, p) {
18893           return pad$1(d.getSeconds(), p, 2);
18894         }
18895
18896         function formatWeekdayNumberMonday(d) {
18897           var day = d.getDay();
18898           return day === 0 ? 7 : day;
18899         }
18900
18901         function formatWeekNumberSunday(d, p) {
18902           return pad$1(sunday.count(year(d), d), p, 2);
18903         }
18904
18905         function formatWeekNumberISO(d, p) {
18906           var day = d.getDay();
18907           d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
18908           return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
18909         }
18910
18911         function formatWeekdayNumberSunday(d) {
18912           return d.getDay();
18913         }
18914
18915         function formatWeekNumberMonday(d, p) {
18916           return pad$1(monday.count(year(d), d), p, 2);
18917         }
18918
18919         function formatYear$1(d, p) {
18920           return pad$1(d.getFullYear() % 100, p, 2);
18921         }
18922
18923         function formatFullYear(d, p) {
18924           return pad$1(d.getFullYear() % 10000, p, 4);
18925         }
18926
18927         function formatZone(d) {
18928           var z = d.getTimezoneOffset();
18929           return (z > 0 ? "-" : (z *= -1, "+"))
18930               + pad$1(z / 60 | 0, "0", 2)
18931               + pad$1(z % 60, "0", 2);
18932         }
18933
18934         function formatUTCDayOfMonth(d, p) {
18935           return pad$1(d.getUTCDate(), p, 2);
18936         }
18937
18938         function formatUTCHour24(d, p) {
18939           return pad$1(d.getUTCHours(), p, 2);
18940         }
18941
18942         function formatUTCHour12(d, p) {
18943           return pad$1(d.getUTCHours() % 12 || 12, p, 2);
18944         }
18945
18946         function formatUTCDayOfYear(d, p) {
18947           return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
18948         }
18949
18950         function formatUTCMilliseconds(d, p) {
18951           return pad$1(d.getUTCMilliseconds(), p, 3);
18952         }
18953
18954         function formatUTCMicroseconds(d, p) {
18955           return formatUTCMilliseconds(d, p) + "000";
18956         }
18957
18958         function formatUTCMonthNumber(d, p) {
18959           return pad$1(d.getUTCMonth() + 1, p, 2);
18960         }
18961
18962         function formatUTCMinutes(d, p) {
18963           return pad$1(d.getUTCMinutes(), p, 2);
18964         }
18965
18966         function formatUTCSeconds(d, p) {
18967           return pad$1(d.getUTCSeconds(), p, 2);
18968         }
18969
18970         function formatUTCWeekdayNumberMonday(d) {
18971           var dow = d.getUTCDay();
18972           return dow === 0 ? 7 : dow;
18973         }
18974
18975         function formatUTCWeekNumberSunday(d, p) {
18976           return pad$1(utcSunday.count(utcYear(d), d), p, 2);
18977         }
18978
18979         function formatUTCWeekNumberISO(d, p) {
18980           var day = d.getUTCDay();
18981           d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
18982           return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
18983         }
18984
18985         function formatUTCWeekdayNumberSunday(d) {
18986           return d.getUTCDay();
18987         }
18988
18989         function formatUTCWeekNumberMonday(d, p) {
18990           return pad$1(utcMonday.count(utcYear(d), d), p, 2);
18991         }
18992
18993         function formatUTCYear(d, p) {
18994           return pad$1(d.getUTCFullYear() % 100, p, 2);
18995         }
18996
18997         function formatUTCFullYear(d, p) {
18998           return pad$1(d.getUTCFullYear() % 10000, p, 4);
18999         }
19000
19001         function formatUTCZone() {
19002           return "+0000";
19003         }
19004
19005         function formatLiteralPercent() {
19006           return "%";
19007         }
19008
19009         function formatUnixTimestamp(d) {
19010           return +d;
19011         }
19012
19013         function formatUnixTimestampSeconds(d) {
19014           return Math.floor(+d / 1000);
19015         }
19016
19017         var locale$1;
19018         var timeFormat;
19019         var timeParse;
19020         var utcFormat;
19021         var utcParse;
19022
19023         defaultLocale$1({
19024           dateTime: "%x, %X",
19025           date: "%-m/%-d/%Y",
19026           time: "%-I:%M:%S %p",
19027           periods: ["AM", "PM"],
19028           days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
19029           shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
19030           months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
19031           shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
19032         });
19033
19034         function defaultLocale$1(definition) {
19035           locale$1 = formatLocale$1(definition);
19036           timeFormat = locale$1.format;
19037           timeParse = locale$1.parse;
19038           utcFormat = locale$1.utcFormat;
19039           utcParse = locale$1.utcParse;
19040           return locale$1;
19041         }
19042
19043         var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
19044
19045         function formatIsoNative(date) {
19046           return date.toISOString();
19047         }
19048
19049         var formatIso = Date.prototype.toISOString
19050             ? formatIsoNative
19051             : utcFormat(isoSpecifier);
19052
19053         function parseIsoNative(string) {
19054           var date = new Date(string);
19055           return isNaN(date) ? null : date;
19056         }
19057
19058         var parseIso = +new Date("2000-01-01T00:00:00.000Z")
19059             ? parseIsoNative
19060             : utcParse(isoSpecifier);
19061
19062         var durationSecond$1 = 1000,
19063             durationMinute$1 = durationSecond$1 * 60,
19064             durationHour$1 = durationMinute$1 * 60,
19065             durationDay$1 = durationHour$1 * 24,
19066             durationWeek$1 = durationDay$1 * 7,
19067             durationMonth = durationDay$1 * 30,
19068             durationYear = durationDay$1 * 365;
19069
19070         function date$1(t) {
19071           return new Date(t);
19072         }
19073
19074         function number$3(t) {
19075           return t instanceof Date ? +t : +new Date(+t);
19076         }
19077
19078         function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
19079           var scale = continuous(identity$5, identity$5),
19080               invert = scale.invert,
19081               domain = scale.domain;
19082
19083           var formatMillisecond = format(".%L"),
19084               formatSecond = format(":%S"),
19085               formatMinute = format("%I:%M"),
19086               formatHour = format("%I %p"),
19087               formatDay = format("%a %d"),
19088               formatWeek = format("%b %d"),
19089               formatMonth = format("%B"),
19090               formatYear = format("%Y");
19091
19092           var tickIntervals = [
19093             [second,  1,      durationSecond$1],
19094             [second,  5,  5 * durationSecond$1],
19095             [second, 15, 15 * durationSecond$1],
19096             [second, 30, 30 * durationSecond$1],
19097             [minute,  1,      durationMinute$1],
19098             [minute,  5,  5 * durationMinute$1],
19099             [minute, 15, 15 * durationMinute$1],
19100             [minute, 30, 30 * durationMinute$1],
19101             [  hour,  1,      durationHour$1  ],
19102             [  hour,  3,  3 * durationHour$1  ],
19103             [  hour,  6,  6 * durationHour$1  ],
19104             [  hour, 12, 12 * durationHour$1  ],
19105             [   day,  1,      durationDay$1   ],
19106             [   day,  2,  2 * durationDay$1   ],
19107             [  week,  1,      durationWeek$1  ],
19108             [ month,  1,      durationMonth ],
19109             [ month,  3,  3 * durationMonth ],
19110             [  year,  1,      durationYear  ]
19111           ];
19112
19113           function tickFormat(date) {
19114             return (second(date) < date ? formatMillisecond
19115                 : minute(date) < date ? formatSecond
19116                 : hour(date) < date ? formatMinute
19117                 : day(date) < date ? formatHour
19118                 : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
19119                 : year(date) < date ? formatMonth
19120                 : formatYear)(date);
19121           }
19122
19123           function tickInterval(interval, start, stop, step) {
19124             if (interval == null) interval = 10;
19125
19126             // If a desired tick count is specified, pick a reasonable tick interval
19127             // based on the extent of the domain and a rough estimate of tick size.
19128             // Otherwise, assume interval is already a time interval and use it.
19129             if (typeof interval === "number") {
19130               var target = Math.abs(stop - start) / interval,
19131                   i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
19132               if (i === tickIntervals.length) {
19133                 step = tickStep(start / durationYear, stop / durationYear, interval);
19134                 interval = year;
19135               } else if (i) {
19136                 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
19137                 step = i[1];
19138                 interval = i[0];
19139               } else {
19140                 step = Math.max(tickStep(start, stop, interval), 1);
19141                 interval = millisecond;
19142               }
19143             }
19144
19145             return step == null ? interval : interval.every(step);
19146           }
19147
19148           scale.invert = function(y) {
19149             return new Date(invert(y));
19150           };
19151
19152           scale.domain = function(_) {
19153             return arguments.length ? domain(map$4.call(_, number$3)) : domain().map(date$1);
19154           };
19155
19156           scale.ticks = function(interval, step) {
19157             var d = domain(),
19158                 t0 = d[0],
19159                 t1 = d[d.length - 1],
19160                 r = t1 < t0,
19161                 t;
19162             if (r) t = t0, t0 = t1, t1 = t;
19163             t = tickInterval(interval, t0, t1, step);
19164             t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
19165             return r ? t.reverse() : t;
19166           };
19167
19168           scale.tickFormat = function(count, specifier) {
19169             return specifier == null ? tickFormat : format(specifier);
19170           };
19171
19172           scale.nice = function(interval, step) {
19173             var d = domain();
19174             return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
19175                 ? domain(nice(d, interval))
19176                 : scale;
19177           };
19178
19179           scale.copy = function() {
19180             return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
19181           };
19182
19183           return scale;
19184         }
19185
19186         function time() {
19187           return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);
19188         }
19189
19190         function utcTime() {
19191           return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);
19192         }
19193
19194         function transformer$2() {
19195           var x0 = 0,
19196               x1 = 1,
19197               t0,
19198               t1,
19199               k10,
19200               transform,
19201               interpolator = identity$5,
19202               clamp = false,
19203               unknown;
19204
19205           function scale(x) {
19206             return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
19207           }
19208
19209           scale.domain = function(_) {
19210             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
19211           };
19212
19213           scale.clamp = function(_) {
19214             return arguments.length ? (clamp = !!_, scale) : clamp;
19215           };
19216
19217           scale.interpolator = function(_) {
19218             return arguments.length ? (interpolator = _, scale) : interpolator;
19219           };
19220
19221           scale.unknown = function(_) {
19222             return arguments.length ? (unknown = _, scale) : unknown;
19223           };
19224
19225           return function(t) {
19226             transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
19227             return scale;
19228           };
19229         }
19230
19231         function copy$2(source, target) {
19232           return target
19233               .domain(source.domain())
19234               .interpolator(source.interpolator())
19235               .clamp(source.clamp())
19236               .unknown(source.unknown());
19237         }
19238
19239         function sequential() {
19240           var scale = linearish(transformer$2()(identity$5));
19241
19242           scale.copy = function() {
19243             return copy$2(scale, sequential());
19244           };
19245
19246           return initInterpolator.apply(scale, arguments);
19247         }
19248
19249         function sequentialLog() {
19250           var scale = loggish(transformer$2()).domain([1, 10]);
19251
19252           scale.copy = function() {
19253             return copy$2(scale, sequentialLog()).base(scale.base());
19254           };
19255
19256           return initInterpolator.apply(scale, arguments);
19257         }
19258
19259         function sequentialSymlog() {
19260           var scale = symlogish(transformer$2());
19261
19262           scale.copy = function() {
19263             return copy$2(scale, sequentialSymlog()).constant(scale.constant());
19264           };
19265
19266           return initInterpolator.apply(scale, arguments);
19267         }
19268
19269         function sequentialPow() {
19270           var scale = powish(transformer$2());
19271
19272           scale.copy = function() {
19273             return copy$2(scale, sequentialPow()).exponent(scale.exponent());
19274           };
19275
19276           return initInterpolator.apply(scale, arguments);
19277         }
19278
19279         function sequentialSqrt() {
19280           return sequentialPow.apply(null, arguments).exponent(0.5);
19281         }
19282
19283         function sequentialQuantile() {
19284           var domain = [],
19285               interpolator = identity$5;
19286
19287           function scale(x) {
19288             if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1));
19289           }
19290
19291           scale.domain = function(_) {
19292             if (!arguments.length) return domain.slice();
19293             domain = [];
19294             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
19295             domain.sort(d3_ascending);
19296             return scale;
19297           };
19298
19299           scale.interpolator = function(_) {
19300             return arguments.length ? (interpolator = _, scale) : interpolator;
19301           };
19302
19303           scale.copy = function() {
19304             return sequentialQuantile(interpolator).domain(domain);
19305           };
19306
19307           return initInterpolator.apply(scale, arguments);
19308         }
19309
19310         function transformer$3() {
19311           var x0 = 0,
19312               x1 = 0.5,
19313               x2 = 1,
19314               t0,
19315               t1,
19316               t2,
19317               k10,
19318               k21,
19319               interpolator = identity$5,
19320               transform,
19321               clamp = false,
19322               unknown;
19323
19324           function scale(x) {
19325             return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
19326           }
19327
19328           scale.domain = function(_) {
19329             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];
19330           };
19331
19332           scale.clamp = function(_) {
19333             return arguments.length ? (clamp = !!_, scale) : clamp;
19334           };
19335
19336           scale.interpolator = function(_) {
19337             return arguments.length ? (interpolator = _, scale) : interpolator;
19338           };
19339
19340           scale.unknown = function(_) {
19341             return arguments.length ? (unknown = _, scale) : unknown;
19342           };
19343
19344           return function(t) {
19345             transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);
19346             return scale;
19347           };
19348         }
19349
19350         function diverging() {
19351           var scale = linearish(transformer$3()(identity$5));
19352
19353           scale.copy = function() {
19354             return copy$2(scale, diverging());
19355           };
19356
19357           return initInterpolator.apply(scale, arguments);
19358         }
19359
19360         function divergingLog() {
19361           var scale = loggish(transformer$3()).domain([0.1, 1, 10]);
19362
19363           scale.copy = function() {
19364             return copy$2(scale, divergingLog()).base(scale.base());
19365           };
19366
19367           return initInterpolator.apply(scale, arguments);
19368         }
19369
19370         function divergingSymlog() {
19371           var scale = symlogish(transformer$3());
19372
19373           scale.copy = function() {
19374             return copy$2(scale, divergingSymlog()).constant(scale.constant());
19375           };
19376
19377           return initInterpolator.apply(scale, arguments);
19378         }
19379
19380         function divergingPow() {
19381           var scale = powish(transformer$3());
19382
19383           scale.copy = function() {
19384             return copy$2(scale, divergingPow()).exponent(scale.exponent());
19385           };
19386
19387           return initInterpolator.apply(scale, arguments);
19388         }
19389
19390         function divergingSqrt() {
19391           return divergingPow.apply(null, arguments).exponent(0.5);
19392         }
19393
19394         function colors(specifier) {
19395           var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
19396           while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
19397           return colors;
19398         }
19399
19400         var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
19401
19402         var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
19403
19404         var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
19405
19406         var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
19407
19408         var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
19409
19410         var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
19411
19412         var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
19413
19414         var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
19415
19416         var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
19417
19418         function ramp(scheme) {
19419           return rgbBasis(scheme[scheme.length - 1]);
19420         }
19421
19422         var scheme = new Array(3).concat(
19423           "d8b365f5f5f55ab4ac",
19424           "a6611adfc27d80cdc1018571",
19425           "a6611adfc27df5f5f580cdc1018571",
19426           "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
19427           "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
19428           "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
19429           "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
19430           "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
19431           "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
19432         ).map(colors);
19433
19434         var BrBG = ramp(scheme);
19435
19436         var scheme$1 = new Array(3).concat(
19437           "af8dc3f7f7f77fbf7b",
19438           "7b3294c2a5cfa6dba0008837",
19439           "7b3294c2a5cff7f7f7a6dba0008837",
19440           "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
19441           "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
19442           "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
19443           "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
19444           "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
19445           "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
19446         ).map(colors);
19447
19448         var PRGn = ramp(scheme$1);
19449
19450         var scheme$2 = new Array(3).concat(
19451           "e9a3c9f7f7f7a1d76a",
19452           "d01c8bf1b6dab8e1864dac26",
19453           "d01c8bf1b6daf7f7f7b8e1864dac26",
19454           "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
19455           "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
19456           "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
19457           "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
19458           "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
19459           "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
19460         ).map(colors);
19461
19462         var PiYG = ramp(scheme$2);
19463
19464         var scheme$3 = new Array(3).concat(
19465           "998ec3f7f7f7f1a340",
19466           "5e3c99b2abd2fdb863e66101",
19467           "5e3c99b2abd2f7f7f7fdb863e66101",
19468           "542788998ec3d8daebfee0b6f1a340b35806",
19469           "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
19470           "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
19471           "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
19472           "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
19473           "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
19474         ).map(colors);
19475
19476         var PuOr = ramp(scheme$3);
19477
19478         var scheme$4 = new Array(3).concat(
19479           "ef8a62f7f7f767a9cf",
19480           "ca0020f4a58292c5de0571b0",
19481           "ca0020f4a582f7f7f792c5de0571b0",
19482           "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
19483           "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
19484           "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
19485           "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
19486           "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
19487           "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
19488         ).map(colors);
19489
19490         var RdBu = ramp(scheme$4);
19491
19492         var scheme$5 = new Array(3).concat(
19493           "ef8a62ffffff999999",
19494           "ca0020f4a582bababa404040",
19495           "ca0020f4a582ffffffbababa404040",
19496           "b2182bef8a62fddbc7e0e0e09999994d4d4d",
19497           "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
19498           "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
19499           "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
19500           "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
19501           "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
19502         ).map(colors);
19503
19504         var RdGy = ramp(scheme$5);
19505
19506         var scheme$6 = new Array(3).concat(
19507           "fc8d59ffffbf91bfdb",
19508           "d7191cfdae61abd9e92c7bb6",
19509           "d7191cfdae61ffffbfabd9e92c7bb6",
19510           "d73027fc8d59fee090e0f3f891bfdb4575b4",
19511           "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
19512           "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
19513           "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
19514           "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
19515           "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
19516         ).map(colors);
19517
19518         var RdYlBu = ramp(scheme$6);
19519
19520         var scheme$7 = new Array(3).concat(
19521           "fc8d59ffffbf91cf60",
19522           "d7191cfdae61a6d96a1a9641",
19523           "d7191cfdae61ffffbfa6d96a1a9641",
19524           "d73027fc8d59fee08bd9ef8b91cf601a9850",
19525           "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
19526           "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
19527           "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
19528           "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
19529           "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
19530         ).map(colors);
19531
19532         var RdYlGn = ramp(scheme$7);
19533
19534         var scheme$8 = new Array(3).concat(
19535           "fc8d59ffffbf99d594",
19536           "d7191cfdae61abdda42b83ba",
19537           "d7191cfdae61ffffbfabdda42b83ba",
19538           "d53e4ffc8d59fee08be6f59899d5943288bd",
19539           "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
19540           "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
19541           "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
19542           "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
19543           "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
19544         ).map(colors);
19545
19546         var Spectral = ramp(scheme$8);
19547
19548         var scheme$9 = new Array(3).concat(
19549           "e5f5f999d8c92ca25f",
19550           "edf8fbb2e2e266c2a4238b45",
19551           "edf8fbb2e2e266c2a42ca25f006d2c",
19552           "edf8fbccece699d8c966c2a42ca25f006d2c",
19553           "edf8fbccece699d8c966c2a441ae76238b45005824",
19554           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
19555           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
19556         ).map(colors);
19557
19558         var BuGn = ramp(scheme$9);
19559
19560         var scheme$a = new Array(3).concat(
19561           "e0ecf49ebcda8856a7",
19562           "edf8fbb3cde38c96c688419d",
19563           "edf8fbb3cde38c96c68856a7810f7c",
19564           "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
19565           "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
19566           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
19567           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
19568         ).map(colors);
19569
19570         var BuPu = ramp(scheme$a);
19571
19572         var scheme$b = new Array(3).concat(
19573           "e0f3dba8ddb543a2ca",
19574           "f0f9e8bae4bc7bccc42b8cbe",
19575           "f0f9e8bae4bc7bccc443a2ca0868ac",
19576           "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
19577           "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19578           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19579           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
19580         ).map(colors);
19581
19582         var GnBu = ramp(scheme$b);
19583
19584         var scheme$c = new Array(3).concat(
19585           "fee8c8fdbb84e34a33",
19586           "fef0d9fdcc8afc8d59d7301f",
19587           "fef0d9fdcc8afc8d59e34a33b30000",
19588           "fef0d9fdd49efdbb84fc8d59e34a33b30000",
19589           "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
19590           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
19591           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
19592         ).map(colors);
19593
19594         var OrRd = ramp(scheme$c);
19595
19596         var scheme$d = new Array(3).concat(
19597           "ece2f0a6bddb1c9099",
19598           "f6eff7bdc9e167a9cf02818a",
19599           "f6eff7bdc9e167a9cf1c9099016c59",
19600           "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
19601           "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
19602           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
19603           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
19604         ).map(colors);
19605
19606         var PuBuGn = ramp(scheme$d);
19607
19608         var scheme$e = new Array(3).concat(
19609           "ece7f2a6bddb2b8cbe",
19610           "f1eef6bdc9e174a9cf0570b0",
19611           "f1eef6bdc9e174a9cf2b8cbe045a8d",
19612           "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
19613           "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19614           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19615           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
19616         ).map(colors);
19617
19618         var PuBu = ramp(scheme$e);
19619
19620         var scheme$f = new Array(3).concat(
19621           "e7e1efc994c7dd1c77",
19622           "f1eef6d7b5d8df65b0ce1256",
19623           "f1eef6d7b5d8df65b0dd1c77980043",
19624           "f1eef6d4b9dac994c7df65b0dd1c77980043",
19625           "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
19626           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
19627           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
19628         ).map(colors);
19629
19630         var PuRd = ramp(scheme$f);
19631
19632         var scheme$g = new Array(3).concat(
19633           "fde0ddfa9fb5c51b8a",
19634           "feebe2fbb4b9f768a1ae017e",
19635           "feebe2fbb4b9f768a1c51b8a7a0177",
19636           "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
19637           "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19638           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19639           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
19640         ).map(colors);
19641
19642         var RdPu = ramp(scheme$g);
19643
19644         var scheme$h = new Array(3).concat(
19645           "edf8b17fcdbb2c7fb8",
19646           "ffffcca1dab441b6c4225ea8",
19647           "ffffcca1dab441b6c42c7fb8253494",
19648           "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
19649           "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19650           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19651           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
19652         ).map(colors);
19653
19654         var YlGnBu = ramp(scheme$h);
19655
19656         var scheme$i = new Array(3).concat(
19657           "f7fcb9addd8e31a354",
19658           "ffffccc2e69978c679238443",
19659           "ffffccc2e69978c67931a354006837",
19660           "ffffccd9f0a3addd8e78c67931a354006837",
19661           "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
19662           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
19663           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
19664         ).map(colors);
19665
19666         var YlGn = ramp(scheme$i);
19667
19668         var scheme$j = new Array(3).concat(
19669           "fff7bcfec44fd95f0e",
19670           "ffffd4fed98efe9929cc4c02",
19671           "ffffd4fed98efe9929d95f0e993404",
19672           "ffffd4fee391fec44ffe9929d95f0e993404",
19673           "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
19674           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
19675           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
19676         ).map(colors);
19677
19678         var YlOrBr = ramp(scheme$j);
19679
19680         var scheme$k = new Array(3).concat(
19681           "ffeda0feb24cf03b20",
19682           "ffffb2fecc5cfd8d3ce31a1c",
19683           "ffffb2fecc5cfd8d3cf03b20bd0026",
19684           "ffffb2fed976feb24cfd8d3cf03b20bd0026",
19685           "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19686           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19687           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
19688         ).map(colors);
19689
19690         var YlOrRd = ramp(scheme$k);
19691
19692         var scheme$l = new Array(3).concat(
19693           "deebf79ecae13182bd",
19694           "eff3ffbdd7e76baed62171b5",
19695           "eff3ffbdd7e76baed63182bd08519c",
19696           "eff3ffc6dbef9ecae16baed63182bd08519c",
19697           "eff3ffc6dbef9ecae16baed64292c62171b5084594",
19698           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
19699           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
19700         ).map(colors);
19701
19702         var Blues = ramp(scheme$l);
19703
19704         var scheme$m = new Array(3).concat(
19705           "e5f5e0a1d99b31a354",
19706           "edf8e9bae4b374c476238b45",
19707           "edf8e9bae4b374c47631a354006d2c",
19708           "edf8e9c7e9c0a1d99b74c47631a354006d2c",
19709           "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
19710           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
19711           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
19712         ).map(colors);
19713
19714         var Greens = ramp(scheme$m);
19715
19716         var scheme$n = new Array(3).concat(
19717           "f0f0f0bdbdbd636363",
19718           "f7f7f7cccccc969696525252",
19719           "f7f7f7cccccc969696636363252525",
19720           "f7f7f7d9d9d9bdbdbd969696636363252525",
19721           "f7f7f7d9d9d9bdbdbd969696737373525252252525",
19722           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
19723           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
19724         ).map(colors);
19725
19726         var Greys = ramp(scheme$n);
19727
19728         var scheme$o = new Array(3).concat(
19729           "efedf5bcbddc756bb1",
19730           "f2f0f7cbc9e29e9ac86a51a3",
19731           "f2f0f7cbc9e29e9ac8756bb154278f",
19732           "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
19733           "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
19734           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
19735           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
19736         ).map(colors);
19737
19738         var Purples = ramp(scheme$o);
19739
19740         var scheme$p = new Array(3).concat(
19741           "fee0d2fc9272de2d26",
19742           "fee5d9fcae91fb6a4acb181d",
19743           "fee5d9fcae91fb6a4ade2d26a50f15",
19744           "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
19745           "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19746           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19747           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
19748         ).map(colors);
19749
19750         var Reds = ramp(scheme$p);
19751
19752         var scheme$q = new Array(3).concat(
19753           "fee6cefdae6be6550d",
19754           "feeddefdbe85fd8d3cd94701",
19755           "feeddefdbe85fd8d3ce6550da63603",
19756           "feeddefdd0a2fdae6bfd8d3ce6550da63603",
19757           "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19758           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19759           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
19760         ).map(colors);
19761
19762         var Oranges = ramp(scheme$q);
19763
19764         var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
19765
19766         var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19767
19768         var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19769
19770         var c = cubehelix();
19771
19772         function rainbow(t) {
19773           if (t < 0 || t > 1) t -= Math.floor(t);
19774           var ts = Math.abs(t - 0.5);
19775           c.h = 360 * t - 100;
19776           c.s = 1.5 - 1.5 * ts;
19777           c.l = 0.8 - 0.9 * ts;
19778           return c + "";
19779         }
19780
19781         var c$1 = rgb(),
19782             pi_1_3 = Math.PI / 3,
19783             pi_2_3 = Math.PI * 2 / 3;
19784
19785         function sinebow(t) {
19786           var x;
19787           t = (0.5 - t) * Math.PI;
19788           c$1.r = 255 * (x = Math.sin(t)) * x;
19789           c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
19790           c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
19791           return c$1 + "";
19792         }
19793
19794         function ramp$1(range) {
19795           var n = range.length;
19796           return function(t) {
19797             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
19798           };
19799         }
19800
19801         var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
19802
19803         var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
19804
19805         var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
19806
19807         var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
19808
19809         function constant$b(x) {
19810           return function constant() {
19811             return x;
19812           };
19813         }
19814
19815         var abs$3 = Math.abs;
19816         var atan2$1 = Math.atan2;
19817         var cos$2 = Math.cos;
19818         var max$4 = Math.max;
19819         var min$1 = Math.min;
19820         var sin$2 = Math.sin;
19821         var sqrt$2 = Math.sqrt;
19822
19823         var epsilon$3 = 1e-12;
19824         var pi$4 = Math.PI;
19825         var halfPi$3 = pi$4 / 2;
19826         var tau$4 = 2 * pi$4;
19827
19828         function acos$1(x) {
19829           return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
19830         }
19831
19832         function asin$1(x) {
19833           return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
19834         }
19835
19836         function arcInnerRadius(d) {
19837           return d.innerRadius;
19838         }
19839
19840         function arcOuterRadius(d) {
19841           return d.outerRadius;
19842         }
19843
19844         function arcStartAngle(d) {
19845           return d.startAngle;
19846         }
19847
19848         function arcEndAngle(d) {
19849           return d.endAngle;
19850         }
19851
19852         function arcPadAngle(d) {
19853           return d && d.padAngle; // Note: optional!
19854         }
19855
19856         function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
19857           var x10 = x1 - x0, y10 = y1 - y0,
19858               x32 = x3 - x2, y32 = y3 - y2,
19859               t = y32 * x10 - x32 * y10;
19860           if (t * t < epsilon$3) return;
19861           t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
19862           return [x0 + t * x10, y0 + t * y10];
19863         }
19864
19865         // Compute perpendicular offset line of length rc.
19866         // http://mathworld.wolfram.com/Circle-LineIntersection.html
19867         function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
19868           var x01 = x0 - x1,
19869               y01 = y0 - y1,
19870               lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
19871               ox = lo * y01,
19872               oy = -lo * x01,
19873               x11 = x0 + ox,
19874               y11 = y0 + oy,
19875               x10 = x1 + ox,
19876               y10 = y1 + oy,
19877               x00 = (x11 + x10) / 2,
19878               y00 = (y11 + y10) / 2,
19879               dx = x10 - x11,
19880               dy = y10 - y11,
19881               d2 = dx * dx + dy * dy,
19882               r = r1 - rc,
19883               D = x11 * y10 - x10 * y11,
19884               d = (dy < 0 ? -1 : 1) * sqrt$2(max$4(0, r * r * d2 - D * D)),
19885               cx0 = (D * dy - dx * d) / d2,
19886               cy0 = (-D * dx - dy * d) / d2,
19887               cx1 = (D * dy + dx * d) / d2,
19888               cy1 = (-D * dx + dy * d) / d2,
19889               dx0 = cx0 - x00,
19890               dy0 = cy0 - y00,
19891               dx1 = cx1 - x00,
19892               dy1 = cy1 - y00;
19893
19894           // Pick the closer of the two intersection points.
19895           // TODO Is there a faster way to determine which intersection to use?
19896           if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
19897
19898           return {
19899             cx: cx0,
19900             cy: cy0,
19901             x01: -ox,
19902             y01: -oy,
19903             x11: cx0 * (r1 / r - 1),
19904             y11: cy0 * (r1 / r - 1)
19905           };
19906         }
19907
19908         function arc() {
19909           var innerRadius = arcInnerRadius,
19910               outerRadius = arcOuterRadius,
19911               cornerRadius = constant$b(0),
19912               padRadius = null,
19913               startAngle = arcStartAngle,
19914               endAngle = arcEndAngle,
19915               padAngle = arcPadAngle,
19916               context = null;
19917
19918           function arc() {
19919             var buffer,
19920                 r,
19921                 r0 = +innerRadius.apply(this, arguments),
19922                 r1 = +outerRadius.apply(this, arguments),
19923                 a0 = startAngle.apply(this, arguments) - halfPi$3,
19924                 a1 = endAngle.apply(this, arguments) - halfPi$3,
19925                 da = abs$3(a1 - a0),
19926                 cw = a1 > a0;
19927
19928             if (!context) context = buffer = path();
19929
19930             // Ensure that the outer radius is always larger than the inner radius.
19931             if (r1 < r0) r = r1, r1 = r0, r0 = r;
19932
19933             // Is it a point?
19934             if (!(r1 > epsilon$3)) context.moveTo(0, 0);
19935
19936             // Or is it a circle or annulus?
19937             else if (da > tau$4 - epsilon$3) {
19938               context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
19939               context.arc(0, 0, r1, a0, a1, !cw);
19940               if (r0 > epsilon$3) {
19941                 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
19942                 context.arc(0, 0, r0, a1, a0, cw);
19943               }
19944             }
19945
19946             // Or is it a circular or annular sector?
19947             else {
19948               var a01 = a0,
19949                   a11 = a1,
19950                   a00 = a0,
19951                   a10 = a1,
19952                   da0 = da,
19953                   da1 = da,
19954                   ap = padAngle.apply(this, arguments) / 2,
19955                   rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
19956                   rc = min$1(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
19957                   rc0 = rc,
19958                   rc1 = rc,
19959                   t0,
19960                   t1;
19961
19962               // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
19963               if (rp > epsilon$3) {
19964                 var p0 = asin$1(rp / r0 * sin$2(ap)),
19965                     p1 = asin$1(rp / r1 * sin$2(ap));
19966                 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
19967                 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
19968                 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
19969                 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
19970               }
19971
19972               var x01 = r1 * cos$2(a01),
19973                   y01 = r1 * sin$2(a01),
19974                   x10 = r0 * cos$2(a10),
19975                   y10 = r0 * sin$2(a10);
19976
19977               // Apply rounded corners?
19978               if (rc > epsilon$3) {
19979                 var x11 = r1 * cos$2(a11),
19980                     y11 = r1 * sin$2(a11),
19981                     x00 = r0 * cos$2(a00),
19982                     y00 = r0 * sin$2(a00),
19983                     oc;
19984
19985                 // Restrict the corner radius according to the sector angle.
19986                 if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
19987                   var ax = x01 - oc[0],
19988                       ay = y01 - oc[1],
19989                       bx = x11 - oc[0],
19990                       by = y11 - oc[1],
19991                       kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
19992                       lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
19993                   rc0 = min$1(rc, (r0 - lc) / (kc - 1));
19994                   rc1 = min$1(rc, (r1 - lc) / (kc + 1));
19995                 }
19996               }
19997
19998               // Is the sector collapsed to a line?
19999               if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
20000
20001               // Does the sector’s outer ring have rounded corners?
20002               else if (rc1 > epsilon$3) {
20003                 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
20004                 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
20005
20006                 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
20007
20008                 // Have the corners merged?
20009                 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
20010
20011                 // Otherwise, draw the two corners and the ring.
20012                 else {
20013                   context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
20014                   context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
20015                   context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
20016                 }
20017               }
20018
20019               // Or is the outer ring just a circular arc?
20020               else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
20021
20022               // Is there no inner ring, and it’s a circular sector?
20023               // Or perhaps it’s an annular sector collapsed due to padding?
20024               if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
20025
20026               // Does the sector’s inner ring (or point) have rounded corners?
20027               else if (rc0 > epsilon$3) {
20028                 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
20029                 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
20030
20031                 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
20032
20033                 // Have the corners merged?
20034                 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
20035
20036                 // Otherwise, draw the two corners and the ring.
20037                 else {
20038                   context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
20039                   context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
20040                   context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
20041                 }
20042               }
20043
20044               // Or is the inner ring just a circular arc?
20045               else context.arc(0, 0, r0, a10, a00, cw);
20046             }
20047
20048             context.closePath();
20049
20050             if (buffer) return context = null, buffer + "" || null;
20051           }
20052
20053           arc.centroid = function() {
20054             var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
20055                 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
20056             return [cos$2(a) * r, sin$2(a) * r];
20057           };
20058
20059           arc.innerRadius = function(_) {
20060             return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius;
20061           };
20062
20063           arc.outerRadius = function(_) {
20064             return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius;
20065           };
20066
20067           arc.cornerRadius = function(_) {
20068             return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius;
20069           };
20070
20071           arc.padRadius = function(_) {
20072             return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius;
20073           };
20074
20075           arc.startAngle = function(_) {
20076             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle;
20077           };
20078
20079           arc.endAngle = function(_) {
20080             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle;
20081           };
20082
20083           arc.padAngle = function(_) {
20084             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle;
20085           };
20086
20087           arc.context = function(_) {
20088             return arguments.length ? ((context = _ == null ? null : _), arc) : context;
20089           };
20090
20091           return arc;
20092         }
20093
20094         function Linear(context) {
20095           this._context = context;
20096         }
20097
20098         Linear.prototype = {
20099           areaStart: function() {
20100             this._line = 0;
20101           },
20102           areaEnd: function() {
20103             this._line = NaN;
20104           },
20105           lineStart: function() {
20106             this._point = 0;
20107           },
20108           lineEnd: function() {
20109             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20110             this._line = 1 - this._line;
20111           },
20112           point: function(x, y) {
20113             x = +x, y = +y;
20114             switch (this._point) {
20115               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20116               case 1: this._point = 2; // proceed
20117               default: this._context.lineTo(x, y); break;
20118             }
20119           }
20120         };
20121
20122         function curveLinear(context) {
20123           return new Linear(context);
20124         }
20125
20126         function x$3(p) {
20127           return p[0];
20128         }
20129
20130         function y$3(p) {
20131           return p[1];
20132         }
20133
20134         function line() {
20135           var x = x$3,
20136               y = y$3,
20137               defined = constant$b(true),
20138               context = null,
20139               curve = curveLinear,
20140               output = null;
20141
20142           function line(data) {
20143             var i,
20144                 n = data.length,
20145                 d,
20146                 defined0 = false,
20147                 buffer;
20148
20149             if (context == null) output = curve(buffer = path());
20150
20151             for (i = 0; i <= n; ++i) {
20152               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20153                 if (defined0 = !defined0) output.lineStart();
20154                 else output.lineEnd();
20155               }
20156               if (defined0) output.point(+x(d, i, data), +y(d, i, data));
20157             }
20158
20159             if (buffer) return output = null, buffer + "" || null;
20160           }
20161
20162           line.x = function(_) {
20163             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x;
20164           };
20165
20166           line.y = function(_) {
20167             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y;
20168           };
20169
20170           line.defined = function(_) {
20171             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined;
20172           };
20173
20174           line.curve = function(_) {
20175             return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
20176           };
20177
20178           line.context = function(_) {
20179             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
20180           };
20181
20182           return line;
20183         }
20184
20185         function area$1() {
20186           var x0 = x$3,
20187               x1 = null,
20188               y0 = constant$b(0),
20189               y1 = y$3,
20190               defined = constant$b(true),
20191               context = null,
20192               curve = curveLinear,
20193               output = null;
20194
20195           function area(data) {
20196             var i,
20197                 j,
20198                 k,
20199                 n = data.length,
20200                 d,
20201                 defined0 = false,
20202                 buffer,
20203                 x0z = new Array(n),
20204                 y0z = new Array(n);
20205
20206             if (context == null) output = curve(buffer = path());
20207
20208             for (i = 0; i <= n; ++i) {
20209               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20210                 if (defined0 = !defined0) {
20211                   j = i;
20212                   output.areaStart();
20213                   output.lineStart();
20214                 } else {
20215                   output.lineEnd();
20216                   output.lineStart();
20217                   for (k = i - 1; k >= j; --k) {
20218                     output.point(x0z[k], y0z[k]);
20219                   }
20220                   output.lineEnd();
20221                   output.areaEnd();
20222                 }
20223               }
20224               if (defined0) {
20225                 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
20226                 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
20227               }
20228             }
20229
20230             if (buffer) return output = null, buffer + "" || null;
20231           }
20232
20233           function arealine() {
20234             return line().defined(defined).curve(curve).context(context);
20235           }
20236
20237           area.x = function(_) {
20238             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0;
20239           };
20240
20241           area.x0 = function(_) {
20242             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0;
20243           };
20244
20245           area.x1 = function(_) {
20246             return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1;
20247           };
20248
20249           area.y = function(_) {
20250             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0;
20251           };
20252
20253           area.y0 = function(_) {
20254             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0;
20255           };
20256
20257           area.y1 = function(_) {
20258             return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1;
20259           };
20260
20261           area.lineX0 =
20262           area.lineY0 = function() {
20263             return arealine().x(x0).y(y0);
20264           };
20265
20266           area.lineY1 = function() {
20267             return arealine().x(x0).y(y1);
20268           };
20269
20270           area.lineX1 = function() {
20271             return arealine().x(x1).y(y0);
20272           };
20273
20274           area.defined = function(_) {
20275             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined;
20276           };
20277
20278           area.curve = function(_) {
20279             return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
20280           };
20281
20282           area.context = function(_) {
20283             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
20284           };
20285
20286           return area;
20287         }
20288
20289         function descending(a, b) {
20290           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
20291         }
20292
20293         function identity$7(d) {
20294           return d;
20295         }
20296
20297         function pie() {
20298           var value = identity$7,
20299               sortValues = descending,
20300               sort = null,
20301               startAngle = constant$b(0),
20302               endAngle = constant$b(tau$4),
20303               padAngle = constant$b(0);
20304
20305           function pie(data) {
20306             var i,
20307                 n = data.length,
20308                 j,
20309                 k,
20310                 sum = 0,
20311                 index = new Array(n),
20312                 arcs = new Array(n),
20313                 a0 = +startAngle.apply(this, arguments),
20314                 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
20315                 a1,
20316                 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
20317                 pa = p * (da < 0 ? -1 : 1),
20318                 v;
20319
20320             for (i = 0; i < n; ++i) {
20321               if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
20322                 sum += v;
20323               }
20324             }
20325
20326             // Optionally sort the arcs by previously-computed values or by data.
20327             if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
20328             else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
20329
20330             // Compute the arcs! They are stored in the original data's order.
20331             for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
20332               j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
20333                 data: data[j],
20334                 index: i,
20335                 value: v,
20336                 startAngle: a0,
20337                 endAngle: a1,
20338                 padAngle: p
20339               };
20340             }
20341
20342             return arcs;
20343           }
20344
20345           pie.value = function(_) {
20346             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value;
20347           };
20348
20349           pie.sortValues = function(_) {
20350             return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
20351           };
20352
20353           pie.sort = function(_) {
20354             return arguments.length ? (sort = _, sortValues = null, pie) : sort;
20355           };
20356
20357           pie.startAngle = function(_) {
20358             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle;
20359           };
20360
20361           pie.endAngle = function(_) {
20362             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle;
20363           };
20364
20365           pie.padAngle = function(_) {
20366             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle;
20367           };
20368
20369           return pie;
20370         }
20371
20372         var curveRadialLinear = curveRadial(curveLinear);
20373
20374         function Radial(curve) {
20375           this._curve = curve;
20376         }
20377
20378         Radial.prototype = {
20379           areaStart: function() {
20380             this._curve.areaStart();
20381           },
20382           areaEnd: function() {
20383             this._curve.areaEnd();
20384           },
20385           lineStart: function() {
20386             this._curve.lineStart();
20387           },
20388           lineEnd: function() {
20389             this._curve.lineEnd();
20390           },
20391           point: function(a, r) {
20392             this._curve.point(r * Math.sin(a), r * -Math.cos(a));
20393           }
20394         };
20395
20396         function curveRadial(curve) {
20397
20398           function radial(context) {
20399             return new Radial(curve(context));
20400           }
20401
20402           radial._curve = curve;
20403
20404           return radial;
20405         }
20406
20407         function lineRadial(l) {
20408           var c = l.curve;
20409
20410           l.angle = l.x, delete l.x;
20411           l.radius = l.y, delete l.y;
20412
20413           l.curve = function(_) {
20414             return arguments.length ? c(curveRadial(_)) : c()._curve;
20415           };
20416
20417           return l;
20418         }
20419
20420         function lineRadial$1() {
20421           return lineRadial(line().curve(curveRadialLinear));
20422         }
20423
20424         function areaRadial() {
20425           var a = area$1().curve(curveRadialLinear),
20426               c = a.curve,
20427               x0 = a.lineX0,
20428               x1 = a.lineX1,
20429               y0 = a.lineY0,
20430               y1 = a.lineY1;
20431
20432           a.angle = a.x, delete a.x;
20433           a.startAngle = a.x0, delete a.x0;
20434           a.endAngle = a.x1, delete a.x1;
20435           a.radius = a.y, delete a.y;
20436           a.innerRadius = a.y0, delete a.y0;
20437           a.outerRadius = a.y1, delete a.y1;
20438           a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
20439           a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
20440           a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
20441           a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
20442
20443           a.curve = function(_) {
20444             return arguments.length ? c(curveRadial(_)) : c()._curve;
20445           };
20446
20447           return a;
20448         }
20449
20450         function pointRadial(x, y) {
20451           return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
20452         }
20453
20454         var slice$a = Array.prototype.slice;
20455
20456         function linkSource(d) {
20457           return d.source;
20458         }
20459
20460         function linkTarget(d) {
20461           return d.target;
20462         }
20463
20464         function link$2(curve) {
20465           var source = linkSource,
20466               target = linkTarget,
20467               x = x$3,
20468               y = y$3,
20469               context = null;
20470
20471           function link() {
20472             var buffer, argv = slice$a.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
20473             if (!context) context = buffer = path();
20474             curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
20475             if (buffer) return context = null, buffer + "" || null;
20476           }
20477
20478           link.source = function(_) {
20479             return arguments.length ? (source = _, link) : source;
20480           };
20481
20482           link.target = function(_) {
20483             return arguments.length ? (target = _, link) : target;
20484           };
20485
20486           link.x = function(_) {
20487             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x;
20488           };
20489
20490           link.y = function(_) {
20491             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y;
20492           };
20493
20494           link.context = function(_) {
20495             return arguments.length ? ((context = _ == null ? null : _), link) : context;
20496           };
20497
20498           return link;
20499         }
20500
20501         function curveHorizontal(context, x0, y0, x1, y1) {
20502           context.moveTo(x0, y0);
20503           context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
20504         }
20505
20506         function curveVertical(context, x0, y0, x1, y1) {
20507           context.moveTo(x0, y0);
20508           context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
20509         }
20510
20511         function curveRadial$1(context, x0, y0, x1, y1) {
20512           var p0 = pointRadial(x0, y0),
20513               p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
20514               p2 = pointRadial(x1, y0),
20515               p3 = pointRadial(x1, y1);
20516           context.moveTo(p0[0], p0[1]);
20517           context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
20518         }
20519
20520         function linkHorizontal() {
20521           return link$2(curveHorizontal);
20522         }
20523
20524         function linkVertical() {
20525           return link$2(curveVertical);
20526         }
20527
20528         function linkRadial() {
20529           var l = link$2(curveRadial$1);
20530           l.angle = l.x, delete l.x;
20531           l.radius = l.y, delete l.y;
20532           return l;
20533         }
20534
20535         var circle$2 = {
20536           draw: function(context, size) {
20537             var r = Math.sqrt(size / pi$4);
20538             context.moveTo(r, 0);
20539             context.arc(0, 0, r, 0, tau$4);
20540           }
20541         };
20542
20543         var cross$2 = {
20544           draw: function(context, size) {
20545             var r = Math.sqrt(size / 5) / 2;
20546             context.moveTo(-3 * r, -r);
20547             context.lineTo(-r, -r);
20548             context.lineTo(-r, -3 * r);
20549             context.lineTo(r, -3 * r);
20550             context.lineTo(r, -r);
20551             context.lineTo(3 * r, -r);
20552             context.lineTo(3 * r, r);
20553             context.lineTo(r, r);
20554             context.lineTo(r, 3 * r);
20555             context.lineTo(-r, 3 * r);
20556             context.lineTo(-r, r);
20557             context.lineTo(-3 * r, r);
20558             context.closePath();
20559           }
20560         };
20561
20562         var tan30 = Math.sqrt(1 / 3),
20563             tan30_2 = tan30 * 2;
20564
20565         var diamond = {
20566           draw: function(context, size) {
20567             var y = Math.sqrt(size / tan30_2),
20568                 x = y * tan30;
20569             context.moveTo(0, -y);
20570             context.lineTo(x, 0);
20571             context.lineTo(0, y);
20572             context.lineTo(-x, 0);
20573             context.closePath();
20574           }
20575         };
20576
20577         var ka = 0.89081309152928522810,
20578             kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
20579             kx = Math.sin(tau$4 / 10) * kr,
20580             ky = -Math.cos(tau$4 / 10) * kr;
20581
20582         var star = {
20583           draw: function(context, size) {
20584             var r = Math.sqrt(size * ka),
20585                 x = kx * r,
20586                 y = ky * r;
20587             context.moveTo(0, -r);
20588             context.lineTo(x, y);
20589             for (var i = 1; i < 5; ++i) {
20590               var a = tau$4 * i / 5,
20591                   c = Math.cos(a),
20592                   s = Math.sin(a);
20593               context.lineTo(s * r, -c * r);
20594               context.lineTo(c * x - s * y, s * x + c * y);
20595             }
20596             context.closePath();
20597           }
20598         };
20599
20600         var square = {
20601           draw: function(context, size) {
20602             var w = Math.sqrt(size),
20603                 x = -w / 2;
20604             context.rect(x, x, w, w);
20605           }
20606         };
20607
20608         var sqrt3 = Math.sqrt(3);
20609
20610         var triangle = {
20611           draw: function(context, size) {
20612             var y = -Math.sqrt(size / (sqrt3 * 3));
20613             context.moveTo(0, y * 2);
20614             context.lineTo(-sqrt3 * y, -y);
20615             context.lineTo(sqrt3 * y, -y);
20616             context.closePath();
20617           }
20618         };
20619
20620         var c$2 = -0.5,
20621             s = Math.sqrt(3) / 2,
20622             k = 1 / Math.sqrt(12),
20623             a = (k / 2 + 1) * 3;
20624
20625         var wye = {
20626           draw: function(context, size) {
20627             var r = Math.sqrt(size / a),
20628                 x0 = r / 2,
20629                 y0 = r * k,
20630                 x1 = x0,
20631                 y1 = r * k + r,
20632                 x2 = -x1,
20633                 y2 = y1;
20634             context.moveTo(x0, y0);
20635             context.lineTo(x1, y1);
20636             context.lineTo(x2, y2);
20637             context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0);
20638             context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1);
20639             context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2);
20640             context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0);
20641             context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1);
20642             context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2);
20643             context.closePath();
20644           }
20645         };
20646
20647         var symbols = [
20648           circle$2,
20649           cross$2,
20650           diamond,
20651           square,
20652           star,
20653           triangle,
20654           wye
20655         ];
20656
20657         function symbol() {
20658           var type = constant$b(circle$2),
20659               size = constant$b(64),
20660               context = null;
20661
20662           function symbol() {
20663             var buffer;
20664             if (!context) context = buffer = path();
20665             type.apply(this, arguments).draw(context, +size.apply(this, arguments));
20666             if (buffer) return context = null, buffer + "" || null;
20667           }
20668
20669           symbol.type = function(_) {
20670             return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type;
20671           };
20672
20673           symbol.size = function(_) {
20674             return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size;
20675           };
20676
20677           symbol.context = function(_) {
20678             return arguments.length ? (context = _ == null ? null : _, symbol) : context;
20679           };
20680
20681           return symbol;
20682         }
20683
20684         function noop$5() {}
20685
20686         function point$2(that, x, y) {
20687           that._context.bezierCurveTo(
20688             (2 * that._x0 + that._x1) / 3,
20689             (2 * that._y0 + that._y1) / 3,
20690             (that._x0 + 2 * that._x1) / 3,
20691             (that._y0 + 2 * that._y1) / 3,
20692             (that._x0 + 4 * that._x1 + x) / 6,
20693             (that._y0 + 4 * that._y1 + y) / 6
20694           );
20695         }
20696
20697         function Basis(context) {
20698           this._context = context;
20699         }
20700
20701         Basis.prototype = {
20702           areaStart: function() {
20703             this._line = 0;
20704           },
20705           areaEnd: function() {
20706             this._line = NaN;
20707           },
20708           lineStart: function() {
20709             this._x0 = this._x1 =
20710             this._y0 = this._y1 = NaN;
20711             this._point = 0;
20712           },
20713           lineEnd: function() {
20714             switch (this._point) {
20715               case 3: point$2(this, this._x1, this._y1); // proceed
20716               case 2: this._context.lineTo(this._x1, this._y1); break;
20717             }
20718             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20719             this._line = 1 - this._line;
20720           },
20721           point: function(x, y) {
20722             x = +x, y = +y;
20723             switch (this._point) {
20724               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20725               case 1: this._point = 2; break;
20726               case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
20727               default: point$2(this, x, y); break;
20728             }
20729             this._x0 = this._x1, this._x1 = x;
20730             this._y0 = this._y1, this._y1 = y;
20731           }
20732         };
20733
20734         function basis$2(context) {
20735           return new Basis(context);
20736         }
20737
20738         function BasisClosed(context) {
20739           this._context = context;
20740         }
20741
20742         BasisClosed.prototype = {
20743           areaStart: noop$5,
20744           areaEnd: noop$5,
20745           lineStart: function() {
20746             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
20747             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
20748             this._point = 0;
20749           },
20750           lineEnd: function() {
20751             switch (this._point) {
20752               case 1: {
20753                 this._context.moveTo(this._x2, this._y2);
20754                 this._context.closePath();
20755                 break;
20756               }
20757               case 2: {
20758                 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
20759                 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
20760                 this._context.closePath();
20761                 break;
20762               }
20763               case 3: {
20764                 this.point(this._x2, this._y2);
20765                 this.point(this._x3, this._y3);
20766                 this.point(this._x4, this._y4);
20767                 break;
20768               }
20769             }
20770           },
20771           point: function(x, y) {
20772             x = +x, y = +y;
20773             switch (this._point) {
20774               case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
20775               case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
20776               case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
20777               default: point$2(this, x, y); break;
20778             }
20779             this._x0 = this._x1, this._x1 = x;
20780             this._y0 = this._y1, this._y1 = y;
20781           }
20782         };
20783
20784         function basisClosed$1(context) {
20785           return new BasisClosed(context);
20786         }
20787
20788         function BasisOpen(context) {
20789           this._context = context;
20790         }
20791
20792         BasisOpen.prototype = {
20793           areaStart: function() {
20794             this._line = 0;
20795           },
20796           areaEnd: function() {
20797             this._line = NaN;
20798           },
20799           lineStart: function() {
20800             this._x0 = this._x1 =
20801             this._y0 = this._y1 = NaN;
20802             this._point = 0;
20803           },
20804           lineEnd: function() {
20805             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20806             this._line = 1 - this._line;
20807           },
20808           point: function(x, y) {
20809             x = +x, y = +y;
20810             switch (this._point) {
20811               case 0: this._point = 1; break;
20812               case 1: this._point = 2; break;
20813               case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
20814               case 3: this._point = 4; // proceed
20815               default: point$2(this, x, y); break;
20816             }
20817             this._x0 = this._x1, this._x1 = x;
20818             this._y0 = this._y1, this._y1 = y;
20819           }
20820         };
20821
20822         function basisOpen(context) {
20823           return new BasisOpen(context);
20824         }
20825
20826         function Bundle(context, beta) {
20827           this._basis = new Basis(context);
20828           this._beta = beta;
20829         }
20830
20831         Bundle.prototype = {
20832           lineStart: function() {
20833             this._x = [];
20834             this._y = [];
20835             this._basis.lineStart();
20836           },
20837           lineEnd: function() {
20838             var x = this._x,
20839                 y = this._y,
20840                 j = x.length - 1;
20841
20842             if (j > 0) {
20843               var x0 = x[0],
20844                   y0 = y[0],
20845                   dx = x[j] - x0,
20846                   dy = y[j] - y0,
20847                   i = -1,
20848                   t;
20849
20850               while (++i <= j) {
20851                 t = i / j;
20852                 this._basis.point(
20853                   this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
20854                   this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
20855                 );
20856               }
20857             }
20858
20859             this._x = this._y = null;
20860             this._basis.lineEnd();
20861           },
20862           point: function(x, y) {
20863             this._x.push(+x);
20864             this._y.push(+y);
20865           }
20866         };
20867
20868         var bundle = (function custom(beta) {
20869
20870           function bundle(context) {
20871             return beta === 1 ? new Basis(context) : new Bundle(context, beta);
20872           }
20873
20874           bundle.beta = function(beta) {
20875             return custom(+beta);
20876           };
20877
20878           return bundle;
20879         })(0.85);
20880
20881         function point$3(that, x, y) {
20882           that._context.bezierCurveTo(
20883             that._x1 + that._k * (that._x2 - that._x0),
20884             that._y1 + that._k * (that._y2 - that._y0),
20885             that._x2 + that._k * (that._x1 - x),
20886             that._y2 + that._k * (that._y1 - y),
20887             that._x2,
20888             that._y2
20889           );
20890         }
20891
20892         function Cardinal(context, tension) {
20893           this._context = context;
20894           this._k = (1 - tension) / 6;
20895         }
20896
20897         Cardinal.prototype = {
20898           areaStart: function() {
20899             this._line = 0;
20900           },
20901           areaEnd: function() {
20902             this._line = NaN;
20903           },
20904           lineStart: function() {
20905             this._x0 = this._x1 = this._x2 =
20906             this._y0 = this._y1 = this._y2 = NaN;
20907             this._point = 0;
20908           },
20909           lineEnd: function() {
20910             switch (this._point) {
20911               case 2: this._context.lineTo(this._x2, this._y2); break;
20912               case 3: point$3(this, this._x1, this._y1); break;
20913             }
20914             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20915             this._line = 1 - this._line;
20916           },
20917           point: function(x, y) {
20918             x = +x, y = +y;
20919             switch (this._point) {
20920               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20921               case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
20922               case 2: this._point = 3; // proceed
20923               default: point$3(this, x, y); break;
20924             }
20925             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20926             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20927           }
20928         };
20929
20930         var cardinal = (function custom(tension) {
20931
20932           function cardinal(context) {
20933             return new Cardinal(context, tension);
20934           }
20935
20936           cardinal.tension = function(tension) {
20937             return custom(+tension);
20938           };
20939
20940           return cardinal;
20941         })(0);
20942
20943         function CardinalClosed(context, tension) {
20944           this._context = context;
20945           this._k = (1 - tension) / 6;
20946         }
20947
20948         CardinalClosed.prototype = {
20949           areaStart: noop$5,
20950           areaEnd: noop$5,
20951           lineStart: function() {
20952             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20953             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20954             this._point = 0;
20955           },
20956           lineEnd: function() {
20957             switch (this._point) {
20958               case 1: {
20959                 this._context.moveTo(this._x3, this._y3);
20960                 this._context.closePath();
20961                 break;
20962               }
20963               case 2: {
20964                 this._context.lineTo(this._x3, this._y3);
20965                 this._context.closePath();
20966                 break;
20967               }
20968               case 3: {
20969                 this.point(this._x3, this._y3);
20970                 this.point(this._x4, this._y4);
20971                 this.point(this._x5, this._y5);
20972                 break;
20973               }
20974             }
20975           },
20976           point: function(x, y) {
20977             x = +x, y = +y;
20978             switch (this._point) {
20979               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
20980               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
20981               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
20982               default: point$3(this, x, y); break;
20983             }
20984             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20985             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20986           }
20987         };
20988
20989         var cardinalClosed = (function custom(tension) {
20990
20991           function cardinal(context) {
20992             return new CardinalClosed(context, tension);
20993           }
20994
20995           cardinal.tension = function(tension) {
20996             return custom(+tension);
20997           };
20998
20999           return cardinal;
21000         })(0);
21001
21002         function CardinalOpen(context, tension) {
21003           this._context = context;
21004           this._k = (1 - tension) / 6;
21005         }
21006
21007         CardinalOpen.prototype = {
21008           areaStart: function() {
21009             this._line = 0;
21010           },
21011           areaEnd: function() {
21012             this._line = NaN;
21013           },
21014           lineStart: function() {
21015             this._x0 = this._x1 = this._x2 =
21016             this._y0 = this._y1 = this._y2 = NaN;
21017             this._point = 0;
21018           },
21019           lineEnd: function() {
21020             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21021             this._line = 1 - this._line;
21022           },
21023           point: function(x, y) {
21024             x = +x, y = +y;
21025             switch (this._point) {
21026               case 0: this._point = 1; break;
21027               case 1: this._point = 2; break;
21028               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21029               case 3: this._point = 4; // proceed
21030               default: point$3(this, x, y); break;
21031             }
21032             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21033             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21034           }
21035         };
21036
21037         var cardinalOpen = (function custom(tension) {
21038
21039           function cardinal(context) {
21040             return new CardinalOpen(context, tension);
21041           }
21042
21043           cardinal.tension = function(tension) {
21044             return custom(+tension);
21045           };
21046
21047           return cardinal;
21048         })(0);
21049
21050         function point$4(that, x, y) {
21051           var x1 = that._x1,
21052               y1 = that._y1,
21053               x2 = that._x2,
21054               y2 = that._y2;
21055
21056           if (that._l01_a > epsilon$3) {
21057             var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
21058                 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
21059             x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
21060             y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
21061           }
21062
21063           if (that._l23_a > epsilon$3) {
21064             var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
21065                 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
21066             x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
21067             y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
21068           }
21069
21070           that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
21071         }
21072
21073         function CatmullRom(context, alpha) {
21074           this._context = context;
21075           this._alpha = alpha;
21076         }
21077
21078         CatmullRom.prototype = {
21079           areaStart: function() {
21080             this._line = 0;
21081           },
21082           areaEnd: function() {
21083             this._line = NaN;
21084           },
21085           lineStart: function() {
21086             this._x0 = this._x1 = this._x2 =
21087             this._y0 = this._y1 = this._y2 = NaN;
21088             this._l01_a = this._l12_a = this._l23_a =
21089             this._l01_2a = this._l12_2a = this._l23_2a =
21090             this._point = 0;
21091           },
21092           lineEnd: function() {
21093             switch (this._point) {
21094               case 2: this._context.lineTo(this._x2, this._y2); break;
21095               case 3: this.point(this._x2, this._y2); break;
21096             }
21097             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21098             this._line = 1 - this._line;
21099           },
21100           point: function(x, y) {
21101             x = +x, y = +y;
21102
21103             if (this._point) {
21104               var x23 = this._x2 - x,
21105                   y23 = this._y2 - y;
21106               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21107             }
21108
21109             switch (this._point) {
21110               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21111               case 1: this._point = 2; break;
21112               case 2: this._point = 3; // proceed
21113               default: point$4(this, x, y); break;
21114             }
21115
21116             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21117             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21118             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21119             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21120           }
21121         };
21122
21123         var catmullRom = (function custom(alpha) {
21124
21125           function catmullRom(context) {
21126             return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
21127           }
21128
21129           catmullRom.alpha = function(alpha) {
21130             return custom(+alpha);
21131           };
21132
21133           return catmullRom;
21134         })(0.5);
21135
21136         function CatmullRomClosed(context, alpha) {
21137           this._context = context;
21138           this._alpha = alpha;
21139         }
21140
21141         CatmullRomClosed.prototype = {
21142           areaStart: noop$5,
21143           areaEnd: noop$5,
21144           lineStart: function() {
21145             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
21146             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
21147             this._l01_a = this._l12_a = this._l23_a =
21148             this._l01_2a = this._l12_2a = this._l23_2a =
21149             this._point = 0;
21150           },
21151           lineEnd: function() {
21152             switch (this._point) {
21153               case 1: {
21154                 this._context.moveTo(this._x3, this._y3);
21155                 this._context.closePath();
21156                 break;
21157               }
21158               case 2: {
21159                 this._context.lineTo(this._x3, this._y3);
21160                 this._context.closePath();
21161                 break;
21162               }
21163               case 3: {
21164                 this.point(this._x3, this._y3);
21165                 this.point(this._x4, this._y4);
21166                 this.point(this._x5, this._y5);
21167                 break;
21168               }
21169             }
21170           },
21171           point: function(x, y) {
21172             x = +x, y = +y;
21173
21174             if (this._point) {
21175               var x23 = this._x2 - x,
21176                   y23 = this._y2 - y;
21177               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21178             }
21179
21180             switch (this._point) {
21181               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
21182               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
21183               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
21184               default: point$4(this, x, y); break;
21185             }
21186
21187             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21188             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21189             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21190             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21191           }
21192         };
21193
21194         var catmullRomClosed = (function custom(alpha) {
21195
21196           function catmullRom(context) {
21197             return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
21198           }
21199
21200           catmullRom.alpha = function(alpha) {
21201             return custom(+alpha);
21202           };
21203
21204           return catmullRom;
21205         })(0.5);
21206
21207         function CatmullRomOpen(context, alpha) {
21208           this._context = context;
21209           this._alpha = alpha;
21210         }
21211
21212         CatmullRomOpen.prototype = {
21213           areaStart: function() {
21214             this._line = 0;
21215           },
21216           areaEnd: function() {
21217             this._line = NaN;
21218           },
21219           lineStart: function() {
21220             this._x0 = this._x1 = this._x2 =
21221             this._y0 = this._y1 = this._y2 = NaN;
21222             this._l01_a = this._l12_a = this._l23_a =
21223             this._l01_2a = this._l12_2a = this._l23_2a =
21224             this._point = 0;
21225           },
21226           lineEnd: function() {
21227             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21228             this._line = 1 - this._line;
21229           },
21230           point: function(x, y) {
21231             x = +x, y = +y;
21232
21233             if (this._point) {
21234               var x23 = this._x2 - x,
21235                   y23 = this._y2 - y;
21236               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21237             }
21238
21239             switch (this._point) {
21240               case 0: this._point = 1; break;
21241               case 1: this._point = 2; break;
21242               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21243               case 3: this._point = 4; // proceed
21244               default: point$4(this, x, y); break;
21245             }
21246
21247             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21248             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21249             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21250             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21251           }
21252         };
21253
21254         var catmullRomOpen = (function custom(alpha) {
21255
21256           function catmullRom(context) {
21257             return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
21258           }
21259
21260           catmullRom.alpha = function(alpha) {
21261             return custom(+alpha);
21262           };
21263
21264           return catmullRom;
21265         })(0.5);
21266
21267         function LinearClosed(context) {
21268           this._context = context;
21269         }
21270
21271         LinearClosed.prototype = {
21272           areaStart: noop$5,
21273           areaEnd: noop$5,
21274           lineStart: function() {
21275             this._point = 0;
21276           },
21277           lineEnd: function() {
21278             if (this._point) this._context.closePath();
21279           },
21280           point: function(x, y) {
21281             x = +x, y = +y;
21282             if (this._point) this._context.lineTo(x, y);
21283             else this._point = 1, this._context.moveTo(x, y);
21284           }
21285         };
21286
21287         function linearClosed(context) {
21288           return new LinearClosed(context);
21289         }
21290
21291         function sign$3(x) {
21292           return x < 0 ? -1 : 1;
21293         }
21294
21295         // Calculate the slopes of the tangents (Hermite-type interpolation) based on
21296         // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
21297         // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
21298         // NOV(II), P. 443, 1990.
21299         function slope3(that, x2, y2) {
21300           var h0 = that._x1 - that._x0,
21301               h1 = x2 - that._x1,
21302               s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
21303               s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
21304               p = (s0 * h1 + s1 * h0) / (h0 + h1);
21305           return (sign$3(s0) + sign$3(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
21306         }
21307
21308         // Calculate a one-sided slope.
21309         function slope2(that, t) {
21310           var h = that._x1 - that._x0;
21311           return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
21312         }
21313
21314         // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
21315         // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
21316         // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
21317         function point$5(that, t0, t1) {
21318           var x0 = that._x0,
21319               y0 = that._y0,
21320               x1 = that._x1,
21321               y1 = that._y1,
21322               dx = (x1 - x0) / 3;
21323           that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
21324         }
21325
21326         function MonotoneX(context) {
21327           this._context = context;
21328         }
21329
21330         MonotoneX.prototype = {
21331           areaStart: function() {
21332             this._line = 0;
21333           },
21334           areaEnd: function() {
21335             this._line = NaN;
21336           },
21337           lineStart: function() {
21338             this._x0 = this._x1 =
21339             this._y0 = this._y1 =
21340             this._t0 = NaN;
21341             this._point = 0;
21342           },
21343           lineEnd: function() {
21344             switch (this._point) {
21345               case 2: this._context.lineTo(this._x1, this._y1); break;
21346               case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
21347             }
21348             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21349             this._line = 1 - this._line;
21350           },
21351           point: function(x, y) {
21352             var t1 = NaN;
21353
21354             x = +x, y = +y;
21355             if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
21356             switch (this._point) {
21357               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21358               case 1: this._point = 2; break;
21359               case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
21360               default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
21361             }
21362
21363             this._x0 = this._x1, this._x1 = x;
21364             this._y0 = this._y1, this._y1 = y;
21365             this._t0 = t1;
21366           }
21367         };
21368
21369         function MonotoneY(context) {
21370           this._context = new ReflectContext(context);
21371         }
21372
21373         (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
21374           MonotoneX.prototype.point.call(this, y, x);
21375         };
21376
21377         function ReflectContext(context) {
21378           this._context = context;
21379         }
21380
21381         ReflectContext.prototype = {
21382           moveTo: function(x, y) { this._context.moveTo(y, x); },
21383           closePath: function() { this._context.closePath(); },
21384           lineTo: function(x, y) { this._context.lineTo(y, x); },
21385           bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
21386         };
21387
21388         function monotoneX(context) {
21389           return new MonotoneX(context);
21390         }
21391
21392         function monotoneY(context) {
21393           return new MonotoneY(context);
21394         }
21395
21396         function Natural(context) {
21397           this._context = context;
21398         }
21399
21400         Natural.prototype = {
21401           areaStart: function() {
21402             this._line = 0;
21403           },
21404           areaEnd: function() {
21405             this._line = NaN;
21406           },
21407           lineStart: function() {
21408             this._x = [];
21409             this._y = [];
21410           },
21411           lineEnd: function() {
21412             var x = this._x,
21413                 y = this._y,
21414                 n = x.length;
21415
21416             if (n) {
21417               this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
21418               if (n === 2) {
21419                 this._context.lineTo(x[1], y[1]);
21420               } else {
21421                 var px = controlPoints(x),
21422                     py = controlPoints(y);
21423                 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
21424                   this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
21425                 }
21426               }
21427             }
21428
21429             if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
21430             this._line = 1 - this._line;
21431             this._x = this._y = null;
21432           },
21433           point: function(x, y) {
21434             this._x.push(+x);
21435             this._y.push(+y);
21436           }
21437         };
21438
21439         // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
21440         function controlPoints(x) {
21441           var i,
21442               n = x.length - 1,
21443               m,
21444               a = new Array(n),
21445               b = new Array(n),
21446               r = new Array(n);
21447           a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
21448           for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
21449           a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
21450           for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
21451           a[n - 1] = r[n - 1] / b[n - 1];
21452           for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
21453           b[n - 1] = (x[n] + a[n - 1]) / 2;
21454           for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
21455           return [a, b];
21456         }
21457
21458         function natural(context) {
21459           return new Natural(context);
21460         }
21461
21462         function Step(context, t) {
21463           this._context = context;
21464           this._t = t;
21465         }
21466
21467         Step.prototype = {
21468           areaStart: function() {
21469             this._line = 0;
21470           },
21471           areaEnd: function() {
21472             this._line = NaN;
21473           },
21474           lineStart: function() {
21475             this._x = this._y = NaN;
21476             this._point = 0;
21477           },
21478           lineEnd: function() {
21479             if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
21480             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21481             if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
21482           },
21483           point: function(x, y) {
21484             x = +x, y = +y;
21485             switch (this._point) {
21486               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21487               case 1: this._point = 2; // proceed
21488               default: {
21489                 if (this._t <= 0) {
21490                   this._context.lineTo(this._x, y);
21491                   this._context.lineTo(x, y);
21492                 } else {
21493                   var x1 = this._x * (1 - this._t) + x * this._t;
21494                   this._context.lineTo(x1, this._y);
21495                   this._context.lineTo(x1, y);
21496                 }
21497                 break;
21498               }
21499             }
21500             this._x = x, this._y = y;
21501           }
21502         };
21503
21504         function step(context) {
21505           return new Step(context, 0.5);
21506         }
21507
21508         function stepBefore(context) {
21509           return new Step(context, 0);
21510         }
21511
21512         function stepAfter(context) {
21513           return new Step(context, 1);
21514         }
21515
21516         function none$1(series, order) {
21517           if (!((n = series.length) > 1)) return;
21518           for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
21519             s0 = s1, s1 = series[order[i]];
21520             for (j = 0; j < m; ++j) {
21521               s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
21522             }
21523           }
21524         }
21525
21526         function none$2(series) {
21527           var n = series.length, o = new Array(n);
21528           while (--n >= 0) o[n] = n;
21529           return o;
21530         }
21531
21532         function stackValue(d, key) {
21533           return d[key];
21534         }
21535
21536         function stack() {
21537           var keys = constant$b([]),
21538               order = none$2,
21539               offset = none$1,
21540               value = stackValue;
21541
21542           function stack(data) {
21543             var kz = keys.apply(this, arguments),
21544                 i,
21545                 m = data.length,
21546                 n = kz.length,
21547                 sz = new Array(n),
21548                 oz;
21549
21550             for (i = 0; i < n; ++i) {
21551               for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
21552                 si[j] = sij = [0, +value(data[j], ki, j, data)];
21553                 sij.data = data[j];
21554               }
21555               si.key = ki;
21556             }
21557
21558             for (i = 0, oz = order(sz); i < n; ++i) {
21559               sz[oz[i]].index = i;
21560             }
21561
21562             offset(sz, oz);
21563             return sz;
21564           }
21565
21566           stack.keys = function(_) {
21567             return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : keys;
21568           };
21569
21570           stack.value = function(_) {
21571             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value;
21572           };
21573
21574           stack.order = function(_) {
21575             return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : order;
21576           };
21577
21578           stack.offset = function(_) {
21579             return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
21580           };
21581
21582           return stack;
21583         }
21584
21585         function expand(series, order) {
21586           if (!((n = series.length) > 0)) return;
21587           for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
21588             for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
21589             if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
21590           }
21591           none$1(series, order);
21592         }
21593
21594         function diverging$1(series, order) {
21595           if (!((n = series.length) > 0)) return;
21596           for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
21597             for (yp = yn = 0, i = 0; i < n; ++i) {
21598               if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
21599                 d[0] = yp, d[1] = yp += dy;
21600               } else if (dy < 0) {
21601                 d[1] = yn, d[0] = yn += dy;
21602               } else {
21603                 d[0] = yp;
21604               }
21605             }
21606           }
21607         }
21608
21609         function silhouette(series, order) {
21610           if (!((n = series.length) > 0)) return;
21611           for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
21612             for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
21613             s0[j][1] += s0[j][0] = -y / 2;
21614           }
21615           none$1(series, order);
21616         }
21617
21618         function wiggle(series, order) {
21619           if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
21620           for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
21621             for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
21622               var si = series[order[i]],
21623                   sij0 = si[j][1] || 0,
21624                   sij1 = si[j - 1][1] || 0,
21625                   s3 = (sij0 - sij1) / 2;
21626               for (var k = 0; k < i; ++k) {
21627                 var sk = series[order[k]],
21628                     skj0 = sk[j][1] || 0,
21629                     skj1 = sk[j - 1][1] || 0;
21630                 s3 += skj0 - skj1;
21631               }
21632               s1 += sij0, s2 += s3 * sij0;
21633             }
21634             s0[j - 1][1] += s0[j - 1][0] = y;
21635             if (s1) y -= s2 / s1;
21636           }
21637           s0[j - 1][1] += s0[j - 1][0] = y;
21638           none$1(series, order);
21639         }
21640
21641         function appearance(series) {
21642           var peaks = series.map(peak);
21643           return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
21644         }
21645
21646         function peak(series) {
21647           var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
21648           while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
21649           return j;
21650         }
21651
21652         function ascending$2(series) {
21653           var sums = series.map(sum$2);
21654           return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
21655         }
21656
21657         function sum$2(series) {
21658           var s = 0, i = -1, n = series.length, v;
21659           while (++i < n) if (v = +series[i][1]) s += v;
21660           return s;
21661         }
21662
21663         function descending$1(series) {
21664           return ascending$2(series).reverse();
21665         }
21666
21667         function insideOut(series) {
21668           var n = series.length,
21669               i,
21670               j,
21671               sums = series.map(sum$2),
21672               order = appearance(series),
21673               top = 0,
21674               bottom = 0,
21675               tops = [],
21676               bottoms = [];
21677
21678           for (i = 0; i < n; ++i) {
21679             j = order[i];
21680             if (top < bottom) {
21681               top += sums[j];
21682               tops.push(j);
21683             } else {
21684               bottom += sums[j];
21685               bottoms.push(j);
21686             }
21687           }
21688
21689           return bottoms.reverse().concat(tops);
21690         }
21691
21692         function reverse(series) {
21693           return none$2(series).reverse();
21694         }
21695
21696         function constant$c(x) {
21697           return function() {
21698             return x;
21699           };
21700         }
21701
21702         function x$4(d) {
21703           return d[0];
21704         }
21705
21706         function y$4(d) {
21707           return d[1];
21708         }
21709
21710         function RedBlackTree() {
21711           this._ = null; // root node
21712         }
21713
21714         function RedBlackNode(node) {
21715           node.U = // parent node
21716           node.C = // color - true for red, false for black
21717           node.L = // left node
21718           node.R = // right node
21719           node.P = // previous node
21720           node.N = null; // next node
21721         }
21722
21723         RedBlackTree.prototype = {
21724           constructor: RedBlackTree,
21725
21726           insert: function(after, node) {
21727             var parent, grandpa, uncle;
21728
21729             if (after) {
21730               node.P = after;
21731               node.N = after.N;
21732               if (after.N) after.N.P = node;
21733               after.N = node;
21734               if (after.R) {
21735                 after = after.R;
21736                 while (after.L) after = after.L;
21737                 after.L = node;
21738               } else {
21739                 after.R = node;
21740               }
21741               parent = after;
21742             } else if (this._) {
21743               after = RedBlackFirst(this._);
21744               node.P = null;
21745               node.N = after;
21746               after.P = after.L = node;
21747               parent = after;
21748             } else {
21749               node.P = node.N = null;
21750               this._ = node;
21751               parent = null;
21752             }
21753             node.L = node.R = null;
21754             node.U = parent;
21755             node.C = true;
21756
21757             after = node;
21758             while (parent && parent.C) {
21759               grandpa = parent.U;
21760               if (parent === grandpa.L) {
21761                 uncle = grandpa.R;
21762                 if (uncle && uncle.C) {
21763                   parent.C = uncle.C = false;
21764                   grandpa.C = true;
21765                   after = grandpa;
21766                 } else {
21767                   if (after === parent.R) {
21768                     RedBlackRotateLeft(this, parent);
21769                     after = parent;
21770                     parent = after.U;
21771                   }
21772                   parent.C = false;
21773                   grandpa.C = true;
21774                   RedBlackRotateRight(this, grandpa);
21775                 }
21776               } else {
21777                 uncle = grandpa.L;
21778                 if (uncle && uncle.C) {
21779                   parent.C = uncle.C = false;
21780                   grandpa.C = true;
21781                   after = grandpa;
21782                 } else {
21783                   if (after === parent.L) {
21784                     RedBlackRotateRight(this, parent);
21785                     after = parent;
21786                     parent = after.U;
21787                   }
21788                   parent.C = false;
21789                   grandpa.C = true;
21790                   RedBlackRotateLeft(this, grandpa);
21791                 }
21792               }
21793               parent = after.U;
21794             }
21795             this._.C = false;
21796           },
21797
21798           remove: function(node) {
21799             if (node.N) node.N.P = node.P;
21800             if (node.P) node.P.N = node.N;
21801             node.N = node.P = null;
21802
21803             var parent = node.U,
21804                 sibling,
21805                 left = node.L,
21806                 right = node.R,
21807                 next,
21808                 red;
21809
21810             if (!left) next = right;
21811             else if (!right) next = left;
21812             else next = RedBlackFirst(right);
21813
21814             if (parent) {
21815               if (parent.L === node) parent.L = next;
21816               else parent.R = next;
21817             } else {
21818               this._ = next;
21819             }
21820
21821             if (left && right) {
21822               red = next.C;
21823               next.C = node.C;
21824               next.L = left;
21825               left.U = next;
21826               if (next !== right) {
21827                 parent = next.U;
21828                 next.U = node.U;
21829                 node = next.R;
21830                 parent.L = node;
21831                 next.R = right;
21832                 right.U = next;
21833               } else {
21834                 next.U = parent;
21835                 parent = next;
21836                 node = next.R;
21837               }
21838             } else {
21839               red = node.C;
21840               node = next;
21841             }
21842
21843             if (node) node.U = parent;
21844             if (red) return;
21845             if (node && node.C) { node.C = false; return; }
21846
21847             do {
21848               if (node === this._) break;
21849               if (node === parent.L) {
21850                 sibling = parent.R;
21851                 if (sibling.C) {
21852                   sibling.C = false;
21853                   parent.C = true;
21854                   RedBlackRotateLeft(this, parent);
21855                   sibling = parent.R;
21856                 }
21857                 if ((sibling.L && sibling.L.C)
21858                     || (sibling.R && sibling.R.C)) {
21859                   if (!sibling.R || !sibling.R.C) {
21860                     sibling.L.C = false;
21861                     sibling.C = true;
21862                     RedBlackRotateRight(this, sibling);
21863                     sibling = parent.R;
21864                   }
21865                   sibling.C = parent.C;
21866                   parent.C = sibling.R.C = false;
21867                   RedBlackRotateLeft(this, parent);
21868                   node = this._;
21869                   break;
21870                 }
21871               } else {
21872                 sibling = parent.L;
21873                 if (sibling.C) {
21874                   sibling.C = false;
21875                   parent.C = true;
21876                   RedBlackRotateRight(this, parent);
21877                   sibling = parent.L;
21878                 }
21879                 if ((sibling.L && sibling.L.C)
21880                   || (sibling.R && sibling.R.C)) {
21881                   if (!sibling.L || !sibling.L.C) {
21882                     sibling.R.C = false;
21883                     sibling.C = true;
21884                     RedBlackRotateLeft(this, sibling);
21885                     sibling = parent.L;
21886                   }
21887                   sibling.C = parent.C;
21888                   parent.C = sibling.L.C = false;
21889                   RedBlackRotateRight(this, parent);
21890                   node = this._;
21891                   break;
21892                 }
21893               }
21894               sibling.C = true;
21895               node = parent;
21896               parent = parent.U;
21897             } while (!node.C);
21898
21899             if (node) node.C = false;
21900           }
21901         };
21902
21903         function RedBlackRotateLeft(tree, node) {
21904           var p = node,
21905               q = node.R,
21906               parent = p.U;
21907
21908           if (parent) {
21909             if (parent.L === p) parent.L = q;
21910             else parent.R = q;
21911           } else {
21912             tree._ = q;
21913           }
21914
21915           q.U = parent;
21916           p.U = q;
21917           p.R = q.L;
21918           if (p.R) p.R.U = p;
21919           q.L = p;
21920         }
21921
21922         function RedBlackRotateRight(tree, node) {
21923           var p = node,
21924               q = node.L,
21925               parent = p.U;
21926
21927           if (parent) {
21928             if (parent.L === p) parent.L = q;
21929             else parent.R = q;
21930           } else {
21931             tree._ = q;
21932           }
21933
21934           q.U = parent;
21935           p.U = q;
21936           p.L = q.R;
21937           if (p.L) p.L.U = p;
21938           q.R = p;
21939         }
21940
21941         function RedBlackFirst(node) {
21942           while (node.L) node = node.L;
21943           return node;
21944         }
21945
21946         function createEdge(left, right, v0, v1) {
21947           var edge = [null, null],
21948               index = edges.push(edge) - 1;
21949           edge.left = left;
21950           edge.right = right;
21951           if (v0) setEdgeEnd(edge, left, right, v0);
21952           if (v1) setEdgeEnd(edge, right, left, v1);
21953           cells[left.index].halfedges.push(index);
21954           cells[right.index].halfedges.push(index);
21955           return edge;
21956         }
21957
21958         function createBorderEdge(left, v0, v1) {
21959           var edge = [v0, v1];
21960           edge.left = left;
21961           return edge;
21962         }
21963
21964         function setEdgeEnd(edge, left, right, vertex) {
21965           if (!edge[0] && !edge[1]) {
21966             edge[0] = vertex;
21967             edge.left = left;
21968             edge.right = right;
21969           } else if (edge.left === right) {
21970             edge[1] = vertex;
21971           } else {
21972             edge[0] = vertex;
21973           }
21974         }
21975
21976         // Liang–Barsky line clipping.
21977         function clipEdge(edge, x0, y0, x1, y1) {
21978           var a = edge[0],
21979               b = edge[1],
21980               ax = a[0],
21981               ay = a[1],
21982               bx = b[0],
21983               by = b[1],
21984               t0 = 0,
21985               t1 = 1,
21986               dx = bx - ax,
21987               dy = by - ay,
21988               r;
21989
21990           r = x0 - ax;
21991           if (!dx && r > 0) return;
21992           r /= dx;
21993           if (dx < 0) {
21994             if (r < t0) return;
21995             if (r < t1) t1 = r;
21996           } else if (dx > 0) {
21997             if (r > t1) return;
21998             if (r > t0) t0 = r;
21999           }
22000
22001           r = x1 - ax;
22002           if (!dx && r < 0) return;
22003           r /= dx;
22004           if (dx < 0) {
22005             if (r > t1) return;
22006             if (r > t0) t0 = r;
22007           } else if (dx > 0) {
22008             if (r < t0) return;
22009             if (r < t1) t1 = r;
22010           }
22011
22012           r = y0 - ay;
22013           if (!dy && r > 0) return;
22014           r /= dy;
22015           if (dy < 0) {
22016             if (r < t0) return;
22017             if (r < t1) t1 = r;
22018           } else if (dy > 0) {
22019             if (r > t1) return;
22020             if (r > t0) t0 = r;
22021           }
22022
22023           r = y1 - ay;
22024           if (!dy && r < 0) return;
22025           r /= dy;
22026           if (dy < 0) {
22027             if (r > t1) return;
22028             if (r > t0) t0 = r;
22029           } else if (dy > 0) {
22030             if (r < t0) return;
22031             if (r < t1) t1 = r;
22032           }
22033
22034           if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
22035
22036           if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
22037           if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
22038           return true;
22039         }
22040
22041         function connectEdge(edge, x0, y0, x1, y1) {
22042           var v1 = edge[1];
22043           if (v1) return true;
22044
22045           var v0 = edge[0],
22046               left = edge.left,
22047               right = edge.right,
22048               lx = left[0],
22049               ly = left[1],
22050               rx = right[0],
22051               ry = right[1],
22052               fx = (lx + rx) / 2,
22053               fy = (ly + ry) / 2,
22054               fm,
22055               fb;
22056
22057           if (ry === ly) {
22058             if (fx < x0 || fx >= x1) return;
22059             if (lx > rx) {
22060               if (!v0) v0 = [fx, y0];
22061               else if (v0[1] >= y1) return;
22062               v1 = [fx, y1];
22063             } else {
22064               if (!v0) v0 = [fx, y1];
22065               else if (v0[1] < y0) return;
22066               v1 = [fx, y0];
22067             }
22068           } else {
22069             fm = (lx - rx) / (ry - ly);
22070             fb = fy - fm * fx;
22071             if (fm < -1 || fm > 1) {
22072               if (lx > rx) {
22073                 if (!v0) v0 = [(y0 - fb) / fm, y0];
22074                 else if (v0[1] >= y1) return;
22075                 v1 = [(y1 - fb) / fm, y1];
22076               } else {
22077                 if (!v0) v0 = [(y1 - fb) / fm, y1];
22078                 else if (v0[1] < y0) return;
22079                 v1 = [(y0 - fb) / fm, y0];
22080               }
22081             } else {
22082               if (ly < ry) {
22083                 if (!v0) v0 = [x0, fm * x0 + fb];
22084                 else if (v0[0] >= x1) return;
22085                 v1 = [x1, fm * x1 + fb];
22086               } else {
22087                 if (!v0) v0 = [x1, fm * x1 + fb];
22088                 else if (v0[0] < x0) return;
22089                 v1 = [x0, fm * x0 + fb];
22090               }
22091             }
22092           }
22093
22094           edge[0] = v0;
22095           edge[1] = v1;
22096           return true;
22097         }
22098
22099         function clipEdges(x0, y0, x1, y1) {
22100           var i = edges.length,
22101               edge;
22102
22103           while (i--) {
22104             if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
22105                 || !clipEdge(edge, x0, y0, x1, y1)
22106                 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
22107                     || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
22108               delete edges[i];
22109             }
22110           }
22111         }
22112
22113         function createCell(site) {
22114           return cells[site.index] = {
22115             site: site,
22116             halfedges: []
22117           };
22118         }
22119
22120         function cellHalfedgeAngle(cell, edge) {
22121           var site = cell.site,
22122               va = edge.left,
22123               vb = edge.right;
22124           if (site === vb) vb = va, va = site;
22125           if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
22126           if (site === va) va = edge[1], vb = edge[0];
22127           else va = edge[0], vb = edge[1];
22128           return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
22129         }
22130
22131         function cellHalfedgeStart(cell, edge) {
22132           return edge[+(edge.left !== cell.site)];
22133         }
22134
22135         function cellHalfedgeEnd(cell, edge) {
22136           return edge[+(edge.left === cell.site)];
22137         }
22138
22139         function sortCellHalfedges() {
22140           for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
22141             if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
22142               var index = new Array(m),
22143                   array = new Array(m);
22144               for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
22145               index.sort(function(i, j) { return array[j] - array[i]; });
22146               for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
22147               for (j = 0; j < m; ++j) halfedges[j] = array[j];
22148             }
22149           }
22150         }
22151
22152         function clipCells(x0, y0, x1, y1) {
22153           var nCells = cells.length,
22154               iCell,
22155               cell,
22156               site,
22157               iHalfedge,
22158               halfedges,
22159               nHalfedges,
22160               start,
22161               startX,
22162               startY,
22163               end,
22164               endX,
22165               endY,
22166               cover = true;
22167
22168           for (iCell = 0; iCell < nCells; ++iCell) {
22169             if (cell = cells[iCell]) {
22170               site = cell.site;
22171               halfedges = cell.halfedges;
22172               iHalfedge = halfedges.length;
22173
22174               // Remove any dangling clipped edges.
22175               while (iHalfedge--) {
22176                 if (!edges[halfedges[iHalfedge]]) {
22177                   halfedges.splice(iHalfedge, 1);
22178                 }
22179               }
22180
22181               // Insert any border edges as necessary.
22182               iHalfedge = 0, nHalfedges = halfedges.length;
22183               while (iHalfedge < nHalfedges) {
22184                 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
22185                 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
22186                 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
22187                   halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
22188                       Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
22189                       : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
22190                       : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
22191                       : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
22192                       : null)) - 1);
22193                   ++nHalfedges;
22194                 }
22195               }
22196
22197               if (nHalfedges) cover = false;
22198             }
22199           }
22200
22201           // If there weren’t any edges, have the closest site cover the extent.
22202           // It doesn’t matter which corner of the extent we measure!
22203           if (cover) {
22204             var dx, dy, d2, dc = Infinity;
22205
22206             for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
22207               if (cell = cells[iCell]) {
22208                 site = cell.site;
22209                 dx = site[0] - x0;
22210                 dy = site[1] - y0;
22211                 d2 = dx * dx + dy * dy;
22212                 if (d2 < dc) dc = d2, cover = cell;
22213               }
22214             }
22215
22216             if (cover) {
22217               var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
22218               cover.halfedges.push(
22219                 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
22220                 edges.push(createBorderEdge(site, v01, v11)) - 1,
22221                 edges.push(createBorderEdge(site, v11, v10)) - 1,
22222                 edges.push(createBorderEdge(site, v10, v00)) - 1
22223               );
22224             }
22225           }
22226
22227           // Lastly delete any cells with no edges; these were entirely clipped.
22228           for (iCell = 0; iCell < nCells; ++iCell) {
22229             if (cell = cells[iCell]) {
22230               if (!cell.halfedges.length) {
22231                 delete cells[iCell];
22232               }
22233             }
22234           }
22235         }
22236
22237         var circlePool = [];
22238
22239         var firstCircle;
22240
22241         function Circle() {
22242           RedBlackNode(this);
22243           this.x =
22244           this.y =
22245           this.arc =
22246           this.site =
22247           this.cy = null;
22248         }
22249
22250         function attachCircle(arc) {
22251           var lArc = arc.P,
22252               rArc = arc.N;
22253
22254           if (!lArc || !rArc) return;
22255
22256           var lSite = lArc.site,
22257               cSite = arc.site,
22258               rSite = rArc.site;
22259
22260           if (lSite === rSite) return;
22261
22262           var bx = cSite[0],
22263               by = cSite[1],
22264               ax = lSite[0] - bx,
22265               ay = lSite[1] - by,
22266               cx = rSite[0] - bx,
22267               cy = rSite[1] - by;
22268
22269           var d = 2 * (ax * cy - ay * cx);
22270           if (d >= -epsilon2$2) return;
22271
22272           var ha = ax * ax + ay * ay,
22273               hc = cx * cx + cy * cy,
22274               x = (cy * ha - ay * hc) / d,
22275               y = (ax * hc - cx * ha) / d;
22276
22277           var circle = circlePool.pop() || new Circle;
22278           circle.arc = arc;
22279           circle.site = cSite;
22280           circle.x = x + bx;
22281           circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
22282
22283           arc.circle = circle;
22284
22285           var before = null,
22286               node = circles._;
22287
22288           while (node) {
22289             if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
22290               if (node.L) node = node.L;
22291               else { before = node.P; break; }
22292             } else {
22293               if (node.R) node = node.R;
22294               else { before = node; break; }
22295             }
22296           }
22297
22298           circles.insert(before, circle);
22299           if (!before) firstCircle = circle;
22300         }
22301
22302         function detachCircle(arc) {
22303           var circle = arc.circle;
22304           if (circle) {
22305             if (!circle.P) firstCircle = circle.N;
22306             circles.remove(circle);
22307             circlePool.push(circle);
22308             RedBlackNode(circle);
22309             arc.circle = null;
22310           }
22311         }
22312
22313         var beachPool = [];
22314
22315         function Beach() {
22316           RedBlackNode(this);
22317           this.edge =
22318           this.site =
22319           this.circle = null;
22320         }
22321
22322         function createBeach(site) {
22323           var beach = beachPool.pop() || new Beach;
22324           beach.site = site;
22325           return beach;
22326         }
22327
22328         function detachBeach(beach) {
22329           detachCircle(beach);
22330           beaches.remove(beach);
22331           beachPool.push(beach);
22332           RedBlackNode(beach);
22333         }
22334
22335         function removeBeach(beach) {
22336           var circle = beach.circle,
22337               x = circle.x,
22338               y = circle.cy,
22339               vertex = [x, y],
22340               previous = beach.P,
22341               next = beach.N,
22342               disappearing = [beach];
22343
22344           detachBeach(beach);
22345
22346           var lArc = previous;
22347           while (lArc.circle
22348               && Math.abs(x - lArc.circle.x) < epsilon$4
22349               && Math.abs(y - lArc.circle.cy) < epsilon$4) {
22350             previous = lArc.P;
22351             disappearing.unshift(lArc);
22352             detachBeach(lArc);
22353             lArc = previous;
22354           }
22355
22356           disappearing.unshift(lArc);
22357           detachCircle(lArc);
22358
22359           var rArc = next;
22360           while (rArc.circle
22361               && Math.abs(x - rArc.circle.x) < epsilon$4
22362               && Math.abs(y - rArc.circle.cy) < epsilon$4) {
22363             next = rArc.N;
22364             disappearing.push(rArc);
22365             detachBeach(rArc);
22366             rArc = next;
22367           }
22368
22369           disappearing.push(rArc);
22370           detachCircle(rArc);
22371
22372           var nArcs = disappearing.length,
22373               iArc;
22374           for (iArc = 1; iArc < nArcs; ++iArc) {
22375             rArc = disappearing[iArc];
22376             lArc = disappearing[iArc - 1];
22377             setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
22378           }
22379
22380           lArc = disappearing[0];
22381           rArc = disappearing[nArcs - 1];
22382           rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
22383
22384           attachCircle(lArc);
22385           attachCircle(rArc);
22386         }
22387
22388         function addBeach(site) {
22389           var x = site[0],
22390               directrix = site[1],
22391               lArc,
22392               rArc,
22393               dxl,
22394               dxr,
22395               node = beaches._;
22396
22397           while (node) {
22398             dxl = leftBreakPoint(node, directrix) - x;
22399             if (dxl > epsilon$4) node = node.L; else {
22400               dxr = x - rightBreakPoint(node, directrix);
22401               if (dxr > epsilon$4) {
22402                 if (!node.R) {
22403                   lArc = node;
22404                   break;
22405                 }
22406                 node = node.R;
22407               } else {
22408                 if (dxl > -epsilon$4) {
22409                   lArc = node.P;
22410                   rArc = node;
22411                 } else if (dxr > -epsilon$4) {
22412                   lArc = node;
22413                   rArc = node.N;
22414                 } else {
22415                   lArc = rArc = node;
22416                 }
22417                 break;
22418               }
22419             }
22420           }
22421
22422           createCell(site);
22423           var newArc = createBeach(site);
22424           beaches.insert(lArc, newArc);
22425
22426           if (!lArc && !rArc) return;
22427
22428           if (lArc === rArc) {
22429             detachCircle(lArc);
22430             rArc = createBeach(lArc.site);
22431             beaches.insert(newArc, rArc);
22432             newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
22433             attachCircle(lArc);
22434             attachCircle(rArc);
22435             return;
22436           }
22437
22438           if (!rArc) { // && lArc
22439             newArc.edge = createEdge(lArc.site, newArc.site);
22440             return;
22441           }
22442
22443           // else lArc !== rArc
22444           detachCircle(lArc);
22445           detachCircle(rArc);
22446
22447           var lSite = lArc.site,
22448               ax = lSite[0],
22449               ay = lSite[1],
22450               bx = site[0] - ax,
22451               by = site[1] - ay,
22452               rSite = rArc.site,
22453               cx = rSite[0] - ax,
22454               cy = rSite[1] - ay,
22455               d = 2 * (bx * cy - by * cx),
22456               hb = bx * bx + by * by,
22457               hc = cx * cx + cy * cy,
22458               vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
22459
22460           setEdgeEnd(rArc.edge, lSite, rSite, vertex);
22461           newArc.edge = createEdge(lSite, site, null, vertex);
22462           rArc.edge = createEdge(site, rSite, null, vertex);
22463           attachCircle(lArc);
22464           attachCircle(rArc);
22465         }
22466
22467         function leftBreakPoint(arc, directrix) {
22468           var site = arc.site,
22469               rfocx = site[0],
22470               rfocy = site[1],
22471               pby2 = rfocy - directrix;
22472
22473           if (!pby2) return rfocx;
22474
22475           var lArc = arc.P;
22476           if (!lArc) return -Infinity;
22477
22478           site = lArc.site;
22479           var lfocx = site[0],
22480               lfocy = site[1],
22481               plby2 = lfocy - directrix;
22482
22483           if (!plby2) return lfocx;
22484
22485           var hl = lfocx - rfocx,
22486               aby2 = 1 / pby2 - 1 / plby2,
22487               b = hl / plby2;
22488
22489           if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
22490
22491           return (rfocx + lfocx) / 2;
22492         }
22493
22494         function rightBreakPoint(arc, directrix) {
22495           var rArc = arc.N;
22496           if (rArc) return leftBreakPoint(rArc, directrix);
22497           var site = arc.site;
22498           return site[1] === directrix ? site[0] : Infinity;
22499         }
22500
22501         var epsilon$4 = 1e-6;
22502         var epsilon2$2 = 1e-12;
22503         var beaches;
22504         var cells;
22505         var circles;
22506         var edges;
22507
22508         function triangleArea(a, b, c) {
22509           return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
22510         }
22511
22512         function lexicographic(a, b) {
22513           return b[1] - a[1]
22514               || b[0] - a[0];
22515         }
22516
22517         function Diagram(sites, extent) {
22518           var site = sites.sort(lexicographic).pop(),
22519               x,
22520               y,
22521               circle;
22522
22523           edges = [];
22524           cells = new Array(sites.length);
22525           beaches = new RedBlackTree;
22526           circles = new RedBlackTree;
22527
22528           while (true) {
22529             circle = firstCircle;
22530             if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
22531               if (site[0] !== x || site[1] !== y) {
22532                 addBeach(site);
22533                 x = site[0], y = site[1];
22534               }
22535               site = sites.pop();
22536             } else if (circle) {
22537               removeBeach(circle.arc);
22538             } else {
22539               break;
22540             }
22541           }
22542
22543           sortCellHalfedges();
22544
22545           if (extent) {
22546             var x0 = +extent[0][0],
22547                 y0 = +extent[0][1],
22548                 x1 = +extent[1][0],
22549                 y1 = +extent[1][1];
22550             clipEdges(x0, y0, x1, y1);
22551             clipCells(x0, y0, x1, y1);
22552           }
22553
22554           this.edges = edges;
22555           this.cells = cells;
22556
22557           beaches =
22558           circles =
22559           edges =
22560           cells = null;
22561         }
22562
22563         Diagram.prototype = {
22564           constructor: Diagram,
22565
22566           polygons: function() {
22567             var edges = this.edges;
22568
22569             return this.cells.map(function(cell) {
22570               var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
22571               polygon.data = cell.site.data;
22572               return polygon;
22573             });
22574           },
22575
22576           triangles: function() {
22577             var triangles = [],
22578                 edges = this.edges;
22579
22580             this.cells.forEach(function(cell, i) {
22581               if (!(m = (halfedges = cell.halfedges).length)) return;
22582               var site = cell.site,
22583                   halfedges,
22584                   j = -1,
22585                   m,
22586                   s0,
22587                   e1 = edges[halfedges[m - 1]],
22588                   s1 = e1.left === site ? e1.right : e1.left;
22589
22590               while (++j < m) {
22591                 s0 = s1;
22592                 e1 = edges[halfedges[j]];
22593                 s1 = e1.left === site ? e1.right : e1.left;
22594                 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
22595                   triangles.push([site.data, s0.data, s1.data]);
22596                 }
22597               }
22598             });
22599
22600             return triangles;
22601           },
22602
22603           links: function() {
22604             return this.edges.filter(function(edge) {
22605               return edge.right;
22606             }).map(function(edge) {
22607               return {
22608                 source: edge.left.data,
22609                 target: edge.right.data
22610               };
22611             });
22612           },
22613
22614           find: function(x, y, radius) {
22615             var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
22616
22617             // Use the previously-found cell, or start with an arbitrary one.
22618             while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
22619             var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
22620
22621             // Traverse the half-edges to find a closer cell, if any.
22622             do {
22623               cell = that.cells[i0 = i1], i1 = null;
22624               cell.halfedges.forEach(function(e) {
22625                 var edge = that.edges[e], v = edge.left;
22626                 if ((v === cell.site || !v) && !(v = edge.right)) return;
22627                 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
22628                 if (v2 < d2) d2 = v2, i1 = v.index;
22629               });
22630             } while (i1 !== null);
22631
22632             that._found = i0;
22633
22634             return radius == null || d2 <= radius * radius ? cell.site : null;
22635           }
22636         };
22637
22638         function voronoi() {
22639           var x = x$4,
22640               y = y$4,
22641               extent = null;
22642
22643           function voronoi(data) {
22644             return new Diagram(data.map(function(d, i) {
22645               var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
22646               s.index = i;
22647               s.data = d;
22648               return s;
22649             }), extent);
22650           }
22651
22652           voronoi.polygons = function(data) {
22653             return voronoi(data).polygons();
22654           };
22655
22656           voronoi.links = function(data) {
22657             return voronoi(data).links();
22658           };
22659
22660           voronoi.triangles = function(data) {
22661             return voronoi(data).triangles();
22662           };
22663
22664           voronoi.x = function(_) {
22665             return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x;
22666           };
22667
22668           voronoi.y = function(_) {
22669             return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y;
22670           };
22671
22672           voronoi.extent = function(_) {
22673             return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
22674           };
22675
22676           voronoi.size = function(_) {
22677             return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
22678           };
22679
22680           return voronoi;
22681         }
22682
22683         function constant$d(x) {
22684           return function() {
22685             return x;
22686           };
22687         }
22688
22689         function ZoomEvent(target, type, transform) {
22690           this.target = target;
22691           this.type = type;
22692           this.transform = transform;
22693         }
22694
22695         function Transform(k, x, y) {
22696           this.k = k;
22697           this.x = x;
22698           this.y = y;
22699         }
22700
22701         Transform.prototype = {
22702           constructor: Transform,
22703           scale: function(k) {
22704             return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22705           },
22706           translate: function(x, y) {
22707             return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22708           },
22709           apply: function(point) {
22710             return [point[0] * this.k + this.x, point[1] * this.k + this.y];
22711           },
22712           applyX: function(x) {
22713             return x * this.k + this.x;
22714           },
22715           applyY: function(y) {
22716             return y * this.k + this.y;
22717           },
22718           invert: function(location) {
22719             return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22720           },
22721           invertX: function(x) {
22722             return (x - this.x) / this.k;
22723           },
22724           invertY: function(y) {
22725             return (y - this.y) / this.k;
22726           },
22727           rescaleX: function(x) {
22728             return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22729           },
22730           rescaleY: function(y) {
22731             return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22732           },
22733           toString: function() {
22734             return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22735           }
22736         };
22737
22738         var identity$8 = new Transform(1, 0, 0);
22739
22740         transform.prototype = Transform.prototype;
22741
22742         function transform(node) {
22743           return node.__zoom || identity$8;
22744         }
22745
22746         function nopropagation$2() {
22747           event.stopImmediatePropagation();
22748         }
22749
22750         function noevent$2() {
22751           event.preventDefault();
22752           event.stopImmediatePropagation();
22753         }
22754
22755         // Ignore right-click, since that should open the context menu.
22756         function defaultFilter$2() {
22757           return !event.button;
22758         }
22759
22760         function defaultExtent$1() {
22761           var e = this, w, h;
22762           if (e instanceof SVGElement) {
22763             e = e.ownerSVGElement || e;
22764             w = e.width.baseVal.value;
22765             h = e.height.baseVal.value;
22766           } else {
22767             w = e.clientWidth;
22768             h = e.clientHeight;
22769           }
22770           return [[0, 0], [w, h]];
22771         }
22772
22773         function defaultTransform() {
22774           return this.__zoom || identity$8;
22775         }
22776
22777         function defaultWheelDelta() {
22778           return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
22779         }
22780
22781         function defaultTouchable$1() {
22782           return "ontouchstart" in this;
22783         }
22784
22785         function defaultConstrain(transform, extent, translateExtent) {
22786           var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
22787               dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
22788               dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
22789               dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
22790           return transform.translate(
22791             dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22792             dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22793           );
22794         }
22795
22796         function d3_zoom() {
22797           var filter = defaultFilter$2,
22798               extent = defaultExtent$1,
22799               constrain = defaultConstrain,
22800               wheelDelta = defaultWheelDelta,
22801               touchable = defaultTouchable$1,
22802               scaleExtent = [0, Infinity],
22803               translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
22804               duration = 250,
22805               interpolate = interpolateZoom,
22806               gestures = [],
22807               listeners = dispatch("start", "zoom", "end"),
22808               touchstarting,
22809               touchending,
22810               touchDelay = 500,
22811               wheelDelay = 150,
22812               clickDistance2 = 0;
22813
22814           function zoom(selection) {
22815             selection
22816                 .property("__zoom", defaultTransform)
22817                 .on("wheel.zoom", wheeled)
22818                 .on("mousedown.zoom", mousedowned)
22819                 .on("dblclick.zoom", dblclicked)
22820               .filter(touchable)
22821                 .on("touchstart.zoom", touchstarted)
22822                 .on("touchmove.zoom", touchmoved)
22823                 .on("touchend.zoom touchcancel.zoom", touchended)
22824                 .style("touch-action", "none")
22825                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22826           }
22827
22828           zoom.transform = function(collection, transform) {
22829             var selection = collection.selection ? collection.selection() : collection;
22830             selection.property("__zoom", defaultTransform);
22831             if (collection !== selection) {
22832               schedule(collection, transform);
22833             } else {
22834               selection.interrupt().each(function() {
22835                 gesture(this, arguments)
22836                     .start()
22837                     .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
22838                     .end();
22839               });
22840             }
22841           };
22842
22843           zoom.scaleBy = function(selection, k) {
22844             zoom.scaleTo(selection, function() {
22845               var k0 = this.__zoom.k,
22846                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22847               return k0 * k1;
22848             });
22849           };
22850
22851           zoom.scaleTo = function(selection, k) {
22852             zoom.transform(selection, function() {
22853               var e = extent.apply(this, arguments),
22854                   t0 = this.__zoom,
22855                   p0 = centroid(e),
22856                   p1 = t0.invert(p0),
22857                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22858               return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
22859             });
22860           };
22861
22862           zoom.translateBy = function(selection, x, y) {
22863             zoom.transform(selection, function() {
22864               return constrain(this.__zoom.translate(
22865                 typeof x === "function" ? x.apply(this, arguments) : x,
22866                 typeof y === "function" ? y.apply(this, arguments) : y
22867               ), extent.apply(this, arguments), translateExtent);
22868             });
22869           };
22870
22871           zoom.translateTo = function(selection, x, y) {
22872             zoom.transform(selection, function() {
22873               var e = extent.apply(this, arguments),
22874                   t = this.__zoom,
22875                   p = centroid(e);
22876               return constrain(identity$8.translate(p[0], p[1]).scale(t.k).translate(
22877                 typeof x === "function" ? -x.apply(this, arguments) : -x,
22878                 typeof y === "function" ? -y.apply(this, arguments) : -y
22879               ), e, translateExtent);
22880             });
22881           };
22882
22883           function scale(transform, k) {
22884             k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22885             return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
22886           }
22887
22888           function translate(transform, p0, p1) {
22889             var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
22890             return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
22891           }
22892
22893           function centroid(extent) {
22894             return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
22895           }
22896
22897           function schedule(transition, transform, center) {
22898             transition
22899                 .on("start.zoom", function() { gesture(this, arguments).start(); })
22900                 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
22901                 .tween("zoom", function() {
22902                   var that = this,
22903                       args = arguments,
22904                       g = gesture(that, args),
22905                       e = extent.apply(that, args),
22906                       p = center || centroid(e),
22907                       w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
22908                       a = that.__zoom,
22909                       b = typeof transform === "function" ? transform.apply(that, args) : transform,
22910                       i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22911                   return function(t) {
22912                     if (t === 1) t = b; // Avoid rounding error on end.
22913                     else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
22914                     g.zoom(null, t);
22915                   };
22916                 });
22917           }
22918
22919           function gesture(that, args) {
22920             for (var i = 0, n = gestures.length, g; i < n; ++i) {
22921               if ((g = gestures[i]).that === that) {
22922                 return g;
22923               }
22924             }
22925             return new Gesture(that, args);
22926           }
22927
22928           function Gesture(that, args) {
22929             this.that = that;
22930             this.args = args;
22931             this.index = -1;
22932             this.active = 0;
22933             this.extent = extent.apply(that, args);
22934           }
22935
22936           Gesture.prototype = {
22937             start: function() {
22938               if (++this.active === 1) {
22939                 this.index = gestures.push(this) - 1;
22940                 this.emit("start");
22941               }
22942               return this;
22943             },
22944             zoom: function(key, transform) {
22945               if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
22946               if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
22947               if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
22948               this.that.__zoom = transform;
22949               this.emit("zoom");
22950               return this;
22951             },
22952             end: function() {
22953               if (--this.active === 0) {
22954                 gestures.splice(this.index, 1);
22955                 this.index = -1;
22956                 this.emit("end");
22957               }
22958               return this;
22959             },
22960             emit: function(type) {
22961               customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
22962             }
22963           };
22964
22965           function wheeled() {
22966             if (!filter.apply(this, arguments)) return;
22967             var g = gesture(this, arguments),
22968                 t = this.__zoom,
22969                 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
22970                 p = d3_mouse(this);
22971
22972             // If the mouse is in the same location as before, reuse it.
22973             // If there were recent wheel events, reset the wheel idle timeout.
22974             if (g.wheel) {
22975               if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22976                 g.mouse[1] = t.invert(g.mouse[0] = p);
22977               }
22978               clearTimeout(g.wheel);
22979             }
22980
22981             // If this wheel event won’t trigger a transform change, ignore it.
22982             else if (t.k === k) return;
22983
22984             // Otherwise, capture the mouse point and location at the start.
22985             else {
22986               g.mouse = [p, t.invert(p)];
22987               interrupt(this);
22988               g.start();
22989             }
22990
22991             noevent$2();
22992             g.wheel = setTimeout(wheelidled, wheelDelay);
22993             g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22994
22995             function wheelidled() {
22996               g.wheel = null;
22997               g.end();
22998             }
22999           }
23000
23001           function mousedowned() {
23002             if (touchending || !filter.apply(this, arguments)) return;
23003             var g = gesture(this, arguments),
23004                 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
23005                 p = d3_mouse(this),
23006                 x0 = event.clientX,
23007                 y0 = event.clientY;
23008
23009             dragDisable(event.view);
23010             nopropagation$2();
23011             g.mouse = [p, this.__zoom.invert(p)];
23012             interrupt(this);
23013             g.start();
23014
23015             function mousemoved() {
23016               noevent$2();
23017               if (!g.moved) {
23018                 var dx = event.clientX - x0, dy = event.clientY - y0;
23019                 g.moved = dx * dx + dy * dy > clickDistance2;
23020               }
23021               g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
23022             }
23023
23024             function mouseupped() {
23025               v.on("mousemove.zoom mouseup.zoom", null);
23026               yesdrag(event.view, g.moved);
23027               noevent$2();
23028               g.end();
23029             }
23030           }
23031
23032           function dblclicked() {
23033             if (!filter.apply(this, arguments)) return;
23034             var t0 = this.__zoom,
23035                 p0 = d3_mouse(this),
23036                 p1 = t0.invert(p0),
23037                 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
23038                 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
23039
23040             noevent$2();
23041             if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
23042             else d3_select(this).call(zoom.transform, t1);
23043           }
23044
23045           function touchstarted() {
23046             if (!filter.apply(this, arguments)) return;
23047             var g = gesture(this, arguments),
23048                 touches = event.changedTouches,
23049                 started,
23050                 n = touches.length, i, t, p;
23051
23052             nopropagation$2();
23053             for (i = 0; i < n; ++i) {
23054               t = touches[i], p = touch(this, touches, t.identifier);
23055               p = [p, this.__zoom.invert(p), t.identifier];
23056               if (!g.touch0) g.touch0 = p, started = true;
23057               else if (!g.touch1) g.touch1 = p;
23058             }
23059
23060             // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
23061             if (touchstarting) {
23062               touchstarting = clearTimeout(touchstarting);
23063               if (!g.touch1) {
23064                 g.end();
23065                 p = d3_select(this).on("dblclick.zoom");
23066                 if (p) p.apply(this, arguments);
23067                 return;
23068               }
23069             }
23070
23071             if (started) {
23072               touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
23073               interrupt(this);
23074               g.start();
23075             }
23076           }
23077
23078           function touchmoved() {
23079             var g = gesture(this, arguments),
23080                 touches = event.changedTouches,
23081                 n = touches.length, i, t, p, l;
23082
23083             noevent$2();
23084             if (touchstarting) touchstarting = clearTimeout(touchstarting);
23085             for (i = 0; i < n; ++i) {
23086               t = touches[i], p = touch(this, touches, t.identifier);
23087               if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
23088               else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
23089             }
23090             t = g.that.__zoom;
23091             if (g.touch1) {
23092               var p0 = g.touch0[0], l0 = g.touch0[1],
23093                   p1 = g.touch1[0], l1 = g.touch1[1],
23094                   dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
23095                   dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
23096               t = scale(t, Math.sqrt(dp / dl));
23097               p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
23098               l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
23099             }
23100             else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
23101             else return;
23102             g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
23103           }
23104
23105           function touchended() {
23106             var g = gesture(this, arguments),
23107                 touches = event.changedTouches,
23108                 n = touches.length, i, t;
23109
23110             nopropagation$2();
23111             if (touchending) clearTimeout(touchending);
23112             touchending = setTimeout(function() { touchending = null; }, touchDelay);
23113             for (i = 0; i < n; ++i) {
23114               t = touches[i];
23115               if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
23116               else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
23117             }
23118             if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
23119             if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
23120             else g.end();
23121           }
23122
23123           zoom.wheelDelta = function(_) {
23124             return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta;
23125           };
23126
23127           zoom.filter = function(_) {
23128             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter;
23129           };
23130
23131           zoom.touchable = function(_) {
23132             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable;
23133           };
23134
23135           zoom.extent = function(_) {
23136             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
23137           };
23138
23139           zoom.scaleExtent = function(_) {
23140             return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
23141           };
23142
23143           zoom.translateExtent = function(_) {
23144             return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
23145           };
23146
23147           zoom.constrain = function(_) {
23148             return arguments.length ? (constrain = _, zoom) : constrain;
23149           };
23150
23151           zoom.duration = function(_) {
23152             return arguments.length ? (duration = +_, zoom) : duration;
23153           };
23154
23155           zoom.interpolate = function(_) {
23156             return arguments.length ? (interpolate = _, zoom) : interpolate;
23157           };
23158
23159           zoom.on = function() {
23160             var value = listeners.on.apply(listeners, arguments);
23161             return value === listeners ? zoom : value;
23162           };
23163
23164           zoom.clickDistance = function(_) {
23165             return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
23166           };
23167
23168           return zoom;
23169         }
23170
23171
23172
23173         var index$3 = /*#__PURE__*/Object.freeze({
23174                 version: version,
23175                 bisect: bisectRight,
23176                 bisectRight: bisectRight,
23177                 bisectLeft: bisectLeft,
23178                 ascending: d3_ascending,
23179                 bisector: d3_bisector,
23180                 cross: cross,
23181                 descending: d3_descending,
23182                 deviation: deviation,
23183                 extent: extent,
23184                 histogram: histogram,
23185                 thresholdFreedmanDiaconis: freedmanDiaconis,
23186                 thresholdScott: scott,
23187                 thresholdSturges: thresholdSturges,
23188                 max: max$2,
23189                 mean: mean,
23190                 median: d3_median,
23191                 merge: merge,
23192                 min: min,
23193                 pairs: pairs,
23194                 permute: permute,
23195                 quantile: threshold,
23196                 range: d3_range,
23197                 scan: scan,
23198                 shuffle: shuffle,
23199                 sum: sum,
23200                 ticks: ticks,
23201                 tickIncrement: tickIncrement,
23202                 tickStep: tickStep,
23203                 transpose: transpose,
23204                 variance: variance,
23205                 zip: zip,
23206                 axisTop: axisTop,
23207                 axisRight: axisRight,
23208                 axisBottom: axisBottom,
23209                 axisLeft: axisLeft,
23210                 brush: brush,
23211                 brushX: brushX,
23212                 brushY: brushY,
23213                 brushSelection: brushSelection,
23214                 chord: chord,
23215                 ribbon: ribbon,
23216                 nest: nest,
23217                 set: set$2,
23218                 map: map$3,
23219                 keys: keys$3,
23220                 values: values,
23221                 entries: entries,
23222                 color: color,
23223                 rgb: rgb,
23224                 hsl: hsl,
23225                 lab: lab,
23226                 hcl: hcl,
23227                 lch: lch,
23228                 gray: gray,
23229                 cubehelix: cubehelix,
23230                 contours: contours,
23231                 contourDensity: density,
23232                 dispatch: dispatch,
23233                 drag: d3_drag,
23234                 dragDisable: dragDisable,
23235                 dragEnable: yesdrag,
23236                 dsvFormat: dsvFormat,
23237                 csvParse: csvParse,
23238                 csvParseRows: csvParseRows,
23239                 csvFormat: csvFormat,
23240                 csvFormatBody: csvFormatBody,
23241                 csvFormatRows: csvFormatRows,
23242                 tsvParse: tsvParse,
23243                 tsvParseRows: tsvParseRows,
23244                 tsvFormat: tsvFormat,
23245                 tsvFormatBody: tsvFormatBody,
23246                 tsvFormatRows: tsvFormatRows,
23247                 autoType: autoType,
23248                 easeLinear: linear$1,
23249                 easeQuad: quadInOut,
23250                 easeQuadIn: quadIn,
23251                 easeQuadOut: quadOut,
23252                 easeQuadInOut: quadInOut,
23253                 easeCubic: cubicInOut,
23254                 easeCubicIn: cubicIn,
23255                 easeCubicOut: cubicOut,
23256                 easeCubicInOut: cubicInOut,
23257                 easePoly: polyInOut,
23258                 easePolyIn: polyIn,
23259                 easePolyOut: polyOut,
23260                 easePolyInOut: polyInOut,
23261                 easeSin: sinInOut,
23262                 easeSinIn: sinIn,
23263                 easeSinOut: sinOut,
23264                 easeSinInOut: sinInOut,
23265                 easeExp: expInOut,
23266                 easeExpIn: expIn,
23267                 easeExpOut: expOut,
23268                 easeExpInOut: expInOut,
23269                 easeCircle: circleInOut,
23270                 easeCircleIn: circleIn,
23271                 easeCircleOut: circleOut,
23272                 easeCircleInOut: circleInOut,
23273                 easeBounce: bounceOut,
23274                 easeBounceIn: bounceIn,
23275                 easeBounceOut: bounceOut,
23276                 easeBounceInOut: bounceInOut,
23277                 easeBack: backInOut,
23278                 easeBackIn: backIn,
23279                 easeBackOut: backOut,
23280                 easeBackInOut: backInOut,
23281                 easeElastic: elasticOut,
23282                 easeElasticIn: elasticIn,
23283                 easeElasticOut: elasticOut,
23284                 easeElasticInOut: elasticInOut,
23285                 blob: blob,
23286                 buffer: buffer,
23287                 dsv: dsv,
23288                 csv: csv$1,
23289                 tsv: tsv$1,
23290                 image: image,
23291                 json: d3_json,
23292                 text: d3_text,
23293                 xml: d3_xml,
23294                 html: html,
23295                 svg: svg,
23296                 forceCenter: center$1,
23297                 forceCollide: collide,
23298                 forceLink: link,
23299                 forceManyBody: manyBody,
23300                 forceRadial: radial,
23301                 forceSimulation: simulation,
23302                 forceX: x$2,
23303                 forceY: y$2,
23304                 formatDefaultLocale: defaultLocale,
23305                 get format () { return format; },
23306                 get formatPrefix () { return formatPrefix; },
23307                 formatLocale: formatLocale,
23308                 formatSpecifier: formatSpecifier,
23309                 precisionFixed: precisionFixed,
23310                 precisionPrefix: precisionPrefix,
23311                 precisionRound: precisionRound,
23312                 geoArea: d3_geoArea,
23313                 geoBounds: d3_geoBounds,
23314                 geoCentroid: d3_geoCentroid,
23315                 geoCircle: circle,
23316                 geoClipAntimeridian: clipAntimeridian,
23317                 geoClipCircle: clipCircle,
23318                 geoClipExtent: extent$1,
23319                 geoClipRectangle: clipRectangle,
23320                 geoContains: contains$2,
23321                 geoDistance: distance,
23322                 geoGraticule: graticule,
23323                 geoGraticule10: graticule10,
23324                 geoInterpolate: interpolate$1,
23325                 geoLength: d3_geoLength,
23326                 geoPath: d3_geoPath,
23327                 geoAlbers: albers,
23328                 geoAlbersUsa: albersUsa,
23329                 geoAzimuthalEqualArea: azimuthalEqualArea,
23330                 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
23331                 geoAzimuthalEquidistant: azimuthalEquidistant,
23332                 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
23333                 geoConicConformal: conicConformal,
23334                 geoConicConformalRaw: conicConformalRaw,
23335                 geoConicEqualArea: conicEqualArea,
23336                 geoConicEqualAreaRaw: conicEqualAreaRaw,
23337                 geoConicEquidistant: conicEquidistant,
23338                 geoConicEquidistantRaw: conicEquidistantRaw,
23339                 geoEqualEarth: equalEarth,
23340                 geoEqualEarthRaw: equalEarthRaw,
23341                 geoEquirectangular: equirectangular,
23342                 geoEquirectangularRaw: equirectangularRaw,
23343                 geoGnomonic: gnomonic,
23344                 geoGnomonicRaw: gnomonicRaw,
23345                 geoIdentity: d3_geoIdentity,
23346                 geoProjection: projection,
23347                 geoProjectionMutator: projectionMutator,
23348                 geoMercator: mercator,
23349                 geoMercatorRaw: mercatorRaw,
23350                 geoNaturalEarth1: naturalEarth1,
23351                 geoNaturalEarth1Raw: naturalEarth1Raw,
23352                 geoOrthographic: orthographic,
23353                 geoOrthographicRaw: orthographicRaw,
23354                 geoStereographic: stereographic,
23355                 geoStereographicRaw: stereographicRaw,
23356                 geoTransverseMercator: transverseMercator,
23357                 geoTransverseMercatorRaw: transverseMercatorRaw,
23358                 geoRotation: rotation,
23359                 geoStream: d3_geoStream,
23360                 geoTransform: d3_geoTransform,
23361                 cluster: cluster,
23362                 hierarchy: hierarchy,
23363                 pack: index$1,
23364                 packSiblings: siblings,
23365                 packEnclose: enclose,
23366                 partition: partition,
23367                 stratify: stratify,
23368                 tree: tree,
23369                 treemap: index$2,
23370                 treemapBinary: binary,
23371                 treemapDice: treemapDice,
23372                 treemapSlice: treemapSlice,
23373                 treemapSliceDice: sliceDice,
23374                 treemapSquarify: squarify,
23375                 treemapResquarify: resquarify,
23376                 interpolate: d3_interpolate,
23377                 interpolateArray: array$2,
23378                 interpolateBasis: basis$1,
23379                 interpolateBasisClosed: basisClosed,
23380                 interpolateDate: date,
23381                 interpolateDiscrete: discrete,
23382                 interpolateHue: hue$1,
23383                 interpolateNumber: d3_interpolateNumber,
23384                 interpolateObject: object,
23385                 interpolateRound: interpolateRound,
23386                 interpolateString: interpolateString,
23387                 interpolateTransformCss: interpolateTransformCss,
23388                 interpolateTransformSvg: interpolateTransformSvg,
23389                 interpolateZoom: interpolateZoom,
23390                 interpolateRgb: d3_interpolateRgb,
23391                 interpolateRgbBasis: rgbBasis,
23392                 interpolateRgbBasisClosed: rgbBasisClosed,
23393                 interpolateHsl: hsl$2,
23394                 interpolateHslLong: hslLong,
23395                 interpolateLab: lab$1,
23396                 interpolateHcl: hcl$2,
23397                 interpolateHclLong: hclLong,
23398                 interpolateCubehelix: cubehelix$2,
23399                 interpolateCubehelixLong: cubehelixLong,
23400                 piecewise: piecewise,
23401                 quantize: d3_quantize,
23402                 path: path,
23403                 polygonArea: d3_polygonArea,
23404                 polygonCentroid: d3_polygonCentroid,
23405                 polygonHull: d3_polygonHull,
23406                 polygonContains: contains$3,
23407                 polygonLength: length$1,
23408                 quadtree: quadtree,
23409                 randomUniform: uniform,
23410                 randomNormal: normal,
23411                 randomLogNormal: logNormal,
23412                 randomBates: bates,
23413                 randomIrwinHall: irwinHall,
23414                 randomExponential: exponential$1,
23415                 scaleBand: band,
23416                 scalePoint: point$1,
23417                 scaleIdentity: identity$6,
23418                 scaleLinear: linear$2,
23419                 scaleLog: log$1,
23420                 scaleSymlog: symlog,
23421                 scaleOrdinal: ordinal,
23422                 scaleImplicit: implicit,
23423                 scalePow: pow$1,
23424                 scaleSqrt: sqrt$1,
23425                 scaleQuantile: quantile,
23426                 scaleQuantize: quantize,
23427                 scaleThreshold: threshold$1,
23428                 scaleTime: time,
23429                 scaleUtc: utcTime,
23430                 scaleSequential: sequential,
23431                 scaleSequentialLog: sequentialLog,
23432                 scaleSequentialPow: sequentialPow,
23433                 scaleSequentialSqrt: sequentialSqrt,
23434                 scaleSequentialSymlog: sequentialSymlog,
23435                 scaleSequentialQuantile: sequentialQuantile,
23436                 scaleDiverging: diverging,
23437                 scaleDivergingLog: divergingLog,
23438                 scaleDivergingPow: divergingPow,
23439                 scaleDivergingSqrt: divergingSqrt,
23440                 scaleDivergingSymlog: divergingSymlog,
23441                 tickFormat: tickFormat,
23442                 schemeCategory10: category10,
23443                 schemeAccent: Accent,
23444                 schemeDark2: Dark2,
23445                 schemePaired: Paired,
23446                 schemePastel1: Pastel1,
23447                 schemePastel2: Pastel2,
23448                 schemeSet1: Set1,
23449                 schemeSet2: Set2,
23450                 schemeSet3: Set3,
23451                 interpolateBrBG: BrBG,
23452                 schemeBrBG: scheme,
23453                 interpolatePRGn: PRGn,
23454                 schemePRGn: scheme$1,
23455                 interpolatePiYG: PiYG,
23456                 schemePiYG: scheme$2,
23457                 interpolatePuOr: PuOr,
23458                 schemePuOr: scheme$3,
23459                 interpolateRdBu: RdBu,
23460                 schemeRdBu: scheme$4,
23461                 interpolateRdGy: RdGy,
23462                 schemeRdGy: scheme$5,
23463                 interpolateRdYlBu: RdYlBu,
23464                 schemeRdYlBu: scheme$6,
23465                 interpolateRdYlGn: RdYlGn,
23466                 schemeRdYlGn: scheme$7,
23467                 interpolateSpectral: Spectral,
23468                 schemeSpectral: scheme$8,
23469                 interpolateBuGn: BuGn,
23470                 schemeBuGn: scheme$9,
23471                 interpolateBuPu: BuPu,
23472                 schemeBuPu: scheme$a,
23473                 interpolateGnBu: GnBu,
23474                 schemeGnBu: scheme$b,
23475                 interpolateOrRd: OrRd,
23476                 schemeOrRd: scheme$c,
23477                 interpolatePuBuGn: PuBuGn,
23478                 schemePuBuGn: scheme$d,
23479                 interpolatePuBu: PuBu,
23480                 schemePuBu: scheme$e,
23481                 interpolatePuRd: PuRd,
23482                 schemePuRd: scheme$f,
23483                 interpolateRdPu: RdPu,
23484                 schemeRdPu: scheme$g,
23485                 interpolateYlGnBu: YlGnBu,
23486                 schemeYlGnBu: scheme$h,
23487                 interpolateYlGn: YlGn,
23488                 schemeYlGn: scheme$i,
23489                 interpolateYlOrBr: YlOrBr,
23490                 schemeYlOrBr: scheme$j,
23491                 interpolateYlOrRd: YlOrRd,
23492                 schemeYlOrRd: scheme$k,
23493                 interpolateBlues: Blues,
23494                 schemeBlues: scheme$l,
23495                 interpolateGreens: Greens,
23496                 schemeGreens: scheme$m,
23497                 interpolateGreys: Greys,
23498                 schemeGreys: scheme$n,
23499                 interpolatePurples: Purples,
23500                 schemePurples: scheme$o,
23501                 interpolateReds: Reds,
23502                 schemeReds: scheme$p,
23503                 interpolateOranges: Oranges,
23504                 schemeOranges: scheme$q,
23505                 interpolateCubehelixDefault: cubehelix$3,
23506                 interpolateRainbow: rainbow,
23507                 interpolateWarm: warm,
23508                 interpolateCool: cool,
23509                 interpolateSinebow: sinebow,
23510                 interpolateViridis: viridis,
23511                 interpolateMagma: magma,
23512                 interpolateInferno: inferno,
23513                 interpolatePlasma: plasma,
23514                 create: create$5,
23515                 creator: creator,
23516                 local: local,
23517                 matcher: matcher,
23518                 mouse: d3_mouse,
23519                 namespace: namespace,
23520                 namespaces: namespaces,
23521                 clientPoint: point,
23522                 select: d3_select,
23523                 selectAll: d3_selectAll,
23524                 selection: selection,
23525                 selector: selector,
23526                 selectorAll: selectorAll,
23527                 style: styleValue,
23528                 touch: touch,
23529                 touches: d3_touches,
23530                 window: defaultView,
23531                 get event () { return event; },
23532                 customEvent: customEvent,
23533                 arc: arc,
23534                 area: area$1,
23535                 line: line,
23536                 pie: pie,
23537                 areaRadial: areaRadial,
23538                 radialArea: areaRadial,
23539                 lineRadial: lineRadial$1,
23540                 radialLine: lineRadial$1,
23541                 pointRadial: pointRadial,
23542                 linkHorizontal: linkHorizontal,
23543                 linkVertical: linkVertical,
23544                 linkRadial: linkRadial,
23545                 symbol: symbol,
23546                 symbols: symbols,
23547                 symbolCircle: circle$2,
23548                 symbolCross: cross$2,
23549                 symbolDiamond: diamond,
23550                 symbolSquare: square,
23551                 symbolStar: star,
23552                 symbolTriangle: triangle,
23553                 symbolWye: wye,
23554                 curveBasisClosed: basisClosed$1,
23555                 curveBasisOpen: basisOpen,
23556                 curveBasis: basis$2,
23557                 curveBundle: bundle,
23558                 curveCardinalClosed: cardinalClosed,
23559                 curveCardinalOpen: cardinalOpen,
23560                 curveCardinal: cardinal,
23561                 curveCatmullRomClosed: catmullRomClosed,
23562                 curveCatmullRomOpen: catmullRomOpen,
23563                 curveCatmullRom: catmullRom,
23564                 curveLinearClosed: linearClosed,
23565                 curveLinear: curveLinear,
23566                 curveMonotoneX: monotoneX,
23567                 curveMonotoneY: monotoneY,
23568                 curveNatural: natural,
23569                 curveStep: step,
23570                 curveStepAfter: stepAfter,
23571                 curveStepBefore: stepBefore,
23572                 stack: stack,
23573                 stackOffsetExpand: expand,
23574                 stackOffsetDiverging: diverging$1,
23575                 stackOffsetNone: none$1,
23576                 stackOffsetSilhouette: silhouette,
23577                 stackOffsetWiggle: wiggle,
23578                 stackOrderAppearance: appearance,
23579                 stackOrderAscending: ascending$2,
23580                 stackOrderDescending: descending$1,
23581                 stackOrderInsideOut: insideOut,
23582                 stackOrderNone: none$2,
23583                 stackOrderReverse: reverse,
23584                 timeInterval: newInterval,
23585                 timeMillisecond: millisecond,
23586                 timeMilliseconds: milliseconds,
23587                 utcMillisecond: millisecond,
23588                 utcMilliseconds: milliseconds,
23589                 timeSecond: second,
23590                 timeSeconds: seconds,
23591                 utcSecond: second,
23592                 utcSeconds: seconds,
23593                 timeMinute: minute,
23594                 timeMinutes: minutes,
23595                 timeHour: hour,
23596                 timeHours: hours,
23597                 timeDay: day,
23598                 timeDays: days,
23599                 timeWeek: sunday,
23600                 timeWeeks: sundays,
23601                 timeSunday: sunday,
23602                 timeSundays: sundays,
23603                 timeMonday: monday,
23604                 timeMondays: mondays,
23605                 timeTuesday: tuesday,
23606                 timeTuesdays: tuesdays,
23607                 timeWednesday: wednesday,
23608                 timeWednesdays: wednesdays,
23609                 timeThursday: thursday,
23610                 timeThursdays: thursdays,
23611                 timeFriday: friday,
23612                 timeFridays: fridays,
23613                 timeSaturday: saturday,
23614                 timeSaturdays: saturdays,
23615                 timeMonth: month,
23616                 timeMonths: months,
23617                 timeYear: year,
23618                 timeYears: years,
23619                 utcMinute: utcMinute,
23620                 utcMinutes: utcMinutes,
23621                 utcHour: utcHour,
23622                 utcHours: utcHours,
23623                 utcDay: utcDay,
23624                 utcDays: utcDays,
23625                 utcWeek: utcSunday,
23626                 utcWeeks: utcSundays,
23627                 utcSunday: utcSunday,
23628                 utcSundays: utcSundays,
23629                 utcMonday: utcMonday,
23630                 utcMondays: utcMondays,
23631                 utcTuesday: utcTuesday,
23632                 utcTuesdays: utcTuesdays,
23633                 utcWednesday: utcWednesday,
23634                 utcWednesdays: utcWednesdays,
23635                 utcThursday: utcThursday,
23636                 utcThursdays: utcThursdays,
23637                 utcFriday: utcFriday,
23638                 utcFridays: utcFridays,
23639                 utcSaturday: utcSaturday,
23640                 utcSaturdays: utcSaturdays,
23641                 utcMonth: utcMonth,
23642                 utcMonths: utcMonths,
23643                 utcYear: utcYear,
23644                 utcYears: utcYears,
23645                 timeFormatDefaultLocale: defaultLocale$1,
23646                 get timeFormat () { return timeFormat; },
23647                 get timeParse () { return timeParse; },
23648                 get utcFormat () { return utcFormat; },
23649                 get utcParse () { return utcParse; },
23650                 timeFormatLocale: formatLocale$1,
23651                 isoFormat: formatIso,
23652                 isoParse: parseIso,
23653                 now: now,
23654                 timer: timer,
23655                 timerFlush: timerFlush,
23656                 timeout: d3_timeout,
23657                 interval: interval$1,
23658                 transition: transition,
23659                 active: active,
23660                 interrupt: interrupt,
23661                 voronoi: voronoi,
23662                 zoom: d3_zoom,
23663                 zoomTransform: transform,
23664                 zoomIdentity: identity$8
23665         });
23666
23667         function actionAddEntity(way) {
23668             return function(graph) {
23669                 return graph.replace(way);
23670             };
23671         }
23672
23673         /*
23674         Order the nodes of a way in reverse order and reverse any direction dependent tags
23675         other than `oneway`. (We assume that correcting a backwards oneway is the primary
23676         reason for reversing a way.)
23677
23678         In addition, numeric-valued `incline` tags are negated.
23679
23680         The JOSM implementation was used as a guide, but transformations that were of unclear benefit
23681         or adjusted tags that don't seem to be used in practice were omitted.
23682
23683         References:
23684             http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
23685             http://wiki.openstreetmap.org/wiki/Key:direction#Steps
23686             http://wiki.openstreetmap.org/wiki/Key:incline
23687             http://wiki.openstreetmap.org/wiki/Route#Members
23688             http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
23689             http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
23690             http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
23691         */
23692         function actionReverse(wayID, options) {
23693             var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
23694             var numeric = /^([+\-]?)(?=[\d.])/;
23695             var turn_lanes = /^turn:lanes:?/;
23696             var keyReplacements = [
23697                 [/:right$/, ':left'],
23698                 [/:left$/, ':right'],
23699                 [/:forward$/, ':backward'],
23700                 [/:backward$/, ':forward'],
23701                 [/:right:/, ':left:'],
23702                 [/:left:/, ':right:'],
23703                 [/:forward:/, ':backward:'],
23704                 [/:backward:/, ':forward:']
23705             ];
23706             var valueReplacements = {
23707                 left: 'right',
23708                 right: 'left',
23709                 up: 'down',
23710                 down: 'up',
23711                 forward: 'backward',
23712                 backward: 'forward',
23713                 forwards: 'backward',
23714                 backwards: 'forward',
23715             };
23716             var roleReplacements = {
23717                 forward: 'backward',
23718                 backward: 'forward',
23719                 forwards: 'backward',
23720                 backwards: 'forward'
23721             };
23722             var onewayReplacements = {
23723                 yes: '-1',
23724                 '1': '-1',
23725                 '-1': 'yes'
23726             };
23727
23728
23729             function reverseKey(key) {
23730                 for (var i = 0; i < keyReplacements.length; ++i) {
23731                     var replacement = keyReplacements[i];
23732                     if (replacement[0].test(key)) {
23733                         return key.replace(replacement[0], replacement[1]);
23734                     }
23735                 }
23736                 return key;
23737             }
23738
23739
23740             function reverseValue(key, value) {
23741                 if (ignoreKey.test(key)) return value;
23742
23743                 // Turn lanes are left/right to key (not way) direction - #5674
23744                 if (turn_lanes.test(key)) {
23745                     return value;
23746                 } else if (key === 'incline' && numeric.test(value)) {
23747                     return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
23748                 } else if (options && options.reverseOneway && key === 'oneway') {
23749                     return onewayReplacements[value] || value;
23750                 } else {
23751                     return valueReplacements[value] || value;
23752                 }
23753             }
23754
23755
23756             // Reverse the direction of tags attached to the nodes - #3076
23757             function reverseNodeTags(graph, nodeIDs) {
23758                 for (var i = 0; i < nodeIDs.length; i++) {
23759                     var node = graph.hasEntity(nodeIDs[i]);
23760                     if (!node || !Object.keys(node.tags).length) continue;
23761
23762                     var tags = {};
23763                     for (var key in node.tags) {
23764                         tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
23765                     }
23766                     graph = graph.replace(node.update({tags: tags}));
23767                 }
23768                 return graph;
23769             }
23770
23771
23772             return function(graph) {
23773                 var way = graph.entity(wayID);
23774                 var nodes = way.nodes.slice().reverse();
23775                 var tags = {};
23776                 var role;
23777
23778                 for (var key in way.tags) {
23779                     tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
23780                 }
23781
23782                 graph.parentRelations(way).forEach(function(relation) {
23783                     relation.members.forEach(function(member, index) {
23784                         if (member.id === way.id && (role = roleReplacements[member.role])) {
23785                             relation = relation.updateMember({role: role}, index);
23786                             graph = graph.replace(relation);
23787                         }
23788                     });
23789                 });
23790
23791                 // Reverse any associated directions on nodes on the way and then replace
23792                 // the way itself with the reversed node ids and updated way tags
23793                 return reverseNodeTags(graph, nodes)
23794                     .replace(way.update({nodes: nodes, tags: tags}));
23795             };
23796         }
23797
23798         function osmIsInterestingTag(key) {
23799             return key !== 'attribution' &&
23800                 key !== 'created_by' &&
23801                 key !== 'source' &&
23802                 key !== 'odbl' &&
23803                 key.indexOf('tiger:') !== 0;
23804         }
23805
23806         var osmAreaKeys = {};
23807         function osmSetAreaKeys(value) {
23808             osmAreaKeys = value;
23809         }
23810
23811         // Tags that indicate a node can be a standalone point
23812         // e.g. { amenity: { bar: true, parking: true, ... } ... }
23813         var osmPointTags = {};
23814         function osmSetPointTags(value) {
23815             osmPointTags = value;
23816         }
23817         // Tags that indicate a node can be part of a way
23818         // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
23819         var osmVertexTags = {};
23820         function osmSetVertexTags(value) {
23821             osmVertexTags = value;
23822         }
23823
23824         function osmNodeGeometriesForTags(nodeTags) {
23825             var geometries = {};
23826             for (var key in nodeTags) {
23827                 if (osmPointTags[key] &&
23828                     (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
23829                     geometries.point = true;
23830                 }
23831                 if (osmVertexTags[key] &&
23832                     (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
23833                     geometries.vertex = true;
23834                 }
23835                 // break early if both are already supported
23836                 if (geometries.point && geometries.vertex) break;
23837             }
23838             return geometries;
23839         }
23840
23841         var osmOneWayTags = {
23842             'aerialway': {
23843                 'chair_lift': true,
23844                 'drag_lift': true,
23845                 'j-bar': true,
23846                 'magic_carpet': true,
23847                 'mixed_lift': true,
23848                 'platter': true,
23849                 'rope_tow': true,
23850                 't-bar': true,
23851                 'zip_line': true
23852             },
23853             'highway': {
23854                 'motorway': true
23855             },
23856             'junction': {
23857                 'circular': true,
23858                 'roundabout': true
23859             },
23860             'man_made': {
23861                 'piste:halfpipe': true
23862             },
23863             'piste:type': {
23864                 'downhill': true,
23865                 'sled': true,
23866                 'yes': true
23867             },
23868             'waterway': {
23869                 'canal': true,
23870                 'ditch': true,
23871                 'drain': true,
23872                 'river': true,
23873                 'stream': true
23874             }
23875         };
23876
23877
23878         var osmPavedTags = {
23879             'surface': {
23880                 'paved': true,
23881                 'asphalt': true,
23882                 'concrete': true,
23883                 'concrete:lanes': true,
23884                 'concrete:plates': true
23885             },
23886             'tracktype': {
23887                 'grade1': true
23888             }
23889         };
23890
23891         var osmRightSideIsInsideTags = {
23892             'natural': {
23893                 'cliff': true,
23894                 'coastline': 'coastline',
23895             },
23896             'barrier': {
23897                 'retaining_wall': true,
23898                 'kerb': true,
23899                 'guard_rail': true,
23900                 'city_wall': true,
23901             },
23902             'man_made': {
23903                 'embankment': true
23904             },
23905             'waterway': {
23906                 'weir': true
23907             }
23908         };
23909
23910         // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
23911         // (does not include `raceway`)
23912         var osmRoutableHighwayTagValues = {
23913             motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true,
23914             motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true,
23915             unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true,
23916             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23917         };
23918         // "highway" tag values that generally do not allow motor vehicles
23919         var osmPathHighwayTagValues = {
23920             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23921         };
23922
23923         // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
23924         var osmRailwayTrackTagValues = {
23925             rail: true, light_rail: true, tram: true, subway: true,
23926             monorail: true, funicular: true, miniature: true, narrow_gauge: true,
23927             disused: true, preserved: true
23928         };
23929
23930         // "waterway" tag values for line features representing water flow
23931         var osmFlowingWaterwayTagValues = {
23932             canal: true, ditch: true, drain: true, river: true, stream: true
23933         };
23934
23935         // constants
23936         var TAU = 2 * Math.PI;
23937         var EQUATORIAL_RADIUS = 6356752.314245179;
23938         var POLAR_RADIUS = 6378137.0;
23939
23940
23941         function geoLatToMeters(dLat) {
23942             return dLat * (TAU * POLAR_RADIUS / 360);
23943         }
23944
23945
23946         function geoLonToMeters(dLon, atLat) {
23947             return Math.abs(atLat) >= 90 ? 0 :
23948                 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
23949         }
23950
23951
23952         function geoMetersToLat(m) {
23953             return m / (TAU * POLAR_RADIUS / 360);
23954         }
23955
23956
23957         function geoMetersToLon(m, atLat) {
23958             return Math.abs(atLat) >= 90 ? 0 :
23959                 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
23960         }
23961
23962
23963         function geoMetersToOffset(meters, tileSize) {
23964             tileSize = tileSize || 256;
23965             return [
23966                 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
23967                 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
23968             ];
23969         }
23970
23971
23972         function geoOffsetToMeters(offset, tileSize) {
23973             tileSize = tileSize || 256;
23974             return [
23975                 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
23976                 -offset[1] * TAU * POLAR_RADIUS / tileSize
23977             ];
23978         }
23979
23980
23981         // Equirectangular approximation of spherical distances on Earth
23982         function geoSphericalDistance(a, b) {
23983             var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
23984             var y = geoLatToMeters(a[1] - b[1]);
23985             return Math.sqrt((x * x) + (y * y));
23986         }
23987
23988
23989         // scale to zoom
23990         function geoScaleToZoom(k, tileSize) {
23991             tileSize = tileSize || 256;
23992             var log2ts = Math.log(tileSize) * Math.LOG2E;
23993             return Math.log(k * TAU) / Math.LN2 - log2ts;
23994         }
23995
23996
23997         // zoom to scale
23998         function geoZoomToScale(z, tileSize) {
23999             tileSize = tileSize || 256;
24000             return tileSize * Math.pow(2, z) / TAU;
24001         }
24002
24003
24004         // returns info about the node from `nodes` closest to the given `point`
24005         function geoSphericalClosestNode(nodes, point) {
24006             var minDistance = Infinity, distance;
24007             var indexOfMin;
24008
24009             for (var i in nodes) {
24010                 distance = geoSphericalDistance(nodes[i].loc, point);
24011                 if (distance < minDistance) {
24012                     minDistance = distance;
24013                     indexOfMin = i;
24014                 }
24015             }
24016
24017             if (indexOfMin !== undefined) {
24018                 return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
24019             } else {
24020                 return null;
24021             }
24022         }
24023
24024         function geoExtent(min, max) {
24025             if (!(this instanceof geoExtent)) {
24026                 return new geoExtent(min, max);
24027             } else if (min instanceof geoExtent) {
24028                 return min;
24029             } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24030                 this[0] = min[0];
24031                 this[1] = min[1];
24032             } else {
24033                 this[0] = min        || [ Infinity,  Infinity];
24034                 this[1] = max || min || [-Infinity, -Infinity];
24035             }
24036         }
24037
24038         geoExtent.prototype = new Array(2);
24039
24040         Object.assign(geoExtent.prototype, {
24041
24042             equals: function (obj) {
24043                 return this[0][0] === obj[0][0] &&
24044                     this[0][1] === obj[0][1] &&
24045                     this[1][0] === obj[1][0] &&
24046                     this[1][1] === obj[1][1];
24047             },
24048
24049
24050             extend: function(obj) {
24051                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
24052                 return geoExtent(
24053                     [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24054                     [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24055                 );
24056             },
24057
24058
24059             _extend: function(extent) {
24060                 this[0][0] = Math.min(extent[0][0], this[0][0]);
24061                 this[0][1] = Math.min(extent[0][1], this[0][1]);
24062                 this[1][0] = Math.max(extent[1][0], this[1][0]);
24063                 this[1][1] = Math.max(extent[1][1], this[1][1]);
24064             },
24065
24066
24067             area: function() {
24068                 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24069             },
24070
24071
24072             center: function() {
24073                 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24074             },
24075
24076
24077             rectangle: function() {
24078                 return [this[0][0], this[0][1], this[1][0], this[1][1]];
24079             },
24080
24081
24082             bbox: function() {
24083                 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24084             },
24085
24086
24087             polygon: function() {
24088                 return [
24089                     [this[0][0], this[0][1]],
24090                     [this[0][0], this[1][1]],
24091                     [this[1][0], this[1][1]],
24092                     [this[1][0], this[0][1]],
24093                     [this[0][0], this[0][1]]
24094                 ];
24095             },
24096
24097
24098             contains: function(obj) {
24099                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
24100                 return obj[0][0] >= this[0][0] &&
24101                        obj[0][1] >= this[0][1] &&
24102                        obj[1][0] <= this[1][0] &&
24103                        obj[1][1] <= this[1][1];
24104             },
24105
24106
24107             intersects: function(obj) {
24108                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
24109                 return obj[0][0] <= this[1][0] &&
24110                        obj[0][1] <= this[1][1] &&
24111                        obj[1][0] >= this[0][0] &&
24112                        obj[1][1] >= this[0][1];
24113             },
24114
24115
24116             intersection: function(obj) {
24117                 if (!this.intersects(obj)) return new geoExtent();
24118                 return new geoExtent(
24119                     [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24120                     [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24121                 );
24122             },
24123
24124
24125             percentContainedIn: function(obj) {
24126                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
24127                 var a1 = this.intersection(obj).area();
24128                 var a2 = this.area();
24129
24130                 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24131                     return 0;
24132                 } else {
24133                     return a1 / a2;
24134                 }
24135             },
24136
24137
24138             padByMeters: function(meters) {
24139                 var dLat = geoMetersToLat(meters);
24140                 var dLon = geoMetersToLon(meters, this.center()[1]);
24141                 return geoExtent(
24142                     [this[0][0] - dLon, this[0][1] - dLat],
24143                     [this[1][0] + dLon, this[1][1] + dLat]
24144                 );
24145             },
24146
24147
24148             toParam: function() {
24149                 return this.rectangle().join(',');
24150             }
24151
24152         });
24153
24154         // vector equals
24155         function geoVecEqual(a, b, epsilon) {
24156             if (epsilon) {
24157                 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
24158             } else {
24159                 return (a[0] === b[0]) && (a[1] === b[1]);
24160             }
24161         }
24162
24163         // vector addition
24164         function geoVecAdd(a, b) {
24165             return [ a[0] + b[0], a[1] + b[1] ];
24166         }
24167
24168         // vector subtraction
24169         function geoVecSubtract(a, b) {
24170             return [ a[0] - b[0], a[1] - b[1] ];
24171         }
24172
24173         // vector scaling
24174         function geoVecScale(a, mag) {
24175             return [ a[0] * mag, a[1] * mag ];
24176         }
24177
24178         // vector rounding (was: geoRoundCoordinates)
24179         function geoVecFloor(a) {
24180             return [ Math.floor(a[0]), Math.floor(a[1]) ];
24181         }
24182
24183         // linear interpolation
24184         function geoVecInterp(a, b, t) {
24185             return [
24186                 a[0] + (b[0] - a[0]) * t,
24187                 a[1] + (b[1] - a[1]) * t
24188             ];
24189         }
24190
24191         // http://jsperf.com/id-dist-optimization
24192         function geoVecLength(a, b) {
24193             b = b || [0, 0];
24194             var x = a[0] - b[0];
24195             var y = a[1] - b[1];
24196             return Math.sqrt((x * x) + (y * y));
24197         }
24198
24199         // get a unit vector
24200         function geoVecNormalize(a) {
24201             var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1]));
24202             if (length !== 0) {
24203                 return geoVecScale(a, 1 / length);
24204             }
24205             return [0, 0];
24206         }
24207
24208         // Return the counterclockwise angle in the range (-pi, pi)
24209         // between the positive X axis and the line intersecting a and b.
24210         function geoVecAngle(a, b) {
24211             return Math.atan2(b[1] - a[1], b[0] - a[0]);
24212         }
24213
24214         // dot product
24215         function geoVecDot(a, b, origin) {
24216             origin = origin || [0, 0];
24217             var p = geoVecSubtract(a, origin);
24218             var q = geoVecSubtract(b, origin);
24219             return (p[0]) * (q[0]) + (p[1]) * (q[1]);
24220         }
24221
24222         // normalized dot product
24223         function geoVecNormalizedDot(a, b, origin) {
24224             origin = origin || [0, 0];
24225             var p = geoVecNormalize(geoVecSubtract(a, origin));
24226             var q = geoVecNormalize(geoVecSubtract(b, origin));
24227             return geoVecDot(p, q);
24228         }
24229
24230         // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24231         // Returns a positive value, if OAB makes a counter-clockwise turn,
24232         // negative for clockwise turn, and zero if the points are collinear.
24233         function geoVecCross(a, b, origin) {
24234             origin = origin || [0, 0];
24235             var p = geoVecSubtract(a, origin);
24236             var q = geoVecSubtract(b, origin);
24237             return (p[0]) * (q[1]) - (p[1]) * (q[0]);
24238         }
24239
24240
24241         // find closest orthogonal projection of point onto points array
24242         function geoVecProject(a, points) {
24243             var min = Infinity;
24244             var idx;
24245             var target;
24246
24247             for (var i = 0; i < points.length - 1; i++) {
24248                 var o = points[i];
24249                 var s = geoVecSubtract(points[i + 1], o);
24250                 var v = geoVecSubtract(a, o);
24251                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24252                 var p;
24253
24254                 if (proj < 0) {
24255                     p = o;
24256                 } else if (proj > 1) {
24257                     p = points[i + 1];
24258                 } else {
24259                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24260                 }
24261
24262                 var dist = geoVecLength(p, a);
24263                 if (dist < min) {
24264                     min = dist;
24265                     idx = i + 1;
24266                     target = p;
24267                 }
24268             }
24269
24270             if (idx !== undefined) {
24271                 return { index: idx, distance: min, target: target };
24272             } else {
24273                 return null;
24274             }
24275         }
24276
24277         // Return the counterclockwise angle in the range (-pi, pi)
24278         // between the positive X axis and the line intersecting a and b.
24279         function geoAngle(a, b, projection) {
24280             return geoVecAngle(projection(a.loc), projection(b.loc));
24281         }
24282
24283
24284         function geoEdgeEqual(a, b) {
24285             return (a[0] === b[0] && a[1] === b[1]) ||
24286                 (a[0] === b[1] && a[1] === b[0]);
24287         }
24288
24289
24290         // Rotate all points counterclockwise around a pivot point by given angle
24291         function geoRotate(points, angle, around) {
24292             return points.map(function(point) {
24293                 var radial = geoVecSubtract(point, around);
24294                 return [
24295                     radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24296                     radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24297                 ];
24298             });
24299         }
24300
24301
24302         // Choose the edge with the minimal distance from `point` to its orthogonal
24303         // projection onto that edge, if such a projection exists, or the distance to
24304         // the closest vertex on that edge. Returns an object with the `index` of the
24305         // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24306         function geoChooseEdge(nodes, point, projection, activeID) {
24307             var dist = geoVecLength;
24308             var points = nodes.map(function(n) { return projection(n.loc); });
24309             var ids = nodes.map(function(n) { return n.id; });
24310             var min = Infinity;
24311             var idx;
24312             var loc;
24313
24314             for (var i = 0; i < points.length - 1; i++) {
24315                 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24316
24317                 var o = points[i];
24318                 var s = geoVecSubtract(points[i + 1], o);
24319                 var v = geoVecSubtract(point, o);
24320                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24321                 var p;
24322
24323                 if (proj < 0) {
24324                     p = o;
24325                 } else if (proj > 1) {
24326                     p = points[i + 1];
24327                 } else {
24328                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24329                 }
24330
24331                 var d = dist(p, point);
24332                 if (d < min) {
24333                     min = d;
24334                     idx = i + 1;
24335                     loc = projection.invert(p);
24336                 }
24337             }
24338
24339             if (idx !== undefined) {
24340                 return { index: idx, distance: min, loc: loc };
24341             } else {
24342                 return null;
24343             }
24344         }
24345
24346
24347         // Test active (dragged or drawing) segments against inactive segments
24348         // This is used to test e.g. multipolygon rings that cross
24349         // `activeNodes` is the ring containing the activeID being dragged.
24350         // `inactiveNodes` is the other ring to test against
24351         function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24352             var actives = [];
24353             var inactives = [];
24354             var j, k, n1, n2, segment;
24355
24356             // gather active segments (only segments in activeNodes that contain the activeID)
24357             for (j = 0; j < activeNodes.length - 1; j++) {
24358                 n1 = activeNodes[j];
24359                 n2 = activeNodes[j+1];
24360                 segment = [n1.loc, n2.loc];
24361                 if (n1.id === activeID || n2.id === activeID) {
24362                     actives.push(segment);
24363                 }
24364             }
24365
24366             // gather inactive segments
24367             for (j = 0; j < inactiveNodes.length - 1; j++) {
24368                 n1 = inactiveNodes[j];
24369                 n2 = inactiveNodes[j+1];
24370                 segment = [n1.loc, n2.loc];
24371                 inactives.push(segment);
24372             }
24373
24374             // test
24375             for (j = 0; j < actives.length; j++) {
24376                 for (k = 0; k < inactives.length; k++) {
24377                     var p = actives[j];
24378                     var q = inactives[k];
24379                     var hit = geoLineIntersection(p, q);
24380                     if (hit) {
24381                         return true;
24382                     }
24383                 }
24384             }
24385
24386             return false;
24387         }
24388
24389
24390         // Test active (dragged or drawing) segments against inactive segments
24391         // This is used to test whether a way intersects with itself.
24392         function geoHasSelfIntersections(nodes, activeID) {
24393             var actives = [];
24394             var inactives = [];
24395             var j, k;
24396
24397             // group active and passive segments along the nodes
24398             for (j = 0; j < nodes.length - 1; j++) {
24399                 var n1 = nodes[j];
24400                 var n2 = nodes[j+1];
24401                 var segment = [n1.loc, n2.loc];
24402                 if (n1.id === activeID || n2.id === activeID) {
24403                     actives.push(segment);
24404                 } else {
24405                     inactives.push(segment);
24406                 }
24407             }
24408
24409             // test
24410             for (j = 0; j < actives.length; j++) {
24411                 for (k = 0; k < inactives.length; k++) {
24412                     var p = actives[j];
24413                     var q = inactives[k];
24414                     // skip if segments share an endpoint
24415                     if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24416                         geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24417                         continue;
24418                     }
24419
24420                     var hit = geoLineIntersection(p, q);
24421                     if (hit) {
24422                         var epsilon = 1e-8;
24423                         // skip if the hit is at the segment's endpoint
24424                         if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24425                             geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24426                             continue;
24427                         } else {
24428                             return true;
24429                         }
24430                     }
24431                 }
24432             }
24433
24434             return false;
24435         }
24436
24437
24438         // Return the intersection point of 2 line segments.
24439         // From https://github.com/pgkelley4/line-segments-intersect
24440         // This uses the vector cross product approach described below:
24441         //  http://stackoverflow.com/a/565282/786339
24442         function geoLineIntersection(a, b) {
24443             var p = [a[0][0], a[0][1]];
24444             var p2 = [a[1][0], a[1][1]];
24445             var q = [b[0][0], b[0][1]];
24446             var q2 = [b[1][0], b[1][1]];
24447             var r = geoVecSubtract(p2, p);
24448             var s = geoVecSubtract(q2, q);
24449             var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24450             var denominator = geoVecCross(r, s);
24451
24452             if (uNumerator && denominator) {
24453                 var u = uNumerator / denominator;
24454                 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24455
24456                 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24457                     return geoVecInterp(p, p2, t);
24458                 }
24459             }
24460
24461             return null;
24462         }
24463
24464
24465         function geoPathIntersections(path1, path2) {
24466             var intersections = [];
24467             for (var i = 0; i < path1.length - 1; i++) {
24468                 for (var j = 0; j < path2.length - 1; j++) {
24469                     var a = [ path1[i], path1[i+1] ];
24470                     var b = [ path2[j], path2[j+1] ];
24471                     var hit = geoLineIntersection(a, b);
24472                     if (hit) {
24473                         intersections.push(hit);
24474                     }
24475                 }
24476             }
24477             return intersections;
24478         }
24479
24480         function geoPathHasIntersections(path1, path2) {
24481             for (var i = 0; i < path1.length - 1; i++) {
24482                 for (var j = 0; j < path2.length - 1; j++) {
24483                     var a = [ path1[i], path1[i+1] ];
24484                     var b = [ path2[j], path2[j+1] ];
24485                     var hit = geoLineIntersection(a, b);
24486                     if (hit) {
24487                         return true;
24488                     }
24489                 }
24490             }
24491             return false;
24492         }
24493
24494
24495         // Return whether point is contained in polygon.
24496         //
24497         // `point` should be a 2-item array of coordinates.
24498         // `polygon` should be an array of 2-item arrays of coordinates.
24499         //
24500         // From https://github.com/substack/point-in-polygon.
24501         // ray-casting algorithm based on
24502         // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24503         //
24504         function geoPointInPolygon(point, polygon) {
24505             var x = point[0];
24506             var y = point[1];
24507             var inside = false;
24508
24509             for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24510                 var xi = polygon[i][0];
24511                 var yi = polygon[i][1];
24512                 var xj = polygon[j][0];
24513                 var yj = polygon[j][1];
24514
24515                 var intersect = ((yi > y) !== (yj > y)) &&
24516                     (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24517                 if (intersect) inside = !inside;
24518             }
24519
24520             return inside;
24521         }
24522
24523
24524         function geoPolygonContainsPolygon(outer, inner) {
24525             return inner.every(function(point) {
24526                 return geoPointInPolygon(point, outer);
24527             });
24528         }
24529
24530
24531         function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24532             function testPoints(outer, inner) {
24533                 return inner.some(function(point) {
24534                     return geoPointInPolygon(point, outer);
24535                 });
24536             }
24537
24538            return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24539         }
24540
24541
24542         // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
24543         // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
24544         function geoGetSmallestSurroundingRectangle(points) {
24545             var hull = d3_polygonHull(points);
24546             var centroid = d3_polygonCentroid(hull);
24547             var minArea = Infinity;
24548             var ssrExtent = [];
24549             var ssrAngle = 0;
24550             var c1 = hull[0];
24551
24552             for (var i = 0; i <= hull.length - 1; i++) {
24553                 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1];
24554                 var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
24555                 var poly = geoRotate(hull, -angle, centroid);
24556                 var extent = poly.reduce(function(extent, point) {
24557                     return extent.extend(geoExtent(point));
24558                 }, geoExtent());
24559
24560                 var area = extent.area();
24561                 if (area < minArea) {
24562                     minArea = area;
24563                     ssrExtent = extent;
24564                     ssrAngle = angle;
24565                 }
24566                 c1 = c2;
24567             }
24568
24569             return {
24570                 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
24571                 angle: ssrAngle
24572             };
24573         }
24574
24575
24576         function geoPathLength(path) {
24577             var length = 0;
24578             for (var i = 0; i < path.length - 1; i++) {
24579                 length += geoVecLength(path[i], path[i + 1]);
24580             }
24581             return length;
24582         }
24583
24584
24585         // If the given point is at the edge of the padded viewport,
24586         // return a vector that will nudge the viewport in that direction
24587         function geoViewportEdge(point, dimensions) {
24588             var pad = [80, 20, 50, 20];   // top, right, bottom, left
24589             var x = 0;
24590             var y = 0;
24591
24592             if (point[0] > dimensions[0] - pad[1])
24593                 x = -10;
24594             if (point[0] < pad[3])
24595                 x = 10;
24596             if (point[1] > dimensions[1] - pad[2])
24597                 y = -10;
24598             if (point[1] < pad[0])
24599                 y = 10;
24600
24601             if (x || y) {
24602                 return [x, y];
24603             } else {
24604                 return null;
24605             }
24606         }
24607
24608         /*
24609             Bypasses features of D3's default projection stream pipeline that are unnecessary:
24610             * Antimeridian clipping
24611             * Spherical rotation
24612             * Resampling
24613         */
24614         function geoRawMercator() {
24615             var project = mercatorRaw;
24616             var k = 512 / Math.PI; // scale
24617             var x = 0;
24618             var y = 0; // translate
24619             var clipExtent = [[0, 0], [0, 0]];
24620
24621
24622             function projection(point) {
24623                 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24624                 return [point[0] * k + x, y - point[1] * k];
24625             }
24626
24627
24628             projection.invert = function(point) {
24629                 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24630                 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24631             };
24632
24633
24634             projection.scale = function(_) {
24635                 if (!arguments.length) return k;
24636                 k = +_;
24637                 return projection;
24638             };
24639
24640
24641             projection.translate = function(_) {
24642                 if (!arguments.length) return [x, y];
24643                 x = +_[0];
24644                 y = +_[1];
24645                 return projection;
24646             };
24647
24648
24649             projection.clipExtent = function(_) {
24650                 if (!arguments.length) return clipExtent;
24651                 clipExtent = _;
24652                 return projection;
24653             };
24654
24655
24656             projection.transform = function(obj) {
24657                 if (!arguments.length) return identity$8.translate(x, y).scale(k);
24658                 x = +obj.x;
24659                 y = +obj.y;
24660                 k = +obj.k;
24661                 return projection;
24662             };
24663
24664
24665             projection.stream = d3_geoTransform({
24666                 point: function(x, y) {
24667                     var vec = projection([x, y]);
24668                     this.stream.point(vec[0], vec[1]);
24669                 }
24670             }).stream;
24671
24672
24673             return projection;
24674         }
24675
24676         function geoOrthoNormalizedDotProduct(a, b, origin) {
24677             if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
24678                 return 1;  // coincident points, treat as straight and try to remove
24679             }
24680             return geoVecNormalizedDot(a, b, origin);
24681         }
24682
24683
24684         function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
24685             var val = Math.abs(dotp);
24686             if (val < epsilon) {
24687                 return 0;      // already orthogonal
24688             } else if (allowStraightAngles && Math.abs(val-1) < epsilon) {
24689                 return 0;      // straight angle, which is okay in this case
24690             } else if (val < lowerThreshold || val > upperThreshold) {
24691                 return dotp;   // can be adjusted
24692             } else {
24693                 return null;   // ignore vertex
24694             }
24695         }
24696
24697
24698         function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
24699             var score = 0;
24700             var first = isClosed ? 0 : 1;
24701             var last = isClosed ? points.length : points.length - 1;
24702             var coords = points.map(function(p) { return p.coord; });
24703
24704             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24705             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24706
24707             for (var i = first; i < last; i++) {
24708                 var a = coords[(i - 1 + coords.length) % coords.length];
24709                 var origin = coords[i];
24710                 var b = coords[(i + 1) % coords.length];
24711
24712                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
24713                 if (dotp === null) continue;    // ignore vertex
24714                 score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
24715             }
24716
24717             return score;
24718         }
24719
24720         // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
24721         function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
24722             var max = -Infinity;
24723
24724             var first = isClosed ? 0 : 1;
24725             var last = isClosed ? coords.length : coords.length - 1;
24726
24727             for (var i = first; i < last; i++) {
24728                 var a = coords[(i - 1 + coords.length) % coords.length];
24729                 var origin = coords[i];
24730                 var b = coords[(i + 1) % coords.length];
24731                 var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
24732
24733                 var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
24734
24735                 if (angle > 45) angle = 90 - angle;
24736
24737                 if (angle >= lessThan) continue;
24738
24739                 if (angle > max) max = angle;
24740             }
24741
24742             if (max === -Infinity) return null;
24743
24744             return max;
24745         }
24746
24747
24748         // similar to geoOrthoCalcScore, but returns quickly if there is something to do
24749         function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
24750             var score = null;
24751             var first = isClosed ? 0 : 1;
24752             var last = isClosed ? coords.length : coords.length - 1;
24753
24754             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24755             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24756
24757             for (var i = first; i < last; i++) {
24758                 var a = coords[(i - 1 + coords.length) % coords.length];
24759                 var origin = coords[i];
24760                 var b = coords[(i + 1) % coords.length];
24761
24762                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
24763                 if (dotp === null) continue;        // ignore vertex
24764                 if (Math.abs(dotp) > 0) return 1;   // something to do
24765                 score = 0;                          // already square
24766             }
24767
24768             return score;
24769         }
24770
24771         var wikibooks = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Galician","galego","gl"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Khmer","ភាសាខ្មែរ","km"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malagasy","Malagasy","mg"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sinhala","සිංහල","si"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tagalog","Tagalog","tl"],["Turkish","Türkçe","tr"],["Tatar","татарча/tatarça","tt"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24772
24773         var wikibooks$1 = /*#__PURE__*/Object.freeze({
24774                 'default': wikibooks
24775         });
24776
24777         var wikinews = [["Arabic","العربية","ar"],["Bulgarian","български","bg"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Chinese","中文","zh"]];
24778
24779         var wikinews$1 = /*#__PURE__*/Object.freeze({
24780                 'default': wikinews
24781         });
24782
24783         var wikiquote = [["Afrikaans","Afrikaans","af"],["Arabic","العربية","ar"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Georgian","ქართული","ka"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kurdish","Kurdî","ku"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Vietnamese","Tiếng Việt","vi"],["Wolof","Wolof","wo"],["Chinese","中文","zh"]];
24784
24785         var wikiquote$1 = /*#__PURE__*/Object.freeze({
24786                 'default': wikiquote
24787         });
24788
24789         var wikiversity = [["Arabic","العربية","ar"],["Czech","čeština","cs"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Finnish","suomi","fi"],["French","français","fr"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Korean","한국어","ko"],["Portuguese","português","pt"],["Russian","русский","ru"],["Slovenian","slovenščina","sl"],["Swedish","svenska","sv"]];
24790
24791         var wikiversity$1 = /*#__PURE__*/Object.freeze({
24792                 'default': wikiversity
24793         });
24794
24795         var wikivoyage = [["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Spanish","español","es"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["French","français","fr"],["Hebrew","עברית","he"],["Italian","italiano","it"],["Dutch","Nederlands","nl"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Swedish","svenska","sv"],["Ukrainian","українська","uk"],["Vietnamese","Tiếng Việt","vi"],["Chinese","中文","zh"]];
24796
24797         var wikivoyage$1 = /*#__PURE__*/Object.freeze({
24798                 'default': wikivoyage
24799         });
24800
24801         var wiktionary = [["Afrikaans","Afrikaans","af"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Asturian","asturianu","ast"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Cherokee","ᏣᎳᎩ","chr"],["Corsican","corsu","co"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Divehi","ދިވެހިބަސް","dv"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Guarani","Avañe'ẽ","gn"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Kurdish","Kurdî","ku"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Luxembourgish","Lëtzebuergesch","lb"],["Limburgish","Limburgs","li"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Lithuanian","lietuvių","lt"],["Latvian","latviešu","lv"],["Malagasy","Malagasy","mg"],["Maori","Māori","mi"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Burmese","မြန်မာဘာသာ","my"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Low German","Plattdüütsch","nds"],["Nepali","नेपाली","ne"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Occitan","occitan","oc"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Western Punjabi","پنجابی","pnb"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["Russian","русский","ru"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sicilian","sicilianu","scn"],["Sindhi","سنڌي","sd"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Wolof","Wolof","wo"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Zulu","isiZulu","zu"]];
24802
24803         var wiktionary$1 = /*#__PURE__*/Object.freeze({
24804                 'default': wiktionary
24805         });
24806
24807         var wikipedia = [["Abkhazian","Аҧсшәа","ab"],["Achinese","Acèh","ace"],["Adyghe","адыгабзэ","ady"],["Afrikaans","Afrikaans","af"],["Akan","Akan","ak"],["Alemannisch","Alemannisch","als"],["Amharic","አማርኛ","am"],["Aragonese","aragonés","an"],["Old English","Ænglisc","ang"],["Arabic","العربية","ar"],["Aramaic","ܐܪܡܝܐ","arc"],["Egyptian Arabic","مصرى","arz"],["Assamese","অসমীয়া","as"],["Asturian","asturianu","ast"],["Avaric","авар","av"],["Aymara","Aymar aru","ay"],["Azerbaijani","azərbaycanca","az"],["تۆرکجه","تۆرکجه","azb"],["Bashkir","башҡортса","ba"],["Bavarian","Boarisch","bar"],["Samogitian","žemaitėška","bat-smg"],["Bikol Central","Bikol Central","bcl"],["Belarusian","беларуская","be"],["беларуская (тарашкевіца)‎","беларуская (тарашкевіца)‎","be-x-old"],["Bulgarian","български","bg"],["भोजपुरी","भोजपुरी","bh"],["Bislama","Bislama","bi"],["Banjar","Bahasa Banjar","bjn"],["Bambara","bamanankan","bm"],["Bangla","বাংলা","bn"],["Tibetan","བོད་ཡིག","bo"],["Bishnupriya","বিষ্ণুপ্রিয়া মণিপুরী","bpy"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Buginese","ᨅᨔ ᨕᨘᨁᨗ","bug"],["буряад","буряад","bxr"],["Catalan","català","ca"],["Chavacano de Zamboanga","Chavacano de Zamboanga","cbk-zam"],["Min Dong Chinese","Mìng-dĕ̤ng-ngṳ̄","cdo"],["Chechen","нохчийн","ce"],["Cebuano","Cebuano","ceb"],["Chamorro","Chamoru","ch"],["Cherokee","ᏣᎳᎩ","chr"],["Cheyenne","Tsetsêhestâhese","chy"],["Central Kurdish","کوردیی ناوەندی","ckb"],["Corsican","corsu","co"],["Cree","Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ","cr"],["Crimean Turkish","qırımtatarca","crh"],["Czech","čeština","cs"],["Kashubian","kaszëbsczi","csb"],["Church Slavic","словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ","cu"],["Chuvash","Чӑвашла","cv"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Zazaki","Zazaki","diq"],["Lower Sorbian","dolnoserbski","dsb"],["Divehi","ދިވެހިބަސް","dv"],["Dzongkha","ཇོང་ཁ","dz"],["Ewe","eʋegbe","ee"],["Greek","Ελληνικά","el"],["Emiliano-Romagnolo","emiliàn e rumagnòl","eml"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Basque","euskara","eu"],["Extremaduran","estremeñu","ext"],["Persian","فارسی","fa"],["Fulah","Fulfulde","ff"],["Finnish","suomi","fi"],["Võro","Võro","fiu-vro"],["Fijian","Na Vosa Vakaviti","fj"],["Faroese","føroyskt","fo"],["French","français","fr"],["Arpitan","arpetan","frp"],["Northern Frisian","Nordfriisk","frr"],["Friulian","furlan","fur"],["Western Frisian","Frysk","fy"],["Irish","Gaeilge","ga"],["Gagauz","Gagauz","gag"],["Gan Chinese","贛語","gan"],["Scottish Gaelic","Gàidhlig","gd"],["Galician","galego","gl"],["Gilaki","گیلکی","glk"],["Guarani","Avañe'ẽ","gn"],["Goan Konkani","गोंयची कोंकणी / Gõychi Konknni","gom"],["Gothic","𐌲𐌿𐍄𐌹𐍃𐌺","got"],["Gujarati","ગુજરાતી","gu"],["Manx","Gaelg","gv"],["Hausa","Hausa","ha"],["Hakka Chinese","客家語/Hak-kâ-ngî","hak"],["Hawaiian","Hawaiʻi","haw"],["Hebrew","עברית","he"],["Hindi","हिन्दी","hi"],["Fiji Hindi","Fiji Hindi","hif"],["Croatian","hrvatski","hr"],["Upper Sorbian","hornjoserbsce","hsb"],["Haitian Creole","Kreyòl ayisyen","ht"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Interlingua","interlingua","ia"],["Indonesian","Bahasa Indonesia","id"],["Interlingue","Interlingue","ie"],["Igbo","Igbo","ig"],["Inupiaq","Iñupiak","ik"],["Iloko","Ilokano","ilo"],["Ido","Ido","io"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ/inuktitut","iu"],["Japanese","日本語","ja"],["Jamaican Creole English","Patois","jam"],["Lojban","la .lojban.","jbo"],["Javanese","Basa Jawa","jv"],["Georgian","ქართული","ka"],["Kara-Kalpak","Qaraqalpaqsha","kaa"],["Kabyle","Taqbaylit","kab"],["Kabardian","Адыгэбзэ","kbd"],["Kongo","Kongo","kg"],["Kikuyu","Gĩkũyũ","ki"],["Kazakh","қазақша","kk"],["Kalaallisut","kalaallisut","kl"],["Khmer","ភាសាខ្មែរ","km"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Komi-Permyak","Перем Коми","koi"],["Karachay-Balkar","къарачай-малкъар","krc"],["Kashmiri","कॉशुर / کٲشُر","ks"],["Colognian","Ripoarisch","ksh"],["Kurdish","Kurdî","ku"],["Komi","коми","kv"],["Cornish","kernowek","kw"],["Kyrgyz","Кыргызча","ky"],["Latin","Latina","la"],["Ladino","Ladino","lad"],["Luxembourgish","Lëtzebuergesch","lb"],["лакку","лакку","lbe"],["Lezghian","лезги","lez"],["Ganda","Luganda","lg"],["Limburgish","Limburgs","li"],["Ligurian","Ligure","lij"],["Lombard","lumbaart","lmo"],["Lingala","lingála","ln"],["Lao","ລາວ","lo"],["Northern Luri","لۊری شومالی","lrc"],["Lithuanian","lietuvių","lt"],["Latgalian","latgaļu","ltg"],["Latvian","latviešu","lv"],["Maithili","मैथिली","mai"],["Basa Banyumasan","Basa Banyumasan","map-bms"],["Moksha","мокшень","mdf"],["Malagasy","Malagasy","mg"],["Eastern Mari","олык марий","mhr"],["Maori","Māori","mi"],["Minangkabau","Baso Minangkabau","min"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Mongolian","монгол","mn"],["Marathi","मराठी","mr"],["Western Mari","кырык мары","mrj"],["Malay","Bahasa Melayu","ms"],["Maltese","Malti","mt"],["Mirandese","Mirandés","mwl"],["Burmese","မြန်မာဘာသာ","my"],["Erzya","эрзянь","myv"],["Mazanderani","مازِرونی","mzn"],["Nauru","Dorerin Naoero","na"],["Nāhuatl","Nāhuatl","nah"],["Neapolitan","Napulitano","nap"],["Low German","Plattdüütsch","nds"],["Low Saxon","Nedersaksies","nds-nl"],["Nepali","नेपाली","ne"],["Newari","नेपाल भाषा","new"],["Dutch","Nederlands","nl"],["Norwegian Nynorsk","norsk nynorsk","nn"],["Norwegian","norsk bokmål","no"],["Novial","Novial","nov"],["Nouormand","Nouormand","nrm"],["Northern Sotho","Sesotho sa Leboa","nso"],["Navajo","Diné bizaad","nv"],["Nyanja","Chi-Chewa","ny"],["Occitan","occitan","oc"],["Livvi-Karelian","Livvinkarjala","olo"],["Oromo","Oromoo","om"],["Odia","ଓଡ଼ିଆ","or"],["Ossetic","Ирон","os"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Pangasinan","Pangasinan","pag"],["Pampanga","Kapampangan","pam"],["Papiamento","Papiamentu","pap"],["Picard","Picard","pcd"],["Pennsylvania German","Deitsch","pdc"],["Palatine German","Pälzisch","pfl"],["Pali","पालि","pi"],["Norfuk / Pitkern","Norfuk / Pitkern","pih"],["Polish","polski","pl"],["Piedmontese","Piemontèis","pms"],["Western Punjabi","پنجابی","pnb"],["Pontic","Ποντιακά","pnt"],["Pashto","پښتو","ps"],["Portuguese","português","pt"],["Quechua","Runa Simi","qu"],["Romansh","rumantsch","rm"],["Romani","Romani","rmy"],["Rundi","Kirundi","rn"],["Romanian","română","ro"],["Aromanian","armãneashti","roa-rup"],["tarandíne","tarandíne","roa-tara"],["Russian","русский","ru"],["Rusyn","русиньскый","rue"],["Kinyarwanda","Kinyarwanda","rw"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Sardinian","sardu","sc"],["Sicilian","sicilianu","scn"],["Scots","Scots","sco"],["Sindhi","سنڌي","sd"],["Northern Sami","sámegiella","se"],["Sango","Sängö","sg"],["Serbo-Croatian","srpskohrvatski / српскохрватски","sh"],["Sinhala","සිංහල","si"],["Simple English","Simple English","simple"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Samoan","Gagana Samoa","sm"],["Shona","chiShona","sn"],["Somali","Soomaaliga","so"],["Albanian","shqip","sq"],["Serbian","српски / srpski","sr"],["Sranan Tongo","Sranantongo","srn"],["Swati","SiSwati","ss"],["Southern Sotho","Sesotho","st"],["Saterland Frisian","Seeltersk","stq"],["Sundanese","Basa Sunda","su"],["Swedish","svenska","sv"],["Swahili","Kiswahili","sw"],["Silesian","ślůnski","szl"],["Tamil","தமிழ்","ta"],["Tulu","ತುಳು","tcy"],["Telugu","తెలుగు","te"],["Tetum","tetun","tet"],["Tajik","тоҷикӣ","tg"],["Thai","ไทย","th"],["Tigrinya","ትግርኛ","ti"],["Turkmen","Türkmençe","tk"],["Tagalog","Tagalog","tl"],["Tswana","Setswana","tn"],["Tongan","lea faka-Tonga","to"],["Tok Pisin","Tok Pisin","tpi"],["Turkish","Türkçe","tr"],["Tsonga","Xitsonga","ts"],["Tatar","татарча/tatarça","tt"],["Tumbuka","chiTumbuka","tum"],["Twi","Twi","tw"],["Tahitian","reo tahiti","ty"],["Tuvinian","тыва дыл","tyv"],["Udmurt","удмурт","udm"],["Uyghur","ئۇيغۇرچە / Uyghurche","ug"],["Ukrainian","українська","uk"],["Urdu","اردو","ur"],["Uzbek","oʻzbekcha/ўзбекча","uz"],["Venda","Tshivenda","ve"],["Venetian","vèneto","vec"],["Veps","vepsän kel’","vep"],["Vietnamese","Tiếng Việt","vi"],["West Flemish","West-Vlams","vls"],["Volapük","Volapük","vo"],["Walloon","walon","wa"],["Waray","Winaray","war"],["Wolof","Wolof","wo"],["Wu Chinese","吴语","wuu"],["Kalmyk","хальмг","xal"],["Xhosa","isiXhosa","xh"],["Mingrelian","მარგალური","xmf"],["Yiddish","ייִדיש","yi"],["Yoruba","Yorùbá","yo"],["Zhuang","Vahcuengh","za"],["Zeelandic","Zeêuws","zea"],["Chinese","中文","zh"],["Classical Chinese","文言","zh-classical"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"],["Cantonese","粵語","zh-yue"],["Zulu","isiZulu","zu"]];
24808
24809         var wikipedia$1 = /*#__PURE__*/Object.freeze({
24810                 'default': wikipedia
24811         });
24812
24813         var wikisource = [["Arabic","العربية","ar"],["Assamese","অসমীয়া","as"],["Azerbaijani","azərbaycanca","az"],["Belarusian","беларуская","be"],["Bulgarian","български","bg"],["Bangla","বাংলা","bn"],["Breton","brezhoneg","br"],["Bosnian","bosanski","bs"],["Catalan","català","ca"],["Czech","čeština","cs"],["Welsh","Cymraeg","cy"],["Danish","dansk","da"],["German","Deutsch","de"],["Greek","Ελληνικά","el"],["English","English","en"],["Esperanto","Esperanto","eo"],["Spanish","español","es"],["Estonian","eesti","et"],["Persian","فارسی","fa"],["Finnish","suomi","fi"],["Faroese","føroyskt","fo"],["French","français","fr"],["Galician","galego","gl"],["Gujarati","ગુજરાતી","gu"],["Hebrew","עברית","he"],["Croatian","hrvatski","hr"],["Hungarian","magyar","hu"],["Armenian","Հայերեն","hy"],["Indonesian","Bahasa Indonesia","id"],["Icelandic","íslenska","is"],["Italian","italiano","it"],["Japanese","日本語","ja"],["Kannada","ಕನ್ನಡ","kn"],["Korean","한국어","ko"],["Latin","Latina","la"],["Limburgish","Limburgs","li"],["Lithuanian","lietuvių","lt"],["Macedonian","македонски","mk"],["Malayalam","മലയാളം","ml"],["Marathi","मराठी","mr"],["Dutch","Nederlands","nl"],["Norwegian","norsk bokmål","no"],["Odia","ଓଡ଼ିଆ","or"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Polish","polski","pl"],["Portuguese","português","pt"],["Romanian","română","ro"],["Russian","русский","ru"],["Sanskrit","संस्कृतम्","sa"],["Sakha","саха тыла","sah"],["Slovak","slovenčina","sk"],["Slovenian","slovenščina","sl"],["Serbian","српски / srpski","sr"],["Swedish","svenska","sv"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Thai","ไทย","th"],["Turkish","Türkçe","tr"],["Ukrainian","українська","uk"],["Venetian","vèneto","vec"],["Vietnamese","Tiếng Việt","vi"],["Yiddish","ייִדיש","yi"],["Chinese","中文","zh"],["Chinese (Min Nan)","Bân-lâm-gú","zh-min-nan"]];
24814
24815         var wikisource$1 = /*#__PURE__*/Object.freeze({
24816                 'default': wikisource
24817         });
24818
24819         getCjsExportFromNamespace(wikibooks$1);
24820
24821         getCjsExportFromNamespace(wikinews$1);
24822
24823         getCjsExportFromNamespace(wikiquote$1);
24824
24825         getCjsExportFromNamespace(wikiversity$1);
24826
24827         getCjsExportFromNamespace(wikivoyage$1);
24828
24829         getCjsExportFromNamespace(wiktionary$1);
24830
24831         var require$$6 = getCjsExportFromNamespace(wikipedia$1);
24832
24833         getCjsExportFromNamespace(wikisource$1);
24834
24835         var wikipedia$2 = require$$6;
24836
24837         var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","postcode"]]},{countryCodes:["gb"],format:[["housename"],["housenumber","street"],["city","postcode"]]},{countryCodes:["ie"],format:[["housename"],["housenumber","street"],["city"],["postcode"]]},{countryCodes:["at","ch","de","si","pl"],format:[["street","housenumber"],["postcode","city"]]},{countryCodes:["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],format:[["street","housenumber","unit"],["postcode","city"]]},{countryCodes:["fr","lu","mo"],format:[["housenumber","street"],["postcode","city"]]},{countryCodes:["br"],format:[["street"],["housenumber","suburb"],["city","postcode"]]},{countryCodes:["vn"],format:[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{countryCodes:["ca"],format:[["housenumber","street","unit"],["city","province","postcode"]]},{countryCodes:["us"],format:[["housenumber","street","unit"],["city","state","postcode"]]},{countryCodes:["tw"],format:[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{countryCodes:["jp"],format:[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],dropdowns:["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],widths:{postcode:0.3,province:0.35,county:0.35,city:0.65,suburb:0.35,quarter:0.5,neighbourhood:0.5,block_number:0.5,housenumber:0.5}},{countryCodes:["tr"],format:[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{countryCodes:["ua"],format:[["housenumber","postcode"],["street"]]},{countryCodes:["cn"],format:[["postcode","province"],["city","district"],["street","housenumber"]]}];
24838
24839         var dataDeprecated = [{old:{aerialway:"canopy"},replace:{aerialway:"zip_line"}},{old:{aeroway:"aerobridge"},replace:{aeroway:"jet_bridge"}},{old:{amenity:"advertising"},replace:{advertising:"*"}},{old:{amenity:"artwork"},replace:{tourism:"artwork"}},{old:{amenity:"bail_bonds"},replace:{office:"bail_bond_agent"}},{old:{amenity:"car_repair"},replace:{shop:"car_repair"}},{old:{amenity:"changing_room"},replace:{amenity:"dressing_room"}},{old:{amenity:"citymap_post"},replace:{tourism:"information"}},{old:{amenity:"club"},replace:{club:"*"}},{old:{amenity:"community_center"},replace:{amenity:"community_centre"}},{old:{amenity:"dancing_school"},replace:{leisure:"dance","dance:teaching":"yes"}},{old:{amenity:"dog_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"dog_waste_bin"},replace:{amenity:"waste_basket",waste:"dog_excrement"}},{old:{amenity:"embassy"},replace:{office:"diplomatic"}},{old:{amenity:"ev_charging"},replace:{amenity:"charging_station"}},{old:{amenity:"fire_hydrant"},replace:{emergency:"fire_hydrant"}},{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{amenity:"garage"},replace:{landuse:"garages"}},{old:{amenity:"garages"},replace:{landuse:"garages"}},{old:{amenity:"gym"},replace:{leisure:"fitness_centre"}},{old:{amenity:"hotel"},replace:{tourism:"hotel"}},{old:{amenity:"kiosk"},replace:{shop:"kiosk"}},{old:{amenity:"nursery"},replace:{amenity:"kindergarten"}},{old:{amenity:"preschool"},replace:{amenity:"kindergarten",preschool:"yes"}},{old:{amenity:"public_building"},replace:{building:"public"}},{old:{amenity:"real_estate"},replace:{office:"estate_agent"}},{old:{amenity:"register_office"},replace:{office:"government",government:"register_office"}},{old:{amenity:"sauna"},replace:{leisure:"sauna"}},{old:{amenity:"scrapyard"},replace:{landuse:"industrial",industrial:"scrap_yard"}},{old:{amenity:"shop"},replace:{shop:"*"}},{old:{amenity:"sloped_curb"},replace:{kerb:"lowered"}},{old:{amenity:"social_club"},replace:{club:"*"}},{old:{amenity:"swimming_pool"},replace:{leisure:"swimming_pool"}},{old:{amenity:"ticket_booth"},replace:{shop:"ticket"}},{old:{amenity:"toilet"},replace:{amenity:"toilets"}},{old:{amenity:"vending_machine",vending:"news_papers"},replace:{amenity:"vending_machine",vending:"newspapers"}},{old:{amenity:"winery"},replace:{craft:"winery"}},{old:{amenity:"youth_center"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{amenity:"youth_centre"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{artwork:"*"},replace:{artwork_type:"$1"}},{old:{"artwork:type":"*"},replace:{artwork_type:"$1"}},{old:{attraction:"ferris_wheel"},replace:{attraction:"big_wheel"}},{old:{barrier:"curb"},replace:{barrier:"kerb"}},{old:{barrier:"embankment"},replace:{man_made:"embankment"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"wire"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{building:"entrance"},replace:{entrance:"*"}},{old:{building:"family_house"},replace:{building:"house"}},{old:{building:"home"},replace:{building:"house"}},{old:{building:"household"},replace:{building:"house"}},{old:{"building:color":"*"},replace:{"building:colour":"$1"}},{old:{"building:roof:colour":"*"},replace:{"roof:colour":"$1"}},{old:{"building:type":"*"},replace:{building:"$1"}},{old:{camp_site:"camp_pitch"},replace:{tourism:"camp_pitch"}},{old:{color:"*"},replace:{colour:"$1"}},{old:{craft:"glass"},replace:{craft:"glaziery"}},{old:{craft:"catering"},replace:{craft:"caterer"}},{old:{craft:"sculpter"},replace:{craft:"sculptor"}},{old:{crossing:"zebra"},replace:{crossing:"marked"}},{old:{cuisine:"gluten-free"},replace:{"diet:gluten_free":"*"}},{old:{cuisine:"halal"},replace:{"diet:halal":"*"}},{old:{cuisine:"kosher"},replace:{"diet:kosher":"*"}},{old:{cuisine:"vegan"},replace:{"diet:vegan":"*"}},{old:{cuisine:"vegetarian"},replace:{"diet:vegetarian":"*"}},{old:{curb:"*"},replace:{kerb:"$1"}},{old:{drinkable:"*"},replace:{drinking_water:"$1"}},{old:{dropped_kerb:"*"},replace:{kerb:"lowered"}},{old:{escalator:"*"},replace:{highway:"steps",conveying:"$1"}},{old:{fee:"0"},replace:{fee:"no"}},{old:{fee:"free"},replace:{fee:"no"}},{old:{fee:"Free"},replace:{fee:"no"}},{old:{fee:"No"},replace:{fee:"no"}},{old:{fee:"none"},replace:{fee:"no"}},{old:{fee:"some"},replace:{fee:"yes"}},{old:{fee:"Yes"},replace:{fee:"yes"}},{old:{fenced:"yes"},replace:{barrier:"fence"}},{old:{FIXME:"*"},replace:{fixme:"$1"}},{old:{footway:"both"},replace:{sidewalk:"both"}},{old:{footway:"crossing",highway:"cycleway"},replace:{cycleway:"crossing",highway:"cycleway"}},{old:{footway:"left"},replace:{sidewalk:"left"}},{old:{footway:"no"},replace:{sidewalk:"no"}},{old:{footway:"none"},replace:{sidewalk:"no"}},{old:{footway:"right"},replace:{sidewalk:"right"}},{old:{footway:"separate"},replace:{sidewalk:"separate"}},{old:{"generator:source":"photovoltaic"},replace:{"generator:source":"solar","generator:method":"photovoltaic"}},{old:{highway:"abandoned"},replace:{"abandoned:highway":"*"}},{old:{highway:"bridleway",horse:"no"},replace:{highway:"path",horse:"no"}},{old:{highway:"cycleway",bicycle:"no"},replace:{highway:"path",bicycle:"no"}},{old:{highway:"footway",foot:"no"},replace:{highway:"path",foot:"no"}},{old:{highway:"ford"},replace:{ford:"*"}},{old:{highway:"no"}},{old:{highway:"platform"},replace:{bus:"yes",public_transport:"platform"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"unsurfaced"},replace:{highway:"road",surface:"unpaved"}},{old:{internet_access:"public"},replace:{internet_access:"yes","internet_access:fee":"no"}},{old:{internet_access:"wifi"},replace:{internet_access:"wlan"}},{old:{"internet_access:fee":"0"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"Free"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:fee":"No"},replace:{"internet_access:fee":"no"}},{old:{"internet_access:name":"*"},replace:{"internet_access:ssid":"$1"}},{old:{"internet_access:type":"*"},replace:{internet_access:"$1"}},{old:{kerb:"dropped"},replace:{kerb:"lowered"}},{old:{kerb:"flat"},replace:{kerb:"flush"}},{old:{landuse:"basin"},replace:{natural:"water",water:"basin"}},{old:{landuse:"conservation"},replace:{boundary:"protected_area"}},{old:{landuse:"farm"},replace:{landuse:"farmland"}},{old:{landuse:"field"},replace:{landuse:"farmland"}},{old:{landuse:"pond"},replace:{natural:"water",water:"pond"}},{old:{landuse:"port"},replace:{landuse:"industrial",industrial:"port"}},{old:{landuse:"reservoir"},replace:{natural:"water",water:"reservoir"}},{old:{landuse:"wood"},replace:{natural:"wood"}},{old:{lawyer:"notary"},replace:{office:"notary"}},{old:{leisure:"beach"},replace:{natural:"beach"}},{old:{leisure:"club"},replace:{club:"*"}},{old:{leisure:"ice_rink",sport:"hockey"},replace:{leisure:"ice_rink",sport:"ice_hockey"}},{old:{leisure:"ice_rink",sport:"skating"},replace:{leisure:"ice_rink",sport:"ice_skating"}},{old:{leisure:"social_club"},replace:{club:"*"}},{old:{leisure:"video_arcade"},replace:{leisure:"amusement_arcade"}},{old:{leisure:"recreation_ground"},replace:{landuse:"recreation_ground"}},{old:{man_made:"cut_line"},replace:{man_made:"cutline"}},{old:{man_made:"jetty"},replace:{highway:"footway",man_made:"pier"}},{old:{man_made:"mdf"},replace:{telecom:"exchange"}},{old:{man_made:"MDF"},replace:{telecom:"exchange"}},{old:{man_made:"fuel_storage_tank"},replace:{man_made:"storage_tank",content:"fuel"}},{old:{man_made:"oil_tank"},replace:{man_made:"storage_tank",content:"oil"}},{old:{man_made:"wastewater_tank"},replace:{man_made:"storage_tank",content:"wastewater"}},{old:{man_made:"water_tank"},replace:{man_made:"storage_tank",content:"water"}},{old:{man_made:"well"},replace:{man_made:"water_well"}},{old:{man_made:"winery"},replace:{craft:"winery"}},{old:{memorial:"plate"},replace:{memorial:"plaque"}},{old:{mining_resource:"*"},replace:{resource:"$1"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{natural:"waterfall"},replace:{waterway:"waterfall"}},{old:{NOTE:"*"},replace:{note:"$1"}},{old:{nosquare:"*"},replace:{nonsquare:"$1"}},{old:{office:"administrative"},replace:{office:"government"}},{old:{office:"real_estate"},replace:{office:"estate_agent"}},{old:{oneway:"1"},replace:{oneway:"yes"}},{old:{oneway:"alternate"},replace:{oneway:"alternating"}},{old:{oneway:"no;yes"}},{old:{oneway:"unknown"}},{old:{place_name:"*"},replace:{name:"$1"}},{old:{pole:"transition"},replace:{"location:transition":"yes"}},{old:{postcode:"*"},replace:{"addr:postcode":"$1"}},{old:{power:"busbar"},replace:{power:"line",line:"busbar"}},{old:{power:"line",location:"underground"},replace:{power:"cable",location:"underground"}},{old:{power:"sub_station"},replace:{power:"substation"}},{old:{power:"substation",location:"kiosk"},replace:{power:"substation",man_made:"street_cabinet",street_cabinet:"power"}},{old:{power:"underground_cable"},replace:{power:"cable",location:"underground"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{recommended_speed:"*"},replace:{"maxspeed:advisory":"$1"}},{old:{"recommended_speed:backward":"*"},replace:{"maxspeed:advisory:backward":"$1"}},{old:{"recommended_speed:forward":"*"},replace:{"maxspeed:advisory:forward":"$1"}},{old:{religion:"catholic"},replace:{religion:"christian",denomination:"catholic"}},{old:{reservations:"*"},replace:{reservation:"$1"}},{old:{"roof:color":"*"},replace:{"roof:colour":"$1"}},{old:{route:"ncn"},replace:{route:"bicycle",network:"ncn"}},{old:{shop:"adult"},replace:{shop:"erotic"}},{old:{shop:"antique"},replace:{shop:"antiques"}},{old:{shop:"army_surplus"},replace:{shop:"military_surplus"}},{old:{shop:"auto_parts"},replace:{shop:"car_parts"}},{old:{shop:"baby"},replace:{shop:"baby_goods"}},{old:{shop:"baby_care"},replace:{shop:"baby_goods"}},{old:{shop:"bags"},replace:{shop:"bag"}},{old:{shop:"bail_bond"},replace:{office:"bail_bond_agent"}},{old:{shop:"bail_bonds"},replace:{office:"bail_bond_agent"}},{old:{shop:"betting"},replace:{shop:"bookmaker"}},{old:{shop:"boutique"},replace:{shop:"clothes"}},{old:{shop:"cafe"},replace:{amenity:"cafe"}},{old:{shop:"dive"},replace:{shop:"scuba_diving"}},{old:{shop:"fashion"},replace:{shop:"clothes"}},{old:{shop:"fish"},replace:{shop:"seafood"}},{old:{shop:"fishmonger"},replace:{shop:"seafood"}},{old:{shop:"furnace"},replace:{shop:"fireplace"}},{old:{shop:"gallery"},replace:{shop:"art"}},{old:{shop:"jewellery"},replace:{shop:"jewelry"}},{old:{shop:"lingerie"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"luggage"},replace:{shop:"bag"}},{old:{shop:"money_transfer"},replace:{amenity:"money_transfer"}},{old:{shop:"moneylender"},replace:{shop:"money_lender"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}},{old:{shop:"perfume"},replace:{shop:"perfumery"}},{old:{shop:"real_estate"},replace:{office:"estate_agent"}},{old:{shop:"tickets"},replace:{shop:"ticket"}},{old:{shop:"underwear"},replace:{shop:"clothes",clothes:"underwear"}},{old:{shop:"winery"},replace:{craft:"winery"}},{old:{sloped_curb:"0"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.00"},replace:{kerb:"flush"}},{old:{sloped_curb:"0.01"},replace:{kerb:"lowered","kerb:height":"1 cm"}},{old:{sloped_curb:"0.02"},replace:{kerb:"lowered","kerb:height":"2 cm"}},{old:{sloped_curb:"0.03"},replace:{kerb:"lowered","kerb:height":"3 cm"}},{old:{sloped_curb:"at_grade"},replace:{kerb:"flush"}},{old:{sloped_curb:"both"},replace:{kerb:"lowered"}},{old:{sloped_curb:"flush"},replace:{kerb:"flush"}},{old:{sloped_curb:"low"},replace:{kerb:"lowered"}},{old:{sloped_curb:"no"},replace:{kerb:"raised"}},{old:{sloped_curb:"yes"},replace:{kerb:"lowered"}},{old:{speed_limit:"*"},replace:{maxspeed:"$1"}},{old:{speedlimit:"*"},replace:{maxspeed:"$1"}},{old:{SpeedLimit:"*"},replace:{maxspeed:"$1"}},{old:{SPEEDLIMIT:"*"},replace:{maxspeed:"$1"}},{old:{sport:"horse_shoes"},replace:{sport:"horseshoes"}},{old:{sport:"horseshoe"},replace:{sport:"horseshoes"}},{old:{sport:"shuffle_board"},replace:{sport:"shuffleboard"}},{old:{sustenance:"bar"},replace:{amenity:"bar"}},{old:{sustenance:"cafe"},replace:{amenity:"cafe"}},{old:{sustenance:"pub"},replace:{amenity:"pub"}},{old:{sustenance:"restaurant"},replace:{amenity:"restaurant"}},{old:{"theatre:type":"amphitheatre"},replace:{"theatre:type":"amphi"}},{old:{todo:"*"},replace:{fixme:"$1"}},{old:{TODO:"*"},replace:{fixme:"$1"}},{old:{"toilets:disposal":"longdrop"},replace:{"toilets:disposal":"pitlatrine"}},{old:{"toilets:disposal":"pit_latrine"},replace:{"toilets:disposal":"pitlatrine"}},{old:{tourism:"bed_and_breakfast"},replace:{tourism:"guest_house",guest_house:"bed_and_breakfast"}},{old:{"tower:type":"power"},replace:{power:"tower"}},{old:{type:"broad_leaved"},replace:{leaf_type:"broadleaved"}},{old:{type:"conifer"},replace:{leaf_type:"needleleaved"}},{old:{type:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{unnamed:"*"},replace:{noname:"$1"}},{old:{water:"intermittent"},replace:{natural:"water",intermittent:"yes"}},{old:{water:"riverbank"},replace:{natural:"water",water:"river"}},{old:{water:"salt"},replace:{natural:"water",salt:"yes"}},{old:{water:"tidal"},replace:{natural:"water",tidal:"yes"}},{old:{waterway:"aqueduct"},replace:{waterway:"canal",bridge:"aqueduct"}},{old:{waterway:"lock"},replace:{waterway:"canal",lock:"yes"}},{old:{waterway:"riverbank"},replace:{natural:"water",water:"river"}},{old:{wifi:"yes"},replace:{internet_access:"wlan"}},{old:{wifi:"free"},replace:{internet_access:"wlan","internet_access:fee":"no"}},{old:{wood:"coniferous"},replace:{leaf_type:"needleleaved"}},{old:{wood:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{wood:"evergreen"},replace:{leaf_cycle:"evergreen"}},{old:{wood:"mixed"},replace:{leaf_cycle:"mixed",leaf_type:"mixed"}}];
24840
24841         var dataDiscarded = {created_by:true,odbl:true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"osmarender:nameDirection":true,"osmarender:renderName":true,"osmarender:renderRef":true,"osmarender:rendernames":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"SK53_bulk:load":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true};
24842
24843         var dataLocales = {af:{rtl:false},ar:{rtl:true},"ar-AA":{rtl:true},ast:{rtl:false},be:{rtl:false},bg:{rtl:false},bn:{rtl:false},bs:{rtl:false},ca:{rtl:false},ckb:{rtl:true},cs:{rtl:false},cy:{rtl:false},da:{rtl:false},de:{rtl:false},dv:{rtl:true},el:{rtl:false},"en-AU":{rtl:false},"en-GB":{rtl:false},eo:{rtl:false},es:{rtl:false},et:{rtl:false},eu:{rtl:false},fa:{rtl:true},fi:{rtl:false},fr:{rtl:false},gan:{rtl:false},gl:{rtl:false},gu:{rtl:false},he:{rtl:true},hi:{rtl:false},hr:{rtl:false},hu:{rtl:false},hy:{rtl:false},ia:{rtl:false},id:{rtl:false},is:{rtl:false},it:{rtl:false},ja:{rtl:false},jv:{rtl:false},km:{rtl:false},kn:{rtl:false},ko:{rtl:false},ku:{rtl:false},lij:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pap:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},so:{rtl:false},sq:{rtl:false},sr:{rtl:false},sv:{rtl:false},ta:{rtl:false},te:{rtl:false},th:{rtl:false},tl:{rtl:false},tr:{rtl:false},uk:{rtl:false},ur:{rtl:true},vi:{rtl:false},yue:{rtl:false},zh:{rtl:false},"zh-CN":{rtl:false},"zh-HK":{rtl:false},"zh-TW":{rtl:false}};
24844
24845         var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
24846
24847         var dataShortcuts = [{tab:"browsing",text:"shortcuts.browsing.title",columns:[{rows:[{section:"navigation",text:"shortcuts.browsing.navigation.title"},{shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan",separator:","},{modifiers:["⌘"],shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan_more",separator:","},{shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom",separator:","},{modifiers:["⌘"],shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom_more",separator:","},{section:"help",text:"shortcuts.browsing.help.title"},{shortcuts:["help.key"],text:"shortcuts.browsing.help.help"},{shortcuts:["shortcuts.toggle.key","?"],text:"shortcuts.browsing.help.keyboard"},{section:"display_options",text:"shortcuts.browsing.display_options.title"},{shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background"},{modifiers:["⌘"],shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background_switch"},{shortcuts:["map_data.key"],text:"shortcuts.browsing.display_options.map_data"},{modifiers:["⌃","⌘"],shortcuts:["F","F11"],text:"shortcuts.browsing.display_options.fullscreen"},{shortcuts:["sidebar.key","`","²"],text:"shortcuts.browsing.display_options.sidebar"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{modifiers:["⌥"],shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.osm_data"},{shortcuts:["background.minimap.key"],text:"shortcuts.browsing.display_options.minimap"}]},{rows:[{section:"selecting",text:"shortcuts.browsing.selecting.title"},{shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_one"},{modifiers:["⇧"],shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_multi"},{modifiers:["⇧"],shortcuts:["Left-click"],gesture:"shortcuts.gesture.drag",text:"shortcuts.browsing.selecting.lasso"},{modifiers:["⌘"],shortcuts:["F"],text:"shortcuts.browsing.selecting.search"},{section:"with_selected",text:"shortcuts.browsing.with_selected.title"},{shortcuts:["Right-click","shortcuts.key.space"],text:"shortcuts.browsing.with_selected.edit_menu"},{shortcuts:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{section:"vertex_selected",text:"shortcuts.browsing.vertex_selected.title"},{shortcuts:["[","↖"],text:"shortcuts.browsing.vertex_selected.previous"},{shortcuts:["]","↘"],text:"shortcuts.browsing.vertex_selected.next"},{shortcuts:["{","⇞"],text:"shortcuts.browsing.vertex_selected.first"},{shortcuts:["}","⇟"],text:"shortcuts.browsing.vertex_selected.last"},{shortcuts:["\\","shortcuts.key.pause"],text:"shortcuts.browsing.vertex_selected.change_parent"}]}]},{tab:"editing",text:"shortcuts.editing.title",columns:[{rows:[{section:"drawing",text:"shortcuts.editing.drawing.title"},{shortcuts:["modes.add_feature.key"],text:"shortcuts.editing.drawing.focus_add_feature"},{shortcuts:["1","2","3"],text:"shortcuts.editing.drawing.add_favorite",separator:",",suffix:"…"},{shortcuts:["modes.add_note.key"],text:"shortcuts.editing.drawing.add_note"},{shortcuts:["Left-click","shortcuts.key.space"],text:"shortcuts.editing.drawing.place_point"},{shortcuts:["⌥"],text:"shortcuts.editing.drawing.disable_snap"},{shortcuts:["↵","⎋"],text:"shortcuts.editing.drawing.stop_line"},{section:"commands",text:"shortcuts.editing.commands.title"},{modifiers:["⌘"],shortcuts:["C"],text:"shortcuts.editing.commands.copy"},{modifiers:["⌘"],shortcuts:["V"],text:"shortcuts.editing.commands.paste"},{modifiers:["⌘"],shortcuts:["Z"],text:"shortcuts.editing.commands.undo"},{modifiers:["⌘","⇧"],shortcuts:["Z"],text:"shortcuts.editing.commands.redo"},{modifiers:["⌘"],shortcuts:["S"],text:"shortcuts.editing.commands.save"}]},{rows:[{section:"operations",text:"shortcuts.editing.operations.title"},{shortcuts:["operations.continue.key"],text:"shortcuts.editing.operations.continue_line"},{shortcuts:["operations.merge.key"],text:"shortcuts.editing.operations.merge"},{shortcuts:["operations.disconnect.key"],text:"shortcuts.editing.operations.disconnect"},{shortcuts:["operations.extract.key"],text:"shortcuts.editing.operations.extract"},{shortcuts:["operations.split.key"],text:"shortcuts.editing.operations.split"},{shortcuts:["operations.reverse.key"],text:"shortcuts.editing.operations.reverse"},{shortcuts:["operations.move.key"],text:"shortcuts.editing.operations.move"},{shortcuts:["operations.rotate.key"],text:"shortcuts.editing.operations.rotate"},{shortcuts:["operations.orthogonalize.key"],text:"shortcuts.editing.operations.orthogonalize"},{shortcuts:["operations.straighten.key"],text:"shortcuts.editing.operations.straighten"},{shortcuts:["operations.circularize.key"],text:"shortcuts.editing.operations.circularize"},{shortcuts:["operations.reflect.key.long"],text:"shortcuts.editing.operations.reflect_long"},{shortcuts:["operations.reflect.key.short"],text:"shortcuts.editing.operations.reflect_short"},{modifiers:["⌘"],shortcuts:["⌫"],text:"shortcuts.editing.operations.delete"}]}]},{tab:"tools",text:"shortcuts.tools.title",columns:[{rows:[{section:"info",text:"shortcuts.tools.info.title"},{modifiers:["⌘"],shortcuts:["info_panels.key"],text:"shortcuts.tools.info.all"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.background.key"],text:"shortcuts.tools.info.background"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.history.key"],text:"shortcuts.tools.info.history"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.location.key"],text:"shortcuts.tools.info.location"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.measurement.key"],text:"shortcuts.tools.info.measurement"}]}]}];
24848
24849         var type$1 = "FeatureCollection";
24850         var features = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,55],[170,53],[180,49],[180,55]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
24851         var dataImperial = {
24852         type: type$1,
24853         features: features
24854         };
24855
24856         var type$2 = "FeatureCollection";
24857         var features$1 = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-63,-50.5],[-60,-54],[-55,-51],[-63,-50.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,55],[170,53],[180,49],[180,55]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[143,22],[143,12],[147,12],[147,22],[143,22]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-68.44482421875,17.623081791311755],[-64.34692382812499,17.38209494787749],[-63.951416015625,19.03096327846469],[-67.950439453125,18.885497977462876],[-68.44482421875,17.623081791311755]]]}}];
24858         var dataMPH = {
24859         type: type$2,
24860         features: features$1
24861         };
24862
24863         var type$3 = "FeatureCollection";
24864         var features$2 = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
24865         var dataDriveLeft = {
24866         type: type$3,
24867         features: features$2
24868         };
24869
24870         var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org",favorite:"favorite"},toolbar:{inspect:"Inspect",undo_redo:"Undo / Redo",recent:"Recent",favorites:"Favorites",add_feature:"Add Feature"},modes:{add_feature:{title:"Add a feature",description:"Search for features to add to the map.",key:"Tab",result:"{count} result",results:"{count} results"},add_area:{title:"Area",description:"Add parks, buildings, lakes or other areas to the map.",tail:"Click on the map to start drawing an area, like a park, lake, or building.",filter_tooltip:"areas"},add_line:{title:"Line",description:"Add highways, streets, pedestrian paths, canals or other lines to the map.",tail:"Click on the map to start drawing a road, path, or route.",filter_tooltip:"lines"},add_point:{title:"Point",description:"Add restaurants, monuments, postal boxes or other points to the map.",tail:"Click on the map to add a point.",filter_tooltip:"points"},add_note:{title:"Note",label:"Add Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note.",key:"N"},add_preset:{title:"Add {feature}",point:{title:"Add {feature} as a point"},line:{title:"Add {feature} as a line"},area:{title:"Add {feature} as an area"},building:{title:"Add {feature} as a building"}},browse:{title:"Browse",description:"Pan and zoom the map."},draw_area:{tail:"Click to add nodes to your area. Click the first node to finish the area."},draw_line:{tail:"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},drag_node:{connected_to_hidden:"This can't be edited because it is connected to a hidden feature."}},operations:{add:{annotation:{point:"Added a point.",vertex:"Added a node to a way.",relation:"Added a relation.",note:"Added a note."}},start:{annotation:{line:"Started a line.",area:"Started an area."}},"continue":{key:"A",title:"Continue",description:"Continue this line.",not_eligible:"No line can be continued here.",multiple:"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.",annotation:{line:"Continued a line.",area:"Continued an area."}},cancel_draw:{annotation:"Canceled drawing."},change_role:{annotation:"Changed the role of a relation member."},change_tags:{annotation:"Changed tags."},circularize:{title:"Circularize",description:{line:"Make this line circular.",area:"Make this area circular."},key:"O",annotation:{line:"Made a line circular.",area:"Made an area circular."},not_closed:"This can't be made circular because it's not a loop.",too_large:"This can't be made circular because not enough of it is currently visible.",connected_to_hidden:"This can't be made circular because it is connected to a hidden feature.",not_downloaded:"This can't be made circular because parts of it have not yet been downloaded."},orthogonalize:{title:"Square",description:{vertex:"Square this corner.",line:"Square the corners of this line.",area:"Square the corners of this area."},key:"Q",annotation:{vertex:"Squared a single corner.",line:"Squared the corners of a line.",area:"Squared the corners of an area."},end_vertex:"This can't be squared because it is an end node.",square_enough:"This can't be made more square than it already is.",not_squarish:"This can't be made square because it is not squarish.",too_large:"This can't be made square because not enough of it is currently visible.",connected_to_hidden:"This can't be made square because it is connected to a hidden feature.",not_downloaded:"This can't be made square because parts of it have not yet been downloaded."},straighten:{title:"Straighten",description:{points:"Straighten these points.",line:"Straighten this line."},key:"S",annotation:{points:"Straightened several points.",line:"Straightened a line."},too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This can't be straightened because it is connected to a hidden feature.",not_downloaded:"This can't be straightened because parts of it have not yet been downloaded."},"delete":{title:"Delete",description:{single:"Delete this feature permanently.",multiple:"Delete these features permanently."},annotation:{point:"Deleted a point.",vertex:"Deleted a node from a way.",line:"Deleted a line.",area:"Deleted an area.",relation:"Deleted a relation.",multiple:"Deleted {n} features."},too_large:{single:"This feature can't be deleted because not enough of it is currently visible.",multiple:"These features can't be deleted because not enough of them are currently visible."},incomplete_relation:{single:"This feature can't be deleted because it hasn't been fully downloaded.",multiple:"These features can't be deleted because they haven't been fully downloaded."},part_of_relation:{single:"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.",multiple:"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},connected_to_hidden:{single:"This feature can't be deleted because it is connected to a hidden feature.",multiple:"These features can't be deleted because some are connected to hidden features."},not_downloaded:{single:"This feature can't be deleted because parts of it have not yet been downloaded.",multiple:"These features can't be deleted because parts of them have not yet been downloaded."},has_wikidata_tag:{single:"This feature can't be deleted because it has a Wikidata tag.",multiple:"These features can't be deleted because some have Wikidata tags."}},downgrade:{title:"Downgrade",description:{building_address:"Remove all non-address and non-building tags.",building:"Remove all non-building tags.",address:"Remove all non-address tags."},annotation:{building:{single:"Downgraded a feature to a basic building.",multiple:"Downgraded {n} features to basic buildings."},address:{single:"Downgraded a feature to an address.",multiple:"Downgraded {n} features to addresses."},multiple:"Downgraded {n} features."},has_wikidata_tag:{single:"This feature can't be downgraded because it has a Wikidata tag.",multiple:"These features can't be downgraded because some have Wikidata tags."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},reorder_members:{annotation:"Reordered a relation's members."},connect:{annotation:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point to an area."}},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},disconnect:{title:"Disconnect",description:"Disconnect these lines/areas from each other.",line:{description:"Disconnect this line from other features."},area:{description:"Disconnect this area from other features."},key:"D",annotation:"Disconnected lines/areas.",too_large:{single:"This can't be disconnected because not enough of it is currently visible."},not_connected:"There aren't enough lines/areas here to disconnect.",not_downloaded:"This can't be disconnected because parts of it have not yet been downloaded.",connected_to_hidden:"This can't be disconnected because it is connected to a hidden feature.",relation:"This can't be disconnected because it connects members of a relation."},merge:{title:"Merge",description:"Merge these features.",key:"C",annotation:"Merged {n} features.",not_eligible:"These features can't be merged.",not_adjacent:"These features can't be merged because their endpoints aren't connected.",restriction:"These features can't be merged because it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",incomplete_relation:"These features can't be merged because at least one hasn't been fully downloaded.",conflicting_tags:"These features can't be merged because some of their tags have conflicting values.",paths_intersect:"These features can't be merged because the resulting path would intersect itself."},move:{title:"Move",description:{single:"Move this feature to a different location.",multiple:"Move these features to a different location."},key:"M",annotation:{point:"Moved a point.",vertex:"Moved a node in a way.",line:"Moved a line.",area:"Moved an area.",multiple:"Moved multiple features."},incomplete_relation:{single:"This feature can't be moved because it hasn't been fully downloaded.",multiple:"These features can't be moved because they haven't been fully downloaded."},too_large:{single:"This feature can't be moved because not enough of it is currently visible.",multiple:"These features can't be moved because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be moved because it is connected to a hidden feature.",multiple:"These features can't be moved because some are connected to hidden features."},not_downloaded:{single:"This feature can't be moved because parts of it have not yet been downloaded.",multiple:"These features can't be moved because parts of them have not yet been downloaded."}},reflect:{title:{long:"Reflect Long",short:"Reflect Short"},description:{long:{single:"Reflect this feature across its long axis.",multiple:"Reflect these features across their long axis."},short:{single:"Reflect this feature across its short axis.",multiple:"Reflect these features across their short axis."}},key:{long:"T",short:"Y"},annotation:{long:{single:"Reflected a feature across its long axis.",multiple:"Reflected multiple features across their long axis."},short:{single:"Reflected a feature across its short axis.",multiple:"Reflected multiple features across their short axis."}},incomplete_relation:{single:"This feature can't be reflected because it hasn't been fully downloaded.",multiple:"These features can't be reflected because they haven't been fully downloaded."},too_large:{single:"This feature can't be reflected because not enough of it is currently visible.",multiple:"These features can't be reflected because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be reflected because it is connected to a hidden feature.",multiple:"These features can't be reflected because some are connected to hidden features."},not_downloaded:{single:"This feature can't be reflected because parts of it have not yet been downloaded.",multiple:"These features can't be reflected because parts of them have not yet been downloaded."}},rotate:{title:"Rotate",description:{single:"Rotate this feature around its center point.",multiple:"Rotate these features around their center point."},key:"R",annotation:{line:"Rotated a line.",area:"Rotated an area.",multiple:"Rotated multiple features."},incomplete_relation:{single:"This feature can't be rotated because it hasn't been fully downloaded.",multiple:"These features can't be rotated because they haven't been fully downloaded."},too_large:{single:"This feature can't be rotated because not enough of it is currently visible.",multiple:"These features can't be rotated because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be rotated because it is connected to a hidden feature.",multiple:"These features can't be rotated because some are connected to hidden features."},not_downloaded:{single:"This feature can't be rotated because parts of it have not yet been downloaded.",multiple:"These features can't be rotated because parts of them have not yet been downloaded."}},reverse:{title:"Reverse",description:"Make this line go in the opposite direction.",key:"V",annotation:"Reversed a line."},split:{title:"Split",description:{line:"Split this line into two at this node.",area:"Split the boundary of this area into two.",multiple:"Split the lines/area boundaries at this node into two."},key:"X",annotation:{line:"Split a line.",area:"Split an area boundary.",multiple:"Split {n} lines/area boundaries."},not_eligible:"Lines can't be split at their beginning or end.",multiple_ways:"There are too many lines here to split.",connected_to_hidden:"This can't be split because it is connected to a hidden feature."},restriction:{annotation:{create:"Added a turn restriction","delete":"Deleted a turn restriction"}},extract:{title:"Extract",key:"E",description:{vertex:{single:"Extract this point from its parent lines/areas."},area:{single:"Extract a point from this area."}},annotation:{single:"Extracted a point."},too_large:{area:{single:"A point can't be extracted from this area because not enough of it is currently visible."}},restriction:{vertex:{single:"This point can't be extracted because it would damage a \"{relation}\" relation."}},connected_to_hidden:{vertex:{single:"This point can't be extracted because it is connected to a hidden feature."}}}},restriction:{controls:{distance:"Distance",distance_up_to:"Up to {distance}",via:"Via",via_node_only:"Node only",via_up_to_one:"Up to 1 way",via_up_to_two:"Up to 2 ways"},help:{indirect:"(indirect)",turn:{no_left_turn:"NO Left Turn {indirect}",no_right_turn:"NO Right Turn {indirect}",no_u_turn:"NO U-Turn {indirect}",no_straight_on:"NO Straight On {indirect}",only_left_turn:"ONLY Left Turn {indirect}",only_right_turn:"ONLY Right Turn {indirect}",only_u_turn:"ONLY U-Turn {indirect}",only_straight_on:"ONLY Straight On {indirect}",allowed_left_turn:"Left Turn Allowed {indirect}",allowed_right_turn:"Right Turn Allowed {indirect}",allowed_u_turn:"U-Turn Allowed {indirect}",allowed_straight_on:"Straight On Allowed {indirect}"},from:"FROM",via:"VIA",to:"TO",from_name:"{from} {fromName}",from_name_to_name:"{from} {fromName} {to} {toName}",via_names:"{via} {viaNames}",select_from:"Click to select a {from} segment",select_from_name:"Click to select {from} {fromName}",toggle:"Click for \"{turn}\""}},undo:{tooltip:"Undo: {action}",nothing:"Nothing to undo."},redo:{tooltip:"Redo: {action}",nothing:"Nothing to redo."},tooltip_keyhint:"Shortcut:",browser_notice:"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",translate:{translate:"Translate",localized_translation_label:"Multilingual Name",localized_translation_language:"Choose language",localized_translation_name:"Name"},zoom_in_edit:"Zoom in to edit",login:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",sidebar:{key:"`",tooltip:"Toggle the sidebar."},feature_info:{hidden_warning:"{count} hidden features",hidden_details:"These features are currently hidden: {details}"},status:{error:"Unable to connect to API.",offline:"The API is offline. Please try editing later.",readonly:"The API is read-only. You will need to wait to save your changes.",rateLimit:"The API is limiting anonymous connections.  You can fix this by logging in."},commit:{title:"Upload to OpenStreetMap",upload_explanation:"The changes you upload will be visible on all maps that use OpenStreetMap data.",upload_explanation_with_user:"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",request_review:"I would like someone to review my edits.",save:"Upload",cancel:"Cancel",changes:"{count} Changes",download_changes:"Download osmChange file",errors:"Errors",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",outstanding_errors_message:"Please resolve all errors first. {count} remaining.",comment_needed_message:"Please add a changeset comment first.",about_changeset_comments:"About changeset comments",about_changeset_comments_link:"//wiki.openstreetmap.org/wiki/Good_changeset_comments",google_warning:"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",google_warning_link:"https://www.openstreetmap.org/copyright"},contributors:{list:"Edits by {users}",truncated_list:"Edits by {users} and {count} others"},info_panels:{key:"I",background:{key:"B",title:"Background",zoom:"Zoom",vintage:"Vintage",source:"Source",description:"Description",resolution:"Resolution",accuracy:"Accuracy",unknown:"Unknown",show_tiles:"Show Tiles",hide_tiles:"Hide Tiles",show_vintage:"Show Vintage",hide_vintage:"Hide Vintage"},history:{key:"H",title:"History",selected:"{n} selected",no_history:"No History (New Feature)",version:"Version",last_edit:"Last Edit",edited_by:"Edited By",changeset:"Changeset",unknown:"Unknown",link_text:"History on openstreetmap.org",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note on openstreetmap.org"},location:{key:"L",title:"Location",unknown_location:"Unknown Location"},measurement:{key:"M",title:"Measurement",selected:"{n} selected",geometry:"Geometry",closed_line:"closed line",closed_area:"closed area",center:"Center",perimeter:"Perimeter",length:"Length",area:"Area",centroid:"Centroid",location:"Location",metric:"Metric",imperial:"Imperial",node_count:"Number of nodes"}},geometry:{point:"point",vertex:"vertex",line:"line",area:"area",relation:"relation",note:"note"},geocoder:{search:"Search worldwide...",no_results_visible:"No results in visible map area",no_results_worldwide:"No results found"},geolocate:{title:"Show My Location",locating:"Locating, please wait..."},inspector:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",add_to_relation:"Add to a relation",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",no_documentation_key:"There is no documentation available.",edit_reference:"edit/translate",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",hidden_preset:{manual:"{features} are hidden. Enable them in the Map Data pane.",zoom:"{features} are hidden. Zoom in to enable them."},back_tooltip:"Change feature",remove:"Remove",search:"Search",multiselect:"Selected features",unknown:"Unknown",incomplete:"<not downloaded>",feature_list:"Search features",edit:"Edit feature",check:{yes:"Yes",no:"No",reverser:"Change Direction"},radio:{structure:{type:"Type","default":"Default",layer:"Layer"}},add:"Add",none:"None",node:"Node",way:"Way",relation:"Relation",location:"Location",add_fields:"Add field:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},background:{title:"Background",description:"Background settings",key:"B",backgrounds:"Backgrounds",none:"None",best_imagery:"Best known imagery source for this location","switch":"Switch back to this background",custom:"Custom",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",reset_all:"Reset All",display_options:"Display Options",brightness:"Brightness",contrast:"Contrast",saturation:"Saturation",sharpness:"Sharpness",minimap:{description:"Show Minimap",tooltip:"Show a zoomed out map to help locate the area currently displayed.",key:"/"},fix_misalignment:"Adjust imagery offset",offset:"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},map_data:{title:"Map Data",description:"Map Data",key:"F",data_layers:"Data Layers",layers:{osm:{tooltip:"Map data from OpenStreetMap",title:"OpenStreetMap data"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},improveOSM:{tooltip:"Missing data automatically detected by improveosm.org",title:"ImproveOSM Issues"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to data"}},fill_area:"Fill Areas",map_features:"Map Features",autohidden:"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them.",osmhidden:"These features have been automatically hidden because the OpenStreetMap layer is hidden."},photo_overlays:{title:"Photo Overlays",traffic_signs:{title:"Traffic Signs"},photo_type:{flat:{title:"Flat Photos",tooltip:"Traditional photos"},panoramic:{title:"Panoramic Photos",tooltip:"360° photos"}}},feature:{points:{description:"Points",tooltip:"Points of Interest"},traffic_roads:{description:"Traffic Roads",tooltip:"Highways, Streets, etc."},service_roads:{description:"Service Roads",tooltip:"Service Roads, Parking Aisles, Tracks, etc."},paths:{description:"Paths",tooltip:"Sidewalks, Foot Paths, Cycle Paths, etc."},buildings:{description:"Buildings",tooltip:"Buildings, Shelters, Garages, etc."},building_parts:{description:"Building Parts",tooltip:"3D Building and Roof Components"},indoor:{description:"Indoor Features",tooltip:"Rooms, Corridors, Stairwells, etc."},landuse:{description:"Landuse Features",tooltip:"Forests, Farmland, Parks, Residential, Commercial, etc."},boundaries:{description:"Boundaries",tooltip:"Administrative Boundaries"},water:{description:"Water Features",tooltip:"Rivers, Lakes, Ponds, Basins, etc."},rail:{description:"Rail Features",tooltip:"Railways"},pistes:{description:"Pistes",tooltip:"Ski Slopes, Sled Runs, Ice Skating Trails, etc."},aerialways:{description:"Aerial Features",tooltip:"Chair Lifts, Gondolas, Zip Lines, etc."},power:{description:"Power Features",tooltip:"Power Lines, Power Plants, Substations, etc."},past_future:{description:"Past/Future Features",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Other Features",tooltip:"Everything Else"}},area_fill:{wireframe:{description:"No Fill (Wireframe)",tooltip:"Enabling wireframe mode makes it easy to see the background imagery.",key:"W"},partial:{description:"Partial Fill",tooltip:"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},full:{description:"Full Fill",tooltip:"Areas are drawn fully filled."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"Enter a tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n   {-y} or {ty} for flipped TMS-style Y coordinates\n   {u} for quadtile scheme\n   {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},restore:{heading:"You have unsaved changes",description:"Do you wish to restore unsaved changes from a previous editing session?",restore:"Restore my changes",reset:"Discard my changes"},save:{title:"Save",help:"Review your changes and upload them to OpenStreetMap, making them visible to other users.",no_changes:"No changes to save.",error:"Errors occurred while trying to save",status_code:"Server returned status code {code}",unknown_error_details:"Please ensure you are connected to the internet.",uploading:"Uploading changes to OpenStreetMap...",conflict_progress:"Checking for conflicts: {num} of {total}",unsaved_changes:"You have unsaved changes",conflict:{header:"Resolve conflicting edits",count:"Conflict {num} of {total}",previous:"< Previous",next:"Next >",keep_local:"Keep mine",keep_remote:"Use theirs",restore:"Restore","delete":"Leave Deleted",download_changes:"Or download osmChange file",done:"All conflicts resolved!",help:"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},merge_remote_changes:{conflict:{deleted:"This feature has been deleted by {user}.",location:"This feature was moved by both you and {user}.",nodelist:"Nodes were changed by both you and {user}.",memberlist:"Relation members were changed by both you and {user}.",tags:"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},success:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",thank_you_where:{format:"{place}{separator}{region}",separator:", "},help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",help_link_text:"Details",help_link_url:"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},confirm:{okay:"OK",cancel:"Cancel"},splash:{welcome:"Welcome to the iD OpenStreetMap editor",text:"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.",walkthrough:"Start the Walkthrough",start:"Edit now"},source_switch:{live:"live",lose_changes:"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?",dev:"dev"},version:{whats_new:"What's new in iD {version}"},tag_reference:{description:"Description",on_wiki:"{tag} on wiki.osm.org",used_with:"used with {type}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",QA:{improveOSM:{title:"ImproveOSM Detection",geometry_types:{path:"paths",parking:"parking",road:"roads",both:"roads and parking"},directions:{east:"east",north:"north",northeast:"northeast",northwest:"northwest",south:"south",southeast:"southeast",southwest:"southwest",west:"west"},error_types:{ow:{title:"Missing One-way",description:"Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a \"oneway\" tag."},mr:{title:"Missing Geometry",description:"{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.",description_alt:"Data from a 3rd party suggests there may be unmapped {geometry_type} here."},tr:{title:"Missing Turn Restriction",description:"{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing \"{turn_restriction}\" restriction."}}},keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},streetside:{tooltip:"Streetside photos from Microsoft",title:"Bing Streetside",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary"},mapillary:{title:"Mapillary",signs:{tooltip:"Traffic signs from Mapillary"},view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam"},openstreetcam:{title:"OpenStreetCam",view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},help:{title:"Help",key:"H",help:{title:"Help",welcome:"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",open_data_h:"Open Data",open_data:"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",before_start_h:"Before you start",before_start:"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",open_source_h:"Open Source",open_source:"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",open_source_help:"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},overview:{title:"Overview",navigation_h:"Navigation",navigation_drag:"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",navigation_zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",features_h:"Map Features",features:"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},editing:{title:"Editing & Saving",select_h:"Select",select_left_click:"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",select_right_click:"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",multiselect_h:"Multiselect",multiselect_shift_click:"`{shift}`+{leftclick} left-click to select several features together.  This makes it easier to move or delete multiple items.",multiselect_lasso:"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",undo_redo_h:"Undo & Redo",undo_redo:"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",save_h:"Save",save:"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",save_validation:"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",upload_h:"Upload",upload:"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",backups_h:"Automatic Backups",backups:"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",keyboard_h:"Keyboard Shortcuts",keyboard:"You can view a list of keyboard shortcuts by pressing the `?` key."},feature_editor:{title:"Feature Editor",intro:"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",definitions:"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",type_h:"Feature Type",type:"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",type_picker:"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",fields_h:"Fields",fields_all_fields:"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",fields_example:"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",fields_add_field:"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",tags_h:"Tags",tags_all_tags:"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",tags_resources:"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},points:{title:"Points",intro:"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",add_point_h:"Adding Points",add_point:"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",add_point_finish:"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",move_point_h:"Moving Points",move_point:"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",delete_point_h:"Deleting Points",delete_point:"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",delete_point_command:"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},lines:{title:"Lines",intro:"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",add_line_h:"Adding Lines",add_line:"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",add_line_draw:"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_line_finish:"To finish a line, press `{return}` or click again on the last node.",modify_line_h:"Modifying Lines",modify_line_dragnode:"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",modify_line_addnode:"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",connect_line_h:"Connecting Lines",connect_line:"Having roads connected properly is important for the map and essential for providing driving directions.",connect_line_display:"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",connect_line_drag:"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",connect_line_tag:"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",disconnect_line_h:"Disconnecting Lines",disconnect_line_command:"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",move_line_h:"Moving Lines",move_line_command:"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",move_line_connected:"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",delete_line_h:"Deleting Lines",delete_line:"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",delete_line_command:"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},areas:{title:"Areas",intro:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",point_or_area_h:"Points or Areas?",point_or_area:"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",add_area_h:"Adding Areas",add_area_command:"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",add_area_draw:"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_area_finish:"To finish an area, press `{return}` or click again on either the first or last node.",square_area_h:"Square Corners",square_area_command:"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",modify_area_h:"Modifying Areas",modify_area_dragnode:"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",modify_area_addnode:"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",delete_area_h:"Deleting Areas",delete_area:"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",delete_area_command:"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},relations:{title:"Relations",intro:"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",edit_relation_h:"Editing Relations",edit_relation:"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",edit_relation_add:"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",edit_relation_delete:"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",maintain_relation_h:"Maintaining Relations",maintain_relation:"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",relation_types_h:"Relation Types",multipolygon_h:"Multipolygons",multipolygon:"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",multipolygon_create:"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",multipolygon_merge:"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",turn_restriction_h:"Turn restrictions",turn_restriction:"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",turn_restriction_field:"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",turn_restriction_editing:"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",route_h:"Routes",route:"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",route_add:"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",boundary_h:"Boundaries",boundary:"A *boundary* relation is a group of one or more line features that together form an administrative boundary.",boundary_add:"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},imagery:{title:"Background Imagery",intro:"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",sources_h:"Imagery Sources",choosing:"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",sources:"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",offsets_h:"Adjusting Imagery Offset",offset:"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",offset_change:"Click on the small triangles to adjust the imagery offset in small steps, or hold the {leftclick} left mouse button and drag within the gray square to slide the imagery into alignment."},streetlevel:{title:"Street Level Photos",intro:"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).",using_h:"Using Street Level Photos",using:"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",photos:"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",viewer:"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},gps:{title:"GPS Traces",intro:"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",survey:"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",using_h:"Using GPS Traces",using:"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",tracing:"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",upload:"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [ImproveOSM](https://improveosm.org/en/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/) and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},field:{restrictions:{title:"Turn Restrictions Help",about:{title:"About",about:"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.",from_via_to:"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.",maxdist:"The \"{distField}\" slider controls how far to search for additional connected roads.",maxvia:"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},inspecting:{title:"Inspecting",about:"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.",from_shadow:"{fromShadow} **FROM segment**",allow_shadow:"{allowShadow} **TO Allowed**",restrict_shadow:"{restrictShadow} **TO Restricted**",only_shadow:"{onlyShadow} **TO Only**",restricted:"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".",only:"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},modifying:{title:"Modifying",about:"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.",indicators:"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".",allow_turn:"{allowTurn} **TO Allowed**",restrict_turn:"{restrictTurn} **TO Restricted**",only_turn:"{onlyTurn} **TO Only**"},tips:{title:"Tips",simple:"**Prefer simple restrictions over complex ones.**",simple_example:"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.",indirect:"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**",indirect_example:"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.",indirect_noedit:"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},issues:{title:"Issues",key:"I",list_title:"Issues ({count})",errors:{list_title:"Errors ({count})"},warnings:{list_title:"Warnings ({count})"},rules:{title:"Rules"},no_issues:{message:{everything:"Everything looks fine",everything_in_view:"Everything in view looks fine",edits:"Your edits look fine",edits_in_view:"Your edits in view look fine"},hidden_issues:{none:"Detected issues will appear here",elsewhere:"Issues elsewhere: {count}",other_features:"Issues with other features: {count}",other_features_elsewhere:"Issues elsewhere with other features: {count}",disabled_rules:"Issues with disabled rules: {count}",disabled_rules_elsewhere:"Issues elsewhere with disabled rules: {count}",ignored_issues:"Ignored issues: {count}",ignored_issues_elsewhere:"Ignored issues elsewhere: {count}"}},options:{what:{title:"Check:",edited:"My Edits",all:"Everything"},where:{title:"Where:",visible:"In View",all:"Everywhere"}},suggested:"Suggested updates:",enable_all:"Enable All",disable_all:"Disable All",reset_ignored:"Reset Ignored ({count})",fix_one:{title:"fix"},fix_all:{title:"Fix All",annotation:"Fixed several validation issues."},almost_junction:{title:"Almost Junctions",message:"{feature} is very close but not connected to {feature2}",tip:"Find features that should possibly be connected to other nearby features",self:{message:"{feature} ends very close to itself but does not reconnect"},"highway-highway":{reference:"Intersecting highways should share a junction vertex."}},close_nodes:{title:"Very Close Points",tip:"Find redundant and crowded points",message:"Two points in {way} are very close together",reference:"Redundant points in a way should be merged or moved apart.",detached:{message:"{feature} is too close to {feature2}",reference:"Separate points should not share a location."}},crossing_ways:{title:"Crossings Ways",message:"{feature} crosses {feature2}",tip:"Find features that incorrectly cross over one another","building-building":{reference:"Buildings should not intersect except on different layers."},"building-highway":{reference:"Highways crossing buildings should use bridges, tunnels, coverings, or entrances."},"building-railway":{reference:"Railways crossing buildings should use bridges or tunnels."},"building-waterway":{reference:"Waterways crossing buildings should use tunnels or different layers."},"highway-highway":{reference:"Crossing highways should use bridges, tunnels, or intersections."},"highway-railway":{reference:"Highways crossing railways should use bridges, tunnels, or level crossings."},"highway-waterway":{reference:"Highways crossing waterways should use bridges, tunnels, or fords."},"railway-railway":{reference:"Crossing railways should be connected or use bridges or tunnels."},"railway-waterway":{reference:"Railways crossing waterways should use bridges or tunnels."},"waterway-waterway":{reference:"Crossing waterways should be connected or use tunnels."},"tunnel-tunnel":{reference:"Crossing tunnels should use different layers."},"tunnel-tunnel_connectable":{reference:"Crossing tunnels should be connected or use different layers."},"bridge-bridge":{reference:"Crossing bridges should use different layers."},"bridge-bridge_connectable":{reference:"Crossing bridges should be connected or use different layers."},"indoor-indoor":{reference:"Crossing indoor features should use different levels."},"indoor-indoor_connectable":{reference:"Crossing indoor features should be connected or use different levels."}},disconnected_way:{title:"Disconnected Ways",tip:"Find unroutable roads, paths, and ferry routes",routable:{message:{multiple:"{count} routable features are connected only to each other."},reference:"All roads, paths, and ferry routes should connect to form a single routing network."},highway:{message:"{highway} is disconnected from other roads and paths"}},fixme_tag:{title:"\"Fix Me\" Requests",message:"{feature} has a \"Fix Me\" request",tip:"Find features with \"fixme\" tags",reference:"A \"fixme\" tag indicates that a mapper has requested help with a feature."},generic_name:{title:"Suspicious Names",message:"{feature} has the suspicious name \"{name}\"",tip:"Find features with generic or suspicious names",reference:"Names should be the actual, on-the-ground names of features."},incompatible_source:{title:"Suspicious Sources",tip:"Find features with suspicious source tags",google:{feature:{message:"{feature} lists Google as a data source"},reference:"Google products are proprietary and must not be used as references."}},invalid_format:{title:"Invalid Formatting",tip:"Find tags with unexpected formats",email:{message:"{feature} has an invalid email address.",message_multi:"{feature} has multiple invalid email addresses.",reference:"Email addresses must look like \"user@example.com\"."},website:{message:"{feature} has an invalid website.",message_multi:"{feature} has multiple invalid websites.",reference:"Websites should start with \"http\" or \"https\"."}},missing_role:{title:"Missing Roles",message:"{member} has no role within {relation}",tip:"Find relations with missing or incorrect member roles",multipolygon:{reference:"Multipolygon members must have an inner or outer role."}},missing_tag:{title:"Missing Tags",tip:"Find features that are missing descriptive tags",reference:"Features must have tags that define what they are.",any:{message:"{feature} has no tags"},descriptive:{message:"{feature} has no descriptive tags"},relation_type:{message:"{feature} is a relation without a type"}},old_multipolygon:{message:"{multipolygon} has misplaced tags",reference:"Multipolygons should be tagged on their relation, not their outer way."},outdated_tags:{title:"Outdated Tags",message:"{feature} has outdated tags",tip:"Find features with deprecated tags that can be updated",reference:"Some tags change over time and should be updated.",incomplete:{message:"{feature} has incomplete tags",reference:"Some features should have additional tags."},noncanonical_brand:{message:"{feature} looks like a brand with nonstandard tags",reference:"All features of the same brand should be tagged the same way."}},private_data:{title:"Private Information",tip:"Find features that may contain private information",reference:"Sensitive data like personal phone numbers should not be tagged.",contact:{message:"{feature} might be tagged with private contact information"}},tag_suggests_area:{title:"Lines Tagged as Areas",message:"{feature} should be a closed area based on the tag \"{tag}\"",tip:"Find features that are tagged as lines and should possibly be tagged as areas",reference:"Areas must have connected endpoints."},unknown_road:{message:"{feature} has no classification",reference:"Roads without a specific type may not appear in maps or routing."},impossible_oneway:{title:"Impossible One-Ways",tip:"Find route issues with one-way features",waterway:{connected:{start:{message:"{feature} flows away from a connected waterway"},end:{message:"{feature} flows against a connected waterway"},reference:"Waterway segments should all flow in the same direction."}},highway:{start:{message:"{feature} is unreachable",reference:"One-way roads must be accessible via other roads."},end:{message:"{feature} has no outlet",reference:"One-way roads must lead to other roads."}}},unsquare_way:{title:"Unsquare Corners (up to {val}°)",message:"{feature} has unsquare corners",tip:"Find features with unsquare corners that can be drawn better",buildings:{reference:"Buildings with unsquare corners can often be drawn more accurately."}},fix:{connect_almost_junction:{annotation:"Connected very close features."},connect_crossing_features:{annotation:"Connected crossing features."},connect_endpoints:{title:"Connect the ends",annotation:"Connected the endpoints of a way."},connect_feature:{title:"Connect this feature"},connect_features:{title:"Connect the features"},continue_from_start:{title:"Continue drawing from start"},continue_from_end:{title:"Continue drawing from end"},delete_feature:{title:"Delete this feature"},ignore_issue:{title:"Ignore this issue"},merge_close_vertices:{annotation:"Merged very close points in a way."},merge_points:{title:"Merge these points"},move_points_apart:{title:"Move these points apart"},move_tags:{title:"Move the tags",annotation:"Moved tags."},remove_from_relation:{title:"Remove from relation"},remove_generic_name:{title:"Remove the name",annotation:"Removed a generic name."},remove_private_info:{annotation:"Removed private information."},remove_proprietary_data:{title:"Remove any proprietary data"},remove_tag:{title:"Remove the tag",annotation:"Removed tag."},remove_tags:{title:"Remove the tags"},reposition_features:{title:"Reposition the features"},reverse_feature:{title:"Reverse this feature"},select_preset:{title:"Select a feature type"},select_road_type:{title:"Select a road type"},set_as_inner:{title:"Set as inner"},set_as_outer:{title:"Set as outer"},square_feature:{title:"Square this feature"},tag_as_disconnected:{title:"Tag as disconnected",annotation:"Tagged very close features as disconnected."},tag_as_unsquare:{title:"Tag as physically unsquare",annotation:"Tagged a way as having unsquare corners."},tag_this_as_higher:{title:"Tag this as higher"},tag_this_as_lower:{title:"Tag this as lower"},upgrade_tags:{title:"Upgrade the tags",annotation:"Upgraded old tags."},use_bridge_or_tunnel:{title:"Use a bridge or tunnel"},use_different_layers:{title:"Use different layers"},use_different_layers_or_levels:{title:"Use different layers or levels"},use_different_levels:{title:"Use different levels"},use_tunnel:{title:"Use a tunnel"}}},intro:{done:"done",ok:"OK",graph:{block_number:"<value for addr:block_number>",city:"Three Rivers",county:"<value for addr:county>",district:"<value for addr:district>",hamlet:"<value for addr:hamlet>",neighbourhood:"<value for addr:neighbourhood>",postcode:"49093",province:"<value for addr:province>",quarter:"<value for addr:quarter>",state:"MI",subdistrict:"<value for addr:subdistrict>",suburb:"<value for addr:suburb>",countrycode:"us",name:{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},welcome:{title:"Welcome",welcome:"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",practice:"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",words:"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",mouse:"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",leftclick:"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",rightclick:"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**",chapters:"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},navigation:{title:"Navigation",drag:"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**",zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**",features:"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.",points_lines_areas:"Map features are represented using *points, lines, or areas.*",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.",click_townhall:"All features on the map can be selected by clicking on them. **Click on the point to select it.**",selected_townhall:"Great! The point is now selected. Selected features are drawn with a pulsing glow.",editor_townhall:"When a feature is selected, the *feature editor* is displayed alongside the map.",preset_townhall:"The top part of the feature editor shows the feature's type. This point is a {preset}.",fields_townhall:"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.",close_townhall:"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**",search_street:"You can also search for features in the current view, or worldwide. **Search for '{name}'.**",choose_street:"**Choose {name} from the list to select it.**",selected_street:"Great! {name} is now selected.",editor_street:"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**",play:"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},points:{title:"Points",add_point:"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**",place_point:"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**",search_cafe:"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**",choose_cafe:"**Choose {preset} from the list.**",feature_editor:"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.",add_name:"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**",add_close:"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**",reselect:"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**",update:"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**",update_close:"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**",rightclick:"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**",undo:"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**",play:"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},areas:{title:"Areas",add_playground:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",start_playground:"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",continue_playground:"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",finish_playground:"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",search_playground:"**Search for '{preset}'.**",choose_playground:"**Choose {preset} from the list.**",add_field:"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**",choose_field:"**Choose {field} from the list.**",retry_add_field:"You didn't select the {field} field. Let's try again.",describe_playground:"**Add a description, then click the {button} button to close the feature editor.**",play:"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},lines:{title:"Lines",add_line:"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",start_line:"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",intersect:"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",retry_intersect:"The road needs to intersect {name}. Let's try again!",continue_line:"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**",choose_category_road:"**Select {category} from the list.**",choose_preset_residential:"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**",retry_preset_residential:"You didn't select the {preset} type. **Click here to choose again.**",name_road:"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**",did_name_road:"Looks good! Next we will learn how to update the shape of a line.",update_line:"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.",add_node:"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**",start_drag_endpoint:"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**",finish_drag_endpoint:"This spot looks good. **Release the left mouse button to finish dragging.**",start_drag_midpoint:"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**",continue_drag_midpoint:"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**",delete_lines:"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.",rightclick_intersection:"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**",split_intersection:"**Click on the {button} button to split {street}.**",retry_split:"You didn't click the Split button. Try again.",did_split_multi:"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**",did_split_single:"**Click the top part of {street2} to select it.**",multi_select:"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**",multi_rightclick:"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**",multi_delete:"**Click on the {button} button to delete the extra lines.**",retry_delete:"You didn't click the Delete button. Try again.",play:"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},buildings:{title:"Buildings",add_building:"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**",start_building:"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**",continue_building:"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**",retry_building:"It looks like you had some trouble placing the nodes at the building corners. Try again!",choose_category_building:"**Choose {category} from the list.**",choose_preset_house:"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**",close:"**Hit escape or click the {button} button to close the feature editor.**",rightclick_building:"**Right-click to select the building you created and show the edit menu.**",square_building:"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**",retry_square:"You didn't click the Square button. Try again.",done_square:"See how the corners of the building moved into place? Let's learn another useful trick.",add_tank:"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**",start_tank:"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**",continue_tank:"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**",search_tank:"**Search for '{preset}'.**",choose_tank:"**Choose {preset} from the list.**",rightclick_tank:"**Right-click to select the storage tank you created and show the edit menu.**",circle_tank:"**Click on the {button} button to make the tank a circle.**",retry_circle:"You didn't click the Circularize button. Try again.",play:"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},startediting:{title:"Start Editing",help:"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.",shortcuts:"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.",save:"Don't forget to regularly save your changes!",start:"Start mapping!"}},shortcuts:{title:"Keyboard shortcuts",tooltip:"Show the keyboard shortcuts screen.",toggle:{key:"?"},key:{alt:"Alt",backspace:"Backspace",cmd:"Cmd",ctrl:"Ctrl","delete":"Delete",del:"Del",end:"End",enter:"Enter",esc:"Esc",home:"Home",option:"Option",pause:"Pause",pgdn:"PgDn",pgup:"PgUp","return":"Return",shift:"Shift",space:"Space"},gesture:{drag:"drag"},or:"-or-",browsing:{title:"Browsing",navigation:{title:"Navigation",pan:"Pan map",pan_more:"Pan map by one screenful",zoom:"Zoom in / Zoom out",zoom_more:"Zoom in / Zoom out by a lot"},help:{title:"Help",help:"Show help/documentation",keyboard:"Show keyboard shortcuts"},display_options:{title:"Display options",background:"Show background options",background_switch:"Switch back to last background",map_data:"Show map data options",fullscreen:"Enter full screen mode",sidebar:"Toggle sidebar",wireframe:"Toggle wireframe mode",osm_data:"Toggle OpenStreetMap data",minimap:"Toggle minimap"},selecting:{title:"Selecting features",select_one:"Select a single feature",select_multi:"Select multiple features",lasso:"Draw a selection lasso around features",search:"Find features matching search text"},with_selected:{title:"With feature selected",edit_menu:"Toggle edit menu",zoom_to:"Zoom to selected feature"},vertex_selected:{title:"With node selected",previous:"Jump to previous node",next:"Jump to next node",first:"Jump to first node",last:"Jump to last node",change_parent:"Switch parent way"}},editing:{title:"Editing",drawing:{title:"Drawing",focus_add_feature:"Focus the feature search field",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",add_favorite:"Add a favorite feature",place_point:"Place a point or note",disable_snap:"Hold to disable point snapping",stop_line:"Finish drawing a line or area"},operations:{title:"Operations",continue_line:"Continue a line at the selected node",merge:"Combine (merge) selected features",disconnect:"Disconnect features at the selected node",extract:"Extract a point from a feature",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Square corners of a line or area",straighten:"Straighten a line or points",circularize:"Circularize a closed line or area",reflect_long:"Reflect features across the longer axis",reflect_short:"Reflect features across the shorter axis","delete":"Delete selected features"},commands:{title:"Commands",copy:"Copy selected features",paste:"Paste copied features",undo:"Undo last action",redo:"Redo last action",save:"Save changes"}},tools:{title:"Tools",info:{title:"Information",all:"Toggle all information panels",background:"Toggle background panel",history:"Toggle history panel",location:"Toggle location panel",measurement:"Toggle measurement panel"}}},units:{feet:"{quantity} ft",miles:"{quantity} mi",square_feet:"{quantity} sq ft",square_miles:"{quantity} sq mi",acres:"{quantity} ac",meters:"{quantity} m",kilometers:"{quantity} km",square_meters:"{quantity} m²",square_kilometers:"{quantity} km²",hectares:"{quantity} ha",area_pair:"{area1} ({area2})",arcdegrees:"{quantity}°",arcminutes:"{quantity}′",arcseconds:"{quantity}″",north:"N",south:"S",east:"E",west:"W",coordinate:"{coordinate}{direction}",coordinate_pair:"{latitude}, {longitude}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf":{name:"Golf Features"},"category-landuse":{name:"Land Use Features"},"category-natural":{name:"Natural Features"},"category-path":{name:"Paths"},"category-rail":{name:"Rails"},"category-restriction":{name:"Restriction Features"},"category-road_major":{name:"Major Roads"},"category-road_minor":{name:"Minor Roads"},"category-road_service":{name:"Service Roads"},"category-route":{name:"Route Features"},"category-utility":{name:"Utility Features"},"category-water":{name:"Water Bodies"},"category-waterway":{name:"Waterways"}},fields:{access_simple:{label:"Allowed Access"},access:{label:"Allowed Access",placeholder:"Not Specified",types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},"addr/interpolation":{label:"Type",options:{all:"All",even:"Even",odd:"Odd",alphabetic:"Alphabetic"}},address:{label:"Address",placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}},admin_level:{label:"Admin Level"},aerialway:{label:"Type"},"aerialway/access":{label:"Access",options:{entry:"Entry",exit:"Exit",both:"Both"}},"aerialway/bubble":{label:"Bubble"},"aerialway/capacity":{label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{label:"Heated"},"aerialway/occupancy":{label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{label:"Access (summer)",options:{entry:"Entry",exit:"Exit",both:"Both"}},aeroway:{label:"Type"},agrarian:{label:"Products"},air_conditioning:{label:"Air Conditioning"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},bar:{label:"Bar"},barrier:{label:"Type"},basin:{label:"Type"},"bath/open_air":{label:"Open Air"},"bath/sand_bath":{label:"Sand Bath"},"bath/type":{label:"Specialty",options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}},beauty:{label:"Beauty Specialty"},bench:{label:"Bench"},bicycle_parking:{label:"Type"},bin:{label:"Waste Bin"},blood_components:{label:"Blood Components",options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}},board_type:{label:"Type"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},"building/levels_building":{label:"Building Levels",placeholder:"2, 4, 6..."},"building/levels/underground":{label:"Underground Levels",placeholder:"2, 4, 6..."},"building/material":{label:"Material"},bunker_type:{label:"Type"},cables:{label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{label:"Camera Mount"},"camera/type":{label:"Camera Type",options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}},capacity:{label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},check_date:{label:"Last Checked Date"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},consulate:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},covered:{label:"Covered"},craft:{label:"Type"},"crane/type":{label:"Crane Type",options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}},crop:{label:"Crops"},crossing:{label:"Type"},cuisine:{label:"Cuisines"},currency_multi:{label:"Currency Types"},cutting:{label:"Type",placeholder:"Default"},cycle_network:{label:"Network"},cycleway:{label:"Bike Lanes",placeholder:"none",types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{label:"Dance Styles"},date:{label:"Date"},delivery:{label:"Delivery"},denomination:{label:"Denomination"},denotation:{label:"Denotation"},departures_board:{label:"Departures Board",options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}},description:{label:"Description"},design:{label:"Design"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diameter:{label:"Diameter",placeholder:"5 mm, 10 cm, 15 in…"},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},diplomatic:{label:"Type"},"diplomatic/services":{label:"Services"},direction_cardinal:{label:"Direction",options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}},direction_clock:{label:"Direction",options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}},direction_vertex:{label:"Direction Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},direction:{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{label:"Dispenses Prescriptions"},display:{label:"Display"},distance:{label:"Distance"},dock:{label:"Type"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},door_type:{label:"Type"},door:{label:"Door"},drive_through:{label:"Drive-Through"},duration:{label:"Duration",placeholder:"00:00"},electrified:{label:"Electrification",placeholder:"Contact Line, Electrified Rail...",options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}},elevation:{label:"Elevation"},email:{label:"Email",placeholder:"example@example.com"},embankment:{label:"Type",placeholder:"Default"},embassy:{label:"Type"},emergency_combo:{label:"Type"},emergency:{label:"Emergency"},enforcement:{label:"Type"},entrance:{label:"Type"},except:{label:"Exceptions"},faces:{label:"Faces"},fax:{label:"Fax",placeholder:"+31 42 123 4567"},fee:{label:"Fee"},fence_type:{label:"Type"},"fire_hydrant/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fishing:{label:"Fishing"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},floating:{label:"Floating"},flood_prone:{label:"Flood Prone"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},frequency:{label:"Operating Frequency"},from:{label:"From"},fuel_multi:{label:"Fuel Types"},fuel:{label:"Fuel"},gauge:{label:"Gauge"},gender:{label:"Gender",placeholder:"Unknown",options:{male:"Male",female:"Female",unisex:"Unisex"}},"generator/method":{label:"Method"},"generator/output/electricity":{label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{label:"Source"},"generator/type":{label:"Type"},government:{label:"Type"},grape_variety:{label:"Grape Varieties"},guest_house:{label:"Type"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height_building:{label:"Building Height (Meters)"},height:{label:"Height (Meters)"},highspeed:{label:"High-Speed"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},hoops:{label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA Airport Code"},icao:{label:"ICAO Airport Code"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor_type:{label:"Type"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent_yes:{label:"Intermittent"},intermittent:{label:"Intermittent"},internet_access:{label:"Internet Access",options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}},"internet_access/fee":{label:"Internet Access Fee"},"internet_access/ssid":{label:"Wifi Network Name"},interval:{label:"Interval"},junction_line:{label:"Junction",options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}},"junction/ref_oneway":{label:"Junction Number"},kerb:{label:"Curb"},"kerb/height":{label:"Height"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},layer:{label:"Layer",placeholder:"0"},leaf_cycle_singular:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}},leaf_cycle:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}},leaf_type_singular:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}},leaf_type:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}},leisure:{label:"Type"},length:{label:"Length (Meters)"},level:{label:"Level"},levels:{label:"Levels",placeholder:"2, 4, 6..."},liaison:{label:"Type"},lit:{label:"Lit"},location_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},lock:{label:"Lock"},man_made:{label:"Type"},manhole:{label:"Type"},manufacturer:{label:"Manufacturer"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},maxheight:{label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},maxspeed:{label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{label:"Max Stay"},maxweight_bridge:{label:"Max Weight"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},microbrewery:{label:"Microbrewery"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},monitoring_multi:{label:"Monitoring"},"mtb/scale":{label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},name:{label:"Name",placeholder:"Common name (if any)"},natural:{label:"Natural"},network_bicycle:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}},network_foot:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}},network_horse:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}},network_road:{label:"Network"},network:{label:"Network"},note:{label:"Note"},office:{label:"Type"},oneway_yes:{label:"One Way",options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},oneway:{label:"One Way",options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},opening_hours:{label:"Hours",placeholder:"Unknown"},operator:{label:"Operator"},"operator/type":{label:"Operator Type"},outdoor_seating:{label:"Outdoor Seating"},par:{label:"Par",placeholder:"3, 4, 5..."},park_ride:{label:"Park and Ride"},parking:{label:"Type",options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}},payment_multi_fee:{label:"Payment Types"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}},"piste/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/grooming":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/type":{label:"Type",options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},playground:{label:"Type"},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},polling_station:{label:"Polling Place"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},preschool:{label:"Preschool"},produce:{label:"Produce"},product:{label:"Products"},"public_bookcase/type":{label:"Type"},railway:{label:"Type"},"railway/position":{label:"Milestone Position",placeholder:"Distance to one decimal (123.4)"},"railway/signal/direction":{label:"Direction Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_room_number:{label:"Room Number"},ref_route:{label:"Route Number"},ref_runway:{label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{label:"Stop Number"},ref_taxiway:{label:"Taxiway Name",placeholder:"e.g. A5"},ref:{label:"Reference Code"},"ref/isil":{label:"ISIL Code"},relation:{label:"Type"},religion:{label:"Religion"},reservation:{label:"Reservations",options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}},resort:{label:"Type"},resource:{label:"Resources"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},"roof/colour":{label:"Roof Color"},room:{label:"Type"},rooms:{label:"Rooms"},route_master:{label:"Type"},route:{label:"Type"},sac_scale:{label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}},salt:{label:"Salt"},sanitary_dump_station:{label:"Toilet Disposal"},screen:{label:"Screens",placeholder:"1, 4, 8…"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},self_service:{label:"Self-Service"},service_rail:{label:"Service Type",options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}},service_times:{label:"Service Times"},service:{label:"Type"},"service/bicycle":{label:"Services"},"service/vehicle":{label:"Services"},shelter_type:{label:"Type"},shelter:{label:"Shelter"},shop:{label:"Type"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},street_cabinet:{label:"Type"},structure_waterway:{label:"Structure",placeholder:"Unknown",options:{tunnel:"Tunnel"}},structure:{label:"Structure",placeholder:"Unknown",options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}},studio:{label:"Type"},substance:{label:"Substance"},substation:{label:"Type"},supervised:{label:"Supervised"},support:{label:"Support"},surface:{label:"Surface"},surveillance:{label:"Surveillance Kind"},"surveillance/type":{label:"Surveillance Type",options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}},"surveillance/zone":{label:"Surveillance Zone"},"survey/date":{label:"Last Survey Date"},swimming_pool:{label:"Type"},"switch":{label:"Type",options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}},tactile_paving:{label:"Tactile Paving"},takeaway:{label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",options:{yes:"Yes",no:"No",only:"Takeaway Only"}},target:{label:"Target"},tidal:{label:"Tidal"},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}},"toilets/handwashing":{label:"Handwashing"},"toilets/position":{label:"Positions"},toll:{label:"Toll"},tomb:{label:"Type"},tourism:{label:"Type"},"tower/construction":{label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{label:"Type"},tracktype:{label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}},trade:{label:"Type"},traffic_calming:{label:"Type"},traffic_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction Affected",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},trail_visibility:{label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}},transformer:{label:"Type",options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}},trees:{label:"Trees"},trench:{label:"Type"},trolley_wire:{label:"Overhead Trolley Wires"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},valve:{label:"Type"},vending:{label:"Types of Goods"},visibility:{label:"Visibility",options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}},"volcano/status":{label:"Volcano Status",options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}},"volcano/type":{label:"Volcano Type",options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}},voltage_electrified:{label:"Voltage"},voltage:{label:"Voltage"},"voltage/primary":{label:"Primary Voltage"},"voltage/secondary":{label:"Secondary Voltage"},"voltage/tertiary":{label:"Tertiary Voltage"},wall:{label:"Type"},water_point:{label:"Water Point"},water_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"https://example.com"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},wikipedia:{label:"Wikipedia"},windings:{label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{label:"Windings Configuration",options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}},presets:{aerialway:{name:"Aerialway",terms:""},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},attraction:{name:"Attraction",terms:""},boundary:{name:"Boundary",terms:""},building_point:{name:"Building",terms:""},embankment:{name:"Embankment",terms:""},emergency:{name:"Emergency Feature",terms:""},ford_line:{name:"Ford",terms:""},highway:{name:"Highway",terms:""},indoor:{name:"Indoor Feature",terms:""},landuse:{name:"Land Use",terms:""},leisure:{name:"Leisure",terms:""},man_made:{name:"Man Made",terms:""},natural:{name:"Natural",terms:""},place:{name:"Place",terms:""},playground:{name:"Playground Equipment",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},seamark:{name:"Seamark",terms:""},tourism:{name:"Tourism",terms:""},waterway:{name:"Waterway",terms:""},"addr/interpolation":{name:"Address Interpolation",terms:""},address:{name:"Address",terms:""},"advertising/billboard":{name:"Billboard",terms:""},"advertising/column":{name:"Advertising Column",terms:""},"aerialway/station":{name:"Aerialway Station",terms:""},"aerialway/cable_car":{name:"Cable Car",terms:"tramway,ropeway"},"aerialway/chair_lift":{name:"Chair Lift",terms:""},"aerialway/drag_lift":{name:"Drag Lift",terms:""},"aerialway/gondola":{name:"Gondola",terms:""},"aerialway/goods":{name:"Goods Aerialway",terms:""},"aerialway/j-bar":{name:"J-bar Lift",terms:"jbar"},"aerialway/magic_carpet":{name:"Magic Carpet Lift",terms:""},"aerialway/mixed_lift":{name:"Mixed Lift",terms:""},"aerialway/platter":{name:"Platter Lift",terms:"button lift,poma lift"},"aerialway/pylon":{name:"Aerialway Pylon",terms:""},"aerialway/rope_tow":{name:"Rope Tow Lift",terms:"handle tow,bugel lift"},"aerialway/t-bar":{name:"T-bar Lift",terms:"tbar"},"aerialway/zip_line":{name:"Zip Line",terms:"aerial runway,canopy,flying fox,foefie slide,gravity propelled aerial ropeslide,Tyrolean traverse,zip wire,zip-line,zipline,zipwire"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"aeroway/apron":{name:"Apron",terms:"ramp"},"aeroway/gate":{name:"Airport Gate",terms:""},"aeroway/hangar":{name:"Hangar",terms:""},"aeroway/helipad":{name:"Helipad",terms:"helicopter,helipad,heliport"},"aeroway/holding_position":{name:"Aircraft Holding Position",terms:""},"aeroway/jet_bridge":{name:"Jet Bridge",terms:"aerobridge,air jetty,airbridge,finger,gangway,jet way,jetway,passenger boarding bridge,PBB,portal,skybridge,terminal gate connector"},"aeroway/parking_position":{name:"Aircraft Parking Position",terms:""},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"aeroway/windsock":{name:"Windsock",terms:""},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/register_office":{name:"Register Office",terms:""},"amenity/scrapyard":{name:"Scrap Yard",terms:""},"amenity/swimming_pool":{name:"Swimming Pool",terms:""},"amenity/animal_boarding":{name:"Animal Boarding Facility",terms:"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{name:"Animal Breeding Facility",terms:"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{name:"Animal Shelter",terms:"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca,pound"},"amenity/arts_centre":{name:"Arts Center",terms:""},"amenity/atm":{name:"ATM",terms:"money,cash,machine"},"amenity/bank":{name:"Bank",terms:"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{name:"Bar",terms:"dive,beer,bier,booze"},"amenity/bar/lgbtq":{name:"LGBTQ+ Bar",terms:"gay bar,lesbian bar,lgbtq bar,lgbt bar,lgb bar"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat,chair"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_parking/building":{name:"Bicycle Parking Garage",terms:"Multi-Storey Bicycle Park,Multi-Storey Bike Park,Bike Parking Station"},"amenity/bicycle_parking/lockers":{name:"Bicycle Lockers",terms:"Bike Lockers"},"amenity/bicycle_parking/shed":{name:"Bicycle Shed",terms:"Bike Shed"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike,bicycle,bikeshare,bike share,bicycle share,hub,dock"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump,tools,stand,multitool"},"amenity/biergarten":{name:"Biergarten",terms:"beer,bier,booze"},"amenity/boat_rental":{name:"Boat Rental",terms:""},"amenity/bureau_de_change":{name:"Currency Exchange",terms:"bureau de change,money changer"},"amenity/cafe":{name:"Cafe",terms:"bistro,coffee,tea"},"amenity/car_pooling":{name:"Car Pooling",terms:""},"amenity/car_rental":{name:"Car Rental",terms:""},"amenity/car_sharing":{name:"Car Sharing",terms:""},"amenity/car_wash":{name:"Car Wash",terms:""},"amenity/casino":{name:"Casino",terms:"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{name:"Charging Station",terms:"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{name:"Nursery/Childcare",terms:"daycare,orphanage,playgroup"},"amenity/cinema":{name:"Cinema",terms:"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{name:"Clinic",terms:"medical,urgentcare"},"amenity/clinic/abortion":{name:"Abortion Clinic",terms:""},"amenity/clinic/fertility":{name:"Fertility Clinic",terms:"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{name:"Clock",terms:"time"},"amenity/clock/sundial":{name:"Sundial",terms:"gnomon,shadow"},"amenity/college":{name:"College Grounds",terms:"university,undergraduate school"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/community_centre/lgbtq":{name:"LGBTQ+ Community Center",terms:"lgbtq event,lgbtq hall,lgbt event,lgbt hall,lgb event,lgb hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/conference_centre":{name:"Convention Center",terms:"auditorium,conference,exhibition,exposition,lecture"},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"amenity/doctors":{name:"Doctor",terms:"medic*,physician"},"amenity/dojo":{name:"Dojo / Martial Arts Academy",terms:"martial arts,dojang"},"amenity/dressing_room":{name:"Changing Room",terms:"changeroom,dressing room,fitting room,locker room"},"amenity/drinking_water":{name:"Drinking Water",terms:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/events_venue":{name:"Events Venue",terms:"banquet hall,baptism,Bar Mitzvah,Bat Mitzvah,birthdays,celebrations,conferences,confirmation,meetings,parties,party,quinceañera,reunions,weddings"},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/ice_cream":{name:"Ice Cream Fast Food",terms:""},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/donut":{name:"Donut Fast Food",terms:"breakfast,brunch,cafe,canteen,coffee,dine,diner,donut,doughnut,dining,eat,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/mexican":{name:"Mexican Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/karaoke":{name:"Karaoke Box",terms:"karaoke club,karaoke room,karaoke television,KTV"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/language_school":{name:"Language School",terms:"esl"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/nightclub/lgbtq":{name:"LGBTQ+ Nightclub",terms:"gay nightclub,lesbian nightclub,lgbtq nightclub,lgbt nightclub,lgb nightclub"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/parking/park_ride":{name:"Park & Ride Lot",terms:"commuter parking lot,incentive parking lot,metro parking lot,park and pool lot,park and ride lot,P+R,public transport parking lot,public transit parking lot,train parking lot"},"amenity/parking/underground":{name:"Underground Parking",terms:"automobile parking,car lot,car parking,rv parking,subsurface parking,truck parking,vehicle parking"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy Counter",terms:"apothecary,drug store,drugstore,med*,prescription"},"amenity/photo_booth":{name:"Photo Booth",terms:"photobooth,photo,booth,kiosk,camera"},"amenity/place_of_worship":{name:"Place of Worship",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{name:"Buddhist Temple",terms:"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{name:"Christian Church",terms:"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/christian/jehovahs_witness":{name:"Kingdom Hall of Jehovah's Witnesses",terms:"christian,church,house of God,house of prayer,house of worship"},"amenity/place_of_worship/christian/la_luz_del_mundo":{name:"La Luz del Mundo Temple",terms:"christian,church,house of God,house of prayer,house of worship,the light of the world church"},"amenity/place_of_worship/christian/quaker":{name:"Quaker Friends Meeting House",terms:"christian,church,house of God,house of prayer,house of worship"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim Mosque",terms:"islam,islamic center,muslim"},"amenity/place_of_worship/shinto":{name:"Shinto Shrine",terms:"kami,torii"},"amenity/place_of_worship/sikh":{name:"Sikh Temple",terms:"gurudwara,temple"},"amenity/place_of_worship/taoist":{name:"Taoist Temple",terms:"daoist,monastery,temple"},"amenity/planetarium":{name:"Planetarium",terms:"museum,astronomy,observatory"},"amenity/police":{name:"Police",terms:"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/polling_station":{name:"Permanent Polling Place",terms:"ballot box,ballot drop,democracy,elections,polling place,vote,voting booth,voting machine"},"amenity/post_box":{name:"Mailbox",terms:"letter drop,mail box,package drop,post box,postal box"},"amenity/post_office":{name:"Post Office",terms:"letter,mail"},"amenity/prep_school":{name:"Test Prep / Tutoring School",terms:"academic,ACT,SAT,homework,math,reading,test prep,tutoring,writing"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail,correction"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/pub/lgbtq":{name:"LGBTQ+ Pub",terms:"gay pub,lesbian pub,lgbtq pub,lgbt pub,lgb pub"},"amenity/pub/microbrewery":{name:"Brewpub",terms:"alcohol,drink,dive,beer,bier,booze,craft brewery,microbrewery,small batch brewery"},"amenity/public_bath":{name:"Public Bath",terms:"onsen,foot bath,hot springs"},"amenity/public_bookcase":{name:"Public Bookcase",terms:"library,bookcrossing"},"amenity/ranger_station":{name:"Ranger Station",terms:"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{name:"Recycling Center",terms:"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling_container":{name:"Recycling Container",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{name:"Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{name:"RV Toilet Disposal",terms:"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{name:"School Grounds",terms:"academy,elementary school,middle school,high school"},"amenity/shelter":{name:"Shelter",terms:"lean-to,gazebo,picnic"},"amenity/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,public transit shelter,public transport shelter,tram stop shelter,waiting"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_centre":{name:"Social Center",terms:"event,fraternal,fraternity,hall,organization,professional,society,sorority,union,vetern"},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/ambulatory_care":{name:"Ambulatory Care",terms:""},"amenity/social_facility/food_bank":{name:"Food Bank",terms:""},"amenity/social_facility/group_home":{name:"Elderly Group Home",terms:"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{name:"Homeless Shelter",terms:"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{name:"Nursing Home",terms:"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{name:"Studio",terms:"recording,radio,television"},"amenity/taxi":{name:"Taxi Stand",terms:"cab"},"amenity/telephone":{name:"Telephone",terms:"phone"},"amenity/theatre":{name:"Theater",terms:"theatre,performance,play,musical"},"amenity/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/toilets/disposal/flush":{name:"Flush Toilets",terms:"bathroom,head,lavatory,privy,restroom,water closet,WC,W.C."},"amenity/toilets/disposal/pitlatrine":{name:"Pit Latrine",terms:"head,lavatory,long drop,outhouse,pit toilet,privy"},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/toy_library":{name:"Toy Library",terms:"game,toy"},"amenity/university":{name:"University Grounds",terms:"college,graduate school,PhD program,master's degree program"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"amenity/vending_machine/cigarettes":{name:"Cigarette Vending Machine",terms:"cigarette"},"amenity/vending_machine/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"amenity/vending_machine/condoms":{name:"Condom Vending Machine",terms:"condom"},"amenity/vending_machine/drinks":{name:"Drink Vending Machine",terms:"drink,soda,beverage,juice,pop"},"amenity/vending_machine/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"amenity/vending_machine/excrement_bags":{name:"Excrement Bag Dispenser",terms:"excrement bags,poop,waste,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,pickup"},"amenity/vending_machine/parking_tickets":{name:"Parking Ticket Vending Machine",terms:"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{name:"Transit Ticket Vending Machine",terms:"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"amenity/vending_machine/sweets":{name:"Snack Vending Machine",terms:"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{name:"Veterinary",terms:"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{name:"Waste Basket",terms:"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{name:"Garbage Dumpster",terms:"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{name:"Waste Transfer Station",terms:"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{name:"Dog Excrement Bin",terms:"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{name:"RV Drinking Water",terms:""},"amenity/watering_place":{name:"Animal Watering Place",terms:""},area:{name:"Area",terms:"polygon"},"area/highway":{name:"Road Surface",terms:"area:highway,edge of pavement,highway area,highway shape,pavement,road shape,street area"},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal Enclosure",terms:"amphibian,animal park,aquarium,bear,bird,fish,insect,lion,mammal,monkey,penguin,reptile,safari,theme park,tiger,zoo"},"attraction/big_wheel":{name:"Big Wheel",terms:"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{name:"Bumper Car",terms:"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{name:"Bungee Jumping",terms:"theme park,bungy jumping,jumping platform"},"attraction/carousel":{name:"Carousel",terms:"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{name:"Dark Ride",terms:"theme park,ghost train"},"attraction/drop_tower":{name:"Drop Tower",terms:"theme park,amusement ride,gondola,tower,big drop"},"attraction/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"attraction/pirate_ship":{name:"Pirate Ship",terms:"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{name:"River Rafting",terms:"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{name:"Roller Coaster",terms:"theme park,amusement ride"},"attraction/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"attraction/train":{name:"Tourist Train",terms:"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{name:"Water Slide",terms:"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},barrier:{name:"Barrier",terms:""},"barrier/entrance":{name:"Entrance",terms:""},"barrier/block":{name:"Block",terms:""},"barrier/bollard":{name:"Bollard",terms:""},"barrier/border_control":{name:"Border Control",terms:""},"barrier/cattle_grid":{name:"Cattle Grid",terms:""},"barrier/chain":{name:"Chain",terms:""},"barrier/city_wall":{name:"City Wall",terms:""},"barrier/cycle_barrier":{name:"Cycle Barrier",terms:""},"barrier/ditch":{name:"Trench",terms:""},"barrier/fence":{name:"Fence",terms:""},"barrier/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/height_restrictor":{name:"Height Restrictor",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"barrier/kerb/raised":{name:"Raised Curb",terms:""},"barrier/kerb/rolled":{name:"Rolled Curb",terms:"gutter"},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/sally_port":{name:"Sally Port",terms:"Postern,castle side gate"},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/turnstile":{name:"Turnstile",terms:"baffle gate,turnstyle"},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building_part:{name:"Building Part",terms:"roof,simple 3D buildings"},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station Building",terms:""},"building/apartments":{name:"Apartment Building",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"building/cathedral":{name:"Cathedral Building",terms:""},"building/chapel":{name:"Chapel Building",terms:""},"building/church":{name:"Church Building",terms:""},"building/civic":{name:"Civic Building",terms:""},"building/college":{name:"College Building",terms:"university"},"building/commercial":{name:"Commercial Building",terms:""},"building/construction":{name:"Building Under Construction",terms:""},"building/detached":{name:"Detached House",terms:"home,single,family,residence,dwelling"},"building/dormitory":{name:"Dormitory",terms:""},"building/farm_auxiliary":{name:"Farm Building",terms:""},"building/farm":{name:"Farm House",terms:""},"building/garage":{name:"Garage",terms:""},"building/garages":{name:"Garages",terms:""},"building/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"building/greenhouse":{name:"Greenhouse",terms:""},"building/hangar":{name:"Hangar Building",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/houseboat":{name:"Houseboat",terms:"home,family,residence,dwelling"},"building/hut":{name:"Hut",terms:""},"building/industrial":{name:"Industrial Building",terms:""},"building/kindergarten":{name:"Preschool/Kindergarten Building",terms:"kindergarden,pre-school"},"building/mosque":{name:"Mosque Building",terms:""},"building/pavilion":{name:"Pavilion Building",terms:"sports"},"building/public":{name:"Public Building",terms:""},"building/residential":{name:"Residential Building",terms:""},"building/retail":{name:"Retail Building",terms:""},"building/roof":{name:"Roof",terms:""},"building/ruins":{name:"Building Ruins",terms:""},"building/school":{name:"School Building",terms:"academy,elementary school,middle school,high school"},"building/semidetached_house":{name:"Semi-Detached House",terms:"home,double,duplex,twin,family,residence,dwelling"},"building/service":{name:"Service Building",terms:""},"building/shed":{name:"Shed",terms:""},"building/stable":{name:"Stable",terms:""},"building/stadium":{name:"Stadium Building",terms:""},"building/static_caravan":{name:"Static Mobile Home",terms:""},"building/temple":{name:"Temple Building",terms:""},"building/terrace":{name:"Row Houses",terms:"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{name:"Transportation Building",terms:""},"building/university":{name:"University Building",terms:"college"},"building/warehouse":{name:"Warehouse",terms:""},club:{name:"Club",terms:"social"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},craft:{name:"Craft",terms:""},"craft/jeweler":{name:"Jeweler",terms:""},"craft/locksmith":{name:"Locksmith",terms:""},"craft/optician":{name:"Optician",terms:""},"craft/tailor":{name:"Tailor",terms:"clothes,suit"},"craft/agricultural_engines":{name:"Argricultural Engines Mechanic",terms:""},"craft/basket_maker":{name:"Basket Maker",terms:""},"craft/beekeeper":{name:"Beekeeper",terms:""},"craft/blacksmith":{name:"Blacksmith",terms:""},"craft/boatbuilder":{name:"Boat Builder",terms:""},"craft/bookbinder":{name:"Bookbinder",terms:"book repair"},"craft/brewery":{name:"Brewery",terms:"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{name:"Carpenter",terms:"woodworker"},"craft/carpet_layer":{name:"Carpet Layer",terms:""},"craft/caterer":{name:"Caterer",terms:""},"craft/chimney_sweeper":{name:"Chimney Sweeper",terms:""},"craft/clockmaker":{name:"Clockmaker",terms:""},"craft/confectionery":{name:"Candy Maker",terms:"sweet,candy"},"craft/distillery":{name:"Distillery",terms:"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{name:"Dressmaker",terms:"seamstress"},"craft/electrician":{name:"Electrician",terms:"power,wire"},"craft/electronics_repair":{name:"Electronics Repair Shop",terms:""},"craft/floorer":{name:"Floorer",terms:""},"craft/gardener":{name:"Gardener",terms:"landscaper,grounds keeper"},"craft/glaziery":{name:"Glaziery",terms:"glass,stained-glass,window"},"craft/handicraft":{name:"Handicraft",terms:""},"craft/hvac":{name:"HVAC",terms:"heat*,vent*,air conditioning"},"craft/insulator":{name:"Insulator",terms:""},"craft/joiner":{name:"Joiner",terms:"furniture"},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/parquet_layer":{name:"Parquet Layer",terms:""},"craft/photographer":{name:"Photographer",terms:""},"craft/photographic_laboratory":{name:"Photographic Laboratory",terms:"film"},"craft/plasterer":{name:"Plasterer",terms:""},"craft/plumber":{name:"Plumber",terms:"pipe"},"craft/pottery":{name:"Pottery",terms:"ceramic"},"craft/rigger":{name:"Rigger",terms:""},"craft/roofer":{name:"Roofer",terms:""},"craft/saddler":{name:"Saddler",terms:""},"craft/sailmaker":{name:"Sailmaker",terms:""},"craft/sawmill":{name:"Sawmill",terms:"lumber"},"craft/scaffolder":{name:"Scaffolder",terms:""},"craft/sculptor":{name:"Sculptor",terms:""},"craft/shoemaker":{name:"Shoemaker",terms:"cobbler"},"craft/signmaker":{name:"Signmaker",terms:""},"craft/stonemason":{name:"Stonemason",terms:"masonry"},"craft/tiler":{name:"Tiler",terms:""},"craft/tinsmith":{name:"Tinsmith",terms:""},"craft/upholsterer":{name:"Upholsterer",terms:""},"craft/watchmaker":{name:"Watchmaker",terms:""},"craft/window_construction":{name:"Window Construction",terms:"glass"},"craft/winery":{name:"Winery",terms:""},"emergency/designated":{name:"Emergency Access Designated",terms:""},"emergency/destination":{name:"Emergency Access Destination",terms:""},"emergency/no":{name:"Emergency Access No",terms:""},"emergency/official":{name:"Emergency Access Official",terms:""},"emergency/private":{name:"Emergency Access Private",terms:""},"emergency/yes":{name:"Emergency Access Yes",terms:""},"emergency/ambulance_station":{name:"Ambulance Station",terms:"EMS,EMT,rescue"},"emergency/defibrillator":{name:"Defibrillator",terms:"AED"},"emergency/fire_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hose":{name:"Fire Hose",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug,fire water well,hydrant"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/cartpath":{name:"Golf Cartpath",terms:""},"golf/driving_range":{name:"Driving Range",terms:""},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard":{name:"Lateral Water Hazard",terms:""},"golf/path":{name:"Golf Walking Path",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard":{name:"Water Hazard",terms:""},healthcare:{name:"Healthcare Facility",terms:"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{name:"Alternative Medicine",terms:"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{name:"Chiropractor",terms:"back,pain,spine"},"healthcare/audiologist":{name:"Audiologist",terms:"ear,hearing,sound"},"healthcare/birthing_center":{name:"Birthing Center",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{name:"Blood Donor Center",terms:"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/counselling":{name:"Counselling Center",terms:""},"healthcare/hospice":{name:"Hospice",terms:"terminal,illness"},"healthcare/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"healthcare/midwife":{name:"Midwife",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{name:"Occupational Therapist",terms:"therapist,therapy"},"healthcare/optometrist":{name:"Optometrist",terms:"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{name:"Physiotherapist",terms:"physical,therapist,therapy"},"healthcare/podiatrist":{name:"Podiatrist",terms:"foot,feet,nails"},"healthcare/psychotherapist":{name:"Psychotherapist",terms:"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{name:"Rehabilitation Facility",terms:"rehab,therapist,therapy"},"healthcare/speech_therapist":{name:"Speech Therapist",terms:"speech,therapist,therapy,voice"},"highway/bus_stop":{name:"Bus Stop",terms:""},"highway/crossing":{name:"Crossing",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/construction":{name:"Road Closed",terms:"closed,closure,construction"},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"highway/cycleway":{name:"Cycle Path",terms:"bike path,bicyle path"},"highway/cycleway/crossing":{name:"Cycle Crossing",terms:""},"highway/cycleway/bicycle_foot":{name:"Cycle & Foot Path",terms:"bicycle and foot path,bike and pedestrian path,green way,greenway,mixed-use trail,multi-use trail,segregated trail,rail trail"},"highway/cycleway/crossing/marked":{name:"Marked Cycle Crossing",terms:"cycle crosswalk,cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/cycleway/crossing/unmarked":{name:"Unmarked Cycle Crossing",terms:"cycle path crossing,cycleway crossing,bicycle crossing,bike crossing"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/emergency_bay":{name:"Emergency Stopping Place",terms:"Highway Emergency Bay"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,promenade,trackway,trail,walk"},"highway/footway/crossing":{name:"Pedestrian Crossing",terms:""},"highway/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"marked foot path crossing,marked crossing,marked pedestrian crosswalk,zebra crossing"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:"unmarked foot path crossing,unmarked crosswalk,unmarked pedestrian crossing"},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"mile marker,mile post,mile stone,mileage marker,milemarker,milepost"},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:"traffic circle"},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"highway/path":{name:"Path",terms:"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{name:"Pedestrian Area",terms:"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{name:"Pedestrian Street",terms:"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{name:"Primary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"highway/service/alley":{name:"Alley",terms:""},"highway/service/drive-through":{name:"Drive-Through",terms:""},"highway/service/driveway":{name:"Driveway",terms:""},"highway/service/emergency_access":{name:"Emergency Access",terms:""},"highway/service/parking_aisle":{name:"Parking Aisle",terms:""},"highway/services":{name:"Service Area",terms:"services,travel plaza,service station"},"highway/speed_camera":{name:"Speed Camera",terms:""},"highway/steps":{name:"Steps",terms:"stairs,staircase,stairway"},"highway/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"highway/stop":{name:"Stop Sign",terms:"stop,halt,sign"},"highway/street_lamp":{name:"Street Lamp",terms:"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{name:"Tertiary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"highway/track":{name:"Unmaintained Track Road",terms:"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{name:"Traffic Mirror",terms:"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{name:"Traffic Signals",terms:"light,stoplight,traffic light"},"highway/trailhead":{name:"Trailhead",terms:"hiking,mile zero,mountain biking,mountaineering,trail endpoint,trail start,staging area,trekking"},"highway/trunk_link":{name:"Trunk Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"highway/turning_circle":{name:"Turning Circle",terms:"cul-de-sac"},"highway/turning_loop":{name:"Turning Loop (Island)",terms:"cul-de-sac"},"highway/unclassified":{name:"Minor/Unclassified Road",terms:"road,street"},historic:{name:"Historic Site",terms:""},"historic/archaeological_site":{name:"Archaeological Site",terms:""},"historic/boundary_stone":{name:"Boundary Stone",terms:""},"historic/castle":{name:"Castle",terms:""},"historic/castle/fortress":{name:"Historic Fortress",terms:"citadel,military"},"historic/castle/palace":{name:"Palace",terms:"Royal Residence,royal,king,queen"},"historic/castle/stately":{name:"Château",terms:"Historic Country House,Stately Home,nobility,gentry,representative"},"historic/city_gate":{name:"City Gate",terms:"Town Gate"},"historic/fort":{name:"Historic Fort",terms:"military"},"historic/manor":{name:"Manor House",terms:"Mansion,gentry,nobility,estate"},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/memorial/plaque":{name:"Commemorative Plaque",terms:"dedicatory,epitaph,historical marker,remember,remembrance,memory"},"historic/monument":{name:"Monument",terms:""},"historic/ruins":{name:"Ruins",terms:""},"historic/tomb":{name:"Tomb",terms:""},"historic/wayside_cross":{name:"Wayside Cross",terms:""},"historic/wayside_shrine":{name:"Wayside Shrine",terms:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"indoor/corridor_line":{name:"Indoor Corridor",terms:""},"indoor/area":{name:"Indoor Area",terms:"indoor space"},"indoor/corridor":{name:"Indoor Corridor",terms:"concourse,foyer,hallway,passageway"},"indoor/door":{name:"Indoor Door",terms:"doorframe,doorway,portal,room access,threshold"},"indoor/room":{name:"Room",terms:"antechamber,anteroom,atrium,cell,chamber,concourse,foyer,indoor room,lobby,vestibule"},"indoor/wall":{name:"Indoor Wall",terms:"indoor barrier,room divider,room partition"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},"junction/circular":{name:"Traffic Circle",terms:""},"junction/jughandle":{name:"Jughandle",terms:""},"junction/roundabout":{name:"Roundabout",terms:""},"landuse/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",terms:""},"landuse/allotments":{name:"Community Garden",terms:"allotment,garden"},"landuse/aquaculture":{name:"Aquaculture",terms:"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/brownfield":{name:"Brownfield",terms:""},"landuse/cemetery":{name:"Cemetery",terms:""},"landuse/churchyard":{name:"Churchyard",terms:""},"landuse/commercial":{name:"Commercial Area",terms:""},"landuse/construction":{name:"Construction",terms:""},"landuse/farmland":{name:"Farmland",terms:"crop,grow,plant"},"landuse/farmyard":{name:"Farmyard",terms:"crop,grow,plant"},"landuse/forest":{name:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:"grazing,hay field,pasture"},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},"landuse/winter_sports":{name:"Winter Sports Area",terms:"piste area,ski area,ski hill,ski mountain,ski resort,snow board area,snowboard area"},"leisure/adult_gaming_centre":{name:"Adult Gaming Center",terms:"gambling,slot machine"},"leisure/amusement_arcade":{name:"Amusement Arcade",terms:"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/bandstand":{name:"Bandstand",terms:""},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"leisure/bowling_alley":{name:"Bowling Alley",terms:"bowling center"},"leisure/common":{name:"Common",terms:"open space"},"leisure/dance":{name:"Dance Hall",terms:"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{name:"Dance School",terms:"jive,swing,tango,waltz,dance teaching"},"leisure/disc_golf_course":{name:"Disc Golf Course",terms:"disk golf,frisbee golf,flying disc golf,frolf,ultimate"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/escape_game":{name:"Escape Room",terms:"escape game,escape the room,puzzle room,quest room"},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio,asanas,modern yoga,meditation"},"leisure/fitness_station":{name:"Outdoor Fitness Station",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{name:"Exercise Balance Beam",terms:"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{name:"Exercise Box",terms:"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{name:"Exercise Horizontal Bar",terms:"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{name:"Exercise Monkey Bars",terms:"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{name:"Hyperextension Station",terms:"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{name:"Parallel Bars",terms:"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{name:"Push-Up Station",terms:"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{name:"Exercise Rings",terms:"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{name:"Exercise Instruction Sign",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{name:"Sit-Up Station",terms:"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{name:"Exercise Stairs",terms:"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{name:"Garden",terms:""},"leisure/golf_course":{name:"Golf Course",terms:"links"},"leisure/hackerspace":{name:"Hackerspace",terms:"makerspace,hackspace,hacklab"},"leisure/horse_riding":{name:"Horseback Riding Facility",terms:"equestrian,stable"},"leisure/ice_rink":{name:"Ice Rink",terms:"hockey,skating,curling"},"leisure/marina":{name:"Marina",terms:"boat"},"leisure/miniature_golf":{name:"Miniature Golf",terms:"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{name:"Nature Reserve",terms:"protected,wildlife"},"leisure/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"leisure/park":{name:"Park",terms:"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{name:"Picnic Table",terms:"bench"},"leisure/picnic_table/chess":{name:"Chess Table",terms:"bench,chess board,checkerboard,checkers,chequerboard,game table"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",terms:""},"leisure/pitch/basketball":{name:"Basketball Court",terms:""},"leisure/pitch/beachvolleyball":{name:"Beach Volleyball Court",terms:"volleyball"},"leisure/pitch/boules":{name:"Boules/Bocce Court",terms:"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{name:"Bowling Green",terms:""},"leisure/pitch/cricket":{name:"Cricket Field",terms:""},"leisure/pitch/equestrian":{name:"Riding Arena",terms:"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/field_hockey":{name:"Field Hockey Pitch",terms:"landhockey"},"leisure/pitch/horseshoes":{name:"Horseshoes Pit",terms:"horse shoes"},"leisure/pitch/netball":{name:"Netball Court",terms:""},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/shuffleboard":{name:"Shuffleboard Court",terms:"deck shuffleboard,floor shuffleboard"},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/softball":{name:"Softball Field",terms:"softball,diamond"},"leisure/pitch/table_tennis":{name:"Ping Pong Table",terms:"table tennis,ping pong"},"leisure/pitch/tennis":{name:"Tennis Court",terms:""},"leisure/pitch/volleyball":{name:"Volleyball Court",terms:""},"leisure/playground":{name:"Playground",terms:"jungle gym,play area"},"leisure/resort":{name:"Resort",terms:"recreation center,sanatorium,ski and snowboard resort,vacation resort,winter sports resort"},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway_point":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/climbing":{name:"Climbing Gym",terms:"abseiling,artificial climbing wall,belaying,bouldering,rock climbing facility,indoor rock wall,rappeling,rock gym,ropes"},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_area":{name:"Natural Swimming Area",terms:"dive,water,aquatics"},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/track/cycling_point":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/cycling":{name:"Cycling Track",terms:"bicycle track,bicycling track,cycle racetrack,velodrome"},"leisure/track/horse_racing_point":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/horse_racing":{name:"Horse Racing Track",terms:"equestrian race track,horse race betting,horseracing,horsetrack,horse racetrack"},"leisure/track/running_point":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/track/running":{name:"Running Track",terms:"athletics track,decathlon,foot race,long distance running,marathon,middle distance running,racetrack,running,sprint,track,walking"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:"polyline"},"man_made/adit":{name:"Adit",terms:"cave,horizontal mine entrance,tunnel,underground"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/beacon":{name:"Beacon",terms:""},"man_made/beehive":{name:"Beehive",terms:"apiary,beekeeper,farm,honey,pollination"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/cairn":{name:"Cairn",terms:"rock pile,stone stack,stone pile,càrn"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cross":{name:"Summit Cross",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/dyke":{name:"Levee",terms:"Dike,Dyke,Floodbank,Stopbank"},"man_made/embankment":{name:"Embankment",terms:""},"man_made/flagpole":{name:"Flagpole",terms:""},"man_made/gasometer":{name:"Gasometer",terms:"gas holder"},"man_made/groyne":{name:"Groyne",terms:""},"man_made/lighthouse":{name:"Lighthouse",terms:""},"man_made/mast":{name:"Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication":{name:"Communication Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/mineshaft":{name:"Mineshaft",terms:"cave,mine shaft,tunnel,underground,vertical mine entrance"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"man_made/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"man_made/petroleum_well":{name:"Oil Well",terms:"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{name:"Pier",terms:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pier/floating":{name:"Floating Pier",terms:"berth,dock,jetty,landing,promenade,wharf"},"man_made/pipeline":{name:"Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pipeline/underground":{name:"Underground Pipeline",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pipeline/valve":{name:"Pipeline Valve",terms:"oil,natural gas,water,sewer,sewage"},"man_made/pumping_station":{name:"Pumping Station",terms:""},"man_made/silo":{name:"Silo",terms:"grain,corn,wheat"},"man_made/storage_tank":{name:"Storage Tank",terms:"water,oil,gas,petrol"},"man_made/storage_tank/water":{name:"Water Tank",terms:"cistern,water tower"},"man_made/street_cabinet":{name:"Street Cabinet",terms:"cable tv,monitoring box,technical box,telecommunications,traffic signal controls"},"man_made/surveillance":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance/camera":{name:"Surveillance Camera",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/torii":{name:"Torii",terms:"Japanese gate,Shinto shrine"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/bell_tower":{name:"Bell Tower",terms:"belfry,bell gable,campanile,church tower,klockstapel"},"man_made/tower/communication":{name:"Communication Tower",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/tower/defensive":{name:"Fortified Tower",terms:"Defensive Tower,Castle Tower"},"man_made/tower/minaret":{name:"Minaret",terms:"Islam,mosque,Muezzin,Muslim"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/tunnel":{name:"Tunnel",terms:"bore,dig,shaft,underground passage,underpass"},"man_made/wastewater_plant":{name:"Wastewater Plant",terms:"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{name:"Water Tower",terms:""},"man_made/water_well":{name:"Water Well",terms:""},"man_made/water_works":{name:"Water Works",terms:""},"man_made/watermill":{name:"Watermill",terms:"water,wheel,mill"},"man_made/windmill":{name:"Windmill",terms:"wind,wheel,mill"},"man_made/works":{name:"Factory",terms:"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},manhole:{name:"Manhole",terms:"cover,hole,sewer,sewage,telecom"},"manhole/drain":{name:"Storm Drain",terms:"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{name:"Telecom Manhole",terms:"cover,phone,hole,telecom,telephone,bt"},"military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"military/trench":{name:"Military Trench",terms:"dugout,firestep,fox hole,infantry trench,war trench"},"natural/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cape":{name:"Cape",terms:"bay,coastline,erosion,headland,promontory"},"natural/cave_entrance":{name:"Cave Entrance",terms:"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{name:"Cliff",terms:"crag,escarpment,rock face,scarp"},"natural/coastline":{name:"Coastline",terms:"shore"},"natural/fell":{name:"Fell",terms:""},"natural/glacier":{name:"Glacier",terms:"ice,snow"},"natural/grassland":{name:"Grassland",terms:"prairie,savanna"},"natural/heath":{name:"Heath",terms:""},"natural/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"natural/ridge":{name:"Ridge",terms:"crest"},"natural/rock":{name:"Attached Rock / Boulder",terms:"boulder,stone,rock"},"natural/saddle":{name:"Saddle",terms:"pass,mountain pass,top"},"natural/sand":{name:"Sand",terms:"desert"},"natural/scree":{name:"Scree",terms:"loose rocks"},"natural/scrub":{name:"Scrub",terms:"bush,shrubs"},"natural/shingle":{name:"Shingle",terms:"beach,gravel,pebbles,riverbed,rounded rock fragments"},"natural/spring":{name:"Spring",terms:""},"natural/stone":{name:"Unattached Stone / Boulder",terms:"boulder,stone,rock"},"natural/tree_row":{name:"Tree Row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/valley":{name:"Valley",terms:"canyon,dale,dell,dene,depression,glen,gorge,gully,gulley,gultch,hollow,ravine,rift,vale"},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/moat":{name:"Moat",terms:""},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"natural/water/wastewater":{name:"Wastewater Basin",terms:"excrement,shit,sewage,wastewater,Settling Basin,Clarifier Basin"},"natural/wetland":{name:"Wetland",terms:"bog,fen,marsh,mire,moor,muskeg,peatland,quagmire,reedbed,saltmarsh,swamp,tidalflat,wet meadow"},"natural/wood":{name:"Wood",terms:"tree"},"noexit/yes":{name:"No Exit",terms:"no exit,road end,dead end"},office:{name:"Office",terms:""},"office/administrative":{name:"Administrative Office",terms:""},"office/physician":{name:"Physician",terms:""},"office/travel_agent":{name:"Travel Agency",terms:""},"office/accountant":{name:"Accountant Office",terms:""},"office/adoption_agency":{name:"Adoption Agency",terms:""},"office/advertising_agency":{name:"Advertising Agency",terms:"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{name:"Architect Office",terms:""},"office/association":{name:"Nonprofit Organization Office",terms:"association,non-profit,nonprofit,organization,society"},"office/bail_bond_agent":{name:"Bail Bond Agent",terms:"bail bond dealer,bail bond man,bail bondsman,bail bondsperson"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/diplomatic":{name:"Diplomatic Office",terms:""},"office/diplomatic/consulate":{name:"Consulate",terms:""},"office/diplomatic/embassy":{name:"Embassy",terms:""},"office/diplomatic/liaison":{name:"Liaison Office",terms:""},"office/educational_institution":{name:"Educational Institution",terms:""},"office/employment_agency":{name:"Employment Agency",terms:"job"},"office/energy_supplier":{name:"Energy Supplier Office",terms:"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{name:"Real Estate Office",terms:"real estate"},"office/financial_advisor":{name:"Financial Advisor",terms:"401k,inheritance,savings,stocks,retirement,wealth management"},"office/financial":{name:"Financial Office",terms:""},"office/forestry":{name:"Forestry Office",terms:"forest,ranger"},"office/foundation":{name:"Foundation Office",terms:""},"office/government":{name:"Government Office",terms:""},"office/government/register_office":{name:"Register Office",terms:"clerk,marriage,death,birth,certificate"},"office/government/tax":{name:"Tax and Revenue Office",terms:"fiscal authorities,revenue office,tax office"},"office/guide":{name:"Tour Guide Office",terms:"dive guide,mountain guide,tour guide"},"office/insurance":{name:"Insurance Office",terms:""},"office/it":{name:"Information Technology Office",terms:"computer,information,software,technology"},"office/lawyer":{name:"Law Office",terms:""},"office/lawyer/notary":{name:"Notary Office",terms:""},"office/moving_company":{name:"Moving Company Office",terms:"relocation"},"office/newspaper":{name:"Newspaper Office",terms:""},"office/ngo":{name:"NGO Office",terms:"ngo,non government,non-government,organization,organisation"},"office/notary":{name:"Notary Office",terms:"clerk,deeds,estate,signature,wills"},"office/political_party":{name:"Political Party",terms:""},"office/private_investigator":{name:"Private Investigator Office",terms:"PI,private eye,private detective"},"office/quango":{name:"Quasi-NGO Office",terms:"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/religion":{name:"Religious Office",terms:""},"office/research":{name:"Research Office",terms:""},"office/surveyor":{name:"Surveyor Office",terms:""},"office/tax_advisor":{name:"Tax Advisor Office",terms:"tax,tax consultant"},"office/telecommunication":{name:"Telecom Office",terms:"communication,internet service provider,isp,network,telephone,voice"},"office/therapist":{name:"Therapist Office",terms:"therapy"},"office/water_utility":{name:"Water Utility Office",terms:"water board,utility"},"piste/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",terms:""},"place/city":{name:"City",terms:""},"place/hamlet":{name:"Hamlet",terms:""},"place/island":{name:"Island",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{name:"Islet",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{name:"Isolated Dwelling",terms:""},"place/locality":{name:"Locality",terms:""},"place/neighbourhood":{name:"Neighborhood",terms:"neighbourhood"},"place/plot":{name:"Plot",terms:"tract,land,lot,parcel"},"place/quarter":{name:"Sub-Borough / Quarter",terms:"boro,borough,quarter"},"place/square":{name:"Square",terms:""},"place/suburb":{name:"Borough / Suburb",terms:"boro,borough,quarter"},"place/town":{name:"Town",terms:""},"place/village":{name:"Village",terms:""},"playground/balance_beam":{name:"Play Balance Beam",terms:""},"playground/basket_spinner":{name:"Basket Spinner",terms:"basket rotator"},"playground/basket_swing":{name:"Basket Swing",terms:""},"playground/climbing_frame":{name:"Climbing Frame",terms:""},"playground/cushion":{name:"Bouncy Cushion",terms:""},"playground/horizontal_bar":{name:"Play Horizontal Bar",terms:"high bar"},"playground/rocker":{name:"Spring Rider",terms:"spring rocker,springy rocker"},"playground/roundabout":{name:"Play Roundabout",terms:"merry-go-round"},"playground/sandpit":{name:"Sandpit",terms:""},"playground/seesaw":{name:"Seesaw",terms:""},"playground/slide":{name:"Slide",terms:""},"playground/structure":{name:"Play Structure",terms:""},"playground/swing":{name:"Swing",terms:""},"playground/zipwire":{name:"Zip Wire",terms:""},point:{name:"Point",terms:"node,other,vertex,vertices"},polling_station:{name:"Temporary Polling Place",terms:"ballot box,ballot drop,democracy,elections,polling place,vote,voting booth,voting machine"},"power/sub_station":{name:"Substation",terms:""},"power/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"power/generator/source/hydro":{name:"Water Turbine",terms:"dam,generator,francis turbine,hydroelectricity,kaplan turbine,pelton turbine"},"power/generator/source/nuclear":{name:"Nuclear Reactor",terms:"fission,generator,nuclear,nuke,reactor"},"power/generator/source/wind":{name:"Wind Turbine",terms:"generator,turbine,windmill,wind"},"power/line":{name:"Power Line",terms:"electric power transmission line,high voltage line,high tension line"},"power/minor_line":{name:"Minor Power Line",terms:""},"power/plant":{name:"Power Station Grounds",terms:"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{name:"Power Pole",terms:""},"power/substation":{name:"Substation",terms:""},"power/switch":{name:"Power Switch",terms:""},"power/tower":{name:"High-Voltage Tower",terms:"power"},"power/transformer":{name:"Transformer",terms:""},"public_transport/platform_point":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform":{name:"Transit Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform/aerialway_point":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry_point":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail_point":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail_point":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway_point":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train_point":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram_point":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/aerialway":{name:"Aerialway Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus_point":{name:"Bus Stop",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/bus":{name:"Bus Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/ferry":{name:"Ferry Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform/light_rail":{name:"Light Rail Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform/monorail":{name:"Monorail Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform/subway":{name:"Subway Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform/train":{name:"Train Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform/tram":{name:"Tram Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus_point":{name:"Trolleybus Stop",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform/trolleybus":{name:"Trolleybus Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/station_aerialway":{name:"Aerialway Station",terms:"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{name:"Bus Station / Terminal",terms:"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{name:"Ferry Station / Terminal",terms:"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{name:"Light Rail Station",terms:"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{name:"Monorail Station",terms:"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{name:"Subway Station",terms:"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{name:"Train Station (Halt / Request)",terms:"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{name:"Train Station",terms:"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{name:"Tram Station",terms:"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{name:"Trolleybus Station / Terminal",terms:"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{name:"Transit Station",terms:"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{name:"Transit Stop Area",terms:""},"public_transport/stop_position_aerialway":{name:"Aerialway Stopping Location",terms:"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{name:"Bus Stopping Location",terms:"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{name:"Ferry Stopping Location",terms:"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{name:"Light Rail Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{name:"Monorail Stopping Location",terms:"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{name:"Subway Stopping Location",terms:"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{name:"Train Stopping Location",terms:"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{name:"Tram Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{name:"Trolleybus Stopping Location",terms:"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{name:"Transit Stopping Location",terms:"public transit,public transportation,transit,transportation"},"railway/halt":{name:"Train Station (Halt / Request)",terms:"break,interrupt,rest,wait,interruption"},"railway/platform":{name:"Train Platform",terms:""},"railway/station":{name:"Train Station",terms:"train station,station"},"railway/tram_stop":{name:"Tram Stopping Position",terms:"light rail,streetcar,tram,trolley"},"railway/abandoned":{name:"Abandoned Railway",terms:""},"railway/buffer_stop":{name:"Buffer Stop",terms:"stop,halt,buffer"},"railway/construction":{name:"Railway Under Construction",terms:""},"railway/crossing":{name:"Railway Crossing (Path)",terms:"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{name:"Railway Derailer",terms:"derailer"},"railway/disused":{name:"Disused Railway",terms:""},"railway/funicular":{name:"Funicular",terms:"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{name:"Railway Crossing (Road)",terms:"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{name:"Light Rail",terms:"light rail,streetcar,trolley"},"railway/milestone":{name:"Railway Milestone",terms:"milestone,marker"},"railway/miniature":{name:"Miniature Railway",terms:"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{name:"Monorail",terms:""},"railway/narrow_gauge":{name:"Narrow Gauge Rail",terms:"narrow gauge railway,narrow gauge railroad"},"railway/rail":{name:"Rail",terms:"rail line,railroad track,train track"},"railway/rail/highspeed":{name:"High-Speed Rail",terms:"bullet train,fast rail,high speed rail,highspeed rail,HSR"},"railway/signal":{name:"Railway Signal",terms:"signal,lights"},"railway/subway_entrance":{name:"Subway Entrance",terms:"metro,transit"},"railway/subway":{name:"Subway",terms:"metro,transit"},"railway/switch":{name:"Railway Switch",terms:"switch,points"},"railway/train_wash":{name:"Train Wash",terms:"wash,clean"},"railway/tram":{name:"Tram",terms:"light rail,streetcar,tram,trolley"},relation:{name:"Relation",terms:""},"route/ferry":{name:"Ferry Route",terms:"boat,merchant vessel,ship,water bus,water shuttle,water taxi"},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},shop:{name:"Shop",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/fashion":{name:"Fashion Store",terms:""},"shop/fishmonger":{name:"Fishmonger",terms:""},"shop/furnace":{name:"Furnace Store",terms:"oven,stove"},"shop/vacant":{name:"Vacant Shop",terms:""},"shop/agrarian":{name:"Farm Supply Shop",terms:"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{name:"Liquor Store",terms:"alcohol,beer,booze,wine"},"shop/anime":{name:"Anime Shop",terms:"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{name:"Antiques Shop",terms:""},"shop/appliance":{name:"Appliance Store",terms:"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{name:"Art Store",terms:"art*,exhibit*,gallery"},"shop/baby_goods":{name:"Baby Goods Store",terms:""},"shop/bag":{name:"Bag/Luggage Store",terms:"handbag,purse"},"shop/bakery":{name:"Bakery",terms:"bread,cakes,rolls"},"shop/bathroom_furnishing":{name:"Bathroom Furnishing Store",terms:""},"shop/beauty":{name:"Beauty Shop",terms:"spa,salon,tanning"},"shop/beauty/nails":{name:"Nail Salon",terms:"manicure,pedicure"},"shop/beauty/tanning":{name:"Tanning Salon",terms:""},"shop/bed":{name:"Bedding/Mattress Store",terms:""},"shop/beverages":{name:"Beverage Store",terms:"drinks"},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair,tricycle,unicycle"},"shop/boat":{name:"Boat Store",terms:"fishing boat,jetski,motorboat,rowboat,sailboat,vessel,watercraft"},"shop/bookmaker":{name:"Bookmaker",terms:"betting,bookie"},"shop/books":{name:"Book Store",terms:""},"shop/butcher":{name:"Butcher",terms:"chicken,beef,lamb,meat,pork"},"shop/candles":{name:"Candle Shop",terms:"wax"},"shop/cannabis":{name:"Cannabis Shop",terms:"420,marijuana,pot,reefer,weed"},"shop/car_parts":{name:"Car Parts Store",terms:"automobile,automotive"},"shop/car_repair":{name:"Car Repair Shop",terms:"automobile,automotive,garage,service"},"shop/car":{name:"Car Dealership",terms:"automobile,automotive"},"shop/caravan":{name:"RV Dealership",terms:"auto,camper,recreational vehicle"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"shop/chocolate":{name:"Chocolate Store",terms:"cocoa"},"shop/clothes":{name:"Clothing Store",terms:"blouses,boutique,bras,clothes,dresses,fashion,pants,shirts,shorts,skirts,slacks,socks,suits,underwear"},"shop/clothes/underwear":{name:"Underwear Store",terms:"boutique,bras,brassieres,briefs,boxers,fashion,lingerie,panties,slips,socks,stockings,underclothes,undergarments,underpants,undies"},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:"desktop,laptop,hardware,operating system,software"},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:"print,scan"},"shop/cosmetics":{name:"Cosmetics Store",terms:"make-up,makeup"},"shop/country_store":{name:"Country Store",terms:""},"shop/craft":{name:"Arts and Crafts Store",terms:"art*,paint*,frame"},"shop/curtain":{name:"Curtain Store",terms:"drape*,window"},"shop/dairy":{name:"Dairy Store",terms:"milk,egg,cheese"},"shop/deli":{name:"Deli",terms:"lunch,meat,sandwich"},"shop/department_store":{name:"Department Store",terms:""},"shop/doityourself":{name:"DIY Store",terms:""},"shop/dry_cleaning":{name:"Dry Cleaner",terms:""},"shop/e-cigarette":{name:"E-Cigarette Shop",terms:"electronic,vape,vaping,vapor"},"shop/electronics":{name:"Electronics Store",terms:"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{name:"Erotic Store",terms:"sex,porn"},"shop/erotic/lgbtq":{name:"LGBTQ+ Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fashion_accessories":{name:"Fashion Accessories Store",terms:"bag,cologne,fragrance,hat,jewellery,purfume,purse,scarf,sunglasses,umbrella,wallet,watch"},"shop/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:"bait,fishing line,flies,fly,lure,reel,rod,tackle"},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/games":{name:"Tabletop Game Store",terms:"board game,card game,dice game,game shop,live action role-playing game,miniatures wargame,strategy game"},"shop/garden_centre":{name:"Garden Center",terms:"landscape,mulch,shrub,tree"},"shop/gas":{name:"Bottled Gas Shop",terms:"cng,lpg,natural gas,propane,refill,tank"},"shop/general":{name:"General Store",terms:"Village Shop"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,produce,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"shop/hairdresser":{name:"Hairdresser",terms:"barber"},"shop/hardware":{name:"Hardware Store",terms:""},"shop/health_food":{name:"Health Food Shop",terms:"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{name:"Hearing Aids Store",terms:""},"shop/herbalist":{name:"Herbalist",terms:""},"shop/hifi":{name:"Hifi Store",terms:"audio,hi-fi,high fidelity,stereo,video"},"shop/hobby":{name:"Hobby Shop",terms:"manga,figurine,model"},"shop/houseware":{name:"Houseware Store",terms:"home,household,kitchenware"},"shop/hunting":{name:"Hunting Shop",terms:"arrows,bows,bullets,crossbows,rifles,traps"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jewelry Store",terms:"bracelet,diamond,earrings,gem,gold,jeweler,jewellery,jeweller,necklace,pins,ring,silver"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:"cabinets,countertops,sinks"},"shop/laundry":{name:"Laundry",terms:""},"shop/laundry/self_service":{name:"Self-Service Laundry",terms:"Coin Laundry,Laundromat,Coin Wash,Launderette,Washateria"},"shop/leather":{name:"Leather Store",terms:""},"shop/lighting":{name:"Lighting Store",terms:"fluorescent lighting,lamps,LEDs,light fixtures,lightbulbs"},"shop/locksmith":{name:"Locksmith",terms:"key,lockpick"},"shop/lottery":{name:"Lottery Shop",terms:""},"shop/mall":{name:"Mall",terms:"shopping"},"shop/massage":{name:"Massage Shop",terms:""},"shop/medical_supply":{name:"Medical Supply Store",terms:""},"shop/military_surplus":{name:"Military Surplus Store",terms:"armor,army-navy store,army surplus,navy surplus,tactical gear,war surplus shop,weapons"},"shop/mobile_phone":{name:"Mobile Phone Store",terms:""},"shop/money_lender":{name:"Money Lender",terms:""},"shop/motorcycle_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"shop/motorcycle":{name:"Motorcycle Dealership",terms:"bike"},"shop/music":{name:"Music Store",terms:"tape casettes,CDs,compact discs,vinyl records"},"shop/musical_instrument":{name:"Musical Instrument Store",terms:"guitar"},"shop/newsagent":{name:"Newspaper/Magazine Shop",terms:""},"shop/nutrition_supplements":{name:"Nutrition Supplements Store",terms:"health,supplement,vitamin"},"shop/optician":{name:"Optician",terms:"eye,glasses"},"shop/organic":{name:"Organic Goods Store",terms:""},"shop/outdoor":{name:"Outdoors Store",terms:"camping,climbing,hiking,outfitter,outdoor equipment,outdoor supplies"},"shop/outpost":{name:"Online Retailer Outpost",terms:"online,pick up,pickup"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:"cologne,fragrance,purfume"},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"cat,dog"},"shop/pet":{name:"Pet Store",terms:"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{name:"Photography Store",terms:"camera,film"},"shop/printer_ink":{name:"Printer Ink Store",terms:"copier ink,fax ink,ink cartridges,toner"},"shop/pyrotechnics":{name:"Fireworks Store",terms:"fireworks"},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:"antenna,transistor"},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:"boots,cleats,clogs,heels,loafers,oxfords,sneakers"},"shop/sports":{name:"Sporting Goods Store",terms:"athletics"},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:"garages"},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/swimming_pool":{name:"Pool Supply Store",terms:"hot tub equipment store,hot tub maintenance store,hot tub supply store,pool shop,pool store,swimming pool equipment store,swimming pool installation store,swimming pool maintenance store,swimming pool supply shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:"ink"},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:"box office"},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:"cigarettes,cigars"},"shop/toys":{name:"Toy Store",terms:"games"},"shop/trade":{name:"Trade Shop",terms:""},"shop/travel_agency":{name:"Travel Agency",terms:""},"shop/tyres":{name:"Tire Store",terms:""},"shop/vacuum_cleaner":{name:"Vacuum Cleaner Store",terms:""},"shop/variety_store":{name:"Variety Store",terms:""},"shop/video_games":{name:"Video Game Store",terms:""},"shop/video":{name:"Video Store",terms:"DVD,VHS,video casette"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/water":{name:"Drinking Water Shop",terms:""},"shop/weapons":{name:"Weapon Shop",terms:"ammo,gun,knife,knives"},"shop/wholesale":{name:"Wholesale Store",terms:"warehouse club,cash and carry"},"shop/window_blind":{name:"Window Blind Store",terms:""},"shop/wine":{name:"Wine Shop",terms:""},tactile_paving:{name:"Tactile Paving",terms:"blind path,detectable warning surfaces,tactile ground surface indicators,tactile walking surface indicators,truncated domes,visually impaired path"},"telecom/data_center":{name:"Data Center",terms:"computer systems storage,information technology,server farm,the cloud,telecommunications"},"tourism/alpine_hut":{name:"Alpine Hut",terms:"climbing hut"},"tourism/apartment":{name:"Guest Apartment / Condo",terms:""},"tourism/aquarium":{name:"Aquarium",terms:"fish,sea,water"},"tourism/artwork":{name:"Artwork",terms:"mural,sculpture,statue"},"tourism/artwork/bust":{name:"Bust",terms:"figure"},"tourism/artwork/graffiti":{name:"Graffiti",terms:"Street Artwork,Guerilla Artwork,Graffiti Artwork"},"tourism/artwork/installation":{name:"Art Installation",terms:"interactive art,intervention art,modern art"},"tourism/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},"tourism/camp_site":{name:"Campground",terms:"tent,rv"},"tourism/caravan_site":{name:"RV Park",terms:"Motor Home,Camper"},"tourism/chalet":{name:"Holiday Cottage",terms:"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{name:"Art Gallery",terms:"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{name:"Guest House",terms:"B&B,Bed and Breakfast"},"tourism/hostel":{name:"Hostel",terms:""},"tourism/hotel":{name:"Hotel",terms:""},"tourism/information":{name:"Information",terms:""},"tourism/information/board":{name:"Information Board",terms:""},"tourism/information/guidepost":{name:"Guidepost",terms:"signpost"},"tourism/information/map":{name:"Map",terms:""},"tourism/information/office":{name:"Tourist Information Office",terms:""},"tourism/information/route_marker":{name:"Trail Marker",terms:"cairn,painted blaze,route flag,route marker,stone pile,trail blaze,trail post,way marker"},"tourism/information/terminal":{name:"Information Terminal",terms:""},"tourism/motel":{name:"Motel",terms:""},"tourism/museum":{name:"Museum",terms:"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{name:"Picnic Site",terms:"camp"},"tourism/theme_park":{name:"Theme Park",terms:""},"tourism/trail_riding_station":{name:"Trail Riding Station",terms:""},"tourism/viewpoint":{name:"Viewpoint",terms:""},"tourism/wilderness_hut":{name:"Wilderness Hut",terms:"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{name:"Zoo",terms:"animal"},"tourism/zoo/petting":{name:"Petting Zoo",terms:"Children's Zoo,Children's Farm,Petting Farm,farm animals"},"tourism/zoo/safari":{name:"Safari Park",terms:"Drive-Through Zoo,Drive-In Zoo"},"tourism/zoo/wildlife":{name:"Wildlife Park",terms:"indigenous animals"},traffic_calming:{name:"Traffic Calming",terms:"bump,hump,slow,speed"},"traffic_calming/bump":{name:"Speed Bump",terms:"hump,speed,slow"},"traffic_calming/chicane":{name:"Traffic Chicane",terms:"driveway link,speed,slow"},"traffic_calming/choker":{name:"Traffic Choker",terms:"speed,slow"},"traffic_calming/cushion":{name:"Speed Cushion",terms:"bump,hump,speed,slow"},"traffic_calming/dip":{name:"Dip",terms:"speed,slow"},"traffic_calming/hump":{name:"Speed Hump",terms:"bump,speed,slow"},"traffic_calming/island":{name:"Traffic Island",terms:"circle,roundabout,slow"},"traffic_calming/rumble_strip":{name:"Rumble Strip",terms:"audible lines,sleeper lines,growlers"},"traffic_calming/table":{name:"Speed Table",terms:"flat top,hump,speed,slow"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/enforcement":{name:"Enforcement",terms:""},"type/public_transport/stop_area_group":{name:"Transit Stop Area Group",terms:""},"type/restriction":{name:"Restriction",terms:""},"type/restriction/no_left_turn":{name:"No Left Turn",terms:""},"type/restriction/no_right_turn":{name:"No Right Turn",terms:""},"type/restriction/no_straight_on":{name:"No Straight On",terms:""},"type/restriction/no_u_turn":{name:"No U-turn",terms:""},"type/restriction/only_left_turn":{name:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",terms:""},"type/route_master":{name:"Route Master",terms:""},"type/route":{name:"Route",terms:""},"type/route/bicycle":{name:"Cycle Route",terms:""},"type/route/bus":{name:"Bus Route",terms:""},"type/route/detour":{name:"Detour Route",terms:""},"type/route/ferry":{name:"Ferry Route",terms:""},"type/route/foot":{name:"Foot Route",terms:""},"type/route/hiking":{name:"Hiking Route",terms:""},"type/route/horse":{name:"Riding Route",terms:""},"type/route/light_rail":{name:"Light Rail Route",terms:""},"type/route/monorail":{name:"Monorail Route",terms:""},"type/route/pipeline":{name:"Pipeline Route",terms:""},"type/route/piste":{name:"Piste/Ski Route",terms:""},"type/route/power":{name:"Power Route",terms:""},"type/route/road":{name:"Road Route",terms:""},"type/route/subway":{name:"Subway Route",terms:""},"type/route/train":{name:"Train Route",terms:""},"type/route/tram":{name:"Tram Route",terms:""},"type/site":{name:"Site",terms:""},"type/waterway":{name:"Waterway",terms:""},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/canal/lock":{name:"Canal Lock",terms:""},"waterway/dam":{name:"Dam",terms:""},"waterway/ditch":{name:"Ditch",terms:""},"waterway/dock":{name:"Wet Dock / Dry Dock",terms:"boat,ship,vessel,marine"},"waterway/drain":{name:"Drain",terms:""},"waterway/fuel":{name:"Marine Fuel Station",terms:"petrol,gas,diesel,boat"},"waterway/lock_gate":{name:"Lock Gate",terms:"canal"},"waterway/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/sanitary_dump_station":{name:"Marine Toilet Disposal",terms:"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{name:"Intermittent Stream",terms:"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{name:"Marine Drinking Water",terms:""},"waterway/waterfall":{name:"Waterfall",terms:"fall"},"waterway/weir":{name:"Weir",terms:"low-head dam,low-rise dam,wier"}}},imagery:{AGIV:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Flanders GRB"},AIV_DHMV_II_HILL_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m"},AIV_DHMV_II_SVF_25cm:{attribution:{text:"© agentschap Informatie Vlaanderen"},name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},EOXAT2018CLOUDLESS:{attribution:{text:"Sentinel-2 cloudless - https://s2maps.eu by EOX IT Services GmbH (Contains modified Copernicus Sentinel data 2017 & 2018)"},description:"Post-processed Sentinel Satellite imagery.",name:"eox.at 2018 cloudless"},EsriWorldImagery:{attribution:{text:"Terms & Feedback"},description:"Esri world imagery.",name:"Esri World Imagery"},EsriWorldImageryClarity:{attribution:{text:"Terms & Feedback"},description:"Esri archive imagery that may be clearer and more accurate than the default layer.",name:"Esri World Imagery (Clarity) Beta"},MAPNIK:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},description:"The default OpenStreetMap layer.",name:"OpenStreetMap (Standard)"},Mapbox:{attribution:{text:"Terms & Feedback"},description:"Satellite and aerial imagery.",name:"Mapbox Satellite"},"Maxar-Premium":{attribution:{text:"Terms & Feedback"},description:"Maxar Premium is a mosaic composed of Maxar basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"Maxar Premium Imagery (Beta)"},"Maxar-Standard":{attribution:{text:"Terms & Feedback"},description:"Maxar Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"Maxar Standard Imagery (Beta)"},"OSM_Inspector-Addresses":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Area"},"OSM_Inspector-Places":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Places"},"OSM_Inspector-Routing":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Tagging"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"US-TIGER-Roads-2014":{description:"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap",name:"TIGER Roads 2014"},"US-TIGER-Roads-2017":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2017"},"US-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},"USDA-NAIP":{description:"The most recent year of DOQQs from the National Agriculture Imagery Program (NAIP) for each state in the contiguous United States.",name:"National Agriculture Imagery Program"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"Waymarked_Trails-Cycling":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Winter Sports"},"basemap.at":{attribution:{text:"basemap.at"},description:"Basemap of Austria, based on government data.",name:"basemap.at"},"basemap.at-orthofoto":{attribution:{text:"basemap.at"},description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",name:"basemap.at Orthofoto"},"basemap.at-overlay":{attribution:{text:"basemap.at"},description:"Annotation overlay provided by basemap.at.",name:"basemap.at Overlay"},"basemap.at-surface":{attribution:{text:"basemap.at"},description:"Surface layer provided by basemap.at.",name:"basemap.at Surface"},"basemap.at-terrain":{attribution:{text:"basemap.at"},description:"Terrain layer provided by basemap.at.",name:"basemap.at Terrain"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto Imagery"},"gsi.go.jp_seamlessphoto":{attribution:{text:"GSI Japan seamless photo"},description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others.",name:"Japan GSI seamlessphoto Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},mapbox_locator_overlay:{attribution:{text:"Terms & Feedback"},description:"Shows major features to help orient you.",name:"Locator Overlay"},openpt_map:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenPT Map (overlay)"},"osm-gps":{attribution:{text:"© OpenStreetMap contributors"},description:"Public GPS traces uploaded to OpenStreetMap.",name:"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (German Style)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},qa_no_address:{attribution:{text:"Simon Poole, Data ©OpenStreetMap contributors"},name:"QA No Address"},skobbler:{attribution:{text:"© Tiles: skobbler Map data: OpenStreetMap contributors"},name:"skobbler"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",name:"Stockholm Orthophoto"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research."},"ym-The-Gambia-YMCA-University-of-the-Gambia":{name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development."},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology"},"ym-University-of-Cape-Coast":{name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”"},"ym-University-of-Energy-and-Natural-Resources":{name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival."},"ym-University-of-Ghana":{name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork."},"ym-University-of-Mines-and-Technology":{name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide."},"ym-General-Lansana-Conte-University":{name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities."},"ym-Institute-of-Science-and-Veterinary-Medicine":{name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea."},"ym-Universit-de-NZrkor":{name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit."},"ym-Dedan-Kimathi-University-of-Technology":{name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university."},"ym-Karatina-University":{name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges."},"ym-Kenyatta-University":{name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection."},"ym-Moi-University":{name:"Geography Students Association",description:"YouthMappers chapter at Moi University",extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography."},"ym-Technical-University-of-Kenya":{name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements"},"ym-University-of-Nairobi":{name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities."},"ym-African-Methodist-Episcopal-University":{name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University"},"ym-Cuttington-University":{name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students."},"ym-Grand-Gedeh-County-Community-College":{name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically."},"ym-Nimba-County-Community-College":{name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College"},"ym-Stella-Maris-Polytechnic":{name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic"},"ym-University-of-Liberia-YouthMappers":{name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"ym-University-of-Malawi":{name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs."},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako"},"ym-Universidade-Eduardo-Mondlane":{name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs."},"ym-Namibia-University-of-Science-and-Technology":{name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology"},"ym-Abia-State-University":{name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology"},"ym-Ahmadu-Bello-University":{name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration."},"ym-Federal-School-of-Surveys":{name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys"},"ym-Federal-University-of-Technology-Akure":{name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education."},"ym-Ignatius-Ajuru-University-of-Education":{name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping."},"ym-University-of-Nigeria-Nsukka":{name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools."},"ym-University-of-Port-Harcourt":{name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation."},"ym-University-of-Nigeria-Enugu-Campus":{name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping."},"osm-africa-telegram":{name:"OpenStreetMap Africa Telegram",description:"OpenStreetMap Telegram for Africa"},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community."},"ym-University-of-Rwanda-Huye-Campus":{name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors."},"ym-Institut-Suprieur-de-Management-Kolda":{name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM."},"ym-Universit-Gaston-Berger":{name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa."},"ym-Fourah-Bay-College":{name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team."},"ym-Njala-University-Freetown-Campus":{name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone."},"ym-Njala-University-Njala-Campus":{name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus"},"ym-University-of-Pretoria":{name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad."},"ym-Ardhi-University":{name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations."},"ym-Institute-of-Finance-Management":{name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza"},"ym-Institute-of-Rural-Development-Planning":{name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President."},"ym-Open-University-of-Tanzania":{name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels."},"ym-Sokoine-University-of-Agriculture":{name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action."},"ym-University-of-Dar-es-Salaam":{name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners ."},"ym-Busitema-University":{name:"Good Mappers",description:"YouthMappers chapter at Busitema University",extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map."},"ym-Gulu-University":{name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination."},"ym-Kumi-University":{name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology."},"ym-Makerere-University":{name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives."},"ym-Mbarara-University-of-Science-and-Technology":{name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society."},"ym-St.-Augustine-International-University":{name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University"},"ym-Uganda-Christian-University-Mbale-Campus":{name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU."},"ym-Uganda-Pentecostal-University":{name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes."},"ym-St.-Mawaggali-Trades-Training-Institute":{name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping."},"ym-The-University-of-Zambia":{name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia"},"ym-University-of-Zimbabwe":{name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills."},"osm-afghanistan-facebook":{name:"OpenStreetMap Afghanistan",description:"Improve OpenStreetMap in Afghanistan"},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"ym-Asian-University-for-Women":{name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world."},"ym-Dhaka-College":{name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping."},"ym-Dhaka-University":{name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes."},"ym-Eastern-University":{name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes."},"ym-Jahangirnagar-University":{name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University"},"ym-Khulna-University":{name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics."},"ym-Rajshahi-University-of-Engineering-Technology":{name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world."},"ym-Sherubtse-College":{name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"osm-india-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"ym-Gujarat-University":{name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University"},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"ym-Universitas-Negeri-Makassar":{name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar"},"ym-University-Muhammadiyah-Surakarta":{name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta."},"osm-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"ym-Institute-of-Crisis-Management-Studies":{name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",extendedDescription:"To develop Crisis Mappers to assist during disaster situations."},"ym-Kathmandu-University":{name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc."},"ym-Tribhuvan-University":{name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network."},"OSM-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"ym-Far-Eastern-University-Institute-of-Technology":{name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region"},"ym-University-of-the-Philippines-Resilience-Institute":{name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps."},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"ym-Queen-Mary-University-of-London":{name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society."},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"ym-Heidelberg-University":{name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications."},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"ym-Politecnico-di-Milano":{name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools."},"ym-Yarmouk-University":{name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region."},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"lu-mailinglist":{name:"Talk-lu Mailing List",description:"Official mailing list for the Luxembourgish OSM community"},"ym-Universit-Mohammed-V-Rabat":{name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries"},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"pt-mailinglist":{name:"Talk-pt Mailing List",description:"Talk-pt is the official mailing list for the Portuguese OSM community"},"pt-telegram":{name:"OpenStreetMap Portugal no Telegram",description:"Telegram Group of the Portuguese OpenStreetMap community {url}"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"si-twitter":{name:"OpenStreetMap Slovenia Twitter",description:"Follow OpenStreetMap Slovenia On Twitter: {url}"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"ym-Universidad-Autonoma-de-Madrid":{name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid"},"ym-Universidad-Politcnica-de-Madrid":{name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"ym-Istanbul-Technical-University":{name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data."},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"ym-University-of-Exeter":{name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers."},"ym-University-of-Warwick":{name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled."},"ym-Sacred-Heart-Junior-College":{name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"ym-Universidad-de-Costa-Rica":{name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas."},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"ym-Universidad-Nacional-Autnoma-de-Honduras":{name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras"},"ym-University-of-the-West-Indies-Mona-Campus":{name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students."},"ni-facebook":{name:"OpenStreetMap NI Community",description:"Mappers and OpenStreetMap on Facebook in Nicaragua"},"ni-mailinglist":{name:"Talk-ni Mailing List",description:"Talk-ni is the official mailing list for the Nicaraguan OSM community"},"ni-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"ni-twitter":{name:"OpenStreetMap Nicaragua Twitter",description:"OSM Nicaragua on Twitter: @osm_ni"},"osm-ni":{name:"MapaNica.net",description:"Provide OSM services and information for the local community in Nicaragua"},"ym-Universidad-Nacional-de-Ingenieria":{name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability."},"ym-University-of-Panama":{name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives."},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{"sotmus2019-cfs":{name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota"},sotmus2019:{name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"ym-Ball-State-University":{name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing."},"ym-California-University-of-Pennsylvania":{name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management."},"ym-Central-Washington-University":{name:"Geography Club",description:"YouthMappers chapter at Central Washington University",extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills."},"ym-Clemson-University":{name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world."},"ym-College-of-William-and-Mary":{name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences."},"ym-Cornell-University":{name:"Mapping Society",description:"YouthMappers chapter at Cornell University",extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy."},"ym-George-Mason-University":{name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow."},"ym-Indiana-University-of-Pennsylvania":{name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania"},"ym-Jacksonville-State-University":{name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets"},"ym-Kansas-State-University":{name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015."},"ym-McGill-University":{name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad."},"ym-Miami-University":{name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience."},"ym-Monroe-Community-College":{name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College"},"ym-Montgomery-College":{name:"GeoMC",description:"YouthMappers chapter at Montgomery College",extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in."},"ym-New-York-University":{name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes."},"ym-Ohio-Wesleyan-University":{name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives."},"ym-Oklahoma-State-University":{name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University"},"ym-State-University-of-New-York-Geneseo":{name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community."},"ym-SUNY-at-Fredonia":{name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better."},"ym-Texas-Tech-University":{name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping."},"ym-The-Citadel":{name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers."},"ym-The-George-Washington-University":{name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community."},"ym-The-Johns-Hopkins-University-SAIS":{name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region."},"ym-The-Pennsylvania-State-University":{name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry."},"ym-University-of-California-Davis":{name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis"},"ym-University-of-Central-Florida":{name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS."},"ym-University-of-Chicago":{name:"Tobler Society",description:"YouthMappers chapter at University of Chicago"},"ym-University-of-Maryland-College-Park":{name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community."},"ym-University-of-North-Texas":{name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community."},"ym-University-of-Northern-Colorado":{name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld"},"ym-University-of-Oregon":{name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures."},"ym-University-of-Redlands":{name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events."},"ym-University-of-South-Carolina":{name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines."},"ym-University-of-Southern-California":{name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!"},"ym-University-of-Vermont":{name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont"},"ym-University-of-Victoria":{name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus"},"ym-University-of-Wyoming":{name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming"},"ym-UW-Madison":{name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it."},"ym-Vassar-College":{name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts."},"ym-Villanova-University":{name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level."},"ym-West-Virginia-University":{name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world."},"ym-Western-Michigan-University":{name:"Geography Club",description:"YouthMappers chapter at Western Michigan University"},geogeeks_perth_meetup:{name:"GeoGeeks Perth Meetup",description:"Perth-based meetup group for people interested in mapping, geospatial data, and open source. We'll be working on anything that involves a sense of place."},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"Maptime-Oceania-Slack":{name:"Maptime Oceania Slack",description:"Sign up at {signupUrl}"},"talk-nz":{name:"Talk-nz Mailing List",description:"New Zealand's OSM community talk"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-discord":{name:"OpenStreetMap Brasil Discord",description:"Join the OpenStreetMap Brasil community on Discord"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"ym-Universidad-de-Antioquia":{name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network."},"ym-Universidad-de-La-Guajira":{name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping."},"ym-Universidad-de-Los-Andes":{name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics."},"ym-Universidad-de-San-Buenaventura":{name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community."},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students."},"ym-Universidad-Nacional-de-Colombia":{name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines."},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"uy-forum":{name:"OpenStreetMap UY forum",description:"OpenStreetMap Uruguay web forum"},"uy-irc":{name:"OpenStreetMap Uruguay on IRC",description:"Join #osmuruguay on irc.freenode.org (port 6667)",extendedDescription:"Join #osmuruguay on irc.freenode.org"},"uy-mailinglist":{name:"Talk-uy Mailing List",description:"Talk-uy is the official mailing list for the Uruguayan OSM community"},"ve-forum":{name:"OpenStreetMap VE Forum",description:"OpenStreetMap Venezuela web forum"},"ve-mailinglist":{name:"Talk-ve Mailing List",description:"Talk-ve is the official mailing list for the Venezuelan OSM community"},"ve-telegram":{name:"OpenStreetMap Venezuela Telegram",description:"Join the OpenStreetMap Venezuela community on Telegram"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
24871
24872         var features$3 = {africa_full:{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-29.35547,14.94478],[-27.81738,21.33032],[-12.78809,34.28899],[-5.42999,35.99134],[-2.72461,36.0935],[5.73486,38.39334],[12.17285,37.33522],[13.77686,35.03],[33.35449,33.32135],[34.91455,29.48264],[34.38721,27.54724],[42.57202,13.73138],[43.20923,12.86536],[43.82446,11.53385],[54.93164,14.51978],[63.01758,-13.49647],[50.53711,-40.44695],[10.98633,-38.41056],[2.72461,-9.79568],[-29.35547,14.94478]]]},id:"africa_full"},botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"Feature",id:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.98799,5.5686],[-3.94397,5.56428],[-3.90165,5.5515],[-3.86264,5.53074],[-3.82846,5.5028],[-3.80041,5.46876],[-3.77958,5.42993],[-3.76675,5.38779],[-3.76243,5.34398],[-3.76678,5.30017],[-3.77963,5.25804],[-3.80049,5.21922],[-3.82854,5.1852],[-3.86272,5.15728],[-3.90171,5.13653],[-3.94401,5.12375],[-3.98799,5.11944],[-4.03198,5.12375],[-4.07428,5.13653],[-4.11327,5.15728],[-4.14745,5.1852],[-4.1755,5.21922],[-4.19635,5.25804],[-4.2092,5.30017],[-4.21355,5.34398],[-4.20924,5.38779],[-4.19641,5.42993],[-4.17558,5.46876],[-4.14753,5.5028],[-4.11335,5.53074],[-4.07434,5.5515],[-4.03201,5.56428],[-3.98799,5.5686]]]}},"The-Gambia-YMCA-University-of-the-Gambia":{type:"Feature",id:"The-Gambia-YMCA-University-of-the-Gambia",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.6763,13.68253],[-16.63121,13.67821],[-16.58785,13.66542],[-16.54791,13.64465],[-16.5129,13.6167],[-16.48419,13.58265],[-16.46288,13.54381],[-16.44977,13.50166],[-16.44538,13.45785],[-16.44986,13.41404],[-16.46303,13.37192],[-16.4844,13.33311],[-16.51312,13.2991],[-16.54811,13.27119],[-16.58801,13.25045],[-16.63129,13.23769],[-16.6763,13.23337],[-16.72131,13.23769],[-16.76459,13.25045],[-16.80449,13.27119],[-16.83948,13.2991],[-16.8682,13.33311],[-16.88956,13.37192],[-16.90274,13.41404],[-16.90722,13.45785],[-16.90282,13.50166],[-16.88972,13.54381],[-16.8684,13.58265],[-16.83969,13.6167],[-16.80469,13.64465],[-16.76474,13.66542],[-16.72139,13.67821],[-16.6763,13.68253]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},"Kwame-Nkrumah-University-of-Science-and-Technology":{type:"Feature",id:"Kwame-Nkrumah-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56831,6.89695],[-1.52418,6.89263],[-1.48174,6.87985],[-1.44264,6.85909],[-1.40837,6.83115],[-1.38026,6.7971],[-1.35937,6.75827],[-1.34652,6.71613],[-1.3422,6.67232],[-1.34656,6.62851],[-1.35945,6.58638],[-1.38035,6.54757],[-1.40848,6.51354],[-1.44274,6.48562],[-1.48182,6.46488],[-1.52422,6.45211],[-1.56831,6.44779],[-1.6124,6.45211],[-1.6548,6.46488],[-1.69388,6.48562],[-1.72814,6.51354],[-1.75627,6.54757],[-1.77717,6.58638],[-1.79006,6.62851],[-1.79442,6.67232],[-1.7901,6.71613],[-1.77725,6.75827],[-1.75636,6.7971],[-1.72825,6.83115],[-1.69398,6.85909],[-1.65488,6.87985],[-1.61244,6.89263],[-1.56831,6.89695]]]}},"University-of-Cape-Coast":{type:"Feature",id:"University-of-Cape-Coast",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.23047,5.31552],[-1.18647,5.31121],[-1.14416,5.29842],[-1.10517,5.27766],[-1.071,5.24973],[-1.04296,5.21569],[-1.02214,5.17685],[-1.00932,5.13472],[-1.005,5.0909],[-1.00935,5.04709],[-1.02219,5.00497],[-1.04303,4.96615],[-1.07108,4.93212],[-1.10524,4.9042],[-1.14421,4.88345],[-1.1865,4.87068],[-1.23047,4.86637],[-1.27444,4.87068],[-1.31672,4.88345],[-1.3557,4.9042],[-1.38986,4.93212],[-1.4179,4.96615],[-1.43875,5.00497],[-1.45159,5.04709],[-1.45594,5.0909],[-1.45162,5.13472],[-1.4388,5.17685],[-1.41798,5.21569],[-1.38994,5.24973],[-1.35577,5.27766],[-1.31678,5.29842],[-1.27447,5.31121],[-1.23047,5.31552]]]}},"University-of-Energy-and-Natural-Resources":{type:"Feature",id:"University-of-Energy-and-Natural-Resources",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.343,7.57482],[-2.2988,7.5705],[-2.2563,7.55771],[-2.21714,7.53695],[-2.18283,7.50901],[-2.15467,7.47497],[-2.13376,7.43613],[-2.12089,7.394],[-2.11656,7.35018],[-2.12093,7.30637],[-2.13384,7.26425],[-2.15477,7.22543],[-2.18294,7.19141],[-2.21725,7.16349],[-2.25639,7.14275],[-2.29885,7.12997],[-2.343,7.12566],[-2.38715,7.12997],[-2.42961,7.14275],[-2.46875,7.16349],[-2.50306,7.19141],[-2.53123,7.22543],[-2.55216,7.26425],[-2.56507,7.30637],[-2.56944,7.35018],[-2.56511,7.394],[-2.55224,7.43613],[-2.53133,7.47497],[-2.50317,7.50901],[-2.46886,7.53695],[-2.4297,7.55771],[-2.3872,7.5705],[-2.343,7.57482]]]}},"University-of-Ghana":{type:"Feature",id:"University-of-Ghana",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.19624,5.87573],[-0.15219,5.87141],[-0.10984,5.85863],[-0.07082,5.83787],[-0.03662,5.80993],[-0.00855,5.77589],[0.01229,5.73706],[0.02512,5.69492],[0.02944,5.65111],[0.02509,5.6073],[0.01223,5.56517],[-0.00863,5.52635],[-0.0367,5.49233],[-0.0709,5.46441],[-0.1099,5.44366],[-0.15223,5.43089],[-0.19624,5.42657],[-0.24025,5.43089],[-0.28257,5.44366],[-0.32157,5.46441],[-0.35577,5.49233],[-0.38384,5.52635],[-0.4047,5.56517],[-0.41756,5.6073],[-0.42191,5.65111],[-0.41759,5.69492],[-0.40476,5.73706],[-0.38392,5.77589],[-0.35586,5.80993],[-0.32166,5.83787],[-0.28263,5.85863],[-0.24028,5.87141],[-0.19624,5.87573]]]}},"University-of-Mines-and-Technology":{type:"Feature",id:"University-of-Mines-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[-2.00125,5.52338],[-1.95723,5.51907],[-1.91491,5.50628],[-1.87591,5.48552],[-1.84173,5.45759],[-1.81368,5.42355],[-1.79285,5.38471],[-1.78003,5.34258],[-1.77571,5.29876],[-1.78006,5.25495],[-1.7929,5.21283],[-1.81376,5.17401],[-1.84181,5.13998],[-1.87598,5.11206],[-1.91497,5.09132],[-1.95726,5.07854],[-2.00125,5.07423],[-2.04524,5.07854],[-2.08753,5.09132],[-2.12652,5.11206],[-2.16069,5.13998],[-2.18874,5.17401],[-2.2096,5.21283],[-2.22244,5.25495],[-2.22679,5.29876],[-2.22247,5.34258],[-2.20965,5.38471],[-2.18882,5.42355],[-2.16077,5.45759],[-2.12659,5.48552],[-2.08759,5.50628],[-2.04527,5.51907],[-2.00125,5.52338]]]}},"General-Lansana-Conte-University":{type:"Feature",id:"General-Lansana-Conte-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.62305,9.93364],[-13.57857,9.92932],[-13.5358,9.91653],[-13.49639,9.89576],[-13.46186,9.86782],[-13.43353,9.83377],[-13.41249,9.79494],[-13.39955,9.7528],[-13.3952,9.70898],[-13.39961,9.66517],[-13.4126,9.62305],[-13.43367,9.58424],[-13.46201,9.55022],[-13.49653,9.5223],[-13.53591,9.50156],[-13.57863,9.48879],[-13.62305,9.48448],[-13.66747,9.48879],[-13.71018,9.50156],[-13.74956,9.5223],[-13.78408,9.55022],[-13.81242,9.58424],[-13.83349,9.62305],[-13.84648,9.66517],[-13.85089,9.70898],[-13.84654,9.7528],[-13.8336,9.79494],[-13.81256,9.83377],[-13.78423,9.86782],[-13.7497,9.89576],[-13.71029,9.91653],[-13.66753,9.92932],[-13.62305,9.93364]]]}},"Institute-of-Science-and-Veterinary-Medicine":{type:"Feature",id:"Institute-of-Science-and-Veterinary-Medicine",properties:{},geometry:{type:"Polygon",coordinates:[[[-12.1175,10.91114],[-12.07288,10.90682],[-12.02998,10.89403],[-11.99045,10.87326],[-11.95581,10.84532],[-11.9274,10.81127],[-11.90629,10.77243],[-11.89332,10.73029],[-11.88896,10.68648],[-11.89338,10.64267],[-11.90641,10.60055],[-11.92755,10.56173],[-11.95598,10.52772],[-11.99061,10.4998],[-12.0301,10.47906],[-12.07295,10.46629],[-12.1175,10.46198],[-12.16205,10.46629],[-12.2049,10.47906],[-12.24439,10.4998],[-12.27902,10.52772],[-12.30745,10.56173],[-12.32859,10.60055],[-12.34162,10.64267],[-12.34604,10.68648],[-12.34168,10.73029],[-12.32871,10.77243],[-12.3076,10.81127],[-12.27919,10.84532],[-12.24455,10.87326],[-12.20502,10.89403],[-12.16212,10.90682],[-12.1175,10.91114]]]}},"Universit-de-NZrkor":{type:"Feature",id:"Universit-de-NZrkor",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.83716,7.95701],[-8.79292,7.95269],[-8.75039,7.9399],[-8.71119,7.91914],[-8.67684,7.8912],[-8.64866,7.85715],[-8.62773,7.81832],[-8.61485,7.77618],[-8.61052,7.73237],[-8.6149,7.68856],[-8.62781,7.64643],[-8.64877,7.60762],[-8.67696,7.5736],[-8.7113,7.54568],[-8.75047,7.52493],[-8.79297,7.51216],[-8.83716,7.50785],[-8.88135,7.51216],[-8.92385,7.52493],[-8.96302,7.54568],[-8.99736,7.5736],[-9.02555,7.60762],[-9.0465,7.64643],[-9.05942,7.68856],[-9.0638,7.73237],[-9.05947,7.77618],[-9.04659,7.81832],[-9.02566,7.85715],[-8.99748,7.8912],[-8.96313,7.91914],[-8.92393,7.9399],[-8.8814,7.95269],[-8.83716,7.95701]]]}},"Dedan-Kimathi-University-of-Technology":{type:"Feature",id:"Dedan-Kimathi-University-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.00195,-0.21487],[37.04577,-0.21919],[37.0879,-0.23196],[37.12672,-0.25272],[37.16076,-0.28065],[37.18869,-0.31468],[37.20944,-0.3535],[37.22222,-0.39563],[37.22654,-0.43945],[37.22222,-0.48326],[37.20945,-0.52539],[37.18869,-0.56422],[37.16076,-0.59825],[37.12673,-0.62618],[37.0879,-0.64693],[37.04577,-0.65971],[37.00195,-0.66403],[36.95814,-0.65971],[36.91601,-0.64693],[36.87718,-0.62618],[36.84314,-0.59825],[36.81521,-0.56422],[36.79446,-0.52539],[36.78168,-0.48326],[36.77737,-0.43945],[36.78168,-0.39563],[36.79447,-0.3535],[36.81522,-0.31468],[36.84315,-0.28065],[36.87718,-0.25272],[36.91601,-0.23196],[36.95814,-0.21919],[37.00195,-0.21487]]]}},"Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"Feature",id:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[37.0105,-0.86452],[37.05432,-0.86884],[37.09645,-0.88162],[37.13528,-0.90237],[37.16932,-0.93029],[37.19726,-0.96433],[37.21802,-1.00315],[37.2308,-1.04528],[37.23512,-1.08909],[37.23081,-1.1329],[37.21803,-1.17504],[37.19727,-1.21386],[37.16934,-1.2479],[37.1353,-1.27583],[37.09646,-1.29658],[37.05432,-1.30936],[37.0105,-1.31368],[36.96668,-1.30936],[36.92454,-1.29658],[36.8857,-1.27583],[36.85166,-1.2479],[36.82373,-1.21386],[36.80297,-1.17504],[36.79019,-1.1329],[36.78588,-1.08909],[36.7902,-1.04528],[36.80298,-1.00315],[36.82374,-0.96433],[36.85168,-0.93029],[36.88572,-0.90237],[36.92455,-0.88162],[36.96668,-0.86884],[37.0105,-0.86452]]]}},"Karatina-University":{type:"Feature",id:"Karatina-University",properties:{},geometry:{type:"Polygon",coordinates:[[[37.12789,-0.25676],[37.1717,-0.26108],[37.21383,-0.27386],[37.25266,-0.29461],[37.28669,-0.32254],[37.31462,-0.35657],[37.33538,-0.3954],[37.34816,-0.43752],[37.35247,-0.48134],[37.34816,-0.52515],[37.33538,-0.56728],[37.31463,-0.60611],[37.2867,-0.64014],[37.25267,-0.66807],[37.21384,-0.68882],[37.1717,-0.7016],[37.12789,-0.70592],[37.08407,-0.7016],[37.04194,-0.68882],[37.00311,-0.66807],[36.96908,-0.64014],[36.94115,-0.60611],[36.92039,-0.56728],[36.90762,-0.52515],[36.9033,-0.48134],[36.90762,-0.43752],[36.9204,-0.3954],[36.94115,-0.35657],[36.96908,-0.32254],[37.00312,-0.29461],[37.04194,-0.27386],[37.08407,-0.26108],[37.12789,-0.25676]]]}},"Kenyatta-University":{type:"Feature",id:"Kenyatta-University",properties:{},geometry:{type:"Polygon",coordinates:[[[36.93493,-0.95538],[36.97875,-0.9597],[37.02089,-0.97248],[37.05972,-0.99323],[37.09376,-1.02116],[37.12169,-1.05519],[37.14245,-1.09401],[37.15524,-1.13614],[37.15956,-1.17995],[37.15524,-1.22377],[37.14247,-1.2659],[37.12171,-1.30472],[37.09378,-1.33876],[37.05974,-1.36669],[37.0209,-1.38744],[36.97876,-1.40023],[36.93493,-1.40454],[36.8911,-1.40023],[36.84896,-1.38744],[36.81013,-1.36669],[36.77609,-1.33876],[36.74815,-1.30472],[36.7274,-1.2659],[36.71462,-1.22377],[36.7103,-1.17995],[36.71462,-1.13614],[36.72741,-1.09401],[36.74817,-1.05519],[36.7761,-1.02116],[36.81014,-0.99323],[36.84898,-0.97248],[36.89111,-0.9597],[36.93493,-0.95538]]]}},"Moi-University":{type:"Feature",id:"Moi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.50781,-0.12698],[35.55163,-0.1313],[35.59376,-0.14408],[35.63258,-0.16483],[35.66661,-0.19276],[35.69454,-0.22679],[35.7153,-0.26562],[35.72808,-0.30774],[35.7324,-0.35156],[35.72808,-0.39537],[35.7153,-0.4375],[35.69455,-0.47633],[35.66662,-0.51036],[35.63259,-0.53829],[35.59376,-0.55904],[35.55163,-0.57182],[35.50781,-0.57614],[35.464,-0.57182],[35.42187,-0.55904],[35.38304,-0.53829],[35.34901,-0.51036],[35.32108,-0.47633],[35.30032,-0.4375],[35.28754,-0.39537],[35.28323,-0.35156],[35.28755,-0.30774],[35.30033,-0.26562],[35.32108,-0.22679],[35.34901,-0.19276],[35.38304,-0.16483],[35.42187,-0.14408],[35.464,-0.1313],[35.50781,-0.12698]]]}},"Technical-University-of-Kenya":{type:"Feature",id:"Technical-University-of-Kenya",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82449,-1.06703],[36.86831,-1.07134],[36.91045,-1.08412],[36.94928,-1.10487],[36.98332,-1.1328],[37.01126,-1.16683],[37.03202,-1.20566],[37.04481,-1.24778],[37.04913,-1.2916],[37.04481,-1.33541],[37.03203,-1.37754],[37.01128,-1.41637],[36.98334,-1.4504],[36.9493,-1.47833],[36.91046,-1.49909],[36.86832,-1.51187],[36.82449,-1.51618],[36.78066,-1.51187],[36.73852,-1.49909],[36.69968,-1.47833],[36.66564,-1.4504],[36.6377,-1.41637],[36.61695,-1.37754],[36.60417,-1.33541],[36.59986,-1.2916],[36.60418,-1.24778],[36.61696,-1.20566],[36.63772,-1.16683],[36.66566,-1.1328],[36.6997,-1.10487],[36.73853,-1.08412],[36.78067,-1.07134],[36.82449,-1.06703]]]}},"University-of-Nairobi":{type:"Feature",id:"University-of-Nairobi",properties:{},geometry:{type:"Polygon",coordinates:[[[36.82617,-1.09366],[36.86999,-1.09798],[36.91213,-1.11076],[36.95097,-1.13151],[36.98501,-1.15944],[37.01294,-1.19347],[37.0337,-1.23229],[37.04649,-1.27442],[37.05081,-1.31823],[37.0465,-1.36205],[37.03372,-1.40418],[37.01296,-1.44301],[36.98503,-1.47704],[36.95098,-1.50497],[36.91214,-1.52573],[36.87,-1.53851],[36.82617,-1.54282],[36.78234,-1.53851],[36.7402,-1.52573],[36.70136,-1.50497],[36.66732,-1.47704],[36.63938,-1.44301],[36.61863,-1.40418],[36.60585,-1.36205],[36.60153,-1.31823],[36.60585,-1.27442],[36.61864,-1.23229],[36.6394,-1.19347],[36.66734,-1.15944],[36.70138,-1.13151],[36.74021,-1.11076],[36.78235,-1.09798],[36.82617,-1.09366]]]}},"African-Methodist-Episcopal-University":{type:"Feature",id:"African-Methodist-Episcopal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.80063,6.53533],[-10.75653,6.53101],[-10.71413,6.51823],[-10.67505,6.49747],[-10.64081,6.46953],[-10.61272,6.43549],[-10.59185,6.39665],[-10.579,6.35452],[-10.57468,6.3107],[-10.57904,6.26689],[-10.59192,6.22477],[-10.61281,6.18595],[-10.64091,6.15193],[-10.67514,6.12401],[-10.7142,6.10326],[-10.75657,6.09049],[-10.80063,6.08617],[-10.84469,6.09049],[-10.88706,6.10326],[-10.92612,6.12401],[-10.96035,6.15193],[-10.98845,6.18595],[-11.00934,6.22477],[-11.02222,6.26689],[-11.02658,6.3107],[-11.02226,6.35452],[-11.00941,6.39665],[-10.98854,6.43549],[-10.96045,6.46953],[-10.92621,6.49747],[-10.88713,6.51823],[-10.84473,6.53101],[-10.80063,6.53533]]]}},"Cuttington-University":{type:"Feature",id:"Cuttington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-9.5539,7.26498],[-9.50973,7.26066],[-9.46727,7.24788],[-9.42813,7.22711],[-9.39384,7.19917],[-9.3657,7.16513],[-9.3448,7.1263],[-9.33194,7.08416],[-9.32762,7.04035],[-9.33198,6.99653],[-9.34488,6.95441],[-9.3658,6.91559],[-9.39395,6.88157],[-9.42823,6.85365],[-9.46734,6.83291],[-9.50977,6.82013],[-9.5539,6.81582],[-9.59803,6.82013],[-9.64046,6.83291],[-9.67957,6.85365],[-9.71385,6.88157],[-9.742,6.91559],[-9.76292,6.95441],[-9.77582,6.99653],[-9.78018,7.04035],[-9.77586,7.08416],[-9.763,7.1263],[-9.7421,7.16513],[-9.71396,7.19917],[-9.67967,7.22711],[-9.64053,7.24788],[-9.59807,7.26066],[-9.5539,7.26498]]]}},"Grand-Gedeh-County-Community-College":{type:"Feature",id:"Grand-Gedeh-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.11817,6.28853],[-8.07409,6.28421],[-8.03171,6.27143],[-7.99266,6.25066],[-7.95843,6.22273],[-7.93035,6.18869],[-7.90949,6.14985],[-7.89665,6.10772],[-7.89233,6.0639],[-7.89669,6.02009],[-7.90955,5.97797],[-7.93043,5.93915],[-7.95852,5.90512],[-7.99274,5.8772],[-8.03178,5.85646],[-8.07413,5.84368],[-8.11817,5.83937],[-8.16221,5.84368],[-8.20456,5.85646],[-8.2436,5.8772],[-8.27782,5.90512],[-8.30591,5.93915],[-8.32679,5.97797],[-8.33966,6.02009],[-8.34401,6.0639],[-8.33969,6.10772],[-8.32686,6.14985],[-8.306,6.18869],[-8.27791,6.22273],[-8.24369,6.25066],[-8.20463,6.27143],[-8.16225,6.28421],[-8.11817,6.28853]]]}},"Nimba-County-Community-College":{type:"Feature",id:"Nimba-County-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-8.71645,7.57669],[-8.67226,7.57237],[-8.62976,7.55959],[-8.5906,7.53882],[-8.55628,7.51088],[-8.52812,7.47684],[-8.50721,7.438],[-8.49434,7.39587],[-8.49001,7.35205],[-8.49439,7.30824],[-8.50729,7.26612],[-8.52823,7.2273],[-8.55639,7.19328],[-8.5907,7.16536],[-8.62984,7.14462],[-8.6723,7.13185],[-8.71645,7.12753],[-8.76061,7.13185],[-8.80307,7.14462],[-8.84221,7.16536],[-8.87652,7.19328],[-8.90468,7.2273],[-8.92562,7.26612],[-8.93852,7.30824],[-8.9429,7.35205],[-8.93857,7.39587],[-8.9257,7.438],[-8.90479,7.47684],[-8.87663,7.51088],[-8.84231,7.53882],[-8.80315,7.55959],[-8.76065,7.57237],[-8.71645,7.57669]]]}},"Stella-Maris-Polytechnic":{type:"Feature",id:"Stella-Maris-Polytechnic",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.7944,6.51458],[-10.7503,6.51026],[-10.7079,6.49748],[-10.66883,6.47672],[-10.63459,6.44878],[-10.60649,6.41474],[-10.58562,6.3759],[-10.57278,6.33377],[-10.56846,6.28995],[-10.57282,6.24614],[-10.58569,6.20402],[-10.60658,6.1652],[-10.63469,6.13117],[-10.66892,6.10325],[-10.70797,6.08251],[-10.75034,6.06973],[-10.7944,6.06542],[-10.83846,6.06973],[-10.88083,6.08251],[-10.91988,6.10325],[-10.95411,6.13117],[-10.98222,6.1652],[-11.00311,6.20402],[-11.01598,6.24614],[-11.02034,6.28995],[-11.01602,6.33377],[-11.00318,6.3759],[-10.98231,6.41474],[-10.95421,6.44878],[-10.91997,6.47672],[-10.8809,6.49748],[-10.8385,6.51026],[-10.7944,6.51458]]]}},"University-of-Liberia-YouthMappers":{type:"Feature",id:"University-of-Liberia-YouthMappers",properties:{},geometry:{type:"Polygon",coordinates:[[[-10.61986,6.60165],[-10.57576,6.59733],[-10.53335,6.58454],[-10.49427,6.56378],[-10.46002,6.53584],[-10.43192,6.5018],[-10.41105,6.46297],[-10.39821,6.42083],[-10.39389,6.37702],[-10.39825,6.33321],[-10.41112,6.29108],[-10.43202,6.25226],[-10.46012,6.21824],[-10.49436,6.19032],[-10.53342,6.16958],[-10.5758,6.1568],[-10.61986,6.15249],[-10.66393,6.1568],[-10.70631,6.16958],[-10.74536,6.19032],[-10.7796,6.21824],[-10.80771,6.25226],[-10.8286,6.29108],[-10.84148,6.33321],[-10.84584,6.37702],[-10.84152,6.42083],[-10.82867,6.46297],[-10.8078,6.5018],[-10.7797,6.53584],[-10.74546,6.56378],[-10.70638,6.58454],[-10.66397,6.59733],[-10.61986,6.60165]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},"University-of-Malawi":{type:"Feature",id:"University-of-Malawi",properties:{},geometry:{type:"Polygon",coordinates:[[[35.33203,-15.14437],[35.37742,-15.14868],[35.42107,-15.16145],[35.46131,-15.18218],[35.4966,-15.21009],[35.52557,-15.2441],[35.54712,-15.2829],[35.56042,-15.32502],[35.56494,-15.36883],[35.56051,-15.41265],[35.5473,-15.45479],[35.5258,-15.49364],[35.49685,-15.52769],[35.46154,-15.55564],[35.42125,-15.57642],[35.37752,-15.58921],[35.33203,-15.59353],[35.28654,-15.58921],[35.24281,-15.57642],[35.20252,-15.55564],[35.16721,-15.52769],[35.13826,-15.49364],[35.11676,-15.45479],[35.10355,-15.41265],[35.09912,-15.36883],[35.10365,-15.32502],[35.11694,-15.2829],[35.13849,-15.2441],[35.16747,-15.21009],[35.20275,-15.18218],[35.24299,-15.16145],[35.28664,-15.14868],[35.33203,-15.14437]]]}},"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"Feature",id:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",properties:{},geometry:{type:"Polygon",coordinates:[[[-7.98832,12.83993],[-7.94339,12.83562],[-7.90018,12.82283],[-7.86037,12.80206],[-7.82549,12.77411],[-7.79688,12.74006],[-7.77564,12.70121],[-7.76257,12.65907],[-7.75819,12.61526],[-7.76265,12.57145],[-7.77578,12.52933],[-7.79707,12.49052],[-7.82569,12.45651],[-7.86056,12.4286],[-7.90033,12.40786],[-7.94347,12.39509],[-7.98832,12.39078],[-8.03318,12.39509],[-8.07632,12.40786],[-8.11609,12.4286],[-8.15095,12.45651],[-8.17958,12.49052],[-8.20087,12.52933],[-8.214,12.57145],[-8.21846,12.61526],[-8.21408,12.65907],[-8.20101,12.70121],[-8.17977,12.74006],[-8.15116,12.77411],[-8.11627,12.80206],[-8.07646,12.82283],[-8.03326,12.83562],[-7.98832,12.83993]]]}},"Universidade-Eduardo-Mondlane":{type:"Feature",id:"Universidade-Eduardo-Mondlane",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60357,-25.72761],[32.65221,-25.73192],[32.69898,-25.74467],[32.74211,-25.76539],[32.77994,-25.79328],[32.81102,-25.82727],[32.83416,-25.86606],[32.84845,-25.90817],[32.85334,-25.95197],[32.84863,-25.99579],[32.83449,-26.03795],[32.81146,-26.07681],[32.78042,-26.11088],[32.74255,-26.13885],[32.69932,-26.15964],[32.65239,-26.17244],[32.60357,-26.17677],[32.55475,-26.17244],[32.50782,-26.15964],[32.46459,-26.13885],[32.42672,-26.11088],[32.39568,-26.07681],[32.37265,-26.03795],[32.35851,-25.99579],[32.35381,-25.95197],[32.3587,-25.90817],[32.37299,-25.86606],[32.39612,-25.82727],[32.4272,-25.79328],[32.46503,-25.76539],[32.50816,-25.74467],[32.55493,-25.73192],[32.60357,-25.72761]]]}},"Namibia-University-of-Science-and-Technology":{type:"Feature",id:"Namibia-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[17.07709,-22.34124],[17.12446,-22.34555],[17.17002,-22.35831],[17.21202,-22.37903],[17.24886,-22.40692],[17.27912,-22.44092],[17.30164,-22.47972],[17.31554,-22.52183],[17.32029,-22.56563],[17.31569,-22.60945],[17.30192,-22.6516],[17.27949,-22.69046],[17.24926,-22.72453],[17.21239,-22.75249],[17.1703,-22.77327],[17.12461,-22.78607],[17.07709,-22.79039],[17.02957,-22.78607],[16.98388,-22.77327],[16.94179,-22.75249],[16.90493,-22.72453],[16.8747,-22.69046],[16.85226,-22.6516],[16.83849,-22.60945],[16.83389,-22.56563],[16.83864,-22.52183],[16.85255,-22.47972],[16.87506,-22.44092],[16.90532,-22.40692],[16.94216,-22.37903],[16.98416,-22.35831],[17.02972,-22.34555],[17.07709,-22.34124]]]}},"Abia-State-University":{type:"Feature",id:"Abia-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.41909,6.0554],[7.46315,6.05108],[7.50551,6.0383],[7.54455,6.01753],[7.57877,5.9896],[7.60684,5.95556],[7.62769,5.91672],[7.64052,5.87459],[7.64484,5.83077],[7.64048,5.78696],[7.62762,5.74484],[7.60675,5.70602],[7.57868,5.67199],[7.54447,5.64407],[7.50545,5.62333],[7.46312,5.61055],[7.41909,5.60624],[7.37507,5.61055],[7.33274,5.62333],[7.29372,5.64407],[7.25951,5.67199],[7.23143,5.70602],[7.21056,5.74484],[7.1977,5.78696],[7.19335,5.83077],[7.19767,5.87459],[7.2105,5.91672],[7.23135,5.95556],[7.25942,5.9896],[7.29363,6.01753],[7.33267,6.0383],[7.37503,6.05108],[7.41909,6.0554]]]}},"Ahmadu-Bello-University":{type:"Feature",id:"Ahmadu-Bello-University",properties:{},geometry:{type:"Polygon",coordinates:[[[7.64648,11.40298],[7.69118,11.39866],[7.73415,11.38587],[7.77375,11.36511],[7.80845,11.33716],[7.83691,11.30311],[7.85804,11.26427],[7.87104,11.22213],[7.87541,11.17831],[7.87097,11.13451],[7.85792,11.09239],[7.83674,11.05357],[7.80827,11.01956],[7.77359,10.99164],[7.73403,10.97091],[7.69111,10.95813],[7.64648,10.95382],[7.60186,10.95813],[7.55894,10.97091],[7.51938,10.99164],[7.4847,11.01956],[7.45622,11.05357],[7.43505,11.09239],[7.422,11.13451],[7.41756,11.17831],[7.42193,11.22213],[7.43493,11.26427],[7.45606,11.30311],[7.48452,11.33716],[7.51922,11.36511],[7.55882,11.38587],[7.60179,11.39866],[7.64648,11.40298]]]}},"Federal-School-of-Surveys":{type:"Feature",id:"Federal-School-of-Surveys",properties:{},geometry:{type:"Polygon",coordinates:[[[3.95129,8.06678],[3.99554,8.06247],[4.03808,8.04968],[4.07729,8.02892],[4.11165,8.00098],[4.13984,7.96693],[4.16077,7.9281],[4.17365,7.88596],[4.17798,7.84215],[4.17361,7.79833],[4.16069,7.75621],[4.13972,7.7174],[4.11153,7.68337],[4.07718,7.65546],[4.038,7.63471],[3.99549,7.62194],[3.95129,7.61763],[3.90708,7.62194],[3.86457,7.63471],[3.82539,7.65546],[3.79105,7.68337],[3.76285,7.7174],[3.74189,7.75621],[3.72897,7.79833],[3.72459,7.84215],[3.72892,7.88596],[3.7418,7.9281],[3.76274,7.96693],[3.79092,8.00098],[3.82528,8.02892],[3.86449,8.04968],[3.90704,8.06247],[3.95129,8.06678]]]}},"Federal-University-of-Technology-Akure":{type:"Feature",id:"Federal-University-of-Technology-Akure",properties:{},geometry:{type:"Polygon",coordinates:[[[5.18555,7.49987],[5.22974,7.49555],[5.27223,7.48277],[5.31138,7.46201],[5.34569,7.43407],[5.37385,7.40002],[5.39475,7.36119],[5.40762,7.31905],[5.41195,7.27524],[5.40758,7.23143],[5.39467,7.1893],[5.37374,7.15048],[5.34558,7.11646],[5.31128,7.08854],[5.27215,7.0678],[5.22969,7.05503],[5.18555,7.05071],[5.1414,7.05503],[5.09895,7.0678],[5.05982,7.08854],[5.02551,7.11646],[4.99735,7.15048],[4.97642,7.1893],[4.96352,7.23143],[4.95915,7.27524],[4.96347,7.31905],[4.97634,7.36119],[4.99725,7.40002],[5.0254,7.43407],[5.05971,7.46201],[5.09887,7.48277],[5.14136,7.49555],[5.18555,7.49987]]]}},"Ignatius-Ajuru-University-of-Education":{type:"Feature",id:"Ignatius-Ajuru-University-of-Education",properties:{},geometry:{type:"Polygon",coordinates:[[[6.93364,5.03111],[6.97762,5.02679],[7.01991,5.01401],[7.05888,4.99325],[7.09304,4.96531],[7.12106,4.93127],[7.14188,4.89244],[7.15469,4.85031],[7.15901,4.80649],[7.15466,4.76268],[7.14183,4.72056],[7.12099,4.68174],[7.09296,4.64771],[7.05881,4.61979],[7.01986,4.59904],[6.97759,4.58627],[6.93364,4.58195],[6.88968,4.58627],[6.84742,4.59904],[6.80846,4.61979],[6.77431,4.64771],[6.74628,4.68174],[6.72545,4.72056],[6.71261,4.76268],[6.70826,4.80649],[6.71258,4.85031],[6.72539,4.89244],[6.74621,4.93127],[6.77424,4.96531],[6.80839,4.99325],[6.84736,5.01401],[6.88965,5.02679],[6.93364,5.03111]]]}},"University-of-Nigeria-Nsukka":{type:"Feature",id:"University-of-Nigeria-Nsukka",properties:{},geometry:{type:"Polygon",coordinates:[[[7.40821,7.08921],[7.45236,7.0849],[7.49481,7.07211],[7.53393,7.05135],[7.56821,7.02341],[7.59634,6.98937],[7.61723,6.95053],[7.63008,6.9084],[7.63441,6.86458],[7.63004,6.82077],[7.61715,6.77865],[7.59624,6.73983],[7.5681,6.70581],[7.53383,6.67789],[7.49473,6.65714],[7.45232,6.64437],[7.40821,6.64006],[7.3641,6.64437],[7.32168,6.65714],[7.28259,6.67789],[7.24831,6.70581],[7.22018,6.73983],[7.19926,6.77865],[7.18637,6.82077],[7.18201,6.86458],[7.18633,6.9084],[7.19919,6.95053],[7.22008,6.98937],[7.24821,7.02341],[7.28249,7.05135],[7.32161,7.07211],[7.36406,7.0849],[7.40821,7.08921]]]}},"University-of-Port-Harcourt":{type:"Feature",id:"University-of-Port-Harcourt",properties:{},geometry:{type:"Polygon",coordinates:[[[6.92037,5.12633],[6.96436,5.12201],[7.00665,5.10923],[7.04563,5.08847],[7.07979,5.06053],[7.10782,5.02649],[7.12864,4.98766],[7.14145,4.94553],[7.14577,4.90171],[7.14142,4.8579],[7.12859,4.81578],[7.10775,4.77696],[7.07971,4.74293],[7.04556,4.71501],[7.0066,4.69426],[6.96433,4.68149],[6.92037,4.67717],[6.87641,4.68149],[6.83414,4.69426],[6.79517,4.71501],[6.76102,4.74293],[6.73299,4.77696],[6.71215,4.81578],[6.69931,4.8579],[6.69496,4.90171],[6.69928,4.94553],[6.71209,4.98766],[6.73292,5.02649],[6.76094,5.06053],[6.7951,5.08847],[6.83408,5.10923],[6.87638,5.12201],[6.92037,5.12633]]]}},"University-of-Nigeria-Enugu-Campus":{type:"Feature",id:"University-of-Nigeria-Enugu-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[7.50373,6.651],[7.54784,6.64668],[7.59025,6.63389],[7.62934,6.61313],[7.66359,6.58519],[7.69169,6.55115],[7.71256,6.51232],[7.72541,6.47018],[7.72973,6.42637],[7.72537,6.38256],[7.71249,6.34043],[7.6916,6.30161],[7.66349,6.26759],[7.62924,6.23967],[7.59018,6.21893],[7.5478,6.20615],[7.50373,6.20184],[7.45966,6.20615],[7.41728,6.21893],[7.37822,6.23967],[7.34398,6.26759],[7.31587,6.30161],[7.29497,6.34043],[7.28209,6.38256],[7.27773,6.42637],[7.28206,6.47018],[7.2949,6.51232],[7.31577,6.55115],[7.34388,6.58519],[7.37813,6.61313],[7.41721,6.63389],[7.45962,6.64668],[7.50373,6.651]]]}},"Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"Feature",id:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",properties:{},geometry:{type:"Polygon",coordinates:[[[29.6112,-1.27634],[29.65502,-1.28065],[29.69717,-1.29343],[29.736,-1.31418],[29.77005,-1.34211],[29.79799,-1.37614],[29.81875,-1.41496],[29.83154,-1.45709],[29.83586,-1.5009],[29.83154,-1.54472],[29.81876,-1.58685],[29.79801,-1.62568],[29.77007,-1.65971],[29.73602,-1.68764],[29.69718,-1.7084],[29.65503,-1.72118],[29.6112,-1.72549],[29.56737,-1.72118],[29.52522,-1.7084],[29.48638,-1.68764],[29.45233,-1.65971],[29.4244,-1.62568],[29.40364,-1.58685],[29.39086,-1.54472],[29.38655,-1.5009],[29.39087,-1.45709],[29.40365,-1.41496],[29.42442,-1.37614],[29.45236,-1.34211],[29.4864,-1.31418],[29.52524,-1.29343],[29.56738,-1.28065],[29.6112,-1.27634]]]}},"University-of-Rwanda-Huye-Campus":{type:"Feature",id:"University-of-Rwanda-Huye-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[29.7397,-2.39052],[29.78355,-2.39484],[29.82572,-2.40761],[29.86458,-2.42836],[29.89865,-2.45629],[29.92661,-2.49032],[29.94739,-2.52914],[29.96019,-2.57127],[29.96451,-2.61508],[29.9602,-2.65889],[29.94741,-2.70103],[29.92664,-2.73986],[29.89869,-2.77389],[29.86462,-2.80182],[29.82575,-2.82258],[29.78357,-2.83536],[29.7397,-2.83968],[29.69583,-2.83536],[29.65365,-2.82258],[29.61478,-2.80182],[29.58071,-2.77389],[29.55276,-2.73986],[29.53199,-2.70103],[29.5192,-2.65889],[29.51489,-2.61508],[29.51921,-2.57127],[29.53201,-2.52914],[29.55279,-2.49032],[29.58075,-2.45629],[29.61482,-2.42836],[29.65368,-2.40761],[29.69585,-2.39484],[29.7397,-2.39052]]]}},"Institut-Suprieur-de-Management-Kolda":{type:"Feature",id:"Institut-Suprieur-de-Management-Kolda",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.94108,13.11445],[-14.8961,13.11013],[-14.85285,13.09734],[-14.81299,13.07657],[-14.77807,13.04862],[-14.74943,13.01457],[-14.72816,12.97573],[-14.71509,12.93359],[-14.7107,12.88977],[-14.71517,12.84596],[-14.72831,12.80384],[-14.74962,12.76503],[-14.77828,12.73102],[-14.81319,12.70311],[-14.85299,12.68237],[-14.89618,12.66961],[-14.94108,12.66529],[-14.98599,12.66961],[-15.02918,12.68237],[-15.06898,12.70311],[-15.10389,12.73102],[-15.13255,12.76503],[-15.15386,12.80384],[-15.167,12.84596],[-15.17147,12.88977],[-15.16708,12.93359],[-15.15401,12.97573],[-15.13274,13.01457],[-15.1041,13.04862],[-15.06918,13.07657],[-15.02932,13.09734],[-14.98607,13.11013],[-14.94108,13.11445]]]}},"Universit-Gaston-Berger":{type:"Feature",id:"Universit-Gaston-Berger",properties:{},geometry:{type:"Polygon",coordinates:[[[-16.42556,16.28748],[-16.37992,16.28316],[-16.33604,16.27037],[-16.2956,16.2496],[-16.26018,16.22164],[-16.23112,16.18759],[-16.20956,16.14874],[-16.1963,16.1066],[-16.19186,16.06278],[-16.1964,16.01897],[-16.20974,15.97685],[-16.23137,15.93805],[-16.26044,15.90404],[-16.29585,15.87614],[-16.33622,15.8554],[-16.38002,15.84264],[-16.42556,15.83833],[-16.47111,15.84264],[-16.51491,15.8554],[-16.55528,15.87614],[-16.59069,15.90404],[-16.61976,15.93805],[-16.64138,15.97685],[-16.65473,16.01897],[-16.65927,16.06278],[-16.65483,16.1066],[-16.64157,16.14874],[-16.62,16.18759],[-16.59095,16.22164],[-16.55552,16.2496],[-16.51509,16.27037],[-16.47121,16.28316],[-16.42556,16.28748]]]}},"Fourah-Bay-College":{type:"Feature",id:"Fourah-Bay-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.18359,8.71868],[-13.13927,8.71437],[-13.09665,8.70158],[-13.05738,8.68081],[-13.02296,8.65287],[-12.99473,8.61883],[-12.97376,8.57999],[-12.96086,8.53785],[-12.95652,8.49404],[-12.96091,8.45023],[-12.97386,8.40811],[-12.99485,8.36929],[-13.0231,8.33527],[-13.0575,8.30735],[-13.09674,8.28661],[-13.13932,8.27384],[-13.18359,8.26953],[-13.22787,8.27384],[-13.27044,8.28661],[-13.30969,8.30735],[-13.34409,8.33527],[-13.37233,8.36929],[-13.39333,8.40811],[-13.40627,8.45023],[-13.41066,8.49404],[-13.40633,8.53785],[-13.39343,8.57999],[-13.37246,8.61883],[-13.34422,8.65287],[-13.30981,8.68081],[-13.27054,8.70158],[-13.22792,8.71437],[-13.18359,8.71868]]]}},"Njala-University-Freetown-Campus":{type:"Feature",id:"Njala-University-Freetown-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-13.23673,8.7042],[-13.19241,8.69988],[-13.14979,8.68709],[-13.11052,8.66633],[-13.07611,8.63839],[-13.04787,8.60434],[-13.02691,8.5655],[-13.01401,8.52337],[-13.00967,8.47955],[-13.01406,8.43574],[-13.027,8.39362],[-13.048,8.3548],[-13.07624,8.32078],[-13.11064,8.29287],[-13.14988,8.27212],[-13.19246,8.25935],[-13.23673,8.25504],[-13.281,8.25935],[-13.32358,8.27212],[-13.36282,8.29287],[-13.39722,8.32078],[-13.42546,8.3548],[-13.44646,8.39362],[-13.4594,8.43574],[-13.46379,8.47955],[-13.45945,8.52337],[-13.44655,8.5655],[-13.42559,8.60434],[-13.39735,8.63839],[-13.36294,8.66633],[-13.32367,8.68709],[-13.28105,8.69988],[-13.23673,8.7042]]]}},"Njala-University-Njala-Campus":{type:"Feature",id:"Njala-University-Njala-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-11.76548,8.16057],[-11.72122,8.15625],[-11.67867,8.14347],[-11.63945,8.1227],[-11.60508,8.09476],[-11.57689,8.06072],[-11.55595,8.02188],[-11.54307,7.97975],[-11.53873,7.93593],[-11.54311,7.89212],[-11.55604,7.85],[-11.577,7.81118],[-11.60521,7.77716],[-11.63956,7.74924],[-11.67875,7.7285],[-11.72127,7.71573],[-11.76548,7.71141],[-11.8097,7.71573],[-11.85221,7.7285],[-11.8914,7.74924],[-11.92576,7.77716],[-11.95396,7.81118],[-11.97493,7.85],[-11.98785,7.89212],[-11.99223,7.93593],[-11.9879,7.97975],[-11.97502,8.02188],[-11.95408,8.06072],[-11.92588,8.09476],[-11.89152,8.1227],[-11.8523,8.14347],[-11.80974,8.15625],[-11.76548,8.16057]]]}},"University-of-Pretoria":{type:"Feature",id:"University-of-Pretoria",properties:{},geometry:{type:"Polygon",coordinates:[[[28.21289,-25.49616],[28.26143,-25.50046],[28.30812,-25.51322],[28.35116,-25.53394],[28.38892,-25.56183],[28.41994,-25.59582],[28.44303,-25.63461],[28.45729,-25.67672],[28.46217,-25.72052],[28.45747,-25.76434],[28.44336,-25.8065],[28.42037,-25.84536],[28.38939,-25.87943],[28.3516,-25.9074],[28.30845,-25.92819],[28.26161,-25.94099],[28.21289,-25.94531],[28.16417,-25.94099],[28.11733,-25.92819],[28.07418,-25.9074],[28.03639,-25.87943],[28.00541,-25.84536],[27.98242,-25.8065],[27.96831,-25.76434],[27.96361,-25.72052],[27.96849,-25.67672],[27.98275,-25.63461],[28.00584,-25.59582],[28.03686,-25.56183],[28.07462,-25.53394],[28.11766,-25.51322],[28.16435,-25.50046],[28.21289,-25.49616]]]}},"Ardhi-University":{type:"Feature",id:"Ardhi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[39.21541,-6.54158],[39.25951,-6.54589],[39.30192,-6.55867],[39.34101,-6.57941],[39.37527,-6.60733],[39.4034,-6.64135],[39.42431,-6.68017],[39.4372,-6.72229],[39.44156,-6.7661],[39.43724,-6.80992],[39.42439,-6.85205],[39.4035,-6.89089],[39.37538,-6.92493],[39.3411,-6.95287],[39.30199,-6.97363],[39.25955,-6.98642],[39.21541,-6.99074],[39.17127,-6.98642],[39.12883,-6.97363],[39.08972,-6.95287],[39.05544,-6.92493],[39.02732,-6.89089],[39.00643,-6.85205],[38.99358,-6.80992],[38.98926,-6.7661],[38.99362,-6.72229],[39.00651,-6.68017],[39.02742,-6.64135],[39.05555,-6.60733],[39.08981,-6.57941],[39.1289,-6.55867],[39.17131,-6.54589],[39.21541,-6.54158]]]}},"Institute-of-Finance-Management":{type:"Feature",id:"Institute-of-Finance-Management",properties:{},geometry:{type:"Polygon",coordinates:[[[39.2935,-5.91323],[39.33755,-5.91754],[39.3799,-5.93032],[39.41894,-5.95107],[39.45317,-5.97899],[39.48126,-6.01301],[39.50215,-6.05183],[39.51501,-6.09395],[39.51937,-6.13776],[39.51505,-6.18158],[39.50221,-6.22371],[39.48135,-6.26255],[39.45326,-6.29659],[39.41903,-6.32453],[39.37997,-6.34529],[39.33758,-6.35807],[39.2935,-6.36239],[39.24941,-6.35807],[39.20703,-6.34529],[39.16797,-6.32453],[39.13373,-6.29659],[39.10565,-6.26255],[39.08479,-6.22371],[39.07195,-6.18158],[39.06763,-6.13776],[39.07198,-6.09395],[39.08485,-6.05183],[39.10574,-6.01301],[39.13383,-5.97899],[39.16805,-5.95107],[39.20709,-5.93032],[39.24945,-5.91754],[39.2935,-5.91323]]]}},"Institute-of-Rural-Development-Planning-Mwanza":{type:"Feature",id:"Institute-of-Rural-Development-Planning-Mwanza",properties:{},geometry:{type:"Polygon",coordinates:[[[32.89851,-2.29201],[32.94236,-2.29632],[32.98452,-2.3091],[33.02338,-2.32985],[33.05745,-2.35778],[33.08541,-2.3918],[33.10618,-2.43063],[33.11898,-2.47275],[33.12331,-2.51657],[33.119,-2.56038],[33.10621,-2.60251],[33.08544,-2.64134],[33.05749,-2.67538],[33.02342,-2.70331],[32.98455,-2.72407],[32.94238,-2.73685],[32.89851,-2.74116],[32.85465,-2.73685],[32.81247,-2.72407],[32.7736,-2.70331],[32.73954,-2.67538],[32.71158,-2.64134],[32.69081,-2.60251],[32.67803,-2.56038],[32.67372,-2.51657],[32.67804,-2.47275],[32.69084,-2.43063],[32.71162,-2.3918],[32.73958,-2.35778],[32.77364,-2.32985],[32.8125,-2.3091],[32.85466,-2.29632],[32.89851,-2.29201]]]}},"Institute-of-Rural-Development-Planning":{type:"Feature",id:"Institute-of-Rural-Development-Planning",properties:{},geometry:{type:"Polygon",coordinates:[[[35.74578,-5.89759],[35.78983,-5.9019],[35.83218,-5.91468],[35.87122,-5.93543],[35.90545,-5.96335],[35.93354,-5.99737],[35.95442,-6.03619],[35.96729,-6.07831],[35.97165,-6.12212],[35.96733,-6.16594],[35.95449,-6.20807],[35.93363,-6.24691],[35.90554,-6.28095],[35.87131,-6.30889],[35.83225,-6.32965],[35.78986,-6.34243],[35.74578,-6.34675],[35.7017,-6.34243],[35.65931,-6.32965],[35.62025,-6.30889],[35.58602,-6.28095],[35.55794,-6.24691],[35.53707,-6.20807],[35.52424,-6.16594],[35.51992,-6.12212],[35.52427,-6.07831],[35.53714,-6.03619],[35.55802,-5.99737],[35.58612,-5.96335],[35.62034,-5.93543],[35.65938,-5.91468],[35.70174,-5.9019],[35.74578,-5.89759]]]}},"Open-University-of-Tanzania":{type:"Feature",id:"Open-University-of-Tanzania",properties:{},geometry:{type:"Polygon",coordinates:[[[39.26466,-6.55895],[39.30876,-6.56326],[39.35117,-6.57603],[39.39026,-6.59678],[39.42453,-6.6247],[39.45266,-6.65872],[39.47357,-6.69754],[39.48646,-6.73966],[39.49082,-6.78347],[39.4865,-6.82729],[39.47364,-6.86942],[39.45275,-6.90826],[39.42463,-6.9423],[39.39036,-6.97024],[39.35125,-6.991],[39.3088,-7.00379],[39.26466,-7.0081],[39.22052,-7.00379],[39.17807,-6.991],[39.13896,-6.97024],[39.10469,-6.9423],[39.07656,-6.90826],[39.05568,-6.86942],[39.04282,-6.82729],[39.0385,-6.78347],[39.04286,-6.73966],[39.05575,-6.69754],[39.07666,-6.65872],[39.10479,-6.6247],[39.13906,-6.59678],[39.17815,-6.57603],[39.22056,-6.56326],[39.26466,-6.55895]]]}},"Sokoine-University-of-Agriculture":{type:"Feature",id:"Sokoine-University-of-Agriculture",properties:{},geometry:{type:"Polygon",coordinates:[[[37.65636,-6.62796],[37.70047,-6.63227],[37.74288,-6.64505],[37.78198,-6.66579],[37.81625,-6.69371],[37.84439,-6.72773],[37.8653,-6.76655],[37.87819,-6.80868],[37.88255,-6.85249],[37.87823,-6.8963],[37.86537,-6.93844],[37.84448,-6.97727],[37.81636,-7.01131],[37.78208,-7.03925],[37.74296,-7.06002],[37.70051,-7.0728],[37.65636,-7.07712],[37.61221,-7.0728],[37.56976,-7.06002],[37.53064,-7.03925],[37.49636,-7.01131],[37.46824,-6.97727],[37.44735,-6.93844],[37.43449,-6.8963],[37.43017,-6.85249],[37.43453,-6.80868],[37.44742,-6.76655],[37.46833,-6.72773],[37.49647,-6.69371],[37.53074,-6.66579],[37.56984,-6.64505],[37.61225,-6.63227],[37.65636,-6.62796]]]}},"University-of-Dar-es-Salaam":{type:"Feature",id:"University-of-Dar-es-Salaam",properties:{},geometry:{type:"Polygon",coordinates:[[[39.20531,-6.55579],[39.24941,-6.56011],[39.29182,-6.57288],[39.33091,-6.59363],[39.36518,-6.62155],[39.39331,-6.65557],[39.41422,-6.69439],[39.42711,-6.73651],[39.43147,-6.78032],[39.42715,-6.82414],[39.41429,-6.86627],[39.39341,-6.90511],[39.36528,-6.93915],[39.33101,-6.96709],[39.2919,-6.98785],[39.24945,-7.00063],[39.20531,-7.00495],[39.16117,-7.00063],[39.11873,-6.98785],[39.07961,-6.96709],[39.04534,-6.93915],[39.01722,-6.90511],[38.99633,-6.86627],[38.98348,-6.82414],[38.97915,-6.78032],[38.98352,-6.73651],[38.9964,-6.69439],[39.01731,-6.65557],[39.04544,-6.62155],[39.07971,-6.59363],[39.1188,-6.57288],[39.16121,-6.56011],[39.20531,-6.55579]]]}},"Busitema-University":{type:"Feature",id:"Busitema-University",properties:{},geometry:{type:"Polygon",coordinates:[[[34.01367,0.75192],[34.05749,0.7476],[34.09962,0.73482],[34.13845,0.71407],[34.17248,0.68614],[34.20041,0.6521],[34.22117,0.61328],[34.23395,0.57115],[34.23826,0.52733],[34.23394,0.48352],[34.22116,0.44139],[34.20041,0.40256],[34.17248,0.36853],[34.13844,0.3406],[34.09962,0.31985],[34.05749,0.30707],[34.01367,0.30276],[33.96986,0.30707],[33.92773,0.31985],[33.8889,0.3406],[33.85487,0.36853],[33.82694,0.40256],[33.80618,0.44139],[33.7934,0.48352],[33.78908,0.52733],[33.7934,0.57115],[33.80618,0.61328],[33.82693,0.6521],[33.85486,0.68614],[33.88889,0.71407],[33.92772,0.73482],[33.96986,0.7476],[34.01367,0.75192]]]}},"Gulu-University":{type:"Feature",id:"Gulu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.34375,3.03595],[32.38762,3.03163],[32.42981,3.01885],[32.46869,2.99809],[32.50276,2.97016],[32.53073,2.93613],[32.5515,2.8973],[32.56429,2.85516],[32.5686,2.81135],[32.56427,2.76754],[32.55147,2.72541],[32.53069,2.68659],[32.50272,2.65256],[32.46865,2.62463],[32.42978,2.60388],[32.38761,2.59111],[32.34375,2.58679],[32.29989,2.59111],[32.25772,2.60388],[32.21885,2.62463],[32.18478,2.65256],[32.15681,2.68659],[32.13603,2.72541],[32.12323,2.76754],[32.1189,2.81135],[32.12321,2.85516],[32.136,2.8973],[32.15677,2.93613],[32.18474,2.97016],[32.21881,2.99809],[32.25769,3.01885],[32.29988,3.03163],[32.34375,3.03595]]]}},"Kumi-University":{type:"Feature",id:"Kumi-University",properties:{},geometry:{type:"Polygon",coordinates:[[[33.83789,1.71855],[33.88172,1.71423],[33.92387,1.70145],[33.96271,1.6807],[33.99676,1.65277],[34.0247,1.61873],[34.04545,1.5799],[34.05823,1.53777],[34.06255,1.49396],[34.05822,1.45015],[34.04544,1.40802],[34.02467,1.36919],[33.99673,1.33516],[33.96269,1.30724],[33.92385,1.28649],[33.88171,1.27371],[33.83789,1.26939],[33.79407,1.27371],[33.75193,1.28649],[33.71309,1.30724],[33.67905,1.33516],[33.65111,1.36919],[33.63034,1.40802],[33.61756,1.45015],[33.61324,1.49396],[33.61755,1.53777],[33.63033,1.5799],[33.65109,1.61873],[33.67902,1.65277],[33.71307,1.6807],[33.75191,1.70145],[33.79406,1.71423],[33.83789,1.71855]]]}},"Makerere-University":{type:"Feature",id:"Makerere-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.60742,0.57614],[32.65124,0.57182],[32.69337,0.55904],[32.7322,0.53829],[32.76623,0.51036],[32.79416,0.47633],[32.81491,0.4375],[32.82769,0.39537],[32.832,0.35156],[32.82769,0.30774],[32.81491,0.26562],[32.79415,0.22679],[32.76622,0.19276],[32.73219,0.16483],[32.69336,0.14408],[32.65124,0.1313],[32.60742,0.12698],[32.56361,0.1313],[32.52148,0.14408],[32.48265,0.16483],[32.44862,0.19276],[32.42069,0.22679],[32.39994,0.26562],[32.38716,0.30774],[32.38284,0.35156],[32.38715,0.39537],[32.39993,0.4375],[32.42069,0.47633],[32.44861,0.51036],[32.48265,0.53829],[32.52148,0.55904],[32.56361,0.57182],[32.60742,0.57614]]]}},"Mbarara-University-of-Science-and-Technology":{type:"Feature",id:"Mbarara-University-of-Science-and-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[30.65679,-0.39187],[30.7006,-0.39618],[30.74273,-0.40896],[30.78156,-0.42971],[30.81559,-0.45764],[30.84353,-0.49167],[30.86428,-0.5305],[30.87706,-0.57263],[30.88138,-0.61644],[30.87707,-0.66025],[30.86429,-0.70238],[30.84353,-0.74121],[30.8156,-0.77524],[30.78157,-0.80317],[30.74274,-0.82393],[30.70061,-0.83671],[30.65679,-0.84102],[30.61297,-0.83671],[30.57084,-0.82393],[30.53201,-0.80317],[30.49797,-0.77524],[30.47004,-0.74121],[30.44929,-0.70238],[30.43651,-0.66025],[30.4322,-0.61644],[30.43651,-0.57263],[30.4493,-0.5305],[30.47005,-0.49167],[30.49798,-0.45764],[30.53202,-0.42971],[30.57084,-0.40896],[30.61297,-0.39618],[30.65679,-0.39187]]]}},"St.-Augustine-International-University":{type:"Feature",id:"St.-Augustine-International-University",properties:{},geometry:{type:"Polygon",coordinates:[[[32.62161,0.49696],[32.66543,0.49264],[32.70756,0.47986],[32.74639,0.45911],[32.78042,0.43118],[32.80835,0.39714],[32.8291,0.35832],[32.84188,0.31619],[32.8462,0.27237],[32.84188,0.22856],[32.8291,0.18643],[32.80834,0.14761],[32.78042,0.11357],[32.74638,0.08565],[32.70756,0.06489],[32.66543,0.05211],[32.62161,0.0478],[32.5778,0.05211],[32.53567,0.06489],[32.49684,0.08565],[32.46281,0.11357],[32.43488,0.14761],[32.41413,0.18643],[32.40135,0.22856],[32.39703,0.27237],[32.40135,0.31619],[32.41413,0.35832],[32.43488,0.39714],[32.46281,0.43118],[32.49684,0.45911],[32.53567,0.47986],[32.5778,0.49264],[32.62161,0.49696]]]}},"Uganda-Christian-University-Mbale-Campus":{type:"Feature",id:"Uganda-Christian-University-Mbale-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[34.17487,1.30046],[34.21869,1.29614],[34.26083,1.28336],[34.29967,1.26261],[34.3337,1.23468],[34.36164,1.20064],[34.38239,1.16182],[34.39517,1.11969],[34.39949,1.07587],[34.39517,1.03206],[34.38238,0.98993],[34.36162,0.95111],[34.33369,0.91707],[34.29965,0.88915],[34.26082,0.8684],[34.21868,0.85562],[34.17487,0.8513],[34.13105,0.85562],[34.08891,0.8684],[34.05008,0.88915],[34.01605,0.91707],[33.98811,0.95111],[33.96735,0.98993],[33.95457,1.03206],[33.95025,1.07587],[33.95456,1.11969],[33.96734,1.16182],[33.9881,1.20064],[34.01603,1.23468],[34.05007,1.26261],[34.0889,1.28336],[34.13104,1.29614],[34.17487,1.30046]]]}},"Uganda-Pentecostal-University":{type:"Feature",id:"Uganda-Pentecostal-University",properties:{},geometry:{type:"Polygon",coordinates:[[[30.26621,0.88664],[30.31003,0.88233],[30.35216,0.86955],[30.39099,0.84879],[30.42503,0.82086],[30.45296,0.78683],[30.47371,0.748],[30.48649,0.70587],[30.4908,0.66206],[30.48649,0.61825],[30.4737,0.57612],[30.45295,0.53729],[30.42502,0.50326],[30.39098,0.47533],[30.35215,0.45458],[30.31002,0.4418],[30.26621,0.43749],[30.22239,0.4418],[30.18026,0.45458],[30.14144,0.47533],[30.1074,0.50326],[30.07947,0.53729],[30.05871,0.57612],[30.04593,0.61825],[30.04162,0.66206],[30.04593,0.70587],[30.05871,0.748],[30.07946,0.78683],[30.10739,0.82086],[30.14143,0.84879],[30.18026,0.86955],[30.22239,0.88233],[30.26621,0.88664]]]}},"St.-Mawaggali-Trades-Training-Institute":{type:"Feature",id:"St.-Mawaggali-Trades-Training-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[26.9671,-16.59033],[27.01282,-16.59464],[27.05679,-16.60741],[27.09732,-16.62814],[27.13286,-16.65604],[27.16204,-16.69005],[27.18376,-16.72886],[27.19715,-16.77097],[27.20171,-16.81478],[27.19726,-16.8586],[27.18395,-16.90074],[27.1623,-16.93959],[27.13314,-16.97365],[27.09757,-17.0016],[27.05698,-17.02238],[27.01293,-17.03517],[26.9671,-17.03949],[26.92128,-17.03517],[26.87722,-17.02238],[26.83663,-17.0016],[26.80107,-16.97365],[26.7719,-16.93959],[26.75025,-16.90074],[26.73695,-16.8586],[26.73249,-16.81478],[26.73705,-16.77097],[26.75045,-16.72886],[26.77216,-16.69005],[26.80135,-16.65604],[26.83689,-16.62814],[26.87742,-16.60741],[26.92138,-16.59464],[26.9671,-16.59033]]]}},"The-University-of-Zambia":{type:"Feature",id:"The-University-of-Zambia",properties:{},geometry:{type:"Polygon",coordinates:[[[28.33027,-15.16737],[28.37567,-15.17168],[28.41932,-15.18445],[28.45957,-15.20518],[28.49485,-15.23309],[28.52383,-15.2671],[28.54538,-15.3059],[28.55868,-15.34802],[28.5632,-15.39183],[28.55878,-15.43565],[28.54556,-15.47779],[28.52406,-15.51664],[28.49511,-15.55069],[28.4598,-15.57864],[28.4195,-15.59942],[28.37576,-15.61221],[28.33027,-15.61653],[28.28478,-15.61221],[28.24104,-15.59942],[28.20074,-15.57864],[28.16544,-15.55069],[28.13648,-15.51664],[28.11498,-15.47779],[28.10177,-15.43565],[28.09734,-15.39183],[28.10186,-15.34802],[28.11516,-15.3059],[28.13671,-15.2671],[28.16569,-15.23309],[28.20098,-15.20518],[28.24122,-15.18445],[28.28488,-15.17168],[28.33027,-15.16737]]]}},"University-of-Zimbabwe":{type:"Feature",id:"University-of-Zimbabwe",properties:{},geometry:{type:"Polygon",coordinates:[[[31.05466,-17.56016],[31.10061,-17.56447],[31.14481,-17.57724],[31.18555,-17.59797],[31.22128,-17.62587],[31.25062,-17.65988],[31.27245,-17.69868],[31.28592,-17.74079],[31.29051,-17.7846],[31.28603,-17.82842],[31.27266,-17.87056],[31.2509,-17.90941],[31.22158,-17.94347],[31.18583,-17.97143],[31.14502,-17.99221],[31.10073,-18.005],[31.05466,-18.00932],[31.00859,-18.005],[30.9643,-17.99221],[30.92349,-17.97143],[30.88774,-17.94347],[30.85842,-17.90941],[30.83666,-17.87056],[30.82328,-17.82842],[30.81881,-17.7846],[30.8234,-17.74079],[30.83687,-17.69868],[30.85869,-17.65988],[30.88803,-17.62587],[30.92376,-17.59797],[30.96451,-17.57724],[31.0087,-17.56447],[31.05466,-17.56016]]]}},afghanistan:{type:"Feature",id:"afghanistan",geometry:{type:"Polygon",coordinates:[[[66.51861,37.36278],[67.07578,37.35614],[67.83,37.14499],[68.13556,37.02312],[68.85945,37.34434],[69.19627,37.15114],[69.51879,37.609],[70.11658,37.58822],[70.27057,37.73516],[70.3763,38.1384],[70.80682,38.48628],[71.34813,38.25891],[71.2394,37.95327],[71.54192,37.90577],[71.44869,37.06564],[71.84464,36.73817],[72.19304,36.94829],[72.63689,37.04756],[73.26006,37.49526],[73.9487,37.42157],[74.98,37.41999],[75.15803,37.13303],[74.57589,37.02084],[74.06755,36.83618],[72.92002,36.72001],[71.84629,36.50994],[71.26235,36.07439],[71.49877,35.65056],[71.61308,35.1532],[71.11502,34.73313],[71.15677,34.34891],[70.8818,33.98886],[69.93054,34.02012],[70.32359,33.35853],[69.68715,33.1055],[69.26252,32.50194],[69.31776,31.90141],[68.92668,31.62019],[68.55693,31.71331],[67.79269,31.58293],[67.68339,31.30315],[66.93889,31.30491],[66.38146,30.7389],[66.34647,29.88794],[65.04686,29.47218],[64.35042,29.56003],[64.148,29.34082],[63.55026,29.46833],[62.54986,29.31857],[60.87425,29.82924],[61.78122,30.73585],[61.69931,31.37951],[60.94194,31.54807],[60.86365,32.18292],[60.53608,32.98127],[60.9637,33.52883],[60.52843,33.67645],[60.80319,34.4041],[61.21082,35.65007],[62.23065,35.27066],[62.98466,35.40404],[63.19354,35.85717],[63.9829,36.00796],[64.54648,36.31207],[64.74611,37.11182],[65.58895,37.30522],[65.74563,37.66116],[66.21738,37.39379],[66.51861,37.36278]]]},properties:{name:"Afghanistan"}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},"Asian-University-for-Women":{type:"Feature",id:"Asian-University-for-Women",properties:{},geometry:{type:"Polygon",coordinates:[[[91.8457,22.57465],[91.89315,22.57033],[91.93877,22.55753],[91.98079,22.53675],[92.0176,22.50879],[92.04778,22.47472],[92.07018,22.43586],[92.08393,22.39371],[92.08852,22.34989],[92.08378,22.30609],[92.0699,22.26398],[92.04742,22.22518],[92.01721,22.19118],[91.98043,22.16329],[91.93849,22.14257],[91.893,22.12981],[91.8457,22.1255],[91.79841,22.12981],[91.75292,22.14257],[91.71098,22.16329],[91.6742,22.19118],[91.64399,22.22518],[91.6215,22.26398],[91.60762,22.30609],[91.60288,22.34989],[91.60747,22.39371],[91.62123,22.43586],[91.64362,22.47472],[91.67381,22.50879],[91.71062,22.53675],[91.75264,22.55753],[91.79826,22.57033],[91.8457,22.57465]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},"Dhaka-College":{type:"Feature",id:"Dhaka-College",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Dhaka-University":{type:"Feature",id:"Dhaka-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.35156,23.94959],[90.3995,23.94527],[90.44559,23.93247],[90.48805,23.91168],[90.52524,23.88372],[90.55573,23.84965],[90.57835,23.81079],[90.59224,23.76864],[90.59687,23.72482],[90.59208,23.68101],[90.57805,23.6389],[90.55534,23.60011],[90.52481,23.56611],[90.48766,23.53822],[90.44529,23.5175],[90.39934,23.50474],[90.35156,23.50043],[90.30379,23.50474],[90.25783,23.5175],[90.21547,23.53822],[90.17831,23.56611],[90.14779,23.60011],[90.12507,23.6389],[90.11105,23.68101],[90.10625,23.72482],[90.11088,23.76864],[90.12478,23.81079],[90.1474,23.84965],[90.17789,23.88372],[90.21508,23.91168],[90.25754,23.93247],[90.30362,23.94527],[90.35156,23.94959]]]}},"Eastern-University":{type:"Feature",id:"Eastern-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.38063,23.96703],[90.42857,23.96271],[90.47466,23.94991],[90.51713,23.92913],[90.55432,23.90116],[90.58482,23.86709],[90.60744,23.82823],[90.62134,23.78608],[90.62597,23.74226],[90.62117,23.69846],[90.60714,23.65635],[90.58443,23.61755],[90.5539,23.58356],[90.51674,23.55567],[90.47437,23.53494],[90.42841,23.52218],[90.38063,23.51788],[90.33284,23.52218],[90.28688,23.53494],[90.24451,23.55567],[90.20735,23.58356],[90.17682,23.61755],[90.15411,23.65635],[90.14008,23.69846],[90.13528,23.74226],[90.13991,23.78608],[90.15381,23.82823],[90.17643,23.86709],[90.20693,23.90116],[90.24412,23.92913],[90.28659,23.94991],[90.33268,23.96271],[90.38063,23.96703]]]}},"Jahangirnagar-University":{type:"Feature",id:"Jahangirnagar-University",properties:{},geometry:{type:"Polygon",coordinates:[[[90.26753,24.10689],[90.31553,24.10257],[90.36167,24.08977],[90.40418,24.06899],[90.44141,24.04102],[90.47194,24.00695],[90.49459,23.96809],[90.5085,23.92594],[90.51314,23.88212],[90.50834,23.83831],[90.49429,23.79621],[90.47155,23.75741],[90.44099,23.72342],[90.40378,23.69552],[90.36137,23.6748],[90.31536,23.66204],[90.26753,23.65774],[90.21969,23.66204],[90.17369,23.6748],[90.13127,23.69552],[90.09407,23.72342],[90.06351,23.75741],[90.04077,23.79621],[90.02672,23.83831],[90.02192,23.88212],[90.02656,23.92594],[90.04046,23.96809],[90.06312,24.00695],[90.09364,24.04102],[90.13088,24.06899],[90.17339,24.08977],[90.21953,24.10257],[90.26753,24.10689]]]}},"Khulna-University":{type:"Feature",id:"Khulna-University",properties:{},geometry:{type:"Polygon",coordinates:[[[89.56055,23.06152],[89.60816,23.0572],[89.65394,23.0444],[89.69611,23.02362],[89.73306,22.99565],[89.76335,22.96159],[89.78582,22.92273],[89.79962,22.88058],[89.80423,22.83676],[89.79947,22.79295],[89.78554,22.75085],[89.76297,22.71205],[89.73265,22.67805],[89.69574,22.65016],[89.65366,22.62944],[89.60801,22.61668],[89.56055,22.61237],[89.51308,22.61668],[89.46744,22.62944],[89.42535,22.65016],[89.38844,22.67805],[89.35812,22.71205],[89.33556,22.75085],[89.32163,22.79295],[89.31687,22.83676],[89.32147,22.88058],[89.33527,22.92273],[89.35775,22.96159],[89.38804,22.99565],[89.42498,23.02362],[89.46715,23.0444],[89.51293,23.0572],[89.56055,23.06152]]]}},"Rajshahi-University-of-Engineering-Technology":{type:"Feature",id:"Rajshahi-University-of-Engineering-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[88.62839,24.58841],[88.67657,24.58409],[88.72289,24.57129],[88.76556,24.5505],[88.80293,24.52253],[88.83358,24.48846],[88.85631,24.4496],[88.87027,24.40745],[88.87492,24.36363],[88.8701,24.31983],[88.856,24.27772],[88.83317,24.23893],[88.8025,24.20493],[88.76515,24.17704],[88.72258,24.15632],[88.6764,24.14356],[88.62839,24.13925],[88.58037,24.14356],[88.5342,24.15632],[88.49162,24.17704],[88.45428,24.20493],[88.4236,24.23893],[88.40077,24.27772],[88.38667,24.31983],[88.38185,24.36363],[88.38651,24.40745],[88.40047,24.4496],[88.4232,24.48846],[88.45384,24.52253],[88.49122,24.5505],[88.53389,24.57129],[88.58021,24.58409],[88.62839,24.58841]]]}},"Sherubtse-College":{type:"Feature",id:"Sherubtse-College",properties:{},geometry:{type:"Polygon",coordinates:[[[91.52369,27.51129],[91.57309,27.50697],[91.62058,27.49416],[91.66432,27.47337],[91.70263,27.4454],[91.73404,27.41133],[91.75734,27.37246],[91.77163,27.33031],[91.77639,27.28649],[91.77144,27.24268],[91.75698,27.20058],[91.73357,27.16179],[91.70212,27.1278],[91.66385,27.09991],[91.62022,27.0792],[91.5729,27.06644],[91.52369,27.06214],[91.47449,27.06644],[91.42717,27.0792],[91.38354,27.09991],[91.34526,27.1278],[91.31382,27.16179],[91.29041,27.20058],[91.27595,27.24268],[91.271,27.28649],[91.27575,27.33031],[91.29005,27.37246],[91.31335,27.41133],[91.34475,27.4454],[91.38307,27.47337],[91.42681,27.49416],[91.4743,27.50697],[91.52369,27.51129]]]}},"Gujarat-University":{type:"Feature",id:"Gujarat-University",properties:{},geometry:{type:"Polygon",coordinates:[[[72.50977,23.22343],[72.55744,23.21911],[72.60327,23.20631],[72.6455,23.18552],[72.68248,23.15756],[72.71281,23.12349],[72.73531,23.08463],[72.74913,23.04248],[72.75374,22.99866],[72.74897,22.95486],[72.73502,22.91275],[72.71243,22.87395],[72.68208,22.83996],[72.64512,22.81206],[72.60299,22.79134],[72.55728,22.77858],[72.50977,22.77427],[72.46225,22.77858],[72.41654,22.79134],[72.37441,22.81206],[72.33745,22.83996],[72.3071,22.87395],[72.28451,22.91275],[72.27056,22.95486],[72.26579,22.99866],[72.2704,23.04248],[72.28422,23.08463],[72.30672,23.12349],[72.33705,23.15756],[72.37403,23.18552],[72.41626,23.20631],[72.46209,23.21911],[72.50977,23.22343]]]}},india_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},"Universitas-Negeri-Makassar":{type:"Feature",id:"Universitas-Negeri-Makassar",properties:{},geometry:{type:"Polygon",coordinates:[[[119.4292,-4.96157],[119.47318,-4.96588],[119.51547,-4.97866],[119.55445,-4.9994],[119.58862,-5.02733],[119.61666,-5.06135],[119.63751,-5.10017],[119.65035,-5.14229],[119.6547,-5.18611],[119.65039,-5.22992],[119.63757,-5.27205],[119.61674,-5.31089],[119.5887,-5.34493],[119.55452,-5.37286],[119.51553,-5.39362],[119.47321,-5.40641],[119.4292,-5.41072],[119.38519,-5.40641],[119.34288,-5.39362],[119.30388,-5.37286],[119.26971,-5.34493],[119.24167,-5.31089],[119.22084,-5.27205],[119.20802,-5.22992],[119.2037,-5.18611],[119.20805,-5.14229],[119.22089,-5.10017],[119.24174,-5.06135],[119.26979,-5.02733],[119.30396,-4.9994],[119.34293,-4.97866],[119.38522,-4.96588],[119.4292,-4.96157]]]}},"University-Muhammadiyah-Surakarta":{type:"Feature",id:"University-Muhammadiyah-Surakarta",properties:{},geometry:{type:"Polygon",coordinates:[[[110.76899,-7.33303],[110.81316,-7.33735],[110.85564,-7.35012],[110.89479,-7.37086],[110.92912,-7.39878],[110.9573,-7.4328],[110.97825,-7.47162],[110.99116,-7.51374],[110.99553,-7.55755],[110.9912,-7.60137],[110.97833,-7.64351],[110.95741,-7.68234],[110.92924,-7.71638],[110.8949,-7.74433],[110.85572,-7.76509],[110.81321,-7.77787],[110.76899,-7.78219],[110.72477,-7.77787],[110.68225,-7.76509],[110.64307,-7.74433],[110.60873,-7.71638],[110.58056,-7.68234],[110.55964,-7.64351],[110.54677,-7.60137],[110.54244,-7.55755],[110.54681,-7.51374],[110.55973,-7.47162],[110.58067,-7.4328],[110.60885,-7.39878],[110.64318,-7.37086],[110.68233,-7.35012],[110.72481,-7.33735],[110.76899,-7.33303]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},"Institute-of-Crisis-Management-Studies":{type:"Feature",id:"Institute-of-Crisis-Management-Studies",properties:{},geometry:{type:"Polygon",coordinates:[[[85.34173,27.95228],[85.39133,27.94796],[85.43901,27.93515],[85.48293,27.91436],[85.5214,27.88639],[85.55293,27.85231],[85.57632,27.81345],[85.59067,27.77129],[85.59544,27.72747],[85.59047,27.68367],[85.57595,27.64156],[85.55245,27.60278],[85.52087,27.56879],[85.48245,27.5409],[85.43864,27.52019],[85.39113,27.50743],[85.34173,27.50313],[85.29233,27.50743],[85.24482,27.52019],[85.20102,27.5409],[85.16259,27.56879],[85.13102,27.60278],[85.10752,27.64156],[85.09299,27.68367],[85.08802,27.72747],[85.09279,27.77129],[85.10715,27.81345],[85.13054,27.85231],[85.16207,27.88639],[85.20053,27.91436],[85.24445,27.93515],[85.29213,27.94796],[85.34173,27.95228]]]}},"Kathmandu-University":{type:"Feature",id:"Kathmandu-University",properties:{},geometry:{type:"Polygon",coordinates:[[[85.53873,27.84494],[85.58828,27.84062],[85.63591,27.82781],[85.67979,27.80702],[85.71822,27.77905],[85.74972,27.74497],[85.77308,27.70611],[85.78742,27.66395],[85.79219,27.62013],[85.78722,27.57633],[85.77272,27.53422],[85.74924,27.49543],[85.7177,27.46145],[85.67931,27.43356],[85.63554,27.41285],[85.58808,27.40009],[85.53873,27.39578],[85.48938,27.40009],[85.44192,27.41285],[85.39815,27.43356],[85.35976,27.46145],[85.32822,27.49543],[85.30474,27.53422],[85.29024,27.57633],[85.28527,27.62013],[85.29004,27.66395],[85.30438,27.70611],[85.32774,27.74497],[85.35924,27.77905],[85.39767,27.80702],[85.44155,27.82781],[85.48918,27.84062],[85.53873,27.84494]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},"Tribhuvan-University":{type:"Feature",id:"Tribhuvan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[83.97645,28.47849],[84.0263,28.47417],[84.07421,28.46136],[84.11835,28.44057],[84.157,28.4126],[84.18869,28.37852],[84.21219,28.33965],[84.22661,28.2975],[84.23141,28.25368],[84.22641,28.20987],[84.21181,28.16777],[84.18819,28.12898],[84.15647,28.09499],[84.11785,28.06711],[84.07383,28.04639],[84.02609,28.03364],[83.97645,28.02933],[83.92682,28.03364],[83.87908,28.04639],[83.83506,28.06711],[83.79644,28.09499],[83.76471,28.12898],[83.7411,28.16777],[83.7265,28.20987],[83.7215,28.25368],[83.72629,28.2975],[83.74072,28.33965],[83.76422,28.37852],[83.7959,28.4126],[83.83456,28.44057],[83.8787,28.46136],[83.92661,28.47417],[83.97645,28.47849]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},"Far-Eastern-University-Institute-of-Technology":{type:"Feature",id:"Far-Eastern-University-Institute-of-Technology",properties:{},geometry:{type:"Polygon",coordinates:[[[121.02539,14.82943],[121.07071,14.82511],[121.11429,14.81231],[121.15444,14.79154],[121.18961,14.76359],[121.21847,14.72954],[121.23989,14.69069],[121.25305,14.64855],[121.25747,14.60473],[121.25296,14.56092],[121.23972,14.51881],[121.21825,14.48],[121.18938,14.44599],[121.15422,14.41808],[121.11412,14.39735],[121.07062,14.38458],[121.02539,14.38027],[120.98016,14.38458],[120.93666,14.39735],[120.89656,14.41808],[120.8614,14.44599],[120.83253,14.48],[120.81106,14.51881],[120.79782,14.56092],[120.79331,14.60473],[120.79773,14.64855],[120.81089,14.69069],[120.83232,14.72954],[120.86117,14.76359],[120.89635,14.79154],[120.93649,14.81231],[120.98007,14.82511],[121.02539,14.82943]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},"University-of-the-Philippines-Resilience-Institute":{type:"Feature",id:"University-of-the-Philippines-Resilience-Institute",properties:{},geometry:{type:"Polygon",coordinates:[[[121.06511,14.87964],[121.11044,14.87532],[121.15402,14.86253],[121.19418,14.84176],[121.22937,14.81381],[121.25822,14.77975],[121.27965,14.74091],[121.29282,14.69877],[121.29724,14.65495],[121.29273,14.61114],[121.27948,14.56902],[121.25801,14.53022],[121.22913,14.49621],[121.19396,14.4683],[121.15385,14.44756],[121.11035,14.4348],[121.06511,14.43049],[121.01986,14.4348],[120.97636,14.44756],[120.93625,14.4683],[120.90108,14.49621],[120.8722,14.53022],[120.85073,14.56902],[120.83748,14.61114],[120.83297,14.65495],[120.83739,14.69877],[120.85056,14.74091],[120.87199,14.77975],[120.90084,14.81381],[120.93603,14.84176],[120.97619,14.86253],[121.01977,14.87532],[121.06511,14.87964]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[18.55316,42.39709]]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},"Queen-Mary-University-of-London":{type:"Feature",id:"Queen-Mary-University-of-London",properties:{},geometry:{type:"Polygon",coordinates:[[[-0.04049,51.74867],[0.03027,51.74434],[0.09827,51.7315],[0.16087,51.71065],[0.21563,51.68262],[0.26045,51.64848],[0.29361,51.60956],[0.31386,51.56737],[0.32046,51.52354],[0.31318,51.47975],[0.29235,51.43768],[0.25881,51.39894],[0.21385,51.36502],[0.15922,51.33719],[0.09701,51.31653],[0.02959,51.30381],[-0.04049,51.29952],[-0.11057,51.30381],[-0.178,51.31653],[-0.24021,51.33719],[-0.29484,51.36502],[-0.33979,51.39894],[-0.37334,51.43768],[-0.39417,51.47975],[-0.40144,51.52354],[-0.39485,51.56737],[-0.3746,51.60956],[-0.34144,51.64848],[-0.29662,51.68262],[-0.24185,51.71065],[-0.17926,51.7315],[-0.11125,51.74434],[-0.04049,51.74867]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},"Heidelberg-University":{type:"Feature",id:"Heidelberg-University",properties:{},geometry:{type:"Polygon",coordinates:[[[8.67039,49.64365],[8.73804,49.63932],[8.80306,49.62648],[8.86292,49.60564],[8.91529,49.57762],[8.95817,49.54349],[8.98989,49.50458],[9.00928,49.46239],[9.01561,49.41856],[9.00868,49.37477],[8.98878,49.33269],[8.95671,49.29395],[8.91371,49.26002],[8.86146,49.23218],[8.80194,49.21151],[8.73744,49.19879],[8.67039,49.19449],[8.60334,49.19879],[8.53883,49.21151],[8.47931,49.23218],[8.42706,49.26002],[8.38407,49.29395],[8.352,49.33269],[8.3321,49.37477],[8.32516,49.41856],[8.33149,49.46239],[8.35088,49.50458],[8.38261,49.54349],[8.42548,49.57762],[8.47786,49.60564],[8.53771,49.62648],[8.60273,49.63932],[8.67039,49.64365]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},"Politecnico-di-Milano":{type:"Feature",id:"Politecnico-di-Milano",properties:{},geometry:{type:"Polygon",coordinates:[[[9.22852,45.68471],[9.29123,45.68038],[9.3515,45.66755],[9.40699,45.64672],[9.45556,45.61871],[9.49533,45.58459],[9.52478,45.54569],[9.54279,45.50351],[9.5487,45.45968],[9.5423,45.41589],[9.52388,45.37381],[9.49415,45.33505],[9.45428,45.30111],[9.40581,45.27326],[9.3506,45.25258],[9.29074,45.23985],[9.22852,45.23555],[9.16629,45.23985],[9.10644,45.25258],[9.05122,45.27326],[9.00275,45.30111],[8.96288,45.33505],[8.93316,45.37381],[8.91473,45.41589],[8.90833,45.45968],[8.91424,45.50351],[8.93225,45.54569],[8.9617,45.58459],[9.00147,45.61871],[9.05004,45.64672],[9.10553,45.66755],[9.16581,45.68038],[9.22852,45.68471]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},"Yarmouk-University":{type:"Feature",id:"Yarmouk-University",properties:{},geometry:{type:"Polygon",coordinates:[[[35.85811,32.76124],[35.91021,32.75691],[35.96029,32.7441],[36.00642,32.72331],[36.04681,32.69532],[36.07992,32.66124],[36.10446,32.62236],[36.11951,32.5802],[36.1245,32.53638],[36.11926,32.49258],[36.10399,32.45048],[36.0793,32.4117],[36.04615,32.37772],[36.00581,32.34985],[35.95982,32.32914],[35.90996,32.31639],[35.85811,32.31208],[35.80627,32.31639],[35.75641,32.32914],[35.71042,32.34985],[35.67008,32.37772],[35.63693,32.4117],[35.61224,32.45048],[35.59697,32.49258],[35.59173,32.53638],[35.59672,32.5802],[35.61177,32.62236],[35.63631,32.66124],[35.66941,32.69532],[35.70981,32.72331],[35.75593,32.7441],[35.80602,32.75691],[35.85811,32.76124]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},luxembourg_full:{type:"Feature",id:"luxembourg_full",properties:{},geometry:{type:"Polygon",coordinates:[[[5.74606,49.90779],[5.75308,49.91198],[5.76368,49.9154],[5.76047,49.91732],[5.76203,49.91969],[5.76168,49.92325],[5.76479,49.92643],[5.76341,49.92731],[5.76466,49.92902],[5.76395,49.93146],[5.77097,49.93165],[5.77008,49.9332],[5.77043,49.93668],[5.77516,49.93771],[5.77389,49.94144],[5.77178,49.94448],[5.77037,49.94959],[5.77503,49.95315],[5.77367,49.95651],[5.77723,49.95774],[5.77502,49.9608],[5.78061,49.9627],[5.78563,49.96099],[5.79119,49.9618],[5.79094,49.96388],[5.79608,49.96563],[5.80022,49.96296],[5.80427,49.96314],[5.80654,49.96231],[5.81055,49.96407],[5.80968,49.96764],[5.81047,49.97065],[5.81318,49.97256],[5.81948,49.97205],[5.82022,49.97378],[5.82358,49.97519],[5.8264,49.97466],[5.82796,49.97597],[5.83204,49.97653],[5.83355,49.97854],[5.83578,49.97892],[5.83856,49.98229],[5.83924,49.98889],[5.83664,49.99116],[5.83243,49.99052],[5.82964,49.99414],[5.82359,49.99699],[5.82068,50.00081],[5.8217,50.00182],[5.82043,50.00518],[5.82225,50.00592],[5.82078,50.00776],[5.81899,50.01281],[5.82229,50.01441],[5.83013,50.01484],[5.8293,50.01577],[5.83375,50.01842],[5.8402,50.01941],[5.84113,50.01834],[5.85066,50.02256],[5.85246,50.0229],[5.85152,50.0261],[5.85326,50.02757],[5.85988,50.02888],[5.85757,50.0331],[5.85808,50.03469],[5.85607,50.03628],[5.8633,50.0394],[5.86324,50.04221],[5.86847,50.04394],[5.86746,50.04533],[5.86991,50.04594],[5.86744,50.05019],[5.86102,50.05505],[5.85752,50.05502],[5.85647,50.05768],[5.8542,50.05889],[5.85665,50.0616],[5.85673,50.06394],[5.86066,50.06921],[5.86593,50.07066],[5.86772,50.07335],[5.87878,50.0764],[5.88263,50.07656],[5.88645,50.0784],[5.88755,50.08192],[5.88658,50.09079],[5.89208,50.09942],[5.89461,50.10133],[5.8953,50.10528],[5.89532,50.11216],[5.90101,50.1162],[5.90952,50.11909],[5.91409,50.1219],[5.91741,50.12154],[5.9259,50.12441],[5.92966,50.12619],[5.93717,50.12694],[5.94426,50.12922],[5.94974,50.12917],[5.95467,50.13109],[5.96133,50.13136],[5.95854,50.13886],[5.96135,50.14256],[5.96017,50.14755],[5.96121,50.14981],[5.95814,50.15139],[5.96269,50.15333],[5.96542,50.15371],[5.96707,50.15543],[5.96431,50.15824],[5.96319,50.16094],[5.96177,50.16076],[5.96418,50.16489],[5.96425,50.17126],[5.96368,50.17263],[5.96836,50.17285],[5.97107,50.17502],[5.9893,50.1752],[6.00301,50.17633],[6.01321,50.17898],[6.01827,50.18143],[6.0248,50.18277],[6.02974,50.17106],[6.02956,50.16589],[6.03229,50.1632],[6.03755,50.1605],[6.04551,50.15768],[6.05023,50.15684],[6.05757,50.15423],[6.06422,50.1534],[6.06886,50.15535],[6.07181,50.15736],[6.07878,50.15651],[6.07856,50.15818],[6.08058,50.16311],[6.07891,50.16827],[6.07924,50.17077],[6.08447,50.17199],[6.09471,50.16929],[6.10069,50.17073],[6.10249,50.17056],[6.11982,50.16335],[6.12032,50.16192],[6.11519,50.15633],[6.12063,50.1518],[6.12561,50.15015],[6.11772,50.14732],[6.11698,50.14459],[6.11499,50.14427],[6.1123,50.13602],[6.12071,50.13613],[6.12659,50.13386],[6.13054,50.13],[6.13787,50.12985],[6.13747,50.12568],[6.13611,50.12359],[6.13029,50.12177],[6.1281,50.11596],[6.1296,50.11438],[6.13521,50.11327],[6.13114,50.10826],[6.13135,50.10657],[6.13584,50.10366],[6.1344,50.10263],[6.12986,50.10278],[6.12561,50.1011],[6.12572,50.09915],[6.12858,50.09547],[6.13219,50.09511],[6.13334,50.09374],[6.12951,50.09224],[6.12229,50.09354],[6.1195,50.08949],[6.11977,50.08578],[6.12224,50.08355],[6.1222,50.0813],[6.1185,50.07587],[6.11625,50.07449],[6.1204,50.07247],[6.12316,50.07635],[6.12497,50.0771],[6.12875,50.07468],[6.12933,50.07326],[6.12611,50.07098],[6.1214,50.06893],[6.12045,50.06477],[6.11369,50.06537],[6.11415,50.06367],[6.11247,50.06008],[6.11343,50.05823],[6.1179,50.05644],[6.12034,50.0571],[6.12037,50.06005],[6.12372,50.06014],[6.12363,50.05674],[6.1211,50.05414],[6.12163,50.0527],[6.12449,50.05147],[6.12749,50.04776],[6.13265,50.04341],[6.13454,50.03949],[6.13247,50.03499],[6.12984,50.03156],[6.13041,50.02932],[6.14081,50.02489],[6.14327,50.02458],[6.14613,50.02226],[6.14456,50.02035],[6.13815,50.01587],[6.13477,50.01634],[6.13151,50.0193],[6.12966,50.01813],[6.13365,50.01567],[6.13796,50.01148],[6.14007,50.01074],[6.14808,50.01043],[6.14973,50.0092],[6.14972,50.00681],[6.14707,50.0029],[6.14497,49.99799],[6.13992,50.00003],[6.138,49.99886],[6.14253,49.99478],[6.14665,49.99507],[6.15099,49.99423],[6.15363,49.98949],[6.15737,49.98716],[6.16315,49.98734],[6.17147,49.98547],[6.16997,49.98435],[6.16887,49.98087],[6.16736,49.97976],[6.16501,49.9727],[6.1653,49.97009],[6.16762,49.9681],[6.17077,49.9631],[6.17596,49.96188],[6.17758,49.95509],[6.17944,49.95331],[6.18247,49.95368],[6.1878,49.95634],[6.18314,49.95739],[6.18289,49.95997],[6.18074,49.96473],[6.18372,49.96793],[6.19037,49.96955],[6.19286,49.96846],[6.1931,49.96482],[6.19497,49.96026],[6.19416,49.95668],[6.19649,49.95418],[6.19865,49.95009],[6.20078,49.95293],[6.2046,49.95505],[6.20849,49.95461],[6.20884,49.95301],[6.21174,49.95023],[6.22391,49.95008],[6.22355,49.94901],[6.21654,49.94451],[6.22,49.94333],[6.22733,49.93662],[6.22369,49.9343],[6.22608,49.92893],[6.21866,49.92486],[6.2185,49.92286],[6.22961,49.92097],[6.23272,49.91707],[6.23409,49.91255],[6.23176,49.91118],[6.22756,49.91146],[6.22722,49.91039],[6.23234,49.9065],[6.23405,49.90002],[6.24076,49.89618],[6.24617,49.89565],[6.24937,49.89289],[6.25113,49.8902],[6.25792,49.8863],[6.25931,49.88312],[6.26186,49.88116],[6.26996,49.87904],[6.27297,49.87736],[6.2763,49.87689],[6.27961,49.87869],[6.28273,49.87871],[6.2858,49.87573],[6.29032,49.87539],[6.29226,49.87404],[6.29217,49.87175],[6.29384,49.86867],[6.2977,49.8663],[6.30119,49.86697],[6.30852,49.87015],[6.31127,49.86998],[6.31403,49.86745],[6.31482,49.86508],[6.3139,49.86206],[6.31468,49.85983],[6.31846,49.85525],[6.32163,49.85331],[6.3231,49.85091],[6.322,49.84686],[6.31999,49.84309],[6.32149,49.83898],[6.32747,49.83618],[6.3331,49.83732],[6.3364,49.83909],[6.33785,49.8416],[6.33877,49.84663],[6.34229,49.84928],[6.34992,49.85072],[6.36424,49.85094],[6.36598,49.85021],[6.37285,49.84256],[6.3772,49.84037],[6.37896,49.83805],[6.38244,49.83592],[6.38501,49.83266],[6.39293,49.8276],[6.39721,49.82264],[6.4031,49.8196],[6.40958,49.81793],[6.4262,49.81566],[6.42673,49.81269],[6.43149,49.81063],[6.43722,49.81371],[6.44154,49.81448],[6.44411,49.81161],[6.45401,49.8116],[6.45611,49.81272],[6.46072,49.81741],[6.46337,49.81935],[6.46975,49.82255],[6.47157,49.82279],[6.48017,49.81925],[6.48477,49.81419],[6.48925,49.81199],[6.49278,49.81162],[6.49627,49.81261],[6.50113,49.81063],[6.50686,49.80903],[6.51047,49.80311],[6.51226,49.80244],[6.51603,49.80532],[6.51763,49.80802],[6.51884,49.81252],[6.52059,49.81349],[6.52714,49.81126],[6.52978,49.80943],[6.53125,49.80575],[6.53031,49.80426],[6.52626,49.80172],[6.52067,49.79629],[6.51444,49.7937],[6.50886,49.79209],[6.50619,49.78891],[6.50929,49.78648],[6.51593,49.78424],[6.51733,49.78264],[6.5153,49.77994],[6.51134,49.77695],[6.51052,49.77349],[6.51748,49.76947],[6.51852,49.76744],[6.51906,49.76256],[6.51748,49.7601],[6.51243,49.75727],[6.50525,49.75531],[6.50097,49.7524],[6.50112,49.74833],[6.5032,49.74533],[6.50215,49.7432],[6.50276,49.74003],[6.50215,49.73713],[6.50303,49.73183],[6.50793,49.72853],[6.51583,49.72548],[6.51768,49.72346],[6.51612,49.72188],[6.51166,49.72025],[6.50315,49.72615],[6.49965,49.72657],[6.49566,49.72523],[6.49759,49.7223],[6.50662,49.71668],[6.50723,49.71347],[6.49978,49.71105],[6.49395,49.70744],[6.48105,49.69697],[6.46938,49.69291],[6.46219,49.69171],[6.4577,49.68878],[6.45493,49.68509],[6.44496,49.67583],[6.43881,49.67179],[6.43195,49.66939],[6.42699,49.66384],[6.42697,49.66212],[6.42928,49.66076],[6.43577,49.66097],[6.44051,49.65901],[6.44131,49.6574],[6.44042,49.65274],[6.43779,49.64758],[6.433,49.64013],[6.42991,49.63682],[6.4241,49.62574],[6.4223,49.62065],[6.41864,49.61639],[6.413,49.61415],[6.40594,49.60875],[6.40376,49.60528],[6.39731,49.6007],[6.39308,49.59954],[6.38499,49.59881],[6.38125,49.59654],[6.37576,49.59149],[6.37532,49.58758],[6.37808,49.58455],[6.38308,49.58105],[6.38344,49.57825],[6.37988,49.57583],[6.37567,49.5762],[6.37172,49.57821],[6.36884,49.57843],[6.36179,49.5762],[6.35882,49.57391],[6.35866,49.57164],[6.36497,49.56851],[6.3803,49.55987],[6.38333,49.55665],[6.3805,49.55007],[6.37903,49.54824],[6.37216,49.54387],[6.3686,49.54038],[6.36026,49.53533],[6.35808,49.5321],[6.35784,49.52864],[6.36339,49.51647],[6.36449,49.51529],[6.36684,49.50917],[6.36874,49.50133],[6.36786,49.49502],[6.36983,49.48866],[6.36835,49.47923],[6.36875,49.46922],[6.36772,49.46942],[6.36756,49.46506],[6.36885,49.45987],[6.36445,49.45951],[6.36055,49.46142],[6.35285,49.46732],[6.34715,49.46587],[6.34265,49.46911],[6.33875,49.46862],[6.33402,49.46694],[6.33279,49.46963],[6.3299,49.47006],[6.32065,49.47742],[6.31861,49.47801],[6.3146,49.47707],[6.31296,49.4804],[6.30802,49.47893],[6.30544,49.47714],[6.30429,49.47832],[6.29622,49.4802],[6.29511,49.48139],[6.29907,49.48761],[6.29166,49.48685],[6.29117,49.48466],[6.28754,49.48615],[6.28956,49.48643],[6.28642,49.48805],[6.28439,49.49143],[6.28834,49.49144],[6.28962,49.49372],[6.2819,49.4932],[6.27889,49.4964],[6.28133,49.50104],[6.27986,49.50328],[6.27464,49.50379],[6.27186,49.50473],[6.2633,49.50395],[6.26195,49.50714],[6.25805,49.50755],[6.25701,49.5098],[6.24845,49.50851],[6.2464,49.5092],[6.24513,49.51151],[6.24182,49.51188],[6.24172,49.51423],[6.23896,49.5135],[6.23616,49.50815],[6.22758,49.51036],[6.22,49.50877],[6.21713,49.50976],[6.21723,49.5069],[6.2145,49.50635],[6.2074,49.50625],[6.2029,49.50699],[6.19576,49.50536],[6.19525,49.50642],[6.19136,49.50598],[6.18084,49.50801],[6.17831,49.50696],[6.17497,49.51031],[6.17199,49.50814],[6.16194,49.50415],[6.16165,49.50492],[6.15711,49.50423],[6.15389,49.50163],[6.15747,49.49673],[6.16249,49.49348],[6.15734,49.49148],[6.15585,49.49339],[6.1447,49.48789],[6.14077,49.48667],[6.14176,49.49168],[6.13373,49.48998],[6.13175,49.49063],[6.12804,49.49392],[6.12676,49.49002],[6.12748,49.48233],[6.12256,49.4752],[6.12345,49.47346],[6.11419,49.47049],[6.11139,49.47252],[6.10948,49.47252],[6.10198,49.47038],[6.1026,49.4694],[6.09981,49.46746],[6.09821,49.46427],[6.09878,49.46063],[6.10102,49.45786],[6.10163,49.4543],[6.10077,49.45289],[6.09232,49.45314],[6.09208,49.45428],[6.08694,49.45504],[6.086,49.45612],[6.08071,49.45847],[6.07921,49.46392],[6.07367,49.46365],[6.07264,49.46542],[6.06631,49.46482],[6.06114,49.46539],[6.05811,49.46644],[6.05309,49.4639],[6.04693,49.45555],[6.04177,49.44785],[6.03258,49.44953],[6.02725,49.44826],[6.02588,49.45073],[6.02711,49.45364],[6.02326,49.45507],[6.01559,49.45395],[6.01382,49.45253],[6.0115,49.45352],[6.00785,49.45164],[6.00123,49.4565],[5.99793,49.4565],[5.98197,49.45106],[5.97909,49.45268],[5.9793,49.45524],[5.98236,49.45703],[5.98572,49.45574],[5.98807,49.46129],[5.98732,49.46264],[5.98258,49.46352],[5.98144,49.46122],[5.97931,49.46091],[5.97401,49.46549],[5.97363,49.46859],[5.97194,49.46957],[5.97279,49.47119],[5.97241,49.47553],[5.97467,49.47743],[5.9748,49.482],[5.97141,49.48307],[5.96809,49.4864],[5.9709,49.4884],[5.9738,49.48911],[5.97211,49.49141],[5.96613,49.49134],[5.96523,49.49276],[5.95207,49.49414],[5.94917,49.49649],[5.94199,49.49835],[5.94315,49.50023],[5.94012,49.50096],[5.93414,49.50062],[5.93241,49.49957],[5.93056,49.50064],[5.92754,49.49838],[5.92195,49.50073],[5.92001,49.50021],[5.91227,49.502],[5.9086,49.50159],[5.90363,49.49826],[5.89752,49.49676],[5.89005,49.49668],[5.88698,49.49827],[5.88183,49.49917],[5.87332,49.49852],[5.87192,49.50027],[5.86969,49.49928],[5.86626,49.49991],[5.86246,49.50187],[5.85892,49.50589],[5.85322,49.50705],[5.84973,49.50897],[5.84917,49.51273],[5.84785,49.51494],[5.8412,49.51693],[5.83811,49.51952],[5.83615,49.51987],[5.83578,49.52264],[5.8343,49.52372],[5.83412,49.52638],[5.84303,49.5295],[5.84581,49.5299],[5.83916,49.53731],[5.83708,49.54258],[5.83507,49.54234],[5.82444,49.53917],[5.82272,49.53802],[5.81716,49.53702],[5.81334,49.54155],[5.80855,49.54091],[5.80813,49.54256],[5.81795,49.54575],[5.8201,49.5476],[5.82016,49.54927],[5.82273,49.54972],[5.82604,49.55223],[5.82797,49.55001],[5.83565,49.55246],[5.84181,49.55311],[5.84201,49.5545],[5.84606,49.55628],[5.84585,49.55877],[5.84242,49.56102],[5.84515,49.56105],[5.85021,49.56322],[5.85224,49.56528],[5.86106,49.56702],[5.86041,49.56979],[5.86324,49.57051],[5.86749,49.57308],[5.8728,49.57429],[5.86975,49.57678],[5.87192,49.57963],[5.86601,49.58056],[5.87314,49.58397],[5.87146,49.58778],[5.86778,49.58965],[5.8643,49.58648],[5.85951,49.58603],[5.85007,49.58695],[5.8488,49.59043],[5.8478,49.59598],[5.84907,49.59771],[5.85581,49.5999],[5.86496,49.60433],[5.87007,49.60578],[5.8766,49.60841],[5.87575,49.61136],[5.87718,49.61231],[5.87544,49.61457],[5.87563,49.61889],[5.87665,49.6207],[5.88128,49.62429],[5.88678,49.62732],[5.88582,49.62902],[5.8827,49.63094],[5.88386,49.63298],[5.88691,49.63495],[5.89228,49.63623],[5.89762,49.63582],[5.89897,49.63438],[5.90319,49.63616],[5.90772,49.63907],[5.90437,49.64148],[5.90412,49.64561],[5.90222,49.64595],[5.90296,49.65383],[5.90541,49.65476],[5.90295,49.65758],[5.90508,49.66071],[5.91064,49.66249],[5.90865,49.6655],[5.90601,49.6656],[5.90167,49.66441],[5.90146,49.66632],[5.89809,49.66635],[5.89581,49.66875],[5.89374,49.66629],[5.89029,49.6694],[5.88748,49.66972],[5.88711,49.6679],[5.88509,49.66867],[5.88471,49.67057],[5.87694,49.67343],[5.87391,49.67326],[5.8702,49.67535],[5.8654,49.67608],[5.86181,49.68106],[5.86265,49.68456],[5.86455,49.68735],[5.8634,49.6885],[5.86698,49.69215],[5.8667,49.69436],[5.86925,49.69487],[5.87179,49.69844],[5.87788,49.70117],[5.88191,49.70541],[5.88693,49.70928],[5.88153,49.71307],[5.87482,49.71576],[5.87416,49.71742],[5.87655,49.71813],[5.87517,49.72185],[5.87072,49.72162],[5.87045,49.72341],[5.86503,49.72696],[5.86173,49.72621],[5.86004,49.72723],[5.85443,49.72469],[5.85083,49.72424],[5.84467,49.72137],[5.84093,49.72148],[5.83762,49.724],[5.83139,49.72447],[5.82633,49.72352],[5.82437,49.72605],[5.82692,49.72689],[5.82719,49.72887],[5.82542,49.732],[5.82829,49.73332],[5.82739,49.73911],[5.83263,49.74145],[5.83038,49.74338],[5.83243,49.74692],[5.83047,49.74961],[5.82798,49.75026],[5.82302,49.74947],[5.82046,49.75127],[5.82086,49.75326],[5.81785,49.75397],[5.81597,49.76221],[5.81111,49.76535],[5.80945,49.76533],[5.80724,49.77246],[5.80343,49.7766],[5.79943,49.77806],[5.79847,49.78183],[5.79204,49.78701],[5.7933,49.79057],[5.79037,49.79576],[5.78839,49.79665],[5.78519,49.79617],[5.78135,49.79227],[5.7769,49.7946],[5.7717,49.79319],[5.77026,49.79424],[5.76136,49.79305],[5.75516,49.79146],[5.75309,49.7934],[5.7529,49.79695],[5.75011,49.80895],[5.74995,49.81197],[5.75117,49.81489],[5.74624,49.81577],[5.74347,49.82111],[5.7474,49.82301],[5.74822,49.82446],[5.74632,49.82614],[5.74393,49.8313],[5.73919,49.83362],[5.74079,49.83875],[5.74296,49.83956],[5.74777,49.8385],[5.75064,49.84067],[5.74858,49.84234],[5.74821,49.84597],[5.7516,49.84718],[5.75412,49.84484],[5.75836,49.84666],[5.75821,49.84934],[5.75492,49.85172],[5.74955,49.85146],[5.74584,49.85256],[5.74609,49.85411],[5.74983,49.85433],[5.75456,49.85655],[5.76066,49.8563],[5.7545,49.86221],[5.75698,49.86511],[5.75604,49.8668],[5.7527,49.86884],[5.75393,49.87192],[5.75615,49.87317],[5.75873,49.8728],[5.76293,49.86946],[5.76556,49.86936],[5.76891,49.87227],[5.77207,49.8714],[5.77443,49.86728],[5.77747,49.87204],[5.7829,49.87187],[5.784,49.87306],[5.77896,49.8749],[5.77991,49.87714],[5.78257,49.87573],[5.78337,49.87874],[5.77884,49.88114],[5.77794,49.88388],[5.77183,49.88507],[5.77061,49.88735],[5.76736,49.88729],[5.7601,49.88929],[5.75734,49.88946],[5.75396,49.89137],[5.74787,49.89239],[5.74628,49.89416],[5.73976,49.895],[5.73578,49.89709],[5.73766,49.90103],[5.74046,49.90218],[5.73992,49.90422],[5.74667,49.90631],[5.74606,49.90779]]]}},"Universit-Mohammed-V-Rabat":{type:"Feature",id:"Universit-Mohammed-V-Rabat",properties:{},geometry:{type:"Polygon",coordinates:[[[-6.84395,34.22335],[-6.79097,34.21902],[-6.74003,34.20621],[-6.69312,34.18541],[-6.65205,34.15742],[-6.61839,34.12333],[-6.59343,34.08446],[-6.57813,34.0423],[-6.57307,33.99847],[-6.57841,33.95467],[-6.59394,33.91257],[-6.61905,33.8738],[-6.65276,33.83982],[-6.69379,33.81195],[-6.74054,33.79124],[-6.79124,33.7785],[-6.84395,33.77419],[-6.89666,33.7785],[-6.94736,33.79124],[-6.99412,33.81195],[-7.03514,33.83982],[-7.06886,33.8738],[-7.09397,33.91257],[-7.1095,33.95467],[-7.11484,33.99847],[-7.10977,34.0423],[-7.09447,34.08446],[-7.06952,34.12333],[-7.03586,34.15742],[-6.99478,34.18541],[-6.94787,34.20621],[-6.89694,34.21902],[-6.84395,34.22335]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},portugal_full:{type:"Feature",id:"portugal_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-9.8183,39.46654],[-9.74297,39.61243],[-9.15336,40.2689],[-9.02339,40.66605],[-9.06499,41.53361],[-9.14028,41.86583],[-8.87097,41.86393],[-8.63678,42.04749],[-8.33189,42.08383],[-8.09392,41.80804],[-7.70414,41.90734],[-7.57391,41.82972],[-7.31532,41.84255],[-7.07696,41.95194],[-6.59946,41.9483],[-6.54827,41.6856],[-6.18916,41.57483],[-6.31541,41.39007],[-6.64838,41.24755],[-6.80893,41.0365],[-6.78122,40.3638],[-7.00889,40.22732],[-6.88093,40.04168],[-7.01552,39.67043],[-7.49982,39.59116],[-7.29426,39.45683],[-7.22161,39.1933],[-6.95113,39.0236],[-7.03302,38.87882],[-7.26003,38.72294],[-7.3179,38.44009],[-7.00719,38.02075],[-7.24557,37.9918],[-7.52267,37.55307],[-7.44048,37.39102],[-7.36982,36.96795],[-7.86807,36.75651],[-8.93249,36.70613],[-9.19102,36.85095],[-9.24841,37.0566],[-9.15002,37.89299],[-9.43993,38.30501],[-9.69634,38.59117],[-9.76209,38.77148],[-9.8183,39.46654]]],[[[-29.09544,38.59321],[-28.99861,38.75606],[-28.29551,38.95917],[-28.27253,39.20819],[-28.0874,39.30317],[-27.74735,39.18461],[-27.67871,38.98361],[-27.87807,38.81064],[-27.64155,38.71777],[-27.49973,38.96044],[-27.24547,39.00544],[-26.96172,38.94667],[-26.75981,38.69471],[-26.84006,38.53312],[-27.09439,38.40899],[-27.50811,38.51656],[-27.62972,38.36611],[-27.92878,38.22365],[-28.20466,38.18043],[-28.57194,38.21044],[-28.8786,38.34414],[-29.09544,38.59321]]],[[[-17.50448,32.80672],[-17.33873,33.02841],[-17.13654,33.07618],[-16.85671,33.03341],[-16.64298,33.07363],[-16.50498,33.26683],[-16.31749,33.32499],[-16.07438,33.22887],[-16.03974,33.01477],[-16.29967,32.80354],[-16.32939,32.68259],[-16.23823,32.34105],[-16.43009,32.20188],[-16.57427,32.2215],[-17.20787,32.49171],[-17.4233,32.6378],[-17.50448,32.80672]]],[[[-31.55753,39.44564],[-31.35042,39.8176],[-31.19648,39.91735],[-30.95234,39.88204],[-30.85434,39.72257],[-30.8573,39.42079],[-30.93102,39.25354],[-31.27059,39.14744],[-31.46896,39.23418],[-31.55753,39.44564]]],[[[-26.09699,37.8288],[-25.94558,38.06895],[-25.76694,38.10856],[-25.14862,38.0596],[-24.91128,37.9213],[-24.55129,37.35666],[-24.56246,37.16939],[-24.80604,36.81868],[-24.95535,36.7319],[-25.22799,36.74365],[-25.37354,36.82104],[-26.05947,37.72099],[-26.09699,37.8288]]],[[[-16.28153,30.01758],[-16.25213,30.14668],[-16.00891,30.32696],[-15.68743,30.28727],[-15.63441,30.07799],[-15.89594,29.862],[-16.08667,29.83115],[-16.28153,30.01758]]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},"Universidad-Autonoma-de-Madrid":{type:"Feature",id:"Universidad-Autonoma-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.69437,40.77124],[-3.63652,40.76691],[-3.58092,40.75409],[-3.52972,40.73327],[-3.48489,40.70527],[-3.44818,40.67117],[-3.42097,40.63228],[-3.40432,40.59011],[-3.39883,40.54628],[-3.4047,40.50248],[-3.42167,40.46039],[-3.44909,40.42163],[-3.48588,40.38767],[-3.53063,40.35981],[-3.58162,40.33912],[-3.6369,40.32638],[-3.69437,40.32208],[-3.75184,40.32638],[-3.80712,40.33912],[-3.85811,40.35981],[-3.90286,40.38767],[-3.93965,40.42163],[-3.96707,40.46039],[-3.98405,40.50248],[-3.98992,40.54628],[-3.98443,40.59011],[-3.96777,40.63228],[-3.94057,40.67117],[-3.90385,40.70527],[-3.85903,40.73327],[-3.80783,40.75409],[-3.75222,40.76691],[-3.69437,40.77124]]]}},"Universidad-Politcnica-de-Madrid":{type:"Feature",id:"Universidad-Politcnica-de-Madrid",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.7173,40.67259],[-3.65954,40.66826],[-3.60402,40.65544],[-3.55289,40.63463],[-3.50813,40.60662],[-3.47147,40.57252],[-3.44431,40.53363],[-3.42767,40.49146],[-3.42219,40.44764],[-3.42805,40.40384],[-3.445,40.36175],[-3.47238,40.32298],[-3.50912,40.28902],[-3.5538,40.26117],[-3.60472,40.24047],[-3.65992,40.22773],[-3.7173,40.22343],[-3.77469,40.22773],[-3.82989,40.24047],[-3.8808,40.26117],[-3.92549,40.28902],[-3.96222,40.32298],[-3.9896,40.36175],[-4.00656,40.40384],[-4.01241,40.44764],[-4.00693,40.49146],[-3.9903,40.53363],[-3.96314,40.57252],[-3.92647,40.60662],[-3.88172,40.63463],[-3.83059,40.65544],[-3.77507,40.66826],[-3.7173,40.67259]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},"Istanbul-Technical-University":{type:"Feature",id:"Istanbul-Technical-University",properties:{},geometry:{type:"Polygon",coordinates:[[[29.02465,41.33019],[29.083,41.32586],[29.13907,41.31304],[29.19071,41.29222],[29.23592,41.26422],[29.27294,41.23011],[29.30037,41.19122],[29.31717,41.14905],[29.3227,41.10523],[29.31678,41.06143],[29.29965,41.01934],[29.272,40.98058],[29.2349,40.94662],[29.18977,40.91876],[29.13835,40.89807],[29.08261,40.88533],[29.02465,40.88103],[28.9667,40.88533],[28.91095,40.89807],[28.85954,40.91876],[28.81441,40.94662],[28.77731,40.98058],[28.74965,41.01934],[28.73253,41.06143],[28.72661,41.10523],[28.73214,41.14905],[28.74893,41.19122],[28.77636,41.23011],[28.81339,41.26422],[28.85859,41.29222],[28.91023,41.31304],[28.96631,41.32586],[29.02465,41.33019]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},"University-of-Exeter":{type:"Feature",id:"University-of-Exeter",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.53515,50.96148],[-3.46559,50.95715],[-3.39875,50.94431],[-3.33721,50.92347],[-3.28338,50.89544],[-3.23931,50.8613],[-3.20671,50.82239],[-3.18679,50.7802],[-3.1803,50.73637],[-3.18744,50.69258],[-3.20791,50.6505],[-3.24089,50.61177],[-3.28508,50.57784],[-3.33879,50.55001],[-3.39995,50.52934],[-3.46624,50.51662],[-3.53515,50.51233],[-3.60405,50.51662],[-3.67035,50.52934],[-3.73151,50.55001],[-3.78522,50.57784],[-3.82941,50.61177],[-3.86239,50.6505],[-3.88285,50.69258],[-3.89,50.73637],[-3.8835,50.7802],[-3.86359,50.82239],[-3.83098,50.8613],[-3.78692,50.89544],[-3.73308,50.92347],[-3.67155,50.94431],[-3.6047,50.95715],[-3.53515,50.96148]]]}},"University-of-Warwick":{type:"Feature",id:"University-of-Warwick",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.56119,52.60392],[-1.48906,52.59958],[-1.41974,52.58674],[-1.35593,52.56589],[-1.30011,52.53785],[-1.25443,52.50371],[-1.22063,52.46479],[-1.2,52.4226],[-1.19329,52.37877],[-1.20072,52.33498],[-1.22196,52.29291],[-1.25615,52.25418],[-1.30198,52.22025],[-1.35766,52.19243],[-1.42106,52.17177],[-1.48977,52.15905],[-1.56119,52.15476],[-1.63261,52.15905],[-1.70132,52.17177],[-1.76473,52.19243],[-1.8204,52.22025],[-1.86623,52.25418],[-1.90043,52.29291],[-1.92166,52.33498],[-1.92909,52.37877],[-1.92238,52.4226],[-1.90175,52.46479],[-1.86796,52.50371],[-1.82228,52.53785],[-1.76645,52.56589],[-1.70265,52.58674],[-1.63333,52.59958],[-1.56119,52.60392]]]}},"Sacred-Heart-Junior-College":{type:"Feature",id:"Sacred-Heart-Junior-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.07411,17.38565],[-89.0282,17.38133],[-88.98406,17.36853],[-88.9434,17.34776],[-88.90777,17.3198],[-88.87855,17.28574],[-88.85686,17.24689],[-88.84353,17.20475],[-88.83907,17.16093],[-88.84364,17.11712],[-88.85706,17.07501],[-88.87881,17.0362],[-88.90805,17.0022],[-88.94366,16.97429],[-88.98426,16.95356],[-89.02831,16.9408],[-89.07411,16.93649],[-89.11991,16.9408],[-89.16396,16.95356],[-89.20456,16.97429],[-89.24017,17.0022],[-89.26941,17.0362],[-89.29116,17.07501],[-89.30458,17.11712],[-89.30915,17.16093],[-89.30469,17.20475],[-89.29136,17.24689],[-89.26967,17.28574],[-89.24045,17.3198],[-89.20483,17.34776],[-89.16416,17.36853],[-89.12002,17.38133],[-89.07411,17.38565]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},"Universidad-de-Costa-Rica":{type:"Feature",id:"Universidad-de-Costa-Rica",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.05105,10.16183],[-84.00654,10.15751],[-83.96374,10.14472],[-83.92431,10.12396],[-83.88975,10.09601],[-83.8614,10.06196],[-83.84035,10.02313],[-83.8274,9.98099],[-83.82305,9.93717],[-83.82746,9.89336],[-83.84046,9.85124],[-83.86155,9.81243],[-83.88991,9.77841],[-83.92445,9.75049],[-83.96385,9.72975],[-84.0066,9.71698],[-84.05105,9.71267],[-84.0955,9.71698],[-84.13825,9.72975],[-84.17765,9.75049],[-84.21219,9.77841],[-84.24055,9.81243],[-84.26164,9.85124],[-84.27464,9.89336],[-84.27905,9.93717],[-84.2747,9.98099],[-84.26175,10.02313],[-84.2407,10.06196],[-84.21235,10.09601],[-84.17779,10.12396],[-84.13836,10.14472],[-84.09556,10.15751],[-84.05105,10.16183]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},"Universidad-Nacional-Autnoma-de-Honduras":{type:"Feature",id:"Universidad-Nacional-Autnoma-de-Honduras",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.16598,14.30969],[-87.12077,14.30537],[-87.07729,14.29258],[-87.03724,14.27181],[-87.00214,14.24385],[-86.97336,14.2098],[-86.95199,14.17096],[-86.93885,14.12882],[-86.93444,14.085],[-86.93893,14.04119],[-86.95215,13.99907],[-86.97357,13.96026],[-87.00237,13.92625],[-87.03745,13.89834],[-87.07745,13.87761],[-87.12085,13.86484],[-87.16598,13.86053],[-87.21111,13.86484],[-87.25451,13.87761],[-87.29451,13.89834],[-87.32959,13.92625],[-87.35839,13.96026],[-87.37982,13.99907],[-87.39303,14.04119],[-87.39752,14.085],[-87.39312,14.12882],[-87.37998,14.17096],[-87.3586,14.2098],[-87.32982,14.24385],[-87.29472,14.27181],[-87.25467,14.29258],[-87.2112,14.30537],[-87.16598,14.30969]]]}},"University-of-the-West-Indies-Mona-Campus":{type:"Feature",id:"University-of-the-West-Indies-Mona-Campus",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.74601,18.23094],[-76.69988,18.22662],[-76.65553,18.21383],[-76.61468,18.19305],[-76.57888,18.16509],[-76.54952,18.13104],[-76.52773,18.09219],[-76.51435,18.05004],[-76.50987,18.00622],[-76.51446,17.96241],[-76.52795,17.9203],[-76.5498,17.8815],[-76.57918,17.84749],[-76.61495,17.81959],[-76.65575,17.79886],[-76.7,17.7861],[-76.74601,17.78179],[-76.79202,17.7861],[-76.83627,17.79886],[-76.87707,17.81959],[-76.91284,17.84749],[-76.94222,17.8815],[-76.96407,17.9203],[-76.97756,17.96241],[-76.98215,18.00622],[-76.97767,18.05004],[-76.96429,18.09219],[-76.9425,18.13104],[-76.91314,18.16509],[-76.87734,18.19305],[-76.83649,18.21383],[-76.79214,18.22662],[-76.74601,18.23094]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},"Universidad-Nacional-de-Ingenieria":{type:"Feature",id:"Universidad-Nacional-de-Ingenieria",properties:{},geometry:{type:"Polygon",coordinates:[[[-86.27051,12.35623],[-86.22565,12.35191],[-86.18253,12.33912],[-86.1428,12.31835],[-86.10798,12.2904],[-86.07942,12.25635],[-86.05821,12.21751],[-86.04517,12.17537],[-86.0408,12.13156],[-86.04525,12.08775],[-86.05835,12.04563],[-86.0796,12.00682],[-86.10817,11.9728],[-86.14298,11.94489],[-86.18267,11.92415],[-86.22573,11.91138],[-86.27051,11.90707],[-86.31528,11.91138],[-86.35834,11.92415],[-86.39804,11.94489],[-86.43284,11.9728],[-86.46141,12.00682],[-86.48266,12.04563],[-86.49576,12.08775],[-86.50021,12.13156],[-86.49584,12.17537],[-86.4828,12.21751],[-86.46159,12.25635],[-86.43303,12.2904],[-86.39822,12.31835],[-86.35848,12.33912],[-86.31536,12.35191],[-86.27051,12.35623]]]}},"University-of-Panama":{type:"Feature",id:"University-of-Panama",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.54102,9.23988],[-79.49663,9.23556],[-79.45395,9.22278],[-79.41462,9.20201],[-79.38016,9.17407],[-79.35188,9.14002],[-79.33089,9.10119],[-79.31797,9.05905],[-79.31363,9.01523],[-79.31802,8.97142],[-79.33099,8.9293],[-79.35201,8.89048],[-79.3803,8.85647],[-79.41475,8.82855],[-79.45405,8.80781],[-79.49668,8.79504],[-79.54102,8.79072],[-79.58535,8.79504],[-79.62798,8.80781],[-79.66728,8.82855],[-79.70173,8.85647],[-79.73002,8.89048],[-79.75104,8.9293],[-79.76401,8.97142],[-79.7684,9.01523],[-79.76406,9.05905],[-79.75114,9.10119],[-79.73015,9.14002],[-79.70187,9.17407],[-79.66741,9.20201],[-79.62808,9.22278],[-79.5854,9.23556],[-79.54102,9.23988]]]}},"Universidad-de-Puerto-Rico-Rio-Piedras":{type:"Feature",id:"Universidad-de-Puerto-Rico-Rio-Piedras",properties:{},geometry:{type:"Polygon",coordinates:[[[-66.04978,18.62742],[-66.00355,18.6231],[-65.9591,18.6103],[-65.91815,18.58953],[-65.88227,18.56157],[-65.85285,18.52751],[-65.83101,18.48866],[-65.81759,18.44651],[-65.8131,18.40269],[-65.81771,18.35889],[-65.83123,18.31677],[-65.85313,18.27797],[-65.88258,18.24397],[-65.91843,18.21606],[-65.95932,18.19533],[-66.00367,18.18257],[-66.04978,18.17826],[-66.0959,18.18257],[-66.14025,18.19533],[-66.18113,18.21606],[-66.21699,18.24397],[-66.24644,18.27797],[-66.26834,18.31677],[-66.28186,18.35889],[-66.28647,18.40269],[-66.28198,18.44651],[-66.26856,18.48866],[-66.24672,18.52751],[-66.2173,18.56157],[-66.18142,18.58953],[-66.14047,18.6103],[-66.09602,18.6231],[-66.04978,18.62742]]]}},"Ball-State-University":{type:"Feature",id:"Ball-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.40688,40.43064],[-85.34933,40.42631],[-85.294,40.41349],[-85.24306,40.39268],[-85.19846,40.36468],[-85.16193,40.33057],[-85.13486,40.29169],[-85.11829,40.24952],[-85.11283,40.20569],[-85.11866,40.16189],[-85.13555,40.1198],[-85.16283,40.08104],[-85.19944,40.04708],[-85.24396,40.01922],[-85.29469,39.99852],[-85.3497,39.98578],[-85.40688,39.98148],[-85.46406,39.98578],[-85.51907,39.99852],[-85.5698,40.01922],[-85.61432,40.04708],[-85.65093,40.08104],[-85.67821,40.1198],[-85.6951,40.16189],[-85.70094,40.20569],[-85.69547,40.24952],[-85.6789,40.29169],[-85.65183,40.33057],[-85.6153,40.36468],[-85.5707,40.39268],[-85.51976,40.41349],[-85.46444,40.42631],[-85.40688,40.43064]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},"California-University-of-Pennsylvania":{type:"Feature",id:"California-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.89258,40.26902],[-79.83516,40.26469],[-79.77997,40.25187],[-79.72915,40.23105],[-79.68466,40.20305],[-79.64821,40.16895],[-79.62121,40.13006],[-79.60467,40.08789],[-79.59922,40.04407],[-79.60504,40.00027],[-79.62189,39.95818],[-79.64911,39.91941],[-79.68562,39.88545],[-79.73004,39.85759],[-79.78066,39.8369],[-79.83553,39.82416],[-79.89258,39.81986],[-79.94963,39.82416],[-80.0045,39.8369],[-80.05511,39.85759],[-80.09953,39.88545],[-80.13605,39.91941],[-80.16326,39.95818],[-80.18011,40.00027],[-80.18593,40.04407],[-80.18048,40.08789],[-80.16395,40.13006],[-80.13694,40.16895],[-80.1005,40.20305],[-80.05601,40.23105],[-80.00518,40.25187],[-79.95,40.26469],[-79.89258,40.26902]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},"Central-Washington-University":{type:"Feature",id:"Central-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-120.49805,47.20483],[-120.43356,47.2005],[-120.37159,47.18767],[-120.31453,47.16684],[-120.26459,47.13882],[-120.22371,47.10469],[-120.19344,47.06579],[-120.17494,47.02361],[-120.16888,46.97978],[-120.17546,46.93599],[-120.19442,46.89391],[-120.22499,46.85516],[-120.26598,46.82122],[-120.3158,46.79338],[-120.37256,46.7727],[-120.43409,46.75997],[-120.49805,46.75567],[-120.562,46.75997],[-120.62353,46.7727],[-120.68029,46.79338],[-120.73012,46.82122],[-120.77111,46.85516],[-120.80167,46.89391],[-120.82063,46.93599],[-120.82722,46.97978],[-120.82116,47.02361],[-120.80265,47.06579],[-120.77238,47.10469],[-120.7315,47.13882],[-120.68157,47.16684],[-120.62451,47.18767],[-120.56253,47.2005],[-120.49805,47.20483]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},"Clemson-University":{type:"Feature",id:"Clemson-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.79297,34.89394],[-82.73955,34.88961],[-82.68821,34.8768],[-82.64092,34.85599],[-82.59951,34.82801],[-82.56558,34.79392],[-82.54043,34.75504],[-82.52501,34.71288],[-82.51991,34.66905],[-82.5253,34.62525],[-82.54095,34.58316],[-82.56627,34.54438],[-82.60025,34.51041],[-82.6416,34.48253],[-82.68873,34.46183],[-82.73984,34.44908],[-82.79297,34.44478],[-82.8461,34.44908],[-82.8972,34.46183],[-82.94433,34.48253],[-82.98568,34.51041],[-83.01967,34.54438],[-83.04498,34.58316],[-83.06064,34.62525],[-83.06603,34.66905],[-83.06092,34.71288],[-83.04551,34.75504],[-83.02035,34.79392],[-82.98642,34.82801],[-82.94502,34.85599],[-82.89773,34.8768],[-82.84638,34.88961],[-82.79297,34.89394]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},"College-of-William-and-Mary":{type:"Feature",id:"College-of-William-and-Mary",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.72852,37.52485],[-76.67328,37.52053],[-76.62018,37.50771],[-76.57128,37.4869],[-76.52846,37.45891],[-76.49338,37.42481],[-76.46739,37.38593],[-76.45146,37.34377],[-76.44619,37.29994],[-76.45178,37.25614],[-76.46798,37.21405],[-76.49416,37.17527],[-76.5293,37.14131],[-76.57205,37.11344],[-76.62077,37.09274],[-76.6736,37.08],[-76.72852,37.0757],[-76.78343,37.08],[-76.83626,37.09274],[-76.88498,37.11344],[-76.92773,37.14131],[-76.96287,37.17527],[-76.98905,37.21405],[-77.00525,37.25614],[-77.01084,37.29994],[-77.00557,37.34377],[-76.98965,37.38593],[-76.96365,37.42481],[-76.92857,37.45891],[-76.88576,37.4869],[-76.83685,37.50771],[-76.78376,37.52053],[-76.72852,37.52485]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},"Cornell-University":{type:"Feature",id:"Cornell-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.4735,42.67798],[-76.41391,42.67365],[-76.35663,42.66082],[-76.30389,42.64001],[-76.25772,42.612],[-76.21991,42.57789],[-76.1919,42.539],[-76.17476,42.49683],[-76.16912,42.453],[-76.17518,42.4092],[-76.19268,42.36711],[-76.22092,42.32835],[-76.25882,42.2944],[-76.3049,42.26655],[-76.3574,42.24586],[-76.41433,42.23312],[-76.4735,42.22882],[-76.53267,42.23312],[-76.5896,42.24586],[-76.6421,42.26655],[-76.68818,42.2944],[-76.72608,42.32835],[-76.75432,42.36711],[-76.77182,42.4092],[-76.77788,42.453],[-76.77224,42.49683],[-76.7551,42.539],[-76.72709,42.57789],[-76.68928,42.612],[-76.64311,42.64001],[-76.59037,42.66082],[-76.53309,42.67365],[-76.4735,42.67798]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},"George-Mason-University":{type:"Feature",id:"George-Mason-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.34375,39.04717],[-77.28734,39.04284],[-77.23312,39.03002],[-77.18318,39.00921],[-77.13947,38.98121],[-77.10365,38.94711],[-77.07711,38.90823],[-77.06086,38.86606],[-77.05549,38.82224],[-77.06121,38.77844],[-77.07776,38.73635],[-77.10449,38.69758],[-77.14037,38.66361],[-77.18402,38.63575],[-77.23376,38.61506],[-77.28769,38.60231],[-77.34375,38.59801],[-77.39981,38.60231],[-77.45374,38.61506],[-77.50348,38.63575],[-77.54713,38.66361],[-77.58301,38.69758],[-77.60974,38.73635],[-77.62629,38.77844],[-77.63201,38.82224],[-77.62664,38.86606],[-77.61039,38.90823],[-77.58385,38.94711],[-77.54803,38.98121],[-77.50432,39.00921],[-77.45438,39.03002],[-77.40016,39.04284],[-77.34375,39.04717]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},"Indiana-University-of-Pennsylvania":{type:"Feature",id:"Indiana-University-of-Pennsylvania",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.16139,40.83872],[-79.10348,40.83439],[-79.04782,40.82157],[-78.99657,40.80076],[-78.9517,40.77275],[-78.91495,40.73865],[-78.88772,40.69976],[-78.87104,40.65759],[-78.86555,40.61377],[-78.87142,40.56997],[-78.88842,40.52788],[-78.91586,40.48911],[-78.95269,40.45515],[-78.99749,40.4273],[-79.04853,40.4066],[-79.10386,40.39387],[-79.16139,40.38956],[-79.21892,40.39387],[-79.27426,40.4066],[-79.3253,40.4273],[-79.37009,40.45515],[-79.40692,40.48911],[-79.43437,40.52788],[-79.45136,40.56997],[-79.45724,40.61377],[-79.45174,40.65759],[-79.43507,40.69976],[-79.40784,40.73865],[-79.37108,40.77275],[-79.32622,40.80076],[-79.27496,40.82157],[-79.2193,40.83439],[-79.16139,40.83872]]]}},"Jacksonville-State-University":{type:"Feature",id:"Jacksonville-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.76795,34.04756],[-85.71507,34.04323],[-85.66424,34.03042],[-85.61743,34.00962],[-85.57644,33.98163],[-85.54285,33.94754],[-85.51794,33.90867],[-85.50268,33.86651],[-85.49762,33.82268],[-85.50295,33.77888],[-85.51845,33.73679],[-85.5435,33.69801],[-85.57715,33.66403],[-85.61809,33.63616],[-85.66475,33.61545],[-85.71534,33.6027],[-85.76795,33.5984],[-85.82055,33.6027],[-85.87115,33.61545],[-85.91781,33.63616],[-85.95874,33.66403],[-85.99239,33.69801],[-86.01745,33.73679],[-86.03295,33.77888],[-86.03828,33.82268],[-86.03322,33.86651],[-86.01795,33.90867],[-85.99305,33.94754],[-85.95945,33.98163],[-85.91846,34.00962],[-85.87165,34.03042],[-85.82082,34.04323],[-85.76795,34.04756]]]}},"Kansas-State-University":{type:"Feature",id:"Kansas-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-96.5918,39.38872],[-96.53511,39.38439],[-96.48062,39.37157],[-96.43045,39.35076],[-96.38652,39.32276],[-96.35053,39.28866],[-96.32387,39.24978],[-96.30753,39.20761],[-96.30215,39.16378],[-96.30789,39.11998],[-96.32452,39.07789],[-96.35139,39.03912],[-96.38744,39.00516],[-96.4313,38.9773],[-96.48128,38.95661],[-96.53546,38.94386],[-96.5918,38.93956],[-96.64813,38.94386],[-96.70232,38.95661],[-96.75229,38.9773],[-96.79615,39.00516],[-96.83221,39.03912],[-96.85907,39.07789],[-96.87571,39.11998],[-96.88145,39.16378],[-96.87606,39.20761],[-96.85973,39.24978],[-96.83306,39.28866],[-96.79708,39.32276],[-96.75315,39.35076],[-96.70297,39.37157],[-96.64848,39.38439],[-96.5918,39.38872]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},"McGill-University":{type:"Feature",id:"McGill-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.5787,45.73088],[-73.51593,45.72655],[-73.45561,45.71372],[-73.40007,45.69289],[-73.35147,45.66488],[-73.31166,45.63076],[-73.28219,45.59186],[-73.26416,45.54968],[-73.25825,45.50585],[-73.26465,45.46206],[-73.28309,45.41998],[-73.31284,45.38122],[-73.35274,45.34728],[-73.40125,45.31943],[-73.45652,45.29875],[-73.51642,45.28602],[-73.5787,45.28172],[-73.64097,45.28602],[-73.70088,45.29875],[-73.75614,45.31943],[-73.80465,45.34728],[-73.84455,45.38122],[-73.8743,45.41998],[-73.89274,45.46206],[-73.89914,45.50585],[-73.89323,45.54968],[-73.8752,45.59186],[-73.84573,45.63076],[-73.80593,45.66488],[-73.75732,45.69289],[-73.70178,45.71372],[-73.64146,45.72655],[-73.5787,45.73088]]]}},"Miami-University":{type:"Feature",id:"Miami-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-84.73174,39.73566],[-84.67477,39.73133],[-84.62001,39.71851],[-84.56958,39.6977],[-84.52543,39.6697],[-84.48927,39.6356],[-84.46247,39.59671],[-84.44606,39.55454],[-84.44065,39.51072],[-84.44642,39.46692],[-84.46314,39.42483],[-84.49014,39.38606],[-84.52638,39.3521],[-84.57045,39.32424],[-84.62067,39.30354],[-84.67513,39.2908],[-84.73174,39.2865],[-84.78835,39.2908],[-84.84281,39.30354],[-84.89303,39.32424],[-84.9371,39.3521],[-84.97334,39.38606],[-85.00034,39.42483],[-85.01706,39.46692],[-85.02283,39.51072],[-85.01742,39.55454],[-85.00101,39.59671],[-84.97421,39.6356],[-84.93805,39.6697],[-84.8939,39.6977],[-84.84347,39.71851],[-84.78871,39.73133],[-84.73174,39.73566]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},"Monroe-Community-College":{type:"Feature",id:"Monroe-Community-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.61025,43.32617],[-77.55003,43.32184],[-77.49214,43.30901],[-77.43884,43.28819],[-77.39219,43.26018],[-77.35398,43.22607],[-77.32568,43.18718],[-77.30836,43.14501],[-77.30267,43.10118],[-77.30879,43.05738],[-77.32648,43.0153],[-77.35502,42.97654],[-77.39332,42.94258],[-77.43988,42.91473],[-77.49294,42.89405],[-77.55046,42.88131],[-77.61025,42.87701],[-77.67004,42.88131],[-77.72756,42.89405],[-77.78061,42.91473],[-77.82718,42.94258],[-77.86547,42.97654],[-77.89402,43.0153],[-77.9117,43.05738],[-77.91783,43.10118],[-77.91214,43.14501],[-77.89482,43.18718],[-77.86652,43.22607],[-77.82831,43.26018],[-77.78166,43.28819],[-77.72836,43.30901],[-77.67047,43.32184],[-77.61025,43.32617]]]}},"Montgomery-College":{type:"Feature",id:"Montgomery-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.15782,39.32194],[-77.10119,39.31761],[-77.04675,39.30479],[-76.99662,39.28398],[-76.95274,39.25598],[-76.91678,39.22188],[-76.89014,39.183],[-76.87383,39.14083],[-76.86844,39.097],[-76.87418,39.0532],[-76.8908,39.01111],[-76.91764,38.97234],[-76.95366,38.93838],[-76.99747,38.91052],[-77.0474,38.88982],[-77.10154,38.87708],[-77.15782,38.87278],[-77.2141,38.87708],[-77.26823,38.88982],[-77.31816,38.91052],[-77.36198,38.93838],[-77.398,38.97234],[-77.42484,39.01111],[-77.44146,39.0532],[-77.4472,39.097],[-77.44181,39.14083],[-77.42549,39.183],[-77.39885,39.22188],[-77.3629,39.25598],[-77.31902,39.28398],[-77.26889,39.30479],[-77.21445,39.31761],[-77.15782,39.32194]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},"New-York-University":{type:"Feature",id:"New-York-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.00391,40.93853],[-73.94591,40.9342],[-73.89017,40.92138],[-73.83883,40.90057],[-73.7939,40.87257],[-73.75709,40.83846],[-73.72982,40.79957],[-73.71312,40.7574],[-73.70762,40.71358],[-73.7135,40.66978],[-73.73053,40.62769],[-73.75801,40.58893],[-73.7949,40.55497],[-73.83976,40.52711],[-73.89087,40.50642],[-73.94629,40.49368],[-74.00391,40.48938],[-74.06152,40.49368],[-74.11694,40.50642],[-74.16805,40.52711],[-74.21291,40.55497],[-74.2498,40.58893],[-74.27729,40.62769],[-74.29431,40.66978],[-74.30019,40.71358],[-74.29469,40.7574],[-74.27799,40.79957],[-74.25072,40.83846],[-74.21391,40.87257],[-74.16898,40.90057],[-74.11765,40.92138],[-74.0619,40.9342],[-74.00391,40.93853]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},"Ohio-Wesleyan-University":{type:"Feature",id:"Ohio-Wesleyan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-83.06823,40.52082],[-83.0106,40.51649],[-82.9552,40.50367],[-82.90419,40.48285],[-82.85953,40.45485],[-82.82295,40.42075],[-82.79585,40.38186],[-82.77925,40.33969],[-82.77378,40.29586],[-82.77963,40.25207],[-82.79654,40.20998],[-82.82385,40.17121],[-82.86051,40.13725],[-82.90509,40.10939],[-82.95589,40.0887],[-83.01097,40.07596],[-83.06823,40.07166],[-83.12549,40.07596],[-83.18056,40.0887],[-83.23136,40.10939],[-83.27595,40.13725],[-83.3126,40.17121],[-83.33992,40.20998],[-83.35683,40.25207],[-83.36268,40.29586],[-83.3572,40.33969],[-83.34061,40.38186],[-83.31351,40.42075],[-83.27692,40.45485],[-83.23227,40.48285],[-83.18126,40.50367],[-83.12586,40.51649],[-83.06823,40.52082]]]}},"Oklahoma-State-University":{type:"Feature",id:"Oklahoma-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.07253,36.34551],[-97.01814,36.34119],[-96.96586,36.32837],[-96.9177,36.30756],[-96.87554,36.27957],[-96.841,36.24548],[-96.81539,36.2066],[-96.7997,36.16444],[-96.79451,36.12061],[-96.80001,36.07681],[-96.81596,36.03472],[-96.84173,35.99594],[-96.87634,35.96197],[-96.91844,35.9341],[-96.96642,35.9134],[-97.01845,35.90066],[-97.07253,35.89636],[-97.12662,35.90066],[-97.17865,35.9134],[-97.22663,35.9341],[-97.26873,35.96197],[-97.30333,35.99594],[-97.32911,36.03472],[-97.34506,36.07681],[-97.35055,36.12061],[-97.34537,36.16444],[-97.32967,36.2066],[-97.30407,36.24548],[-97.26952,36.27957],[-97.22736,36.30756],[-97.17921,36.32837],[-97.12693,36.34119],[-97.07253,36.34551]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},"State-University-of-New-York-Geneseo":{type:"Feature",id:"State-University-of-New-York-Geneseo",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.7832,43.0361],[-77.72327,43.03177],[-77.66566,43.01895],[-77.61261,42.99813],[-77.56618,42.97012],[-77.52815,42.93601],[-77.49998,42.89712],[-77.48274,42.85494],[-77.47707,42.81111],[-77.48316,42.76732],[-77.50076,42.72523],[-77.52917,42.68647],[-77.56729,42.65252],[-77.61364,42.62467],[-77.66644,42.60398],[-77.72369,42.59124],[-77.7832,42.58694],[-77.84272,42.59124],[-77.89996,42.60398],[-77.95277,42.62467],[-77.99912,42.65252],[-78.03723,42.68647],[-78.06564,42.72523],[-78.08324,42.76732],[-78.08934,42.81111],[-78.08367,42.85494],[-78.06643,42.89712],[-78.03826,42.93601],[-78.00023,42.97012],[-77.9538,42.99813],[-77.90075,43.01895],[-77.84314,43.03177],[-77.7832,43.0361]]]}},"SUNY-at-Fredonia":{type:"Feature",id:"SUNY-at-Fredonia",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.36523,42.64804],[-79.30567,42.6437],[-79.24842,42.63088],[-79.19571,42.61006],[-79.14956,42.58206],[-79.11177,42.54795],[-79.08377,42.50906],[-79.06664,42.46688],[-79.061,42.42305],[-79.06706,42.37926],[-79.08454,42.33717],[-79.11278,42.29841],[-79.15065,42.26445],[-79.19671,42.2366],[-79.24919,42.21591],[-79.30609,42.20318],[-79.36523,42.19888],[-79.42438,42.20318],[-79.48128,42.21591],[-79.53376,42.2366],[-79.57982,42.26445],[-79.61769,42.29841],[-79.64592,42.33717],[-79.66341,42.37926],[-79.66947,42.42305],[-79.66383,42.46688],[-79.64669,42.50906],[-79.6187,42.54795],[-79.58091,42.58206],[-79.53476,42.61006],[-79.48205,42.63088],[-79.4248,42.6437],[-79.36523,42.64804]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},"Texas-Tech-University":{type:"Feature",id:"Texas-Tech-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-101.86523,33.80259],[-101.81251,33.79827],[-101.76183,33.78546],[-101.71515,33.76465],[-101.67428,33.73667],[-101.64078,33.70258],[-101.61595,33.66371],[-101.60072,33.62155],[-101.59568,33.57772],[-101.60099,33.53392],[-101.61644,33.49182],[-101.64143,33.45304],[-101.67498,33.41907],[-101.7158,33.39119],[-101.76233,33.37049],[-101.81278,33.35774],[-101.86523,33.35344],[-101.91769,33.35774],[-101.96814,33.37049],[-102.01467,33.39119],[-102.05549,33.41907],[-102.08904,33.45304],[-102.11403,33.49182],[-102.12948,33.53392],[-102.13479,33.57772],[-102.12975,33.62155],[-102.11452,33.66371],[-102.08969,33.70258],[-102.05619,33.73667],[-102.01532,33.76465],[-101.96864,33.78546],[-101.91796,33.79827],[-101.86523,33.80259]]]}},"The-Citadel":{type:"Feature",id:"The-Citadel",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.96064,33.02165],[-79.90838,33.01732],[-79.85816,33.00451],[-79.81189,32.98371],[-79.77138,32.95573],[-79.73818,32.92164],[-79.71357,32.88277],[-79.69847,32.84061],[-79.69347,32.79679],[-79.69873,32.75298],[-79.71404,32.71088],[-79.73881,32.6721],[-79.77206,32.63813],[-79.81252,32.61025],[-79.85863,32.58954],[-79.90864,32.57679],[-79.96064,32.57249],[-80.01263,32.57679],[-80.06264,32.58954],[-80.10876,32.61025],[-80.14921,32.63813],[-80.18247,32.6721],[-80.20723,32.71088],[-80.22254,32.75298],[-80.2278,32.79679],[-80.2228,32.84061],[-80.2077,32.88277],[-80.18309,32.92164],[-80.14989,32.95573],[-80.10938,32.98371],[-80.06312,33.00451],[-80.01289,33.01732],[-79.96064,33.02165]]]}},"The-George-Washington-University":{type:"Feature",id:"The-George-Washington-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04812,39.12442],[-76.99165,39.12009],[-76.93737,39.10727],[-76.88738,39.08646],[-76.84362,39.05846],[-76.80776,39.02436],[-76.7812,38.98548],[-76.76492,38.94331],[-76.75955,38.89948],[-76.76527,38.85569],[-76.78184,38.81359],[-76.80861,38.77483],[-76.84453,38.74086],[-76.88822,38.713],[-76.93801,38.6923],[-76.992,38.67956],[-77.04812,38.67526],[-77.10425,38.67956],[-77.15823,38.6923],[-77.20803,38.713],[-77.25172,38.74086],[-77.28764,38.77483],[-77.31441,38.81359],[-77.33097,38.85569],[-77.33669,38.89948],[-77.33132,38.94331],[-77.31505,38.98548],[-77.28848,39.02436],[-77.25263,39.05846],[-77.20887,39.08646],[-77.15888,39.10727],[-77.1046,39.12009],[-77.04812,39.12442]]]}},"The-Johns-Hopkins-University-SAIS":{type:"Feature",id:"The-Johns-Hopkins-University-SAIS",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04027,39.13272],[-76.98379,39.12839],[-76.9295,39.11557],[-76.87951,39.09476],[-76.83574,39.06677],[-76.79988,39.03267],[-76.77331,38.99378],[-76.75704,38.95161],[-76.75167,38.90779],[-76.75739,38.86399],[-76.77396,38.8219],[-76.80073,38.78313],[-76.83665,38.74916],[-76.88035,38.7213],[-76.93015,38.70061],[-76.98414,38.68787],[-77.04027,38.68356],[-77.0964,38.68787],[-77.15039,38.70061],[-77.20019,38.7213],[-77.24389,38.74916],[-77.27982,38.78313],[-77.30658,38.8219],[-77.32316,38.86399],[-77.32888,38.90779],[-77.32351,38.95161],[-77.30723,38.99378],[-77.28066,39.03267],[-77.2448,39.06677],[-77.20104,39.09476],[-77.15104,39.11557],[-77.09675,39.12839],[-77.04027,39.13272]]]}},"The-Pennsylvania-State-University":{type:"Feature",id:"The-Pennsylvania-State-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.85976,41.02277],[-77.80169,41.01844],[-77.74587,41.00562],[-77.69448,40.9848],[-77.64948,40.9568],[-77.61263,40.92269],[-77.58532,40.88381],[-77.5686,40.84164],[-77.5631,40.79781],[-77.56899,40.75401],[-77.58603,40.71192],[-77.61355,40.67316],[-77.65049,40.6392],[-77.6954,40.61134],[-77.74658,40.59065],[-77.80207,40.57791],[-77.85976,40.57361],[-77.91744,40.57791],[-77.97293,40.59065],[-78.02411,40.61134],[-78.06903,40.6392],[-78.10596,40.67316],[-78.13348,40.71192],[-78.15053,40.75401],[-78.15642,40.79781],[-78.15091,40.84164],[-78.13419,40.88381],[-78.10689,40.92269],[-78.07003,40.9568],[-78.02504,40.9848],[-77.97364,41.00562],[-77.91783,41.01844],[-77.85976,41.02277]]]}},"University-of-California-Davis":{type:"Feature",id:"University-of-California-Davis",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.72852,38.77274],[-121.67232,38.76842],[-121.61831,38.7556],[-121.56857,38.73479],[-121.52502,38.70679],[-121.48934,38.67269],[-121.4629,38.63381],[-121.44671,38.59164],[-121.44136,38.54781],[-121.44705,38.50402],[-121.46354,38.46192],[-121.49017,38.42315],[-121.52591,38.38919],[-121.56939,38.36133],[-121.61894,38.34063],[-121.67267,38.32789],[-121.72852,38.32359],[-121.78437,38.32789],[-121.83809,38.34063],[-121.88764,38.36133],[-121.93112,38.38919],[-121.96686,38.42315],[-121.99349,38.46192],[-122.00998,38.50402],[-122.01567,38.54781],[-122.01032,38.59164],[-121.99413,38.63381],[-121.96769,38.67269],[-121.93201,38.70679],[-121.88847,38.73479],[-121.83872,38.7556],[-121.78471,38.76842],[-121.72852,38.77274]]]}},"University-of-Central-Florida":{type:"Feature",id:"University-of-Central-Florida",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.38672,28.68361],[-81.33678,28.67929],[-81.28877,28.66648],[-81.24455,28.64569],[-81.20582,28.61771],[-81.17407,28.58364],[-81.15052,28.54477],[-81.13608,28.50262],[-81.13127,28.45879],[-81.13628,28.41499],[-81.15091,28.37289],[-81.17457,28.3341],[-81.20636,28.30011],[-81.24505,28.27223],[-81.28915,28.25151],[-81.33699,28.23876],[-81.38672,28.23445],[-81.43645,28.23876],[-81.48428,28.25151],[-81.52839,28.27223],[-81.56708,28.30011],[-81.59887,28.3341],[-81.62253,28.37289],[-81.63715,28.41499],[-81.64217,28.45879],[-81.63736,28.50262],[-81.62291,28.54477],[-81.59937,28.58364],[-81.56762,28.61771],[-81.52889,28.64569],[-81.48467,28.66648],[-81.43666,28.67929],[-81.38672,28.68361]]]}},"University-of-Chicago":{type:"Feature",id:"University-of-Chicago",properties:{},geometry:{type:"Polygon",coordinates:[[[-87.59878,42.0135],[-87.53981,42.00917],[-87.48314,41.99634],[-87.43095,41.97553],[-87.38527,41.94752],[-87.34785,41.91341],[-87.32013,41.87452],[-87.30316,41.83235],[-87.29758,41.78852],[-87.30357,41.74473],[-87.32088,41.70264],[-87.34882,41.66388],[-87.38632,41.62992],[-87.43192,41.60207],[-87.48388,41.58138],[-87.54022,41.56864],[-87.59878,41.56434],[-87.65734,41.56864],[-87.71367,41.58138],[-87.76563,41.60207],[-87.81124,41.62992],[-87.84873,41.66388],[-87.87668,41.70264],[-87.89399,41.74473],[-87.89998,41.78852],[-87.8944,41.83235],[-87.87743,41.87452],[-87.84971,41.91341],[-87.81229,41.94752],[-87.76661,41.97553],[-87.71442,41.99634],[-87.65774,42.00917],[-87.59878,42.0135]]]}},"University-of-Maryland-College-Park":{type:"Feature",id:"University-of-Maryland-College-Park",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.94332,39.21148],[-76.88677,39.20715],[-76.83242,39.19433],[-76.78237,39.17352],[-76.73856,39.14552],[-76.70266,39.11142],[-76.67606,39.07254],[-76.65977,39.03037],[-76.65439,38.98654],[-76.66012,38.94275],[-76.67671,38.90065],[-76.70351,38.86189],[-76.73947,38.82792],[-76.78322,38.80006],[-76.83307,38.77937],[-76.88712,38.76662],[-76.94332,38.76232],[-76.99951,38.76662],[-77.05356,38.77937],[-77.10341,38.80006],[-77.14716,38.82792],[-77.18313,38.86189],[-77.20992,38.90065],[-77.22651,38.94275],[-77.23224,38.98654],[-77.22686,39.03037],[-77.21057,39.07254],[-77.18397,39.11142],[-77.14808,39.14552],[-77.10426,39.17352],[-77.05421,39.19433],[-76.99986,39.20715],[-76.94332,39.21148]]]}},"University-of-North-Texas":{type:"Feature",id:"University-of-North-Texas",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.15255,33.43207],[-97.10005,33.42774],[-97.04958,33.41493],[-97.0031,33.39413],[-96.9624,33.36615],[-96.92905,33.33206],[-96.90432,33.29319],[-96.88916,33.25103],[-96.88413,33.2072],[-96.88942,33.1634],[-96.90481,33.1213],[-96.92969,33.08252],[-96.96309,33.04855],[-97.00374,33.02067],[-97.05007,32.99997],[-97.10031,32.98722],[-97.15255,32.98291],[-97.20478,32.98722],[-97.25502,32.99997],[-97.30135,33.02067],[-97.342,33.04855],[-97.3754,33.08252],[-97.40028,33.1213],[-97.41567,33.1634],[-97.42096,33.2072],[-97.41593,33.25103],[-97.40077,33.29319],[-97.37604,33.33206],[-97.34269,33.36615],[-97.30199,33.39413],[-97.25551,33.41493],[-97.20504,33.42774],[-97.15255,33.43207]]]}},"University-of-Northern-Colorado":{type:"Feature",id:"University-of-Northern-Colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-104.69563,40.62872],[-104.63791,40.62439],[-104.58242,40.61157],[-104.53133,40.59075],[-104.4866,40.56275],[-104.44996,40.52865],[-104.42281,40.48976],[-104.40619,40.44759],[-104.40071,40.40377],[-104.40657,40.35997],[-104.42351,40.31788],[-104.45087,40.27911],[-104.48758,40.24515],[-104.53224,40.21729],[-104.58312,40.1966],[-104.63828,40.18386],[-104.69563,40.17956],[-104.75298,40.18386],[-104.80815,40.1966],[-104.85903,40.21729],[-104.90368,40.24515],[-104.94039,40.27911],[-104.96775,40.31788],[-104.98469,40.35997],[-104.99055,40.40377],[-104.98507,40.44759],[-104.96845,40.48976],[-104.9413,40.52865],[-104.90466,40.56275],[-104.85994,40.59075],[-104.80884,40.61157],[-104.75336,40.62439],[-104.69563,40.62872]]]}},"University-of-Oregon":{type:"Feature",id:"University-of-Oregon",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.04688,44.249],[-122.98571,44.24467],[-122.92693,44.23184],[-122.87281,44.21102],[-122.82543,44.18301],[-122.78663,44.1489],[-122.7579,44.11],[-122.74032,44.06783],[-122.73455,44.024],[-122.74077,43.9802],[-122.75874,43.93812],[-122.78773,43.89936],[-122.82661,43.86541],[-122.8739,43.83756],[-122.92777,43.81688],[-122.98617,43.80414],[-123.04688,43.79984],[-123.10758,43.80414],[-123.16598,43.81688],[-123.21985,43.83756],[-123.26714,43.86541],[-123.30602,43.89936],[-123.33501,43.93812],[-123.35298,43.9802],[-123.3592,44.024],[-123.35343,44.06783],[-123.33585,44.11],[-123.30712,44.1489],[-123.26832,44.18301],[-123.22094,44.21102],[-123.16682,44.23184],[-123.10804,44.24467],[-123.04688,44.249]]]}},"University-of-Redlands":{type:"Feature",id:"University-of-Redlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-117.16339,34.28768],[-117.11037,34.28336],[-117.0594,34.27054],[-117.01245,34.24974],[-116.97134,34.22175],[-116.93766,34.18767],[-116.91268,34.14879],[-116.89737,34.10663],[-116.8923,34.06281],[-116.89765,34.019],[-116.91319,33.97691],[-116.93832,33.93813],[-116.97206,33.90415],[-117.01311,33.87628],[-117.0599,33.85558],[-117.11064,33.84283],[-117.16339,33.83852],[-117.21614,33.84283],[-117.26688,33.85558],[-117.31367,33.87628],[-117.35473,33.90415],[-117.38847,33.93813],[-117.4136,33.97691],[-117.42914,34.019],[-117.43448,34.06281],[-117.42941,34.10663],[-117.4141,34.14879],[-117.38913,34.18767],[-117.35544,34.22175],[-117.31434,34.24974],[-117.26739,34.27054],[-117.21642,34.28336],[-117.16339,34.28768]]]}},"University-of-South-Carolina":{type:"Feature",id:"University-of-South-Carolina",properties:{},geometry:{type:"Polygon",coordinates:[[[-81.03516,34.24082],[-80.98216,34.23649],[-80.93122,34.22368],[-80.8843,34.20288],[-80.84321,34.17489],[-80.80954,34.14081],[-80.78458,34.10193],[-80.76928,34.05977],[-80.76421,34.01594],[-80.76956,33.97214],[-80.78509,33.93005],[-80.81021,33.89127],[-80.84393,33.85729],[-80.88496,33.82942],[-80.93172,33.80871],[-80.98243,33.79597],[-81.03516,33.79166],[-81.08788,33.79597],[-81.13859,33.80871],[-81.18535,33.82942],[-81.22638,33.85729],[-81.26011,33.89127],[-81.28522,33.93005],[-81.30076,33.97214],[-81.3061,34.01594],[-81.30103,34.05977],[-81.28573,34.10193],[-81.26077,34.14081],[-81.2271,34.17489],[-81.18602,34.20288],[-81.1391,34.22368],[-81.08815,34.23649],[-81.03516,34.24082]]]}},"University-of-Southern-California":{type:"Feature",id:"University-of-Southern-California",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.30078,34.24082],[-118.24779,34.23649],[-118.19684,34.22368],[-118.14992,34.20288],[-118.10884,34.17489],[-118.07517,34.14081],[-118.05021,34.10193],[-118.03491,34.05977],[-118.02984,34.01594],[-118.03518,33.97214],[-118.05072,33.93005],[-118.07583,33.89127],[-118.10955,33.85729],[-118.15058,33.82942],[-118.19735,33.80871],[-118.24806,33.79597],[-118.30078,33.79166],[-118.3535,33.79597],[-118.40421,33.80871],[-118.45098,33.82942],[-118.49201,33.85729],[-118.52573,33.89127],[-118.55085,33.93005],[-118.56638,33.97214],[-118.57172,34.01594],[-118.56665,34.05977],[-118.55135,34.10193],[-118.52639,34.14081],[-118.49273,34.17489],[-118.45164,34.20288],[-118.40472,34.22368],[-118.35378,34.23649],[-118.30078,34.24082]]]}},"University-of-Vermont":{type:"Feature",id:"University-of-Vermont",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.21289,44.68973],[-73.15127,44.6854],[-73.09204,44.67257],[-73.0375,44.65175],[-72.98977,44.62374],[-72.95068,44.58962],[-72.92174,44.55072],[-72.90403,44.50855],[-72.89821,44.46472],[-72.90449,44.42092],[-72.92259,44.37884],[-72.9518,44.34008],[-72.99098,44.30613],[-73.03862,44.27829],[-73.09289,44.2576],[-73.15173,44.24487],[-73.21289,44.24057],[-73.27405,44.24487],[-73.33289,44.2576],[-73.38716,44.27829],[-73.4348,44.30613],[-73.47398,44.34008],[-73.50319,44.37884],[-73.52129,44.42092],[-73.52757,44.46472],[-73.52175,44.50855],[-73.50404,44.55072],[-73.4751,44.58962],[-73.43601,44.62374],[-73.38828,44.65175],[-73.33374,44.67257],[-73.27451,44.6854],[-73.21289,44.68973]]]}},"University-of-Victoria":{type:"Feature",id:"University-of-Victoria",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.31186,48.68804],[-123.24549,48.68371],[-123.18171,48.67087],[-123.123,48.65004],[-123.07162,48.62201],[-123.02956,48.58789],[-122.99842,48.54898],[-122.9794,48.5068],[-122.97318,48.46297],[-122.97997,48.41917],[-122.99948,48.3771],[-123.03094,48.33835],[-123.07312,48.30441],[-123.12438,48.27658],[-123.18277,48.25591],[-123.24607,48.24318],[-123.31186,48.23888],[-123.37764,48.24318],[-123.44094,48.25591],[-123.49933,48.27658],[-123.55059,48.30441],[-123.59277,48.33835],[-123.62423,48.3771],[-123.64374,48.41917],[-123.65053,48.46297],[-123.64431,48.5068],[-123.62529,48.54898],[-123.59415,48.58789],[-123.55209,48.62201],[-123.50071,48.65004],[-123.442,48.67087],[-123.37822,48.68371],[-123.31186,48.68804]]]}},"University-of-Wyoming":{type:"Feature",id:"University-of-Wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-105.56651,41.53953],[-105.50798,41.5352],[-105.45172,41.52238],[-105.39992,41.50157],[-105.35457,41.47356],[-105.31742,41.43946],[-105.2899,41.40057],[-105.27306,41.3584],[-105.26751,41.31457],[-105.27345,41.27077],[-105.29063,41.22868],[-105.31837,41.18992],[-105.3556,41.15596],[-105.40087,41.12811],[-105.45245,41.10742],[-105.50837,41.09468],[-105.56651,41.09038],[-105.62465,41.09468],[-105.68057,41.10742],[-105.73215,41.12811],[-105.77742,41.15596],[-105.81465,41.18992],[-105.84239,41.22868],[-105.85957,41.27077],[-105.86551,41.31457],[-105.85996,41.3584],[-105.84312,41.40057],[-105.8156,41.43946],[-105.77845,41.47356],[-105.7331,41.50157],[-105.6813,41.52238],[-105.62504,41.5352],[-105.56651,41.53953]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},"UW-Madison":{type:"Feature",id:"UW-Madison",properties:{},geometry:{type:"Polygon",coordinates:[[[-89.41268,43.30123],[-89.35248,43.2969],[-89.29462,43.28408],[-89.24134,43.26326],[-89.19471,43.23525],[-89.15652,43.20114],[-89.12823,43.16225],[-89.11092,43.12007],[-89.10523,43.07624],[-89.11135,43.03245],[-89.12903,42.99036],[-89.15756,42.9516],[-89.19584,42.91765],[-89.24239,42.8898],[-89.29542,42.86911],[-89.35291,42.85638],[-89.41268,42.85208],[-89.47245,42.85638],[-89.52994,42.86911],[-89.58298,42.8898],[-89.62952,42.91765],[-89.6678,42.9516],[-89.69634,42.99036],[-89.71401,43.03245],[-89.72014,43.07624],[-89.71444,43.12007],[-89.69713,43.16225],[-89.66884,43.20114],[-89.63065,43.23525],[-89.58402,43.26326],[-89.53074,43.28408],[-89.47288,43.2969],[-89.41268,43.30123]]]}},"Vassar-College":{type:"Feature",id:"Vassar-College",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.89515,41.91136],[-73.83628,41.90703],[-73.7797,41.8942],[-73.72759,41.87339],[-73.68198,41.84538],[-73.64462,41.81127],[-73.61695,41.77238],[-73.6,41.73021],[-73.59443,41.68639],[-73.60041,41.64259],[-73.61769,41.6005],[-73.64559,41.56174],[-73.68303,41.52778],[-73.72856,41.49993],[-73.78044,41.47924],[-73.83668,41.4665],[-73.89515,41.4622],[-73.95362,41.4665],[-74.00986,41.47924],[-74.06174,41.49993],[-74.10727,41.52778],[-74.14471,41.56174],[-74.17261,41.6005],[-74.1899,41.64259],[-74.19587,41.68639],[-74.1903,41.73021],[-74.17336,41.77238],[-74.14568,41.81127],[-74.10832,41.84538],[-74.06271,41.87339],[-74.01061,41.8942],[-73.95402,41.90703],[-73.89515,41.91136]]]}},"Villanova-University":{type:"Feature",id:"Villanova-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.34361,40.26191],[-75.28619,40.25758],[-75.23101,40.24476],[-75.18019,40.22394],[-75.13571,40.19594],[-75.09927,40.16184],[-75.07227,40.12296],[-75.05573,40.08079],[-75.05028,40.03696],[-75.0561,39.99316],[-75.07295,39.95107],[-75.10016,39.9123],[-75.13667,39.87834],[-75.18109,39.85048],[-75.23169,39.82979],[-75.28656,39.81705],[-75.34361,39.81275],[-75.40065,39.81705],[-75.45552,39.82979],[-75.50613,39.85048],[-75.55054,39.87834],[-75.58705,39.9123],[-75.61426,39.95107],[-75.63111,39.99316],[-75.63693,40.03696],[-75.63148,40.08079],[-75.61495,40.12296],[-75.58795,40.16184],[-75.5515,40.19594],[-75.50702,40.22394],[-75.4562,40.24476],[-75.40102,40.25758],[-75.34361,40.26191]]]}},"West-Virginia-University":{type:"Feature",id:"West-Virginia-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-79.98047,39.86412],[-79.92339,39.85979],[-79.86853,39.84697],[-79.81801,39.82616],[-79.77378,39.79816],[-79.73755,39.76405],[-79.7107,39.72517],[-79.69426,39.683],[-79.68884,39.63917],[-79.69462,39.59537],[-79.71137,39.55328],[-79.73842,39.51452],[-79.77473,39.48055],[-79.81888,39.4527],[-79.8692,39.432],[-79.92375,39.41926],[-79.98047,39.41496],[-80.03718,39.41926],[-80.09174,39.432],[-80.14206,39.4527],[-80.18621,39.48055],[-80.22252,39.51452],[-80.24957,39.55328],[-80.26632,39.59537],[-80.2721,39.63917],[-80.26668,39.683],[-80.25024,39.72517],[-80.22339,39.76405],[-80.18716,39.79816],[-80.14293,39.82616],[-80.09241,39.84697],[-80.03755,39.85979],[-79.98047,39.86412]]]}},"Western-Michigan-University":{type:"Feature",id:"Western-Michigan-University",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.61042,42.5082],[-85.55099,42.50387],[-85.49387,42.49105],[-85.44127,42.47023],[-85.39523,42.44222],[-85.35752,42.40811],[-85.32959,42.36922],[-85.31249,42.32705],[-85.30686,42.28322],[-85.3129,42.23942],[-85.33035,42.19734],[-85.35852,42.15858],[-85.39631,42.12462],[-85.44227,42.09677],[-85.49464,42.07608],[-85.55141,42.06334],[-85.61042,42.05904],[-85.66944,42.06334],[-85.72621,42.07608],[-85.77857,42.09677],[-85.82453,42.12462],[-85.86232,42.15858],[-85.89049,42.19734],[-85.90794,42.23942],[-85.91398,42.28322],[-85.90835,42.32705],[-85.89125,42.36922],[-85.86332,42.40811],[-85.82561,42.44222],[-85.77957,42.47023],[-85.72697,42.49105],[-85.66985,42.50387],[-85.61042,42.5082]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},western_australia:{type:"Feature",id:"western_australia",properties:{},geometry:{type:"Polygon",coordinates:[[[129.1402,-11.59709],[129.09732,-32.56637],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.1402,-11.59709]]]}},new_zealand_full:{type:"Feature",id:"new_zealand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[170.55176,-33.54139],[173.62793,-32.28713],[181.3623,-36.80928],[181.4502,-43.10098],[181.95557,-47.45781],[180.59326,-53.31775],[171.5625,-56.70451],[162.72949,-53.33087],[160.7959,-46.70974],[170.55176,-33.54139]]]}},oceania_full:{type:"Feature",properties:{},id:"oceania_full",geometry:{type:"Polygon",coordinates:[[[94.92188,-18.47961],[119.35547,-13.23995],[128.4082,-10.27168],[135.08789,-8.84165],[140.67993,-9.57908],[141.0157,-9.13193],[140.99716,-2.58091],[144.31641,10.09867],[156.97266,16.88866],[177.97852,15.96133],[193.44727,-2.81137],[197.75391,-14.26438],[193.18359,-40.71396],[161.89453,-55.37911],[102.65625,-45.58329],[94.92188,-18.47961]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]]],[[[-69.46999,-17.50394],[-69.47205,-17.61065],[-69.34708,-17.7343],[-69.30794,-17.83956],[-69.30931,-17.9121],[-69.29352,-17.96698],[-69.06143,-18.06231],[-69.11087,-18.1328],[-68.92548,-18.97253],[-68.40225,-19.41091],[-68.68309,-19.72793],[-68.52997,-19.85262],[-68.56842,-20.05658],[-68.76549,-20.08237],[-68.67279,-20.34591],[-68.73322,-20.38454],[-68.72772,-20.46948],[-68.47504,-20.64949],[-68.53546,-20.8524],[-68.405,-20.93964],[-68.19489,-21.27018],[-67.81586,-22.86099],[-67.55768,-22.89642],[-67.17728,-22.81416],[-66.98639,-23.00012],[-67.32216,-24.03768],[-68.24432,-24.39338],[-68.46405,-24.62829],[-68.5437,-24.79047],[-68.32397,-25.09928],[-68.48328,-25.15399],[-68.37067,-26.17639],[-68.5437,-26.27987],[-68.57666,-26.49147],[-68.25256,-26.96492],[-68.56567,-27.17525],[-68.78609,-27.10803],[-69.94308,-29.24087],[-69.93347,-30.10118],[-69.81262,-30.14869],[-69.88678,-30.35747],[-70.07904,-30.38828],[-70.53102,-31.3724],[-70.46185,-31.84548],[-70.22736,-31.93934],[-70.3125,-32.12562],[-70.08453,-33.03716],[-69.99561,-33.3268],[-69.86721,-33.28663],[-69.78207,-33.33282],[-69.8703,-33.57458],[-69.87854,-34.15614],[-70.3791,-35.17241],[-70.53875,-35.20551],[-70.58441,-35.27646],[-70.43884,-35.32549],[-70.37876,-36.04743],[-70.95932,-36.50246],[-71.04858,-36.49087],[-71.189,-37.74167],[-70.90816,-38.67251],[-71.39465,-38.92843],[-71.77643,-40.268],[-71.66794,-40.30571],[-71.70639,-40.425],[-71.80252,-40.42081],[-71.92612,-40.72332],[-71.73051,-42.11516],[-72.17194,-42.14686],[-72.04182,-42.40546],[-72.04765,-42.54322],[-72.14344,-42.90363],[-71.72596,-43.19066],[-71.8856,-43.45765],[-71.58417,-43.64303],[-71.81213,-44.30714],[-71.07056,-44.47985],[-71.24908,-44.80425],[-72.03495,-44.76989],[-72.03323,-44.88409],[-71.56494,-44.98326],[-71.41148,-45.19486],[-71.33354,-45.28286],[-71.3895,-45.35287],[-71.54383,-45.40436],[-71.47104,-45.49829],[-71.75291,-45.55168],[-71.64459,-46.00936],[-71.82037,-46.1256],[-71.64974,-46.68289],[-71.9426,-46.81204],[-71.87325,-47.12505],[-72.0504,-47.34557],[-72.46788,-47.7451],[-72.24472,-48.34986],[-72.56195,-48.50569],[-72.53174,-48.77746],[-72.68005,-48.89271],[-72.98733,-48.99351],[-73.51742,-49.89065],[-73.32687,-50.52827],[-72.34531,-50.65403],[-72.32412,-51.60426],[-72.03255,-51.8118],[-71.93324,-51.91854],[-72.04212,-51.96756],[-71.95221,-51.97896],[-71.92097,-52.00391],[-70.00412,-52.00423],[-69.49016,-52.15561],[-69.19421,-52.15445],[-68.84205,-52.28181],[-68.58833,-52.31016],[-68.57786,-52.32931],[-68.42268,-52.33665],[-68.42212,-52.39063],[-68.60412,-52.65417],[-68.60412,-54.90395],[-67.30412,-54.90395],[-65.80412,-55.20392],[-68,-58],[-78,-53],[-72.5,-18.3],[-70.19165,-18.33106],[-69.96918,-18.26065],[-69.86618,-18.17325],[-69.82018,-18.1191],[-69.75494,-17.98135],[-69.80919,-17.8023],[-69.82704,-17.75196],[-69.83047,-17.71337],[-69.80164,-17.65253],[-69.67049,-17.66692],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},"Universidad-de-Antioquia":{type:"Feature",id:"Universidad-de-Antioquia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-de-La-Guajira":{type:"Feature",id:"Universidad-de-La-Guajira",properties:{},geometry:{type:"Polygon",coordinates:[[[-72.86133,11.74767],[-72.81658,11.74335],[-72.77355,11.73056],[-72.73391,11.70979],[-72.69917,11.68184],[-72.67067,11.64779],[-72.64951,11.60895],[-72.6365,11.56681],[-72.63213,11.523],[-72.63657,11.47919],[-72.64964,11.43707],[-72.67084,11.39826],[-72.69935,11.36424],[-72.73408,11.33633],[-72.77368,11.31559],[-72.81665,11.30282],[-72.86133,11.29851],[-72.90601,11.30282],[-72.94897,11.31559],[-72.98858,11.33633],[-73.0233,11.36424],[-73.05182,11.39826],[-73.07302,11.43707],[-73.08609,11.47919],[-73.09053,11.523],[-73.08616,11.56681],[-73.07314,11.60895],[-73.05198,11.64779],[-73.02349,11.68184],[-72.98875,11.70979],[-72.9491,11.73056],[-72.90608,11.74335],[-72.86133,11.74767]]]}},"Universidad-de-Los-Andes":{type:"Feature",id:"Universidad-de-Los-Andes",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.79005],[-74.04783,4.78574],[-74.00556,4.77295],[-73.9666,4.75219],[-73.93245,4.72426],[-73.90444,4.69022],[-73.88363,4.65139],[-73.87082,4.60925],[-73.8665,4.56544],[-73.87085,4.52163],[-73.88368,4.4795],[-73.9045,4.44068],[-73.93253,4.40665],[-73.96666,4.37873],[-74.00561,4.35798],[-74.04786,4.34521],[-74.0918,4.34089],[-74.13574,4.34521],[-74.17799,4.35798],[-74.21693,4.37873],[-74.25107,4.40665],[-74.27909,4.44068],[-74.29992,4.4795],[-74.31275,4.52163],[-74.31709,4.56544],[-74.31278,4.60925],[-74.29997,4.65139],[-74.27915,4.69022],[-74.25114,4.72426],[-74.217,4.75219],[-74.17804,4.77295],[-74.13576,4.78574],[-74.0918,4.79005]]]}},"Universidad-de-San-Buenaventura":{type:"Feature",id:"Universidad-de-San-Buenaventura",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.58594,6.45251],[-75.54185,6.4482],[-75.49945,6.43541],[-75.46038,6.41465],[-75.42614,6.38671],[-75.39805,6.35267],[-75.37719,6.31384],[-75.36435,6.2717],[-75.36003,6.22789],[-75.36438,6.18407],[-75.37726,6.14195],[-75.39814,6.10313],[-75.42624,6.06911],[-75.46047,6.04119],[-75.49952,6.02044],[-75.54188,6.00767],[-75.58594,6.00336],[-75.62999,6.00767],[-75.67236,6.02044],[-75.7114,6.04119],[-75.74563,6.06911],[-75.77373,6.10313],[-75.79462,6.14195],[-75.80749,6.18407],[-75.81185,6.22789],[-75.80753,6.2717],[-75.79469,6.31384],[-75.77382,6.35267],[-75.74573,6.38671],[-75.71149,6.41465],[-75.67242,6.43541],[-75.63003,6.4482],[-75.58594,6.45251]]]}},"Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"Feature",id:"Universidad-Distrital-Francisco-Jose-de-Caldas",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},"Universidad-Nacional-de-Colombia":{type:"Feature",id:"Universidad-Nacional-de-Colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.0918,4.87766],[-74.04782,4.87334],[-74.00554,4.86056],[-73.96658,4.8398],[-73.93243,4.81186],[-73.90442,4.77782],[-73.8836,4.73899],[-73.87079,4.69686],[-73.86648,4.65304],[-73.87082,4.60923],[-73.88365,4.56711],[-73.90448,4.52829],[-73.93251,4.49426],[-73.96665,4.46634],[-74.0056,4.44559],[-74.04785,4.43281],[-74.0918,4.4285],[-74.13574,4.43281],[-74.178,4.44559],[-74.21695,4.46634],[-74.25109,4.49426],[-74.27911,4.52829],[-74.29994,4.56711],[-74.31278,4.60923],[-74.31712,4.65304],[-74.3128,4.69686],[-74.29999,4.73899],[-74.27918,4.77782],[-74.25116,4.81186],[-74.21701,4.8398],[-74.17805,4.86056],[-74.13577,4.87334],[-74.0918,4.87766]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},uruguay:{type:"Feature",id:"uruguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-58.37,-33.12],[-58.15,-33.07],[-58.09,-33],[-58.2,-32.48],[-58.18,-32.37],[-58.11,-32.33],[-58.1,-32.25],[-58.18,-32.16],[-58.15,-32],[-58.2,-31.86],[-58.07,-31.81],[-57.98,-31.58],[-58.04,-31.5],[-57.91,-31.23],[-57.88,-30.97],[-57.8,-30.9],[-57.89,-30.5],[-57.63,-30.34],[-57.6,-30.2],[-57.2,-30.3],[-57.1,-30.1],[-56.8,-30.1],[-56,-30.8],[-56,-31.1],[-55.6,-30.85],[-53.8,-32],[-53.5,-32.5],[-53.1,-32.7],[-53.5,-33.1],[-53.5,-33.7],[-53,-34],[-55,-36],[-58,-34.6],[-58.4,-34],[-58.5,-33.6],[-58.37,-33.12]]]}},venezuela:{type:"Feature",id:"venezuela",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-73.42,9.2],[-73.42,9.25],[-73.36,9.3],[-73.36,9.34],[-73.33,9.37],[-73.31,9.43],[-73.27,9.47],[-73.26,9.52],[-73.18,9.61],[-73.14,9.63],[-73.12,9.71],[-73.07,9.77],[-73.05,9.82],[-73.07,9.94],[-73.03,10.03],[-73.03,10.07],[-72.99,10.13],[-72.97,10.23],[-72.98,10.36],[-72.96,10.48],[-72.91,10.52],[-72.9,10.58],[-72.8,10.69],[-72.78,10.78],[-72.74,10.83],[-72.71,10.92],[-72.67,10.95],[-72.64,10.95],[-72.61,10.98],[-72.57,11.06],[-72.56,11.13],[-72.53,11.16],[-72.46,11.2],[-72.4,11.2],[-72.37,11.22],[-72.29,11.21],[-72.04,11.67],[-72,11.71],[-71.8,11.75],[-71.45,11.86],[-71.44,11.88],[-71.36,11.92],[-71,12.01],[-71,12.12],[-71.12,12.26],[-71.15,12.38],[-71.2,12.46],[-71.22,12.54],[-71.18,12.65],[-71.12,12.72],[-71.01,12.78],[-70.89,12.79],[-70.38,12.62],[-70.35,12.59],[-70.35,12.42],[-70.12,12.43],[-69.72,12.33],[-69.04,11.94],[-68.92,11.82],[-68.81,11.81],[-68.59,11.74],[-68.06,11.74],[-68.05,12.24],[-67.8,12.38],[-67.63,12.39],[-66.59,12.29],[-66.07,12.19],[-64.56,12.22],[-62.93,11.72],[-61.67,10.99],[-61.66,10.88],[-61.73,10.71],[-61.74,10.55],[-61.78,10.52],[-61.82,10.52],[-61.99,10.09],[-61.98,10.08],[-61.89,10.06],[-61.62,10.06],[-61.48,10.04],[-61.18,9.94],[-61.08,9.87],[-60.94,9.85],[-60.85,9.81],[-60.76,9.72],[-60.7,9.7],[-59.5,8.74],[-59.47,8.68],[-59.49,8.64],[-59.52,8.62],[-59.87,8.5],[-59.74,8.33],[-59.73,8.26],[-59.76,8.2],[-59.81,8.16],[-59.9,8.15],[-59.93,8.09],[-59.93,8.05],[-59.98,7.98],[-60.05,7.95],[-60.08,7.96],[-60.1,7.93],[-60.17,7.9],[-60.24,7.82],[-60.26,7.82],[-60.33,7.76],[-60.47,7.76],[-60.5,7.73],[-60.52,7.61],[-60.54,7.58],[-60.57,7.57],[-60.57,7.55],[-60.61,7.51],[-60.57,7.47],[-60.53,7.39],[-60.52,7.29],[-60.55,7.26],[-60.54,7.24],[-60.49,7.27],[-60.33,7.25],[-60.25,7.19],[-60.22,7.14],[-60.22,7.05],[-60.25,6.99],[-60.3,6.95],[-60.31,6.9],[-60.36,6.86],[-60.43,6.86],[-60.46,6.82],[-60.5,6.8],[-60.62,6.77],[-60.63,6.74],[-60.69,6.69],[-60.73,6.68],[-60.82,6.72],[-60.92,6.65],[-61.05,6.65],[-61.08,6.63],[-61.11,6.64],[-61.11,6.61],[-61.13,6.59],[-61.07,6.44],[-61.09,6.34],[-61.05,6.31],[-61.04,6.28],[-61.06,6.23],[-61.05,6.2],[-61.07,6.14],[-61.12,6.11],[-61.17,6.05],[-61.22,6.04],[-61.26,6],[-61.29,5.93],[-60.7,5.27],[-60.62,5.23],[-60.57,5.13],[-60.57,5.08],[-60.51,4.96],[-60.53,4.89],[-60.68,4.72],[-60.86,4.63],[-60.87,4.55],[-60.97,4.45],[-61.08,4.45],[-61.1,4.42],[-61.13,4.41],[-61.17,4.41],[-61.21,4.44],[-61.3,4.36],[-61.44,4.36],[-61.45,4.35],[-61.44,4.3],[-61.46,4.25],[-61.54,4.18],[-61.71,4.18],[-61.74,4.17],[-61.75,4.14],[-61.81,4.09],[-61.87,4.08],[-61.91,4.05],[-61.95,4.05],[-62,4.09],[-62.05,4.06],[-62.08,4.02],[-62.12,4.01],[-62.17,4.01],[-62.22,4.04],[-62.31,4.07],[-62.36,4.07],[-62.41,4.1],[-62.46,4.06],[-62.47,4.01],[-62.51,3.96],[-62.6,3.95],[-62.63,3.97],[-62.67,3.97],[-62.7,3.91],[-62.66,3.83],[-62.66,3.69],[-62.68,3.64],[-62.73,3.6],[-62.76,3.6],[-62.83,3.64],[-62.94,3.54],[-63.03,3.55],[-63.08,3.61],[-63.12,3.63],[-63.15,3.68],[-63.15,3.74],[-63.22,3.74],[-63.26,3.76],[-63.3,3.83],[-63.3,3.89],[-63.35,3.89],[-63.37,3.83],[-63.4,3.8],[-63.45,3.79],[-63.47,3.77],[-63.59,3.8],[-63.65,3.85],[-63.72,3.83],[-63.82,3.87],[-63.88,3.86],[-63.94,3.8],[-63.99,3.8],[-64.11,3.91],[-64.18,4.05],[-64.38,4.07],[-64.48,4.04],[-64.6,4.04],[-64.57,4],[-64.52,3.97],[-64.5,3.92],[-64.44,3.86],[-64.34,3.83],[-64.23,3.76],[-64.21,3.71],[-64.14,3.65],[-64.1,3.58],[-64.11,3.48],[-64.16,3.42],[-64.16,3.33],[-64.13,3.26],[-64.14,3.14],[-64.01,2.96],[-64,2.9],[-63.96,2.86],[-63.91,2.75],[-63.92,2.61],[-63.97,2.54],[-63.81,2.56],[-63.74,2.52],[-63.56,2.52],[-63.52,2.5],[-63.47,2.5],[-63.44,2.52],[-63.38,2.51],[-63.31,2.45],[-63.29,2.39],[-63.31,2.19],[-63.33,2.13],[-63.37,2.08],[-63.49,2.04],[-63.53,2.04],[-63.55,2.06],[-63.64,1.95],[-63.69,1.95],[-63.81,1.9],[-63.96,1.91],[-63.99,1.88],[-63.98,1.79],[-64,1.76],[-63.99,1.68],[-64.01,1.61],[-64.07,1.53],[-64.13,1.51],[-64.17,1.45],[-64.25,1.41],[-64.27,1.33],[-64.3,1.3],[-64.32,1.29],[-64.38,1.3],[-64.45,1.34],[-64.47,1.38],[-64.54,1.28],[-64.64,1.23],[-64.69,1.17],[-64.78,1.16],[-64.81,1.19],[-64.84,1.16],[-64.91,1.15],[-64.92,1.11],[-64.99,1.04],[-65.09,1.05],[-65.08,0.98],[-65.1,0.96],[-65.11,0.91],[-65.17,0.84],[-65.23,0.83],[-65.25,0.85],[-65.29,0.85],[-65.29,0.83],[-65.33,0.8],[-65.33,0.72],[-65.42,0.62],[-65.45,0.62],[-65.51,0.58],[-65.57,0.58],[-65.66,0.65],[-65.68,0.7],[-65.64,0.8],[-65.58,0.87],[-65.58,0.89],[-65.62,0.92],[-65.72,0.92],[-65.74,0.89],[-65.79,0.89],[-65.83,0.87],[-65.9,0.81],[-65.93,0.75],[-66,0.74],[-66.06,0.69],[-66.17,0.68],[-66.21,0.7],[-66.34,0.68],[-66.9,1.18],[-66.95,1.25],[-66.95,1.32],[-66.93,1.35],[-66.96,1.36],[-66.98,1.4],[-66.98,1.49],[-67.03,1.56],[-67.03,1.62],[-67.1,1.76],[-67.12,1.87],[-67.19,1.95],[-67.19,2.02],[-67.17,2.06],[-67.23,2.1],[-67.29,2.23],[-67.29,2.31],[-67.27,2.35],[-67.35,2.39],[-67.4,2.47],[-67.53,2.59],[-67.57,2.58],[-67.61,2.6],[-67.64,2.64],[-67.65,2.73],[-67.7,2.73],[-67.78,2.76],[-67.82,2.72],[-67.88,2.72],[-67.93,2.76],[-67.92,2.91],[-67.39,3.38],[-67.39,3.4],[-67.43,3.41],[-67.46,3.44],[-67.48,3.52],[-67.51,3.55],[-67.52,3.64],[-67.54,3.68],[-67.63,3.68],[-67.7,3.75],[-67.71,3.84],[-67.76,3.91],[-67.79,4.08],[-67.83,4.12],[-67.87,4.22],[-67.88,4.32],[-67.85,4.39],[-67.93,4.52],[-67.91,4.58],[-67.92,4.64],[-67.89,4.71],[-67.9,4.75],[-67.89,4.84],[-67.91,4.87],[-67.89,5.07],[-67.92,5.11],[-67.92,5.17],[-67.9,5.2],[-67.9,5.23],[-67.92,5.25],[-67.92,5.32],[-67.84,5.42],[-67.77,5.45],[-67.76,5.47],[-67.69,5.51],[-67.68,5.54],[-67.71,5.63],[-67.71,5.69],[-67.67,5.85],[-67.57,5.97],[-67.53,5.98],[-67.51,6.01],[-67.56,6.1],[-67.56,6.18],[-67.64,6.22],[-67.72,6.23],[-67.78,6.22],[-67.82,6.24],[-67.88,6.18],[-67.99,6.13],[-68.07,6.13],[-68.1,6.16],[-68.14,6.16],[-68.16,6.14],[-68.21,6.14],[-68.29,6.09],[-68.34,6.09],[-68.37,6.11],[-68.48,6.11],[-68.51,6.08],[-68.6,6.08],[-68.62,6.06],[-68.82,6.08],[-68.84,6.1],[-69.03,6.12],[-69.06,6.14],[-69.11,6.09],[-69.15,6.08],[-69.17,6.04],[-69.2,6.02],[-69.29,6.01],[-69.37,6.05],[-69.45,6.04],[-69.49,6.06],[-70.15,6.91],[-70.19,6.91],[-70.28,6.86],[-70.32,6.86],[-70.38,6.88],[-70.41,6.91],[-70.53,6.94],[-70.59,7],[-70.62,6.99],[-70.69,7.02],[-70.79,7.01],[-71.02,6.9],[-71.1,6.91],[-71.17,6.95],[-71.25,6.94],[-71.29,6.96],[-71.41,6.96],[-71.49,6.94],[-71.52,6.96],[-71.72,6.96],[-71.77,6.99],[-71.84,6.95],[-71.98,6.94],[-72.07,6.97],[-72.11,7],[-72.24,7.23],[-72.24,7.31],[-72.36,7.31],[-72.37,7.33],[-72.45,7.33],[-72.49,7.35],[-72.51,7.38],[-72.51,7.43],[-72.54,7.45],[-72.55,7.5],[-72.53,7.58],[-72.55,7.62],[-72.55,7.68],[-72.54,7.81],[-72.52,7.87],[-72.56,7.92],[-72.56,7.96],[-72.54,8],[-72.49,8.03],[-72.48,8.07],[-72.44,8.1],[-72.46,8.31],[-72.71,8.57],[-72.83,9.04],[-72.84,9.05],[-72.92,9.01],[-72.97,9.02],[-73.05,9.11],[-73.06,9.13],[-73.05,9.17],[-73.1,9.16],[-73.15,9.11],[-73.22,9.09],[-73.36,9.1],[-73.41,9.14],[-73.42,9.2]]],[[[-63.33,15.69],[-63.33,15.62],[-63.35,15.56],[-63.44,15.45],[-63.55,15.4],[-63.65,15.39],[-63.78,15.43],[-63.87,15.51],[-63.92,15.61],[-63.93,15.73],[-63.89,15.84],[-63.82,15.92],[-63.7,15.98],[-63.6,15.99],[-63.49,15.96],[-63.39,15.88],[-63.33,15.76],[-63.33,15.69]]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
24873
24874         var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny":{type:"youthmappers",name:"YouthMappers CURAT",description:"YouthMappers chapter at Centre Universitaire de Recherche et d'Application en Télédétection (CURAT) de l'Université Felix Houphouet Boigny",id:"ym-Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",featureId:"Centre-Universitaire-de-Recherche-et-dApplication-en-Tldtection-CURAT-de-lUniversit-Felix-Houphouet-Boigny",contacts:[{name:"Organizer",email:"gpcome@gmail.com"}],extendedDescription:"Our chapter aim is to promote the use of collaborative free mapping and the use of openstreetmap data in the field of research and their application in the implementation of tools for decision-making. Help students produce their own data of their research.",countryCodes:["ci"],url:"mailto:gpcome@gmail.com"},"ym-The-Gambia-YMCA-University-of-the-Gambia":{type:"youthmappers",name:"Connected YouthMappers",description:"YouthMappers chapter at The Gambia YMCA / University of the Gambia",id:"ym-The-Gambia-YMCA-University-of-the-Gambia",featureId:"The-Gambia-YMCA-University-of-the-Gambia",contacts:[{name:"Organizer",email:"connectedyouthmappers@gmail.com"}],extendedDescription:"Connected YouthMappers is comprised of dedicated young Gambians who aspire to change and aid national development.",countryCodes:["gm"],url:"mailto:connectedyouthmappers@gmail.com"},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"ym-Kwame-Nkrumah-University-of-Science-and-Technology":{type:"youthmappers",name:"Kwame Nkrumah University of Science and Technology YouthMappers",description:"YouthMappers chapter at Kwame Nkrumah University of Science and Technology",id:"ym-Kwame-Nkrumah-University-of-Science-and-Technology",featureId:"Kwame-Nkrumah-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"knustyouthmappers@outlook.com"}],countryCodes:["gh"],url:"https://www.facebook.com/KNUSTMappers/"},"ym-University-of-Cape-Coast":{type:"youthmappers",name:"UCC Geographical Society",description:"YouthMappers chapter at University of Cape Coast",id:"ym-University-of-Cape-Coast",featureId:"University-of-Cape-Coast",contacts:[{name:"Organizer",email:"geosoc_ucc@yahoo.com"}],extendedDescription:"We are a society that encompasses all students who are reading and read geography in the Department of Geography and Regional Planning at the University of Cape Coast. Our main aim is to promote interest in the discipline inside and outside of the classroom. Our motto is “We comprehend the Earth and its inhabitants.”",countryCodes:["gh"],url:"https://www.facebook.com/Geographical-Society-Ucc-105157196204838/info/?tab=page_info"},"ym-University-of-Energy-and-Natural-Resources":{type:"youthmappers",name:"Eco-Club",description:"YouthMappers chapter at University of Energy and Natural Resources",id:"ym-University-of-Energy-and-Natural-Resources",featureId:"University-of-Energy-and-Natural-Resources",contacts:[{name:"Organizer",email:"james.agyei-ohemeng@uenr.edu.gh"}],extendedDescription:"To provide a sound education to all citizens about the deteriorating environment and provide utmost use of recreation of the environment for human survival.",countryCodes:["gh"],url:"mailto:james.agyei-ohemeng@uenr.edu.gh"},"ym-University-of-Ghana":{type:"youthmappers",name:"University of Ghana YouthMappers",description:"YouthMappers chapter at University of Ghana",id:"ym-University-of-Ghana",featureId:"University-of-Ghana",contacts:[{name:"Organizer",email:"mawulikaf@gmail.com"}],extendedDescription:"UG YouthMappers consists of both graduate and undergraduate students possessing knowledge and skills in GIS and Remote Sensing. The club is composed of an energetic team that is poised to address social issues and mitigate environmental problems through mapping. Our fundamental principles are capacity building, empowerment and teamwork.",countryCodes:["gh"],url:"https://twitter.com/UGYouthMappers"},"ym-University-of-Mines-and-Technology":{type:"youthmappers",name:"UMaT YouthMappers",description:"YouthMappers chapter at University of Mines and Technology",id:"ym-University-of-Mines-and-Technology",featureId:"University-of-Mines-and-Technology",contacts:[{name:"Organizer",email:"kwadzo459@gmail.com"}],extendedDescription:"UMaT YouthMappers is a group of volunteer students who seek to grant students the opportunity to improve skills in the field of mapping & creating open geographic data and analyses that address locally defined development challenges worldwide.",countryCodes:["gh"],url:"http://umatyouthmappers.wordpress.com/"},"ym-General-Lansana-Conte-University":{type:"youthmappers",name:"YouthMappers General Lansana Conte University",description:"YouthMappers chapter at General Lansana Conte University",id:"ym-General-Lansana-Conte-University",featureId:"General-Lansana-Conte-University",contacts:[{name:"Organizer",email:"condefa3@gmail.com"}],extendedDescription:"The YouthMappers of the University General Lansana Conté is a non profit community willing to contribute to Map Guinea and others part of the world. We are promoting the use of GIS and Open data to build decision support tools. We also work to build capacities among the students and local communities.",countryCodes:["gn"],url:"www.uglc.org"},"ym-Institute-of-Science-and-Veterinary-Medicine":{type:"youthmappers",name:"YouthMappers ISSMV Dalaba",description:"YouthMappers chapter at Institute of Science and Veterinary Medicine",id:"ym-Institute-of-Science-and-Veterinary-Medicine",featureId:"Institute-of-Science-and-Veterinary-Medicine",contacts:[{name:"Organizer",email:"bvloua45@gmail.com"}],extendedDescription:"YouthMappers ISSMV Dabala is a non profit organisation working to promote humanitarian mapping and the use of open sources and open data to build decision making tools in Guinea.",countryCodes:["gn"],url:"mailto:bvloua45@gmail.com"},"ym-Universit-de-NZrkor":{type:"youthmappers",name:"Youthmappers à N'Zérékoré",description:"YouthMappers chapter at Université de N'Zérékoré",id:"ym-Universit-de-NZrkor",featureId:"Universit-de-NZrkor",contacts:[{name:"Organizer",email:"donpaul1974@gmail.com"}],extendedDescription:"YouthMappers est un groupe qui permet de faire la cartographie des communautés enclavées et à la prise des décisions en cas de catastrophes ou épidémies. Elle permet aussi la production et l'utilisation des données en accès gratuit.",countryCodes:["gn"],url:"mailto:donpaul1974@gmail.com"},"ym-Dedan-Kimathi-University-of-Technology":{type:"youthmappers",name:"GDEV",description:"YouthMappers chapter at Dedan Kimathi University of Technology",id:"ym-Dedan-Kimathi-University-of-Technology",featureId:"Dedan-Kimathi-University-of-Technology",contacts:[{name:"Organizer",email:"gdevkenya@gmail.com"}],extendedDescription:"GDEV is a group of enthusiastic GIS group at DeKUT that aims at helping students share, engage and learn from each other in matters geospatial",countryCodes:["ke"],url:"https://plus.google.com/u/0/communities/102367719061492681269/stream/e376a295-1246-4e19-9f66-fa6077719f32"},"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology":{type:"youthmappers",name:"Association of Geomatics Engineering Students",description:"YouthMappers chapter at Jomo Kenyatta University of Agriculture and Technology",id:"ym-Jomo-Kenyatta-University-of-Agriculture-and-Technology",featureId:"Jomo-Kenyatta-University-of-Agriculture-and-Technology",contacts:[{name:"Organizer",email:"laurahmugeha36@gmail.com"}],extendedDescription:"The Association of Geomatics Engineering Students (AGES), aims at promoting GIS products and services as well as training students on the use of the same. It not only promotes socialization between the students and practicing professionals, but also provides a platform for exchanging new ideas for holding new GIS and surveying events and training at the university.",countryCodes:["ke"],url:"mailto:laurahmugeha36@gmail.com"},"ym-Karatina-University":{type:"youthmappers",name:"Nature Club Karatina University",description:"YouthMappers chapter at Karatina University",id:"ym-Karatina-University",featureId:"Karatina-University",contacts:[{name:"Organizer",email:"karunatureclub@gmail.com"}],extendedDescription:"This chapter aims to bring together all GIS enthusiasts.They include environment experts, wildlife experts, aquatic and tourism officers, just to mention a few. Its main aim is to provide a platform where students can learn from each other and, in the process, understand how to integrate the GIS skills in their various career paths as well as provide solutions to various environmental related challenges.",countryCodes:["ke"],url:"https://twitter.com/karunature"},"ym-Kenyatta-University":{type:"youthmappers",name:"Kenyatta University GIS Club",description:"YouthMappers chapter at Kenyatta University",id:"ym-Kenyatta-University",featureId:"Kenyatta-University",contacts:[{name:"Organizer",email:"jamesmagige24@gmail.com"}],extendedDescription:"Kenyatta University GIS Club (KUGISC) was founded on 28th October 2016, with more than 200 students and staff from all faculty within campus as members. We are committed to empower members with spatial knowledge, skills and expertise required in understanding the Earth. We help in mapping resources within the university by incorporating geospatial data in their projects as well as fieldwork data collection.",countryCodes:["ke"],url:"mailto:jamesmagige24@gmail.com"},"ym-Moi-University":{type:"youthmappers",name:"Geography Students Association",description:"YouthMappers chapter at Moi University",id:"ym-Moi-University",featureId:"Moi-University",contacts:[{name:"Organizer",email:"geosamu44@gmail.com"}],extendedDescription:"The Geography Students Association at Moi University (GEOSAMU) explores, discovers and aims at developing the entire world through the young Geo-Spatial analysts.  GEOSAMU is part of the Department of Geography.",countryCodes:["ke"],url:"mailto:geosamu44@gmail.com?subject=YouthMappers%20at%20Moi%20University"},"ym-Technical-University-of-Kenya":{type:"youthmappers",name:"Geospatial Science Student Association",description:"YouthMappers chapter at Technical University of Kenya",id:"ym-Technical-University-of-Kenya",featureId:"Technical-University-of-Kenya",contacts:[{name:"Organizer",email:"youthmappers.tuk@gmail.com"}],extendedDescription:"It's a geographical information based group with very passionate students in the relevant fields of study. We do training to members on emerging trends in the market and keep up with technological advancements",countryCodes:["ke"],url:"mailto:youthmappers.tuk@gmail.com"},"ym-University-of-Nairobi":{type:"youthmappers",name:"Geospatial Engineering Students Association",description:"YouthMappers chapter at University of Nairobi",id:"ym-University-of-Nairobi",featureId:"University-of-Nairobi",contacts:[{name:"Organizer",email:"contact@mapkibera.org"}],extendedDescription:"UN students are working with the local OSM community, Map Kibera, and GrouthTruth to learn about open mapping and contribute data for needs in their urban communities.",countryCodes:["ke"],url:"www.geospatial.uonbi.ac.ke"},"ym-African-Methodist-Episcopal-University":{type:"youthmappers",name:"YouthMappers-AMEU",description:"YouthMappers chapter at African Methodist Episcopal University",id:"ym-African-Methodist-Episcopal-University",featureId:"African-Methodist-Episcopal-University",contacts:[{name:"Organizer",email:"youthmapper.ameu@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmapper.ameu@gmail.com"},"ym-Cuttington-University":{type:"youthmappers",name:"Cuttington University YouthMappers",description:"YouthMappers chapter at Cuttington University",id:"ym-Cuttington-University",featureId:"Cuttington-University",contacts:[{name:"Organizer",email:"youthmappers.cu@gmail.com"}],extendedDescription:"The YouthMappers at Cuttington University, Suakoko, and Bong County comprised of Students from three different departments; namely, the Department of Natural Resources Management “DONRM”, Department of Environmental Sciences, and the Department of Natural Sciences. Since the establishment of the Chapter in February 2017, the overall membership is  20 students, with each department containing 5 students.",countryCodes:["lr"],url:"mailto:youthmappers.cu@gmail.com"},"ym-Grand-Gedeh-County-Community-College":{type:"youthmappers",name:"YouthMappers at Grand Gedeh County Community College",description:"YouthMappers chapter at Grand Gedeh County Community College",id:"ym-Grand-Gedeh-County-Community-College",featureId:"Grand-Gedeh-County-Community-College",contacts:[{name:"Organizer",email:"yimodaxzibitallison@gmail.com"}],extendedDescription:"The Youth Mappers of GGCCC sole intent is to put  places in and around Liberia  that are not on the map. We gather youths from the college within the Grand Gedeh Community College to make it their duties to unite and bring these places to the spot light geographically.",countryCodes:["lr"],url:"mailto:yimodaxzibitallison@gmail.com"},"ym-Nimba-County-Community-College":{type:"youthmappers",name:"Nimba County Community College Youth Mappers",description:"YouthMappers chapter at Nimba County Community College",id:"ym-Nimba-County-Community-College",featureId:"Nimba-County-Community-College",contacts:[{name:"Organizer",email:"ncccyouthmappers@yahoo.com"}],countryCodes:["lr"],url:"mailto:ncccyouthmappers@yahoo.com"},"ym-Stella-Maris-Polytechnic":{type:"youthmappers",name:"YouthMappers-SMP",description:"YouthMappers chapter at Stella Maris Polytechnic",id:"ym-Stella-Maris-Polytechnic",featureId:"Stella-Maris-Polytechnic",contacts:[{name:"Organizer",email:"youthmappers.smp@gmail.com"}],countryCodes:["lr"],url:"mailto:youthmappers.smp@gmail.com"},"ym-University-of-Liberia-YouthMappers":{type:"youthmappers",name:"University of Liberia YouthMappers",description:"YouthMappers chapter at University of Liberia YouthMappers",id:"ym-University-of-Liberia-YouthMappers",featureId:"University-of-Liberia-YouthMappers",contacts:[{name:"Organizer",email:"ulym2017@gmail.com"}],extendedDescription:"The University of Liberia YouthMappers is a chapter organization of the Global YouthMappers. We are a nonprofit student mapping organization focus on mapping for Liberia’s development and the World at large. The purpose of this organization shall be to utilize technology and geospatial knowledge as means of creating and developing maps; collecting and analyzing data that will address local and worldwide challenges. Our aim is to support and create opportunity for students to develop interest and skills in the fields of mapping. We envision a united student community that are collaborative, active and are willing to work with the University of Liberia YouthMappers in order to better the lives of others.",countryCodes:["lr"],url:"mailto:ulym2017@gmail.com"},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"ym-University-of-Malawi":{type:"youthmappers",name:"Chanco Malawi YouthMappers",description:"YouthMappers chapter at University of Malawi",id:"ym-University-of-Malawi",featureId:"University-of-Malawi",contacts:[{name:"Organizer",email:"zolamanyungwa@gmail.com"}],extendedDescription:"Chanco Malawi YouthMappers is the student mapping organization for the University of Malawi's Chancellor College. The students in this chapter focus on mapping for Malawi's development and science needs.",countryCodes:["mw"],url:"mailto:zolamanyungwa@gmail.com"},"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako":{type:"youthmappers",name:"Etudiant au Laboratoire HoPE",description:"YouthMappers chapter at Université des Sciences Sociale et de Gestion de Bamako",id:"ym-Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",featureId:"Universit-des-Sciences-Sociale-et-de-Gestion-de-Bamako",contacts:[{name:"Organizer",email:"youthmappersfhg@gmail.com"}],countryCodes:["ml"],url:"mailto:youthmappersfhg@gmail.com"},"ym-Universidade-Eduardo-Mondlane":{type:"youthmappers",name:"Comunidade YouthMappers Moçambique",description:"YouthMappers chapter at Universidade Eduardo Mondlane",id:"ym-Universidade-Eduardo-Mondlane",featureId:"Universidade-Eduardo-Mondlane",contacts:[{name:"Organizer",email:"moz.youthmappers1@hotmail.com"}],extendedDescription:"We are a student group that intends to join Mozambican society to create a resilient community of humanitarian mapping. The community intend to map the physical occupation of our Country and create open geographic data, accessible to the public and able to be used in several areas without associated costs.",countryCodes:["mz"],url:"www.facebook.com/Moz-YouthMappers"},"ym-Namibia-University-of-Science-and-Technology":{type:"youthmappers",name:"Geoinformation Technology Student Society",description:"YouthMappers chapter at Namibia University of Science and Technology",id:"ym-Namibia-University-of-Science-and-Technology",featureId:"Namibia-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"patriciasem87@gmail.com"}],countryCodes:["na"],url:"mailto:patriciasem87@gmail.com"},"ym-Abia-State-University":{type:"youthmappers",name:"AbsuMappersTeam",description:"YouthMappers chapter at Abia State University",id:"ym-Abia-State-University",featureId:"Abia-State-University",contacts:[{name:"Organizer",email:"absumappersteam@gmail.com"}],extendedDescription:"AbsuMappersTeam is  voluntary team of map enthusiast ,using openstreetmap,GIS and other open source geospatial techno;ogy to solve problems.It is a dedicated for disaster response using OpenStreetMap.It is a  professional mentoring  and empowerment platform for  those with passion for GIS and Mapping.It is a community of  volunteers for geospatial data creation,field data collection and mapping.The team was co-founded by Victor N.Sunday(the Team mentor) and Professor J.U.Ogbonna ,the team coordinator and faculty Advisor. AbsuMapperTeam is an affiliate of UniiqueMappersTeam-Port Harcourt.The team stands to support sustainable development using geospatial  technology",countryCodes:["ng"],url:"https://www.facebook.com/Absumappersteam-1709186109157466"},"ym-Ahmadu-Bello-University":{type:"youthmappers",name:"ABU Geomappers",description:"YouthMappers chapter at Ahmadu Bello University",id:"ym-Ahmadu-Bello-University",featureId:"Ahmadu-Bello-University",contacts:[{name:"Organizer",email:"abugeomappers@gmail.com"}],extendedDescription:"We are a group of Data driven Humanitarian mappers, who are dedicated to rendering humanitarian service in response to disaster and mitigation. We are glad to contribute our expertise and knowledge through mapping, and helping to spread #OpenEvangelism through Training, and collaboration.",countryCodes:["ng"],url:"https://web.facebook.com/abugeomappers/"},"ym-Federal-School-of-Surveys":{type:"youthmappers",name:"OyoMappersTeam (OMT) Oyo",description:"YouthMappers chapter at Federal School of Surveys",id:"ym-Federal-School-of-Surveys",featureId:"Federal-School-of-Surveys",contacts:[{name:"Organizer",email:"oyomappersteam@gmail.com"}],countryCodes:["ng"],url:"https://web.facebook.com/Oyomappersteam-omt-oyo-1432864713415765/"},"ym-Federal-University-of-Technology-Akure":{type:"youthmappers",name:"YouthMappers Futa Space Club",description:"YouthMappers chapter at Federal University of Technology, Akure",id:"ym-Federal-University-of-Technology-Akure",featureId:"Federal-University-of-Technology-Akure",contacts:[{name:"Organizer",email:"denironyx@gmail.com"}],extendedDescription:"Our mission is to raise the next generation of Space Leaders. Activities include research and capacity building in Remote Sensing, GIS, Climate Change, Astronomy, Cosmology, Space Engineering, Global Navigation, Robotics and Space Education.",countryCodes:["ng"],url:"http://spaceclubfuta.com.ng/"},"ym-Ignatius-Ajuru-University-of-Education":{type:"youthmappers",name:"IgnatiusMappersTeam (IMT)",description:"YouthMappers chapter at Ignatius Ajuru University of Education",id:"ym-Ignatius-Ajuru-University-of-Education",featureId:"Ignatius-Ajuru-University-of-Education",contacts:[{name:"Organizer",email:"ignatiusmappersteam@gmail.com"}],extendedDescription:"We are a YouthMappers Chapter of Ignatius Ajuru University of Education involved in crowdsourced mapping of our environment and remote mapping of resilient communities.We are a team of volunteers using openstreetmap and other open Geospatial source for mapping.",countryCodes:["ng"],url:"https://fb.me/ignatiusmappersteam"},"ym-University-of-Nigeria-Nsukka":{type:"youthmappers",name:"LionMappersTeam (LMT) Nsukka",description:"YouthMappers chapter at University of Nigeria, Nsukka",id:"ym-University-of-Nigeria-Nsukka",featureId:"University-of-Nigeria-Nsukka",contacts:[{name:"Organizer",email:"lionmappersteam@gmail.com"}],extendedDescription:"The LionMappersTeam is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of mapping science and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for crowdsourced mapping and geographic information provision using Openstreetmap, citizen science  and other geospatial  technology for research, training and response to resilient community challenges. We are involved in GIS and Remote Sensing Applications and Research.Paticipatory GIS and Citizen Science,field mapping ,training workshops and outreaches to High Schools.",countryCodes:["ng"],url:"http://fb.me/LionMappersTeamNsukka;and send messages to our Page at m.me/LionMappersTeamNsukka"},"ym-University-of-Port-Harcourt":{type:"youthmappers",name:"UniqueMappersTeam (UMT) Port Harcourt",description:"YouthMappers chapter at University of Port Harcourt",id:"ym-University-of-Port-Harcourt",featureId:"University-of-Port-Harcourt",contacts:[{name:"Organizer",email:"victor.sunday@uniport.edu.ng"}],extendedDescription:"UniqueMappersTeam(UMT)Port Harcourt  is an action group and a team of volunteers for a collaborative online mapping targeted at training and empowering members with trending mapping skills  to create open geospatial data and analysis that addresses locally defined challenges for geoinformation and to provide humanitarian mapping  services to resilient communities in Niger Delta,Nigeria and elsewhere.We promote Crowdsoucred Mapping and Geographic information volunteering using OpenStreetMap(OSM) platform and other accessible platforms for Rapid Response Mapping,Disaster Mapping,Geo-intelligence Mapping,Map updates and training.Its an affiliate Campus chapter of Humanitarian OpenStreetMap Team(HOT).It is a project-task team of YouthMappers that provide opportunity for members to learn and improve their skills in Geoinformatics so as to explore global opportunities in the field of Mapping and Geoinformation.",countryCodes:["ng"],url:"https://web.facebook.com/uniquemappersteamportharcourt/"},"ym-University-of-Nigeria-Enugu-Campus":{type:"youthmappers",name:"LionMappersTeam (LMT) Enugu",description:"YouthMappers chapter at University of Nigeria, Enugu Campus",id:"ym-University-of-Nigeria-Enugu-Campus",featureId:"University-of-Nigeria-Enugu-Campus",contacts:[{name:"Organizer",email:"lmtenugucampus@gmail.com"}],extendedDescription:"The LionMappersTeam(LMT)Enugu Campus is an affiliate of YouthMappers Network, with the sole aim of providing members the opportunity to learn and improve their skills in the field of Geoinformatics and to create open geographic data and analysis that addresses locally defined challenges globally. It is a team of volunteers for Crowdsourced Mapping and Geographic Information provision using Openstreetmap, Citizen Science and other Geospatial Technology for research, training and response to resilient community challenges. We are involved in Web-Cartography, GIS and Remote Sensing Applications and ResearchWe are passionate about Volunteered Geographic Information.Paticipatory GIS and Citizen Science.Our major activities include online crowdsourced-Cartography, Field Mapping ,Training workshops and outreaches to High School as well as Humanitarian/Disaster Response Mapping.",countryCodes:["ng"],url:"https://web.facebook.com/Lionmappersteam-enugu-Campus-361221567667528/"},"osm-africa-telegram":{id:"osm-africa-telegram",featureId:"africa_full",type:"telegram",name:"OpenStreetMap Africa Telegram",description:"OpenStreetMap Telegram for Africa",url:"https://t.me/OSMAfrica",contacts:[{name:"OSM Africa",email:"info@openstreetmap.africa"}]},"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri":{type:"youthmappers",name:"YouthMappers at INES Ruhengeri",description:"YouthMappers chapter at Insititue d' Enseignement Superieur de Ruhengeri",id:"ym-Insititue-d-Enseignement-Superieur-de-Ruhengeri",featureId:"Insititue-d-Enseignement-Superieur-de-Ruhengeri",contacts:[{name:"Organizer",email:"dufitesaie91@yahoo.com"}],extendedDescription:"We are students from Land Administration and Management and Land survey Departments from INES-Ruhengeri. We are engaged in mapping activities that create the changes toward sustainable development in our community.",countryCodes:["rw"],url:"www.ines.ac.rw"},"ym-University-of-Rwanda-Huye-Campus":{type:"youthmappers",name:"Rwanda YouthMappers",description:"YouthMappers chapter at University of Rwanda - Huye Campus",id:"ym-University-of-Rwanda-Huye-Campus",featureId:"University-of-Rwanda-Huye-Campus",contacts:[{name:"Organizer",email:"erneruz@gmail.com"}],extendedDescription:"Based on the commitment and the purpose of promoting mapping, and the information from YouthMappers public talks, we have organized as students in Geography department who are committed in mapping to found a chapter of our Campus. We have supported by our Facilitator Dr. Gaspard Rwanyiziri (Director of CGIS-Rwanda) and various lecturer mentors.",countryCodes:["rw"],url:"https://www.facebook.com/Rwanda-YouthMappers"},"ym-Institut-Suprieur-de-Management-Kolda":{type:"youthmappers",name:"Les Femmes Leaders de ISM/Kolda",description:"YouthMappers chapter at Institut Supérieur de Management Kolda",id:"ym-Institut-Suprieur-de-Management-Kolda",featureId:"Institut-Suprieur-de-Management-Kolda",contacts:[{name:"Organizer",email:"koldaym@gmail.com"}],extendedDescription:"Les Femmes Leaders de ISM/Kolda is an all-female mapping group in southern Senegal looking to put Kolda and surrounding villages on the map and better understand how to use OSM.",countryCodes:["sn"],url:"mailto:koldaym@gmail.com"},"ym-Universit-Gaston-Berger":{type:"youthmappers",name:"YouthMappers at UGB",description:"YouthMappers chapter at Université Gaston Berger",id:"ym-Universit-Gaston-Berger",featureId:"Universit-Gaston-Berger",contacts:[{name:"Organizer",email:"youthmappers.ugb@gmail.com"}],extendedDescription:"YouthMappers UGB is made up of young students and researchers who are passionate about mapping. Our aim is to improve students' skills in the field of cartography and to participate in the creation of open geographic data that responds to development challenges around the world and particularly in Africa.",countryCodes:["sn"],url:"https://web.facebook.com/youthmappersugb/"},"ym-Fourah-Bay-College":{type:"youthmappers",name:"Student's Geographical Association",description:"YouthMappers chapter at Fourah Bay College",id:"ym-Fourah-Bay-College",featureId:"Fourah-Bay-College",contacts:[{name:"Organizer",email:"sgayouthmappers@gmail.com"}],extendedDescription:"The Student's Geographical Association- YouthMappers is an association of Fourah Bay College Students with the common goals of mapping out vulnerable places in Sierra Leone and the world at large for relief and other beneficial purposes,carry out Research and other educative endeavors. The chapter consists of young people with great ideas, development oriented with the capacity to relate with each other, comprehend and implement sustainable developmental projects as a team.",countryCodes:["sl"],url:"mailto:sgayouthmappers@gmail.com?subject=YouthMappers%20at%20Fourah%20Bay%20College"},"ym-Njala-University-Freetown-Campus":{type:"youthmappers",name:"Njala Freetown YouthMappers",description:"YouthMappers chapter at Njala University, Freetown Campus",id:"ym-Njala-University-Freetown-Campus",featureId:"Njala-University-Freetown-Campus",contacts:[{name:"Organizer",email:"njalafreetownmappers@gmail.com"}],extendedDescription:"We are students of Njala University Freetown Campus, studying Information Technology under the department of Physics and Computer Science. and we are located at Henry Street Freetown, Sierra Leone.",countryCodes:["sl"],url:"mailto:Njalafreetownmappers@gmail.com"},"ym-Njala-University-Njala-Campus":{type:"youthmappers",name:"YouthMappers Njala University, Njala Campus",description:"YouthMappers chapter at Njala University, Njala Campus",id:"ym-Njala-University-Njala-Campus",featureId:"Njala-University-Njala-Campus",contacts:[{name:"Organizer",email:"youthmappersnu2017@gmail.com"}],countryCodes:["sl"],url:"mailto:youthmappersnu2017@gmail.com"},"ym-University-of-Pretoria":{type:"youthmappers",name:"Centre for Geoinformation Science",description:"YouthMappers chapter at University of Pretoria",id:"ym-University-of-Pretoria",featureId:"University-of-Pretoria",contacts:[{name:"Organizer",email:"cgis-info@kendy.up.ac.za"}],extendedDescription:"The students who map Pretoria are supported by the University of Pretoria's Centre for Geoinformation Science, a platform from where the excellence of UP individuals and teams involved in geographic information science (GISc) research, education and training, professional development and community engagement is encouraged and strengthened through collaborations, education and training and  alliances within South Africa and abroad.",countryCodes:["za"],url:"http://www.up.ac.za/cgis"},"ym-Ardhi-University":{type:"youthmappers",name:"ARU Mapper",description:"YouthMappers chapter at Ardhi University",id:"ym-Ardhi-University",featureId:"Ardhi-University",contacts:[{name:"Organizer",email:"bayonakennedy@gmail.com"}],extendedDescription:"As upcoming geospatial data consultants we seek to educate and provide advice to the society on how they can use spatial data not only as a form of location but a tool of decision making and predict different hazardous and climatical changes which may harm them or future genarations.",countryCodes:["tz"],url:"mailto:bayonakennedy@gmail.com"},"ym-Institute-of-Finance-Management":{type:"youthmappers",name:"IFM mappers",description:"YouthMappers chapter at Institute of Finance Management",id:"ym-Institute-of-Finance-Management",featureId:"Institute-of-Finance-Management",contacts:[{name:"Organizer",email:"supermalik95@gmail.com"}],extendedDescription:"This is a new  chapter at out institute and we are looking forward to use our financial education that we are receiving here at the campus  and link ig with the environment in order to develop our sustainable environment towards helping the community  with the effects of our environment in a financial ways by converting them into numbers. this is widely explained in ecosystem accounting and environmental accounts",countryCodes:["tz"],url:"mailto:supermalik95@gmail.com"},"ym-Institute-of-Rural-Development-Planning-Mwanza":{type:"youthmappers",name:"Youth Mappers Chapter at Institute of Rural Development Planning - Lake Zone Centre",description:"YouthMappers chapter at Institute of Rural Development Planning Mwanza",id:"ym-Institute-of-Rural-Development-Planning-Mwanza",featureId:"Institute-of-Rural-Development-Planning-Mwanza",contacts:[{name:"Organizer",email:"shabanimagawila@gmail.com"}],countryCodes:["tz"],url:"www.facebook.com/IYMLZC/"},"ym-Institute-of-Rural-Development-Planning":{type:"youthmappers",name:"Mipango YouthMappers Chapter",description:"YouthMappers chapter at Institute of Rural Development Planning",id:"ym-Institute-of-Rural-Development-Planning",featureId:"Institute-of-Rural-Development-Planning",contacts:[{name:"Organizer",email:"msmapperschapter@gmail.com"}],extendedDescription:"Mipango YouthMappers Chapter was introduced at IRDP on 3rd July, 2017 by Dr.Domitilla Bashemera. The founding members were  300 (190 males and 110 female) Bachelor Degree students, who were registered as members of the Chapter. Gerald Zacharia is the president of the chapter and Juster Lugira is Vice President.",countryCodes:["tz"],url:"mailto:msmapperschapter@gmail.com"},"ym-Open-University-of-Tanzania":{type:"youthmappers",name:"Youth Mappers at Open University of Tanzania",description:"YouthMappers chapter at Open University of Tanzania",id:"ym-Open-University-of-Tanzania",featureId:"Open-University-of-Tanzania",contacts:[{name:"Organizer",email:"youthmapout@gmail.com"}],extendedDescription:"Youth Mappers at Open University of Tanzania\n\nHad been founded by members and students of Open University of Tanzania in Department of Geography who are mainly need to improve their career and help young community through joint and partnership projects with local community groups such as Mikoko Scout Group (www.msg.or.tz) and start cooperation with international colleges and universities for exchange programs in relation to Geography Studies as some programs prepared by Mikoko Scout Group which will link local university and other universities of the same interest through International Nature & Environmental Youth Camp 2019 (www.campsite.msg.or.tz/nature.html )\n\nOur chapter will soon be recognized as youth network program that will open opportunity for students to study and conduct research studies at a local levels.",countryCodes:["tz"],url:"mailto:youthmapout@gmail.com"},"ym-Sokoine-University-of-Agriculture":{type:"youthmappers",name:"SMCoSE YouthMappers",description:"YouthMappers chapter at Sokoine University of Agriculture",id:"ym-Sokoine-University-of-Agriculture",featureId:"Sokoine-University-of-Agriculture",contacts:[{name:"Organizer",email:"smcoseyouthmappers@gmail.com"}],extendedDescription:"A Chapter comprising of Environmental sciences and management students and Geography studies under the dept. of Geography and  we will be using mapping techniques, based on systems concepts and theories, can be used to facilitate, explore, and capture the different understandings of the relationships, perspectives, and boundaries involved in environmental sustainability to obtain a more complete comprehension of the concept and develop plans for action.",countryCodes:["tz"],url:"mailto:SMCoSEyouthmappers@gmail.com"},"ym-University-of-Dar-es-Salaam":{type:"youthmappers",name:"YouthMappers at University of Dar es Salaam",description:"YouthMappers chapter at University of Dar es Salaam",id:"ym-University-of-Dar-es-Salaam",featureId:"University-of-Dar-es-Salaam",contacts:[{name:"Organizer",email:"godluckur@gmail.com"}],extendedDescription:"The purpose of the University of Dar es Salaam YouthMappers  is to use and promote open source data and GIS technologies to map potential disaster areas, provide resources for emergency management, connect its members with open source and GIS organizations in the city of Dar es Salaam, and serve any upcoming needs of our project partners .",countryCodes:["tz"],url:"https://www.facebook.com/UDSMYouthMappers/"},"ym-Busitema-University":{type:"youthmappers",name:"Good Mappers",description:"YouthMappers chapter at Busitema University",id:"ym-Busitema-University",featureId:"Busitema-University",contacts:[{name:"Organizer",email:"mulindwasteven82@gmail.com"}],extendedDescription:"Good mappers is a team of students in Busitema University. Its main objective is to create a community of experienced mappers who can contribute to the world map.",countryCodes:["ug"],url:"https://m.facebook.com/HOTBusitemaUniv/"},"ym-Gulu-University":{type:"youthmappers",name:"CSGU Mappers",description:"YouthMappers chapter at Gulu University",id:"ym-Gulu-University",featureId:"Gulu-University",contacts:[{name:"Organizer",email:"git445@gmail.com"}],extendedDescription:"The CSGU Mappers are the Computing Society at Gulu University. This chapter is creative, passionate, innovative and ready to map Uganda and the world at large, beyond other people's imagination.",countryCodes:["ug"],url:"mailto:git445@gmail.com?subject=YouthMappers%20at%20Gulu%20University"},"ym-Kumi-University":{type:"youthmappers",name:"Ever Last YouthMappers",description:"YouthMappers chapter at Kumi University",id:"ym-Kumi-University",featureId:"Kumi-University",contacts:[{name:"Organizer",email:"kumiuniversityeverlastyouthmap@gmail.com"}],extendedDescription:"This energetic group of students organizes within the faculty of Science and Information Technology.",countryCodes:["ug"],url:"mailto:kumiuniversityeverlastyouthmap@gmail.com?subject=YouthMappers%20at%20Kumi%20University"},"ym-Makerere-University":{type:"youthmappers",name:"Geo YouthMappers",description:"YouthMappers chapter at Makerere University",id:"ym-Makerere-University",featureId:"Makerere-University",contacts:[{name:"Organizer",email:"geo-youthmappers@googlegroups.com"}],extendedDescription:"Geo YouthMappers is a Makerere University based mapping chapter esteemed to apply the spatial conception to the real world.We have collaborated on various mapping events with OSM. Our main aim is the desire to simplify data and make it readily available mostly for disaster preparedness.\"We map the world and change lives.",countryCodes:["ug"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Mbarara-University-of-Science-and-Technology":{type:"youthmappers",name:"MUST Street Mappers",description:"YouthMappers chapter at Mbarara University of Science and Technology",id:"ym-Mbarara-University-of-Science-and-Technology",featureId:"Mbarara-University-of-Science-and-Technology",contacts:[{name:"Organizer",email:"muststreetmappers@gmail.com"}],extendedDescription:"MUST Street Mappers is a Youth Mappers chapter at the Mbarara University of Science and Technology that is based on making our country and the world at large a better place through mapping. We base on collected information to notice patterns and data mine to present relevant and beneficial information to society.",countryCodes:["ug"],url:"https://web.facebook.com/muststreetmappers/"},"ym-St.-Augustine-International-University":{type:"youthmappers",name:"YouthMappers at St Augustine International University",description:"YouthMappers chapter at St. Augustine International University",id:"ym-St.-Augustine-International-University",featureId:"St.-Augustine-International-University",contacts:[{name:"Organizer",email:"youthmapperssaiu@gmail.com"}],countryCodes:["ng"],url:"mailto:youthmapperssaiu@gmail.com"},"ym-Uganda-Christian-University-Mbale-Campus":{type:"youthmappers",name:"Mappers for Life",description:"YouthMappers chapter at Uganda Christian University Mbale Campus",id:"ym-Uganda-Christian-University-Mbale-Campus",featureId:"Uganda-Christian-University-Mbale-Campus",contacts:[{name:"Organizer",email:"munhilll@gmail.com"}],extendedDescription:"We are Team Mappers for life! Please come and join us as we map together!\" This group works from the Department of Information Technology at the UCU.",countryCodes:["ug"],url:"mailto:munhilll@gmail.com?subject=YouthMappers%20and%20the%20Uganda%20Christian%20University%20Mappers%20for%20Life"},"ym-Uganda-Pentecostal-University":{type:"youthmappers",name:"HiTech Youth Mappers",description:"YouthMappers chapter at Uganda Pentecostal University",id:"ym-Uganda-Pentecostal-University",featureId:"Uganda-Pentecostal-University",contacts:[{name:"Organizer",email:"hitechyouthmappers@gmail.com"}],extendedDescription:"A new Youthmappers Chapter in Western Uganda. Ready to map and provide open data with OpenStreetMap for development purposes.",countryCodes:["ug"],url:"mailto:hitechyouthmappers@gmail.com"},"ym-St.-Mawaggali-Trades-Training-Institute":{type:"youthmappers",name:"MawaggaliMappers",description:"YouthMappers chapter at St. Mawaggali Trades Training Institute",id:"ym-St.-Mawaggali-Trades-Training-Institute",featureId:"St.-Mawaggali-Trades-Training-Institute",contacts:[{name:"Organizer",email:"mawaggalimappers@gmail.com"}],extendedDescription:"We are the youthappers chapter at St. Mawaggali trades in choma who are want to contribute the different humantarian tasks to serve lives through mapping.",countryCodes:["zm"],url:"mailto:mawaggalimappers@gmail.com"},"ym-The-University-of-Zambia":{type:"youthmappers",name:"YouthMappers Unza",description:"YouthMappers chapter at The University of Zambia",id:"ym-The-University-of-Zambia",featureId:"The-University-of-Zambia",contacts:[{name:"Organizer",email:"chombachishala13@gmail.com"}],countryCodes:["zm"],url:"https://www.facebook.com/search/posts/?q=youth%20mappers%20unza"},"ym-University-of-Zimbabwe":{type:"youthmappers",name:"UZMappers",description:"YouthMappers chapter at University of Zimbabwe",id:"ym-University-of-Zimbabwe",featureId:"University-of-Zimbabwe",contacts:[{name:"Organizer",email:"uzmappersteam@gmail.com"}],extendedDescription:"UzMappersTeam Zimbabwe is a team of Volunteers using OpenStreetMap for Open Data Mapping and Humanitarian Disaster response mapping .The team empowers its members with open source geospatial technology skills.",countryCodes:["zw"],url:"https://www.facebook.com/Uzmappersteam-Zimbabwe-246038666256392/"},"osm-afghanistan-facebook":{id:"osm-afghanistan-facebook",featureId:"afghanistan",type:"facebook",name:"OpenStreetMap Afghanistan",description:"Improve OpenStreetMap in Afghanistan",url:"https://www.facebook.com/groups/321292812113316/",countryCodes:["af"],languageCodes:["en","ps","fa"],contacts:[{name:"Walker Kosmidou-Bradley",email:"walker.t.bradley@gmail.com"}]},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"ym-Asian-University-for-Women":{type:"youthmappers",name:"YouthMappers at AUW",description:"YouthMappers chapter at Asian University for Women",id:"ym-Asian-University-for-Women",featureId:"Asian-University-for-Women",contacts:[{name:"Organizer",email:"harunur.rashid@auw.edu.bd"}],extendedDescription:"The Asian University for Women seeks to graduate women who will be skilled and innovative professionals, service-oriented leaders in the businesses and communities in which they will work and live, and promoters of intercultural understanding and sustainable human and economic development in Asia and throughout the world.",countryCodes:["bd"],url:"http://www.auw.edu.bd/"},"ym-Dhaka-College":{type:"youthmappers",name:"YouthMappers Daka College",description:"YouthMappers chapter at Dhaka College",id:"ym-Dhaka-College",featureId:"Dhaka-College",contacts:[{name:"Organizer",email:"youthmappersdc@gmail.com"}],extendedDescription:"YouthMappers DhakaCollege is an approach by students to help mapping vulnerable areas of the world as a part of Humanitarian Action. YouthMappers  gives the opportunity to the students for helping people and using mapping for humanitarian purposes. This open geographic data can be used for educational, navigational and other humanitarian purposes. Happy mapping.",countryCodes:["bd"],url:"https://www.facebook.com/groups/321220498214124/"},"ym-Dhaka-University":{type:"youthmappers",name:"Openstreetmap YouthMappers",description:"YouthMappers chapter at Dhaka University",id:"ym-Dhaka-University",featureId:"Dhaka-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"It's a great privilege for the students of University of Dhaka to map for humanitarian purposes. Our chapter gives the opportunity to the students for helping people and use mapping for humanitarian purposes.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmDU/1773150346233538/?notif_t=group_activity&notif_id=1472953820177890"},"ym-Eastern-University":{type:"youthmappers",name:"YouthMappers at Eastern University",description:"YouthMappers chapter at Eastern University",id:"ym-Eastern-University",featureId:"Eastern-University",contacts:[{name:"Organizer",email:"infolimon@gmail.com"}],extendedDescription:"YouthMappers at Eastern University, Bangladesh has been formed with a view to assisting people during humanitarian crisis. The students, likewise other mappers of the world, are promised to assist people in using the map for educational, navigational and other humanitarian purposes.",countryCodes:["bd"],url:"mailto:infolimon@gmail.com"},"ym-Jahangirnagar-University":{type:"youthmappers",name:"YouthMappers at IRS, Jahangirnagar University",description:"YouthMappers chapter at Jahangirnagar University",id:"ym-Jahangirnagar-University",featureId:"Jahangirnagar-University",contacts:[{name:"Organizer",email:"s.t.islam@juniv.edu"}],countryCodes:["bd"],url:"mailto:s.t.islam@juniv.edu"},"ym-Khulna-University":{type:"youthmappers",name:"Openstreetmap",description:"YouthMappers chapter at Khulna University",id:"ym-Khulna-University",featureId:"Khulna-University",contacts:[{name:"Organizer",email:"hoque.ahasan@gmail.com"}],extendedDescription:"KU students and faculty from multiple disciplines are experienced at creating open data for OSM to address local challenges of development, including food security and other topics.",countryCodes:["bd"],url:"https://www.facebook.com/groups/osmku/"},"ym-Rajshahi-University-of-Engineering-Technology":{type:"youthmappers",name:"YouthMappers at RUET",description:"YouthMappers chapter at Rajshahi University of Engineering & Technology",id:"ym-Rajshahi-University-of-Engineering-Technology",featureId:"Rajshahi-University-of-Engineering-Technology",contacts:[{name:"Organizer",email:"ruetmappers@gmail.com"}],extendedDescription:"The \"YouthMappers at RUET\" is a humanitarian mapping group of students of Rajshahi University of Engineering & Technology (RUET) to share, develop and practice the knowledge of GIS.  This group encourages using open source geospatial data and platform to make solution to reach the most vulnerable group of the world.",countryCodes:["bd"],url:"mailto:ruetmappers@gmail.com"},"ym-Sherubtse-College":{type:"youthmappers",name:"Geographical Society",description:"YouthMappers chapter at Sherubtse College",id:"ym-Sherubtse-College",featureId:"Sherubtse-College",contacts:[{name:"Organizer",email:"gsscbhutan@gmail.com"}],extendedDescription:"The Geographical Society, in the Department of Geography & Planning, Sherubtse College, Royal University of Bhutan, with support from the Center for Climate Change and Spatial Information, has made several efforts to create awareness and address important issues at the local and national level. We now join hands with the international student-centered YouthMappers network on \"Mapping for Resilience\" and contributing to a global 'Happiness'!",countryCodes:["bt"],url:"mailto:gsscbhutan@gmail.com?subject=About%20the%20Royal%20University%20of%20Bhutan%20Geographical%20Society%20and%20Youth%20Mappers"},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"osm-india-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"osm-india-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"osm-india-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"ym-Gujarat-University":{type:"youthmappers",name:"CCIM at Ahmedabad",description:"YouthMappers chapter at Gujarat University",id:"ym-Gujarat-University",featureId:"Gujarat-University",contacts:[{name:"Organizer",email:"coolmulls@gmail.com"}],countryCodes:["in"],url:"mailto:Coolmulls@gmail.com"},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"ym-Universitas-Negeri-Makassar":{type:"youthmappers",name:"Kontur Geografi",description:"YouthMappers chapter at Universitas Negeri Makassar",id:"ym-Universitas-Negeri-Makassar",featureId:"Universitas-Negeri-Makassar",contacts:[{name:"Organizer",email:"konturgeografi@gmail.com"}],countryCodes:["in"],url:"https://tentangkontur.blogspot.co.id"},"ym-University-Muhammadiyah-Surakarta":{type:"youthmappers",name:"SpaceTime",description:"YouthMappers chapter at University Muhammadiyah Surakarta",id:"ym-University-Muhammadiyah-Surakarta",featureId:"University-Muhammadiyah-Surakarta",contacts:[{name:"Organizer",email:"spacetime1717@gmail.com"}],extendedDescription:"SpaceTime is a community mapping in the Faculty of Geography of Muhammadiyah University of Surakarta. SpaceTime was founded by Bruce Maldy Pratama, Mukhlis Akbar and Irfandi Fauzi. They are active students in the Faculty of Geography University Muhammadiyah Surakarta.",countryCodes:["in"],url:"mailto:spacetime1717@gmail.com"},"osm-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"ym-Institute-of-Crisis-Management-Studies":{type:"youthmappers",name:"Institute of Crisis Management Studies YouthMappers",description:"YouthMappers chapter at Institute of Crisis Management Studies",id:"ym-Institute-of-Crisis-Management-Studies",featureId:"Institute-of-Crisis-Management-Studies",contacts:[{name:"Organizer",email:"deepakadhikari@tuicms.edu.np"}],extendedDescription:"To develop Crisis Mappers to assist during disaster situations.",countryCodes:["np"],url:"mailto:deepakadhikari@tuicms.edu.np"},"ym-Kathmandu-University":{type:"youthmappers",name:"Geomatics Engineering Society,GES",description:"YouthMappers chapter at Kathmandu University",id:"ym-Kathmandu-University",featureId:"Kathmandu-University",contacts:[{name:"Organizer",email:"ges@ku.edu.np"}],extendedDescription:"Geomatics Engineering Society (GES) established in 2008 A.D is a departmental club under Department of Civil and Geomatics Engineering (DCGE) at Kathmandu University. GES acts as a platform to develop the skills of students apart from their educational activities by focusing on activities like technical trainings, seminars, talk programs and interaction with experts from related field, sports activities etc.",countryCodes:["np"],url:"ku.edu.np/ges"},"ym-Tribhuvan-University":{type:"youthmappers",name:"Geomatics Engineering Students Association",description:"YouthMappers chapter at Tribhuvan University",id:"ym-Tribhuvan-University",featureId:"Tribhuvan-University",contacts:[{name:"Organizer",email:"gesan.nepal@gmail.com"}],extendedDescription:"This organization is the student forum of Geomatics Engineering students of Tribhuvan University , Institute of Engineering on the Pashchimanchal campus. Established since the beginning of the degree program, students have been active in mapping and leadership and are thrilled to be a part of the YouthMappers network.",countryCodes:["np"],url:"http://gesanwrc.wordpress.com/"},"OSM-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"ym-Far-Eastern-University-Institute-of-Technology":{type:"youthmappers",name:"Junior Philippines Computer Society",description:"YouthMappers chapter at Far Eastern University -Institute of Technology",id:"ym-Far-Eastern-University-Institute-of-Technology",featureId:"Far-Eastern-University-Institute-of-Technology",contacts:[{name:"Organizer",email:"jpcsfeutech@outlook.com"}],extendedDescription:"FEU has been recognized as one of the leading universities in the Philippines. Its mission centers on producing graduates who have contributed to the advancement of the country. The university continuously challenges itself to raise the bar of excellence to achieve a top-tier status not only in the Philippines but also in the South East Asian region",countryCodes:["ph"],url:"mailto:jpcsfeutech@outlook.com?subject=YouthMappers%20and%20Junior%20Philippines%20Computer%20Society"},"ym-University-of-the-Philippines-Resilience-Institute":{type:"youthmappers",name:"YouthMappers UP Resilience Institute",description:"YouthMappers chapter at University of the Philippines Resilience Institute",id:"ym-University-of-the-Philippines-Resilience-Institute",featureId:"University-of-the-Philippines-Resilience-Institute",contacts:[{name:"Organizer",email:"llnguyen@up.edu.ph"}],extendedDescription:"The UP Resilience Institute was established in 2016 with a mission statement to empower local communities through multidisciplinary research and actions toward resilience. Through UP NOAH Center, and the help of different organizations, we have provided building exposure maps for 17 provinces out of the 82 and uploaded more than 4 million footprints to Open Street Maps.",countryCodes:["ph"],url:"https://www.facebook.com/UP-Resillience-Institute-Youth-Mappers-123477508533225"},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"ym-Queen-Mary-University-of-London":{type:"youthmappers",name:"Queen Mary YouthMappers",description:"YouthMappers chapter at Queen Mary University of London",id:"ym-Queen-Mary-University-of-London",featureId:"Queen-Mary-University-of-London",contacts:[{name:"Organizer",email:"youthmappers@qmul.ac.uk"}],extendedDescription:"This chapter will be part of the activities of the Queen Mary Geography Society.",countryCodes:["uk"],url:"https://www.facebook.com/groups/qmulgeographysociety/"},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"ym-Heidelberg-University":{type:"youthmappers",name:"disastermappers heidelberg",description:"YouthMappers chapter at Heidelberg University",id:"ym-Heidelberg-University",featureId:"Heidelberg-University",contacts:[{name:"Organizer",email:"disastermappers@posteo.de"}],extendedDescription:"Disastermappers Heidelberg was founded in 2014 as a student initiative to build a platform for exchange between students, researchers and humanitarian actors. Disastermappers are a member of Missing Maps and are organizing mapathons, workshops and webinars in Heidelberg and beyond and support HOT and Missing Maps through research and applications.",countryCodes:["de"],url:"https://disastermappers.wordpress.com/"},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twitter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"ym-Politecnico-di-Milano":{type:"youthmappers",name:"PoliMappers",description:"YouthMappers chapter at Politecnico di Milano",id:"ym-Politecnico-di-Milano",featureId:"Politecnico-di-Milano",contacts:[{name:"Organizer",email:"polimappers@gmail.com"}],extendedDescription:"PoliMappers is a volunteer students’ association based at Politecnico di Milano. The mission of the group is to train and motivate the next generation of volunteer mappers and to do mapping using free and open source software within the university as well as primary and secondary schools.",countryCodes:["it"],url:"https://polimappers.github.io/"},"ym-Yarmouk-University":{type:"youthmappers",name:"YouthMappers at YU",description:"YouthMappers chapter at Yarmouk University",id:"ym-Yarmouk-University",featureId:"Yarmouk-University",contacts:[{name:"Organizer",email:"rnjawarneh@yu.edu.jo"}],extendedDescription:"YouthMappers chapter at YU is the first mapping group in the Middle East and North Africa region where refugees, drought, and poverty are rising crises and in urgent need for humanitarian mapping  activities to mitigate the consequences of such crises. YU Mappers are encouraged to use open data to address challenges in MENA region to bring relief and development to target areas within the region.",countryCodes:["jo"],url:"mailto:rnjawarneh@yu.edu.jo"},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"lu-mailinglist":{id:"lu-mailinglist",featureId:"luxembourg_full",type:"mailinglist",name:"Talk-lu Mailing List",countryCodes:["lu"],languageCodes:["lb","en","de","fr"],description:"Official mailing list for the Luxembourgish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-lu",contacts:[{name:"David Morais Ferreira",email:"contact@openstreetmap.lu"}]},"ym-Universit-Mohammed-V-Rabat":{type:"youthmappers",name:"Brahmapoutre at Rabat",description:"YouthMappers chapter at Université Mohammed V Rabat",id:"ym-Universit-Mohammed-V-Rabat",featureId:"Universit-Mohammed-V-Rabat",contacts:[{name:"Organizer",email:"khmichasma@gmail.com"}],extendedDescription:"This chapter sees participation in the YouthMappers program as an oppourtunity to share our knowlege create new working relationships with other chapters in different countries",countryCodes:["ma"],url:"mailto:khmichasma@gmail.com"},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"pt-mailinglist":{id:"pt-mailinglist",featureId:"portugal_full",type:"mailinglist",name:"Talk-pt Mailing List",countryCodes:["pt"],languageCodes:["pt"],description:"Talk-pt is the official mailing list for the Portuguese OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-pt",contacts:[{name:"Nuno Caldeira",email:"hello@iamnunocaldeira.com"}]},"pt-telegram":{id:"pt-telegram",featureId:"portugal_full",type:"telegram",name:"OpenStreetMap Portugal no Telegram",countryCodes:["pt"],languageCodes:["pt"],description:"Telegram Group of the Portuguese OpenStreetMap community {url}",url:"https://t.me/OSMPortugal",contacts:[{name:"Nuno Caldeira",email:"hello@iamnunocaldeira.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-twitter":{id:"si-twitter",featureId:"slovenia",type:"twitter",name:"OpenStreetMap Slovenia Twitter",countryCodes:["si"],languageCodes:["sl","en"],description:"Follow OpenStreetMap Slovenia On Twitter: {url}",url:"https://twitter.com/OpenStreetMapSi",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"ym-Universidad-Autonoma-de-Madrid":{type:"youthmappers",name:"YouthMappers at UAM",description:"YouthMappers chapter at Universidad Autonoma de Madrid",id:"ym-Universidad-Autonoma-de-Madrid",featureId:"Universidad-Autonoma-de-Madrid",contacts:[{name:"Organizer",email:"youthmappersatuam@gmail.com"}],countryCodes:["es"],url:"mailto:youthmappersatuam@gmail.com"},"ym-Universidad-Politcnica-de-Madrid":{type:"youthmappers",name:"Mapeo Humanitario",description:"YouthMappers chapter at Universidad Politécnica de Madrid",id:"ym-Universidad-Politcnica-de-Madrid",featureId:"Universidad-Politcnica-de-Madrid",contacts:[{name:"Organizer",email:"lab.topografia@gmail.com"}],extendedDescription:"Geo-volunteering group formed at Moncloa Campus on November 2017. Around 20 members from three Universities (Complutense, CEU and UPM). Undergraduate students, MSc and PhD students collaborate together with organizations (MSF, Acción contra el Hambre,...) supported by trainers from Geoinquietos. Official recognition by UPM as Educative Innovation Project (Code  IE1718.0411)",countryCodes:["es"],url:"https://blogs.upm.es/mapeo-humanitario/"},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"ym-Istanbul-Technical-University":{type:"youthmappers",name:"YouthMappers ITU",description:"YouthMappers chapter at Istanbul Technical University",id:"ym-Istanbul-Technical-University",featureId:"Istanbul-Technical-University",contacts:[{name:"Organizer",email:"youthmappersitu@gmail.com"}],extendedDescription:"YouthMappers ITU is an interdisciplinary and collaborative student community to promote humanitarian mapping for vulnerable settlements and aims to develop and share strategic and innovative spatial information for the future cities by using geographical information systems and open data.",countryCodes:["tr"],url:"https://www.facebook.com/YouthMappers-ITU-226489641442744/?modal=admin_todo_tour"},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://webchat.oftc.net/?channels=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"ym-University-of-Exeter":{type:"youthmappers",name:"University of Exeter British Red Cross Missing Maps",description:"YouthMappers chapter at University of Exeter",id:"ym-University-of-Exeter",featureId:"University-of-Exeter",contacts:[{name:"Organizer",email:"uniofexemissingmaps@gmail.com"}],extendedDescription:"We are a team of enthusiastic Geographers with comprehensive knowledge of GIS. We are passionate about supporting the British Red Cross Society with various humanitarian aid efforts. We are also important teachers of the significance of mapping remotely sensed data and how this helps on the ground. Our mapathons have themed academic focuses that highlight the different GIS research in our geography department, while also functioning as employability awareness events which we use to invite speakers in to talk about their GIS/British Red Cross careers.",countryCodes:["uk"],url:"https://www.facebook.com/EUMissingMaps/"},"ym-University-of-Warwick":{type:"youthmappers",name:"University of Warwick Resilience Mapping Society",description:"YouthMappers chapter at University of Warwick",id:"ym-University-of-Warwick",featureId:"University-of-Warwick",contacts:[{name:"Organizer",email:"p.ulbrich@warwick.ac.uk"}],extendedDescription:"We are a group of enthusiastic mappers based at Warwick University. Our aim is to get people excited about humanitarian mapping and help them understand the impact this activity has on the field. We are closely aligned with Missing Maps and Doctors Without Borders UK and focus on HOT tasks in our mapping activities and workshops. Our mapathons are listed on the Missing Maps page whenever they are scheduled.",countryCodes:["uk"],url:"mailto:p.ulbrich@warwick.ac.uk"},"ym-Sacred-Heart-Junior-College":{type:"youthmappers",name:"Youth Mappers at Sacred Heart Junior College",description:"YouthMappers chapter at Sacred Heart Junior College",id:"ym-Sacred-Heart-Junior-College",featureId:"Sacred-Heart-Junior-College",contacts:[{name:"Organizer",email:"jtzib18@gmail.com"}],countryCodes:["bz"],url:"mailto:jtzib18@gmail.com"},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"ym-Universidad-de-Costa-Rica":{type:"youthmappers",name:"YouthMappers de Universidad de Costa Rica",description:"YouthMappers chapter at Universidad de Costa Rica",id:"ym-Universidad-de-Costa-Rica",featureId:"Universidad-de-Costa-Rica",contacts:[{name:"Organizer",email:"youthmappersucr@gmail.com"}],extendedDescription:"YouthMappers de Universidad de Costa Rica nace en función de acción social para y por miembros de comunidades distintas según temáticas de involucramiento, interacción y representación de variables dentro de un espacio geográfico definido (un territorio) Gracias a las herramientas de OpenStreetMaps tenemos la viabilidad de poder obtener, validar y compartir la información generada para comprobación y uso destinadas a las comunidades o el interesado en tales temáticas objetivas.",countryCodes:["cr"],url:"https://www.facebook.com/ucr.asege/"},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"ym-Universidad-Nacional-Autnoma-de-Honduras":{type:"youthmappers",name:"PumaGis Hn",description:"YouthMappers chapter at Universidad Nacional Autónoma de Honduras",id:"ym-Universidad-Nacional-Autnoma-de-Honduras",featureId:"Universidad-Nacional-Autnoma-de-Honduras",contacts:[{name:"Organizer",email:"pumagishn@gmail.com"}],countryCodes:["hn"],url:"mailto:pumagishn@gmail.com"},"ym-University-of-the-West-Indies-Mona-Campus":{type:"youthmappers",name:"Libraries Outreach - ODL",description:"YouthMappers chapter at University of the West Indies, Mona Campus",id:"ym-University-of-the-West-Indies-Mona-Campus",featureId:"University-of-the-West-Indies-Mona-Campus",contacts:[{name:"Organizer",email:"benjamin.branch@uwimona.edu.jm"}],extendedDescription:"The UWI, Mona Campus Library engages in public, outreach and special projects. This will allow our library the means to be a catalyst for spatial literacy and advocate for spatial data sharing and access to Jamaican and Caribbean interests. We have disaster relief and communication needs and   extensive earth science and geo-hazards needs to better serve our campus and community. Specifically, we hace a Science Library to showcase such to all faculty and students.",countryCodes:["jm"],url:"mailto:benjamin.branch@uwimona.edu.jm"},"ni-facebook":{id:"ni-facebook",featureId:"nicaragua",type:"facebook",name:"OpenStreetMap NI Community",countryCodes:["ni"],languageCodes:["es"],description:"Mappers and OpenStreetMap on Facebook in Nicaragua",url:"https://www.facebook.com/mapanica/",contacts:[{name:"NI Community",email:"talk-ni-owner@openstreetmap.org"}]},"ni-mailinglist":{id:"ni-mailinglist",featureId:"nicaragua",type:"mailinglist",name:"Talk-ni Mailing List",countryCodes:["ni"],languageCodes:["es"],description:"Talk-ni is the official mailing list for the Nicaraguan OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-ni",contacts:[{name:"NI Community",email:"talk-ni-owner@openstreetmap.org"}]},"ni-telegram":{id:"ni-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/mapanica",contacts:[{name:"NI Community",email:"talk-ni-owner@openstreetmap.org"}]},"ni-twitter":{id:"ni-twitter",featureId:"nicaragua",type:"twitter",name:"OpenStreetMap Nicaragua Twitter",countryCodes:["ni"],languageCodes:["es"],description:"OSM Nicaragua on Twitter: @osm_ni",url:"https://twitter.com/osm_ni",contacts:[{name:"NI Community",email:"talk-ni-owner@openstreetmap.org"}]},"osm-ni":{id:"osm-ni",featureId:"nicaragua",type:"group",countryCodes:["ni"],languageCodes:["es"],name:"MapaNica.net",description:"Provide OSM services and information for the local community in Nicaragua",url:"https://www.mapanica.net/",contacts:[{name:"NI Community",email:"talk-ni-owner@openstreetmap.org"}]},"ym-Universidad-Nacional-de-Ingenieria":{type:"youthmappers",name:"Yeka Street MGA",description:"YouthMappers chapter at Universidad Nacional de Ingenieria",id:"ym-Universidad-Nacional-de-Ingenieria",featureId:"Universidad-Nacional-de-Ingenieria",contacts:[{name:"Organizer",email:"yeka.street.mga@gmail.com"}],extendedDescription:"YEKA STREET is a work team constituted by students from Universidad Nacional de Ingenieria at Managua, Nicaragua. With the principal purpose of apply our knowledge and skills using many tools and apps to map areas in our cities and contribute to the development community projects and disasters relieve plans. We want to lead the way adding more students from all careers and universities in our country to join us at this cause, increasing in this way the life level and reducing the population vulnerability.",countryCodes:["ni"],url:"https://www.facebook.com/yekastreetmga/"},"ym-University-of-Panama":{type:"youthmappers",name:"YouthMappers UP",description:"YouthMappers chapter at University of Panama",id:"ym-University-of-Panama",featureId:"University-of-Panama",contacts:[{name:"Organizer",email:"youthmappers.up@gmail.com"}],extendedDescription:"Student mappers in Panama work with open spatial data to help identify, define, address, and create meaning about locally defined development challenges. They collaborate with students from other countries on community mapping topics from ecotourism to food security, from biodiversity to indigenous issues, promoting a humanistic vision through scientific perspectives.",countryCodes:["pa"],url:"mailto:Youthmappers.up@gmail.com"},"ym-Universidad-de-Puerto-Rico-Rio-Piedras":{type:"youthmappers",name:"UPR YouthMappers",description:"YouthMappers chapter at Universidad de Puerto Rico - Rio Piedras",id:"ym-Universidad-de-Puerto-Rico-Rio-Piedras",featureId:"Universidad-de-Puerto-Rico-Rio-Piedras",contacts:[{name:"Organizer",email:"carlosguilbe@gmail.com"}],countryCodes:["pa"],url:"mailto:carlosguilbe@gmail.com"},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you!  Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking.  Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap.  OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe.  Everyone is welcome.  If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world.  If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://slack.openstreetmap.us/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2019-cfs",i18n:true,name:"Propose a Talk for SotM-US 2019",description:"We are calling on all members of the OpenStreetMap community to share your ideas and session proposals for State of the Map US 2019. Whether you are brand new to OSM or have been a core contributor since the beginning, we want to hear from you!",where:"Minneapolis, Minnesota",when:"2019-jun-01",url:"https://sessionize.com/sotmus2019"},{id:"sotmus2019",i18n:true,name:"State of the Map US 2019",description:"Join the OpenStreetMap community at State of the Map US in Minneapolis, Minnesota. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Minneapolis, Minnesota",when:"2019-sep-05",url:"https://2019.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially.  We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"ym-Ball-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon- Iota Omega Chapter",description:"YouthMappers chapter at Ball State University",id:"ym-Ball-State-University",featureId:"Ball-State-University",contacts:[{name:"Organizer",email:"gtu@bsu.edu"}],extendedDescription:"Our chapter is a very active one. We primarily focus on community events, fundraising, and field trips. We are currently looking to develop more mapping-related activities to draw in other students from campus who may be interested in contributing.",countryCodes:["us"],url:"https://www.facebook.com/BallState.GammaThetaUpsilon/"},"ym-California-University-of-Pennsylvania":{type:"youthmappers",name:"CalU PA GIS Club",description:"YouthMappers chapter at California University of Pennsylvania",id:"ym-California-University-of-Pennsylvania",featureId:"California-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"mueller@calu.edu"}],extendedDescription:"GIS Students at Cal U learn to apply spatial theory to the real world. The university degree program focuses on geography as well as utilizing GIS in emergency management.",countryCodes:["us"],url:"https://www.facebook.com/CalUGisClub/"},"ym-Central-Washington-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Central Washington University",id:"ym-Central-Washington-University",featureId:"Central-Washington-University",contacts:[{name:"Organizer",email:"valkoc@cwu.edu"}],extendedDescription:"Our goal teaming up with Youthmappers is to bring relief to areas that are in need of humanitarian mapping. By doing so, we are serving our fellow brothers and sisters around the world as well as furthering our own cartography skills.",countryCodes:["us"],url:"https://www.cwu.edu/geography/geography-club"},"ym-Clemson-University":{type:"youthmappers",name:"Clemson Mappers",description:"YouthMappers chapter at Clemson University",id:"ym-Clemson-University",featureId:"Clemson-University",contacts:[{name:"Organizer",email:"clemsonmappers@gmail.com"}],extendedDescription:"Students in Clemson are supported by the Center for Geospatial Technologies, a community of interdisciplinary geospatial science practitioners supporting research, teaching, and outreach activities using technologies that enable the collection, analysis, and application of geospatial data. Students integrate geospatial technologies within their scholarly activities across all disciplines and build connections throughout the world.",countryCodes:["us"],url:"http://www.clemsongis.org/#!clemson-mappers/i9w6t"},"ym-College-of-William-and-Mary":{type:"youthmappers",name:"All over the map!",description:"YouthMappers chapter at College of William and Mary",id:"ym-College-of-William-and-Mary",featureId:"College-of-William-and-Mary",contacts:[{name:"Organizer",email:"lnseitz@email.wm.edu"}],extendedDescription:"The students who are all over the map are supported by the Center for Geospatial Analysis, a group integrating GIS across the curriculum and providing student and faculty with hardware, software, and expertise.  Students of all backgrounds utilize GIS across campus, including environmental science and policy, geology, history, business, sociology, biology, anthropology, public policy, and marine sciences.",countryCodes:["us"],url:"mailto:lnseitz@email.wm.edu"},"ym-Cornell-University":{type:"youthmappers",name:"Mapping Society",description:"YouthMappers chapter at Cornell University",id:"ym-Cornell-University",featureId:"Cornell-University",contacts:[{name:"Organizer",email:"mappingsocietycornell@gmail.com"}],extendedDescription:"Cornell students and faculty use open data and open source software to address challenges at local, national, and global scales. In doing so, we advance our academic and personal goals of developing our own skills around GIS and spatial literacy.",countryCodes:["us"],url:"mailto:mappingsocietycornell@gmail.com?subject=Youth%20Mappers%20and%20Mapping%20Society%20at%20Cornell%20University"},"ym-George-Mason-University":{type:"youthmappers",name:"Mason Mappers",description:"YouthMappers chapter at George Mason University",id:"ym-George-Mason-University",featureId:"George-Mason-University",contacts:[{name:"Organizer",email:"masonmappers@gmail.com"}],extendedDescription:"Mason Mappers Student Society is a humanitarian mapping student organization in the George Mason University GGS Department, and its goal is to promote education and knowledge in geo-technologies, geo-info science, to foster good global stewardship and engage in professional development while building a positive, interactive geo-community, as well as shaping students into leaders of tomorrow.",countryCodes:["us"],url:"Facebook.com/MasonMappers"},"ym-Indiana-University-of-Pennsylvania":{type:"youthmappers",name:"Geospatial Science Club",description:"YouthMappers chapter at Indiana University of Pennsylvania",id:"ym-Indiana-University-of-Pennsylvania",featureId:"Indiana-University-of-Pennsylvania",contacts:[{name:"Organizer",email:"rhoch@iup.edu"}],countryCodes:["us"],url:"mailto:rhoch@iup.edu"},"ym-Jacksonville-State-University":{type:"youthmappers",name:"JSU Disaster Mapping Team",description:"YouthMappers chapter at Jacksonville State University",id:"ym-Jacksonville-State-University",featureId:"Jacksonville-State-University",contacts:[{name:"Organizer",email:"ltatum@stu.jsu.edu"}],extendedDescription:"The JSU Disaster Mapping Team is a program at Jacksonville State University dedicated to assisting disaster response in times of emergencies. This includes tornadoes, severe thunderstorms, floods, etc. The team is intended to be a valuable asset to surrounding counties and a conduit for the JSU Geoscience Department students to apply what they have learned in an academic setting to support emergency services. Our goal is to streamline disaster response and recovery operations while utilizing student skill sets",countryCodes:["us"],url:"mailto:ltatum@stu.jsu.edu"},"ym-Kansas-State-University":{type:"youthmappers",name:"Gamma Theta Upsilon: Beta Psi Chapter",description:"YouthMappers chapter at Kansas State University",id:"ym-Kansas-State-University",featureId:"Kansas-State-University",contacts:[{name:"Organizer",email:"tblarsen@ksu.edu"}],extendedDescription:"We are the Kansas State University Chapter of Gamma Theta Upsilon, an international geography honor society with affiliation to YouthMappers. We have been active with mapping for OSM and conducted a mapathon called \"Map for Nepal,\" in which we used OpenStreetMap to digitize unmapped areas of Nepal after the earthquake in 2015.",countryCodes:["us"],url:"https://www.facebook.com/kstate.gtu?fref=ts"},"ym-McGill-University":{type:"youthmappers",name:"Open Mapping Group McGill: A Member of the McGill Undergraduate Geography Society",description:"YouthMappers chapter at McGill University",id:"ym-McGill-University",featureId:"McGill-University",contacts:[{name:"Organizer",email:"omg.mcgill@gmail.com"}],extendedDescription:"The Open Mapping Group McGill: A Member of McGill Undergraduate Geography Society (OMG McGill) aims to connect students with open geospatial data and technologies to enhance resilience, community-building, and learning through mapping–on campus, in Montreal, in Canada, and abroad.",countryCodes:["ca"],url:"mailto:omg.mcgill@gmail.com"},"ym-Miami-University":{type:"youthmappers",name:"Geography and Planning Society",description:"YouthMappers chapter at Miami University",id:"ym-Miami-University",featureId:"Miami-University",contacts:[{name:"Organizer",email:"gpsmiamioh@gmail.com"}],extendedDescription:"GPS at Miami University aims to create a close-knit community of planners and geographers who want to have fun, learn more about careers and higher education in their field, network, and work alongside professionals for real experience.",countryCodes:["us"],url:"mailto:GPSMiamiOH@gmail.com"},"ym-Monroe-Community-College":{type:"youthmappers",name:"MCC Mapping Corps",description:"YouthMappers chapter at Monroe Community College",id:"ym-Monroe-Community-College",featureId:"Monroe-Community-College",contacts:[{name:"Organizer",email:"gist@monroecc.edu"}],countryCodes:["us"],url:"mailto:GIST@monroecc.edu"},"ym-Montgomery-College":{type:"youthmappers",name:"GeoMC",description:"YouthMappers chapter at Montgomery College",id:"ym-Montgomery-College",featureId:"Montgomery-College",contacts:[{name:"Organizer",email:"stephanie.calderon@montgomerycollege.edu"}],extendedDescription:"GeoMC’s mission is to provide students with hands-on experience in applying geospatial tools, collecting data, and project management. Most of our students come with a background in GIS and are geography majors. Our chapter’s members come from diverse backgrounds and we all work together to make a positive impact in the world live in.",countryCodes:["us"],url:"mailto:stephanie.calderon@montgomerycollege.edu"},"ym-New-York-University":{type:"youthmappers",name:"NYU mHealth Initiative Mapping Corps",description:"YouthMappers chapter at New York University",id:"ym-New-York-University",featureId:"New-York-University",contacts:[{name:"Organizer",email:"mhealth@nyu.edu"}],extendedDescription:"The NYU mobile health or “mHealth” research initiative focuses on development of systems that link people - usually via their phones - to the places that they live and traverse, and thus supports novel research on the way phones and maps can be leveraged to understand behavioral decision making and ultimately health outcomes.",countryCodes:["us"],url:"http://www.nyumhealth.org/"},"ym-Ohio-Wesleyan-University":{type:"youthmappers",name:"Environment and Wildlife Club",description:"YouthMappers chapter at Ohio Wesleyan University",id:"ym-Ohio-Wesleyan-University",featureId:"Ohio-Wesleyan-University",contacts:[{name:"Organizer",email:"envirowild@owu.edu"}],extendedDescription:"Environment and Wildlife Club looks at environmental issues on campus, in Delaware, and even nationally! We create campus and community projects, explore and enjoy the outdoors, volunteer, and try to promote environmentalism in every aspect of our lives.",countryCodes:["us"],url:"mailto:envirowild@owu.edu"},"ym-Oklahoma-State-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Oklahoma State University",id:"ym-Oklahoma-State-University",featureId:"Oklahoma-State-University",contacts:[{name:"Organizer",email:"hhayden@okstate.edu"}],countryCodes:["us"],url:"mailto:hhayden@okstate.edu"},"ym-State-University-of-New-York-Geneseo":{type:"youthmappers",name:"SUNY Geneseo GIS Association",description:"YouthMappers chapter at State University of New York Geneseo",id:"ym-State-University-of-New-York-Geneseo",featureId:"State-University-of-New-York-Geneseo",contacts:[{name:"Organizer",email:"bb18@geneseo.edu"}],extendedDescription:"We spread awareness, support, education, volunteerism, and career advancement opportunities in geographic information systems, across disciplines and departments, in the context of SUNY Geneseo, the local community, and global community.",countryCodes:["us"],url:"http://www.facebook.com/GeneseoGIS"},"ym-SUNY-at-Fredonia":{type:"youthmappers",name:"Geoventurers",description:"YouthMappers chapter at SUNY at Fredonia",id:"ym-SUNY-at-Fredonia",featureId:"SUNY-at-Fredonia",contacts:[{name:"Organizer",email:"amw30@geneseo.edu"}],extendedDescription:"GeoVenturers is a group of students joining together across a number of majors on our campus that see geospatial technologies as a tool to serve others and to bring people together. Mentoring for the group brings in science education from the department of curriculum and instruction. We hope that we can bring our skills to play in helping make people's lives better.",countryCodes:["us"],url:"mailto:amw30@geneseo.edu?subject=GeoVenturers%20and%20the%20YouthMappers%20network"},"ym-Texas-Tech-University":{type:"youthmappers",name:"YouthMappers at TTU",description:"YouthMappers chapter at Texas Tech University",id:"ym-Texas-Tech-University",featureId:"Texas-Tech-University",contacts:[{name:"Organizer",email:"emily.glaeser@ttu.edu"}],extendedDescription:"As one of the co-founding chapters of the network, the TTU YouthMappers are enthusiastic to serve as interdisciplinary leaders to help create open geographic data and analyses that address locally defined development challenges worldwide. The chapter strives to exchange and collaborate with other chapters around the globe while also offering themselves as a local resource and service to Texas Tech student organizations in ways that add value to their respecitive campus activities through mapping.",countryCodes:["us"],url:"https://www.facebook.com/youthmapperstexastech/"},"ym-The-Citadel":{type:"youthmappers",name:"YouthMappers at The Citadel",description:"YouthMappers chapter at The Citadel",id:"ym-The-Citadel",featureId:"The-Citadel",contacts:[{name:"Organizer",email:"cstokes5@citadel.edu"}],extendedDescription:"This chapter is also a Rotaract Club, which is an affiliate of Rotary International. Multiple members, as well as leadership have expressed an interest in YouthMappers and we would like to affiliate our Citadel Rotaract Club with YouthMappers.",countryCodes:["us"],url:"Mailto:cstokes5@citadel.edu"},"ym-The-George-Washington-University":{type:"youthmappers",name:"Humanitarian Mapping Society",description:"YouthMappers chapter at The George Washington University",id:"ym-The-George-Washington-University",featureId:"The-George-Washington-University",contacts:[{name:"Organizer",email:"hms.gwu@gmail.com"}],extendedDescription:"Models of leadership and engagement, HMS seeks to render aid and better the world through humanitarian Geographic Information Systems (GIS) projects. This co-founding affiliated chapter on the campus of GWU has a plethora of experience to share, and frequently partners directly with USAID, the American Red Cross, and the US Department of State in their DC area to expand student-led efforts and serve the global community.",countryCodes:["us"],url:"https://www.facebook.com/GWHMS/"},"ym-The-Johns-Hopkins-University-SAIS":{type:"youthmappers",name:"SAIS YouthMappers",description:"YouthMappers chapter at The Johns Hopkins University, SAIS",id:"ym-The-Johns-Hopkins-University-SAIS",featureId:"The-Johns-Hopkins-University-SAIS",contacts:[{name:"Organizer",email:"saisyouthmappers@gmail.com"}],extendedDescription:"The mission of SAIS Youth Mappers is to provide students at the Johns Hopkins University SAIS with the opportunity to become highly skilled humanitarian mappers. As a group within the South Asia Club, its primary focus is on supporting humanitarian mapping projects in the Indo-Pacific Region.",countryCodes:["us"],url:"mailto:saisyouthmappers@gmail.com"},"ym-The-Pennsylvania-State-University":{type:"youthmappers",name:"Penn State GIS Coalition",description:"YouthMappers chapter at The Pennsylvania State University",id:"ym-The-Pennsylvania-State-University",featureId:"The-Pennsylvania-State-University",contacts:[{name:"Organizer",email:"advising@geog.psu.edu"}],extendedDescription:"The Penn State Geospatial Information Science (GIS) Coalition is an organization that offers students majoring, minoring, or sharing an interest in GIS opportunities to develop supplementary knowledge and skills necessary to succeed in the professional GIS industry.",countryCodes:["us"],url:"mailto:advising@geog.psu.edu"},"ym-University-of-California-Davis":{type:"youthmappers",name:"Mapping Club",description:"YouthMappers chapter at University of California, Davis",id:"ym-University-of-California-Davis",featureId:"University-of-California-Davis",contacts:[{name:"Organizer",email:"ucdmappingclub@ucdavis.edu"}],countryCodes:["us"],url:"mailto:ucdmappingclub@ucdavis.edu?subject=YouthMappers%20and%20UC%20Davis%20Mapping%20Club"},"ym-University-of-Central-Florida":{type:"youthmappers",name:"Geospatial Information Society",description:"YouthMappers chapter at University of Central Florida",id:"ym-University-of-Central-Florida",featureId:"University-of-Central-Florida",contacts:[{name:"Organizer",email:"rsouth@knights.ucf.edu"}],extendedDescription:"Our mission is to foster a social and educational environment for all majors who are interested in the discussion and application of GIS. Group and community events throughout the academic year organize students to volunteer to help local and regional communities by using community-based GIS projects and educating local middle and high school students on the use and application of GIS.",countryCodes:["us"],url:"mailto:rsouth@knights.ucf.edu"},"ym-University-of-Chicago":{type:"youthmappers",name:"Tobler Society",description:"YouthMappers chapter at University of Chicago",id:"ym-University-of-Chicago",featureId:"University-of-Chicago",contacts:[{name:"Organizer",email:"toblersociety@uchicago.edu"}],countryCodes:["us"],url:"mailto:toblersociety@uchicago.edu"},"ym-University-of-Maryland-College-Park":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at University of Maryland - College Park",id:"ym-University-of-Maryland-College-Park",featureId:"University-of-Maryland-College-Park",contacts:[{name:"Organizer",email:"geogclubumd@gmail.com"}],extendedDescription:"The mission of the Geography Club at the University of Maryland College Park is to engage and encourage students to explore geographic interests within the campus and the community.",countryCodes:["us"],url:"https://www.facebook.com/UMDGeographyClub/?fref=ts"},"ym-University-of-North-Texas":{type:"youthmappers",name:"UNT Geography Club",description:"YouthMappers chapter at University of North Texas",id:"ym-University-of-North-Texas",featureId:"University-of-North-Texas",contacts:[{name:"Organizer",email:"reeseramsey@my.unt.edu"}],extendedDescription:"The Geography Club is a student organization at University of North Texas that welcomes all students who are interested in geography. The objective of the Geography Club is to promote interest in Geography, the Major and the Geography Department along with fellowship among students and faculty. The club also seeks to represent student needs and wants in regard to the study of geography and to provide a forum for the presentation of innovative ideas to the benefit of the University community.",countryCodes:["us"],url:"Mailto:reeseramsey@my.unt.edu"},"ym-University-of-Northern-Colorado":{type:"youthmappers",name:"UNCO Geography and GIS Club",description:"YouthMappers chapter at University of Northern Colorado",id:"ym-University-of-Northern-Colorado",featureId:"University-of-Northern-Colorado",contacts:[{name:"Organizer",email:"uncogeoggisclub@gmail.com"}],extendedDescription:"Official Geography and GIS Club chapter affiliated with the University of Northern Colorado where our aim is to learn, share and connect with those around us. #MakingSenseOfTheWorld",countryCodes:["us"],url:"www.facebook.com/groups/476365076071166/"},"ym-University-of-Oregon":{type:"youthmappers",name:"Map by Northwest",description:"YouthMappers chapter at University of Oregon",id:"ym-University-of-Oregon",featureId:"University-of-Oregon",contacts:[{name:"Organizer",email:"cbone@uoregon.edu"}],extendedDescription:"Map By Northwest aims to engage undergraduate students at the University of Oregon in mapping projects to assist in humanitarian causes and for conducting geographic research. We welcome students from all disciplines to join us in our mapping adventures.",countryCodes:["us"],url:"http://blogs.uoregon.edu/mxnw/"},"ym-University-of-Redlands":{type:"youthmappers",name:"URSpatial Geo-Thinkers",description:"YouthMappers chapter at University of Redlands",id:"ym-University-of-Redlands",featureId:"University-of-Redlands",contacts:[{name:"Organizer",email:"nathan_strout@redlands.edu"}],extendedDescription:"To build upon the members' GIS skills and knowledge of the tools and methods through applied social engagement as well as to educate the campus community about the power of mapping and spatial analysis through community service events.",countryCodes:["us"],url:"mailto:nathan_strout@redlands.edu"},"ym-University-of-South-Carolina":{type:"youthmappers",name:"Geography Graduate Student Association",description:"YouthMappers chapter at University of South Carolina",id:"ym-University-of-South-Carolina",featureId:"University-of-South-Carolina",contacts:[{name:"Organizer",email:"carolina_ggsa@gmail.com"}],extendedDescription:"The GGSA is a fully student-run organization, designed to serve as an advocate and resource for all geography graduate students by filling the role of liaison between the department and students. Our goal is to further professional, academic, and personal development of graduate students interested in the field of geography and its sub disciplines.",countryCodes:["us"],url:"https://carolinaggsa.wordpress.com/"},"ym-University-of-Southern-California":{type:"youthmappers",name:"SC Mappers",description:"YouthMappers chapter at University of Southern California",id:"ym-University-of-Southern-California",featureId:"University-of-Southern-California",contacts:[{name:"Organizer",email:"scmappers@gmail.com"}],extendedDescription:"We see the world differently: we view it through a spatial lens. With the power of spatial thinking, we connect place and space to help address global challenges. Collaborate with us!",countryCodes:["us"],url:"mailto:scmappers@gmail.com?subject=YouthMappers%20at%20USC"},"ym-University-of-Vermont":{type:"youthmappers",name:"University of Vermont Humanitarian Mapping Club",description:"YouthMappers chapter at University of Vermont",id:"ym-University-of-Vermont",featureId:"University-of-Vermont",contacts:[{name:"Organizer",email:"uvm.hmc@gmail.com"}],countryCodes:["us"],url:"https://www.facebook.com/UVMHMC"},"ym-University-of-Victoria":{type:"youthmappers",name:"Society of Geography Students",description:"YouthMappers chapter at University of Victoria",id:"ym-University-of-Victoria",featureId:"University-of-Victoria",contacts:[{name:"Organizer",email:"sogsmappers@gmail.com"}],extendedDescription:"SOGS seeks to promote and represent social and academic interests within the Department of Geography. This is expressed by four key goals: To provide a forum for the discussion of matters concerning the quality and accessibility of education within geography; to provide a means of expressing a consensus of student opinion to deparhnental faculty through representation at deparkrnental meetings and on departrnental committees; to undertake anangements for such activities as are for the benefit of students and are seen to be within the field of interest of students in geography; to act as a liaison through the UVSS and the Course Union Council with other student groups on campus",url:"https://www.facebook.com/SOGSUVic/"},"ym-University-of-Wyoming":{type:"youthmappers",name:"Gamma Theta Upsilon/Geography Club",description:"YouthMappers chapter at University of Wyoming",id:"ym-University-of-Wyoming",featureId:"University-of-Wyoming",contacts:[{name:"Organizer",email:"gtu-geography@uwyo.edu"}],countryCodes:["us"],url:"http://www.uwyo.edu/geography/geographyclub/"},"ym-UW-Madison":{type:"youthmappers",name:"BadgerMaps",description:"YouthMappers chapter at UW-Madison",id:"ym-UW-Madison",featureId:"UW-Madison",contacts:[{name:"Organizer",email:"uwbadgermaps@gmail.com"}],extendedDescription:"BadgerMaps is the UW campus chapter of Youthmappers, an organization dedicated to humanitarian and community mapping services. We connect our volunteer network with opportunities to create GIS data for projects that need it.",countryCodes:["us"],url:"https://www.facebook.com/UW-BadgerMaps-197746270811951/"},"ym-Vassar-College":{type:"youthmappers",name:"Hudson Valley Mappers",description:"YouthMappers chapter at Vassar College",id:"ym-Vassar-College",featureId:"Vassar-College",contacts:[{name:"Organizer",email:"geo@vassar.edu"}],extendedDescription:"Our mission is to provide a multi-disciplinary platform for peers, educators, and community organizations to engage in local mapping projects with a focus on strengthening our local ecosystems, our built environment, and the health of our community. We also seek to contribute geospatial support for global humanitarian aid and development efforts.",countryCodes:["us"],url:"http://pages.vassar.edu/gis/vassar-youthmappers/"},"ym-Villanova-University":{type:"youthmappers",name:"The Villanova Globeplotters",description:"YouthMappers chapter at Villanova University",id:"ym-Villanova-University",featureId:"Villanova-University",contacts:[{name:"Organizer",email:"villanova.globeplotters@gmail.com"}],extendedDescription:"The Villanova Globeplotters is built on Villanova’s Augustinian principle of selfless-service to the global community. Mixed with relaxed social interaction, we strive to provide geospatial outreach to those in need regardless of participating students’ race, academic major, student group association, or college career level.",countryCodes:["us"],url:"mailto:villanova.globeplotters@gmail.com"},"ym-West-Virginia-University":{type:"youthmappers",name:"Maptime Morgantown",description:"YouthMappers chapter at West Virginia University",id:"ym-West-Virginia-University",featureId:"West-Virginia-University",contacts:[{name:"Organizer",email:"maptimemorgantown@gmail.com"}],extendedDescription:"Working as a collaborative team, this co-founding chapter focuses on providing an open learning environment for those interested in working on projects that intersect international development, emergency response, and geographic information science.\nThey connect beginners and experts by providing technical training and experience in building meaningful and useful geographic infrastructure data, while connecting to sister cities around the world.",countryCodes:["us"],url:"mailto:MaptimeMorgantown@gmail.com?subject=Maptime%20Morgantown%20from%20YouthMappers%20website"},"ym-Western-Michigan-University":{type:"youthmappers",name:"Geography Club",description:"YouthMappers chapter at Western Michigan University",id:"ym-Western-Michigan-University",featureId:"Western-Michigan-University",contacts:[{name:"Organizer",email:"wmu.geog.club@gmail.com"}],countryCodes:["us"],url:"http://www.facebook.com/groups/WMUGeographyClub/"},geogeeks_perth_meetup:{id:"geogeeks_perth_meetup",featureId:"western_australia",type:"group",countryCodes:["au"],languageCodes:["en"],name:"GeoGeeks Perth Meetup",description:"Perth-based meetup group for people interested in mapping, geospatial data, and open source. We'll be working on anything that involves a sense of place.",url:"https://geogeeks.org",contacts:[{name:"GeoGeeks Perth",email:"geogeeks.perth@gmail.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"Maptime-Oceania-Slack":{id:"Maptime-Oceania-Slack",featureId:"oceania_full",type:"slack",countryCodes:["au","nz"],languageCodes:["en"],name:"Maptime Oceania Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeoceania.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-nz":{id:"talk-nz",featureId:"new_zealand_full",type:"mailinglist",countryCodes:["nz"],languageCodes:["en"],name:"Talk-nz Mailing List",description:"New Zealand's OSM community talk",url:"https://lists.openstreetmap.org/listinfo/talk-nz",contacts:[{name:"Talk NZ Owner",email:"talk-nz-owner@openstreetmap.org"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://webchat.oftc.net/?channels=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-discord":{id:"OSM-br-discord",featureId:"brazil",type:"discord",name:"OpenStreetMap Brasil Discord",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Discord",url:"https://discord.gg/bQn4aCm",contacts:[{name:"Eduardo Addad de Oliveira",email:"duduaddad@gmail.com"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"ym-Universidad-de-Antioquia":{type:"youthmappers",name:"Geomatica UDEA",description:"YouthMappers chapter at Universidad de Antioquia",id:"ym-Universidad-de-Antioquia",featureId:"Universidad-de-Antioquia",contacts:[{name:"Organizer",email:"geomatica.ing.udea@gmail.com"}],extendedDescription:"We are a group interested in geospatial data, voluntary cartography, and participating in mapping with others in our country and within the YouthMappers network.",countryCodes:["co"],url:"mailto:geomatica.ing.udea@gmail.com?subject=YouthMappers%20y%20Universidad%20de%20Antioquia"},"ym-Universidad-de-La-Guajira":{type:"youthmappers",name:"Grupo Mesh",description:"YouthMappers chapter at Universidad de La Guajira",id:"ym-Universidad-de-La-Guajira",featureId:"Universidad-de-La-Guajira",contacts:[{name:"Organizer",email:"zoviedo@uniguajira.edu.co"}],extendedDescription:"Grupo Mesh is a student organization at the Universidad de la Guajira in Colombia, including students from the program of Environmental Engineering who learn cartography and open mapping.",countryCodes:["co"],url:"mailto:zoviedo@uniguajira.edu.co?subject=Grupo%20Mesh%20y%20YouthMappers"},"ym-Universidad-de-Los-Andes":{type:"youthmappers",name:"Cartografos Uniandes",description:"YouthMappers chapter at Universidad de Los Andes",id:"ym-Universidad-de-Los-Andes",featureId:"Universidad-de-Los-Andes",contacts:[{name:"Organizer",email:"geografia@uniandes.edu.co"}],extendedDescription:"We are a circle of student participation that seeks to use mapping and spatial reasoning as a means to create bonds of cooperation and integration between the university and society by addressing different spatial, social, political , economic and cultural dynamics.",countryCodes:["co"],url:"mailto:geografia@uniandes.edu.co?subject=Youth%20Mappers%20Chapter%20y%20la%20Universidad%20de%20los%20Andes"},"ym-Universidad-de-San-Buenaventura":{type:"youthmappers",name:"YouthMappers San Buenaventura",description:"YouthMappers chapter at Universidad de San Buenaventura",id:"ym-Universidad-de-San-Buenaventura",featureId:"Universidad-de-San-Buenaventura",contacts:[{name:"Organizer",email:"ingenieria.sistemas@usbmed.edu.co"}],extendedDescription:"We are pleased to join YouthMappers mapping for a better world and community.",countryCodes:["co"],url:"https://www.facebook.com/groups/1742657446017065/"},"ym-Universidad-Distrital-Francisco-Jose-de-Caldas":{type:"youthmappers",name:"YouthMappers at Bogota",description:"YouthMappers chapter at Universidad Distrital Francisco Jose de Caldas",id:"ym-Universidad-Distrital-Francisco-Jose-de-Caldas",featureId:"Universidad-Distrital-Francisco-Jose-de-Caldas",contacts:[{name:"Organizer",email:"lrocha@selper.org.co"}],extendedDescription:"The Universidad Distrital Francisco José de Caldas is a public, coeducational, research university based in Bogotá, Colombia with a population of 26,140 students.",countryCodes:["co"],url:"mailto:lrocha@selper.org.co"},"ym-Universidad-Nacional-de-Colombia":{type:"youthmappers",name:"Grupo UN",description:"YouthMappers chapter at Universidad Nacional de Colombia",id:"ym-Universidad-Nacional-de-Colombia",featureId:"Universidad-Nacional-de-Colombia",contacts:[{name:"Organizer",email:"raknudsono@unal.edu.co"}],extendedDescription:"Students are uniting to map and network with university students across the country of Colombia and across the globe.  Geographic specialties include affiliation with microbiology and health disciplines.",countryCodes:["co"],url:"mailto:raknudsono@unal.edu.co?subject=Youth%20Mappers%20y%20Grupo%20UN%20Colombia"},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"uy-forum":{id:"uy-forum",type:"forum",featureId:"uruguay",countryCodes:["uy"],languageCodes:["es"],name:"OpenStreetMap UY forum",description:"OpenStreetMap Uruguay web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=78",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"uy-irc":{id:"uy-irc",featureId:"uruguay",type:"irc",name:"OpenStreetMap Uruguay on IRC",countryCodes:["uy"],languageCodes:["es"],description:"Join #osmuruguay on irc.freenode.org (port 6667)",extendedDescription:"Join #osmuruguay on irc.freenode.org",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osmuruguay",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"uy-mailinglist":{id:"uy-mailinglist",featureId:"uruguay",type:"mailinglist",name:"Talk-uy Mailing List",countryCodes:["uy"],languageCodes:["es"],description:"Talk-uy is the official mailing list for the Uruguayan OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-uy",contacts:[{name:"UY community",email:"talk-uy-owner@openstreetmap.org"}]},"ve-forum":{id:"ve-forum",type:"forum",featureId:"venezuela",countryCodes:["ve"],languageCodes:["es"],name:"OpenStreetMap VE Forum",description:"OpenStreetMap Venezuela web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=50",contacts:[{name:"VE Community",email:"talk-ve-owner@openstreetmap.org"}]},"ve-mailinglist":{id:"ve-mailinglist",featureId:"venezuela",type:"mailinglist",name:"Talk-ve Mailing List",countryCodes:["ve"],languageCodes:["es"],description:"Talk-ve is the official mailing list for the Venezuelan OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-ve",contacts:[{name:"VE Community",email:"talk-ve-owner@openstreetmap.org"}]},"ve-telegram":{id:"ve-telegram",featureId:"venezuela",type:"telegram",name:"OpenStreetMap Venezuela Telegram",countryCodes:["ve"],languageCodes:["es"],description:"Join the OpenStreetMap Venezuela community on Telegram",url:"https://telegram.me/OSMve",contacts:[{name:"VE Community",email:"talk-ve-owner@openstreetmap.org"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",featureId:"latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
24875
24876         var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2013-06-01T00:00:00.000Z",startDate:"2013-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],terms_url:"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523",terms_text:"Pictometry Inc, San Juan County GIS",description:"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{id:"sjcgis.org-Aerials_2016_WM",name:"2016 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2016-07-01T00:00:00.000Z",startDate:"2016-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],best:true,description:"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{id:"OS7",name:"7th Series (OS7)",type:"tms",template:"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/rest/services/actmapi/imagery2017mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",icon:"http://actmapi.act.gov.au/img/apple-touch-icon.png"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/rest/services/actmapi/imagery2018mga/ImageServer/exportImage?f=image&format=jpeg&imageSR=3857&bboxSR=3857&bbox={bbox}&size={width},{height}&foo={proj}",projection:"EPSG:3857",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true,icon:"http://actmapi.act.gov.au/img/apple-touch-icon.png"},{id:"AGRI-black_and_white-2.5m",name:"AGRI black-and-white 2.5m",type:"tms",template:"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"AIV_DHMV_II_HILL_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, multidirectionale hillshade 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_HILL_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AIV_DHMV_II_SVF_25cm",name:"AIV Digitaal Hoogtemodel Vlaanderen II, Skyview factor 0,25 m",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/dhmv/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DHMV_II_SVF_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV10cm",name:"AIV Flanders 2013-2015 aerial imagery 10cm",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AIV Flanders GRB",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"© agentschap Informatie Vlaanderen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AIV Flanders most recent aerial imagery",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"© agentschap Informatie Vlaanderen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"CRAIG-Auvergne-2013",name:"Auvergne 2013 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",terms_text:"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL",description:"French address registry or Base Adresses Nationale Ouverte",overlay:true},{id:"lu.geoportail.opendata.basemap",name:"Basemap geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"basemap.at",name:"basemap.at",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-orthofoto",name:"basemap.at Orthofoto",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",best:true,description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Overlay",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{id:"basemap.at-surface",name:"basemap.at Surface",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoberflaeche/grau/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Surface layer provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-terrain",name:"basemap.at Terrain",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapgelaende/grau/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Terrain layer provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v2/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence",terms_text:"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL",description:"Réseau hydrographique: cours et plans d'eau et POI",overlay:true},{id:"fr.ign.bdortho",name:"BDOrtho IGN",type:"tms",template:"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018"},{id:"Berlin-2019",name:"Berlin aerial photography 2019",type:"tms",template:"https://tiles.codefor.de/berlin-2019/{zoom}/{x}/{y}.png",endDate:"2019-04-06T00:00:00.000Z",startDate:"2019-04-01T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2019 (DOP20RGB)",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[1,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{id:"Bordeaux_2012",name:"Bordeaux - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Communauté urbaine de Bordeaux - 2012"},{id:"Bordeaux_2016",name:"Bordeaux 2016",type:"tms",template:"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Bordeaux Métropole - 2016"},{id:"branquinha_al",name:"Branquinha AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"British_Columbia_Mosaic",name:"British Columbia Mosaic",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",endDate:"2013-06-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],terms_url:"http://imagery.paulnorman.ca/tiles/about.html",terms_text:"Copyright Province of British Columbia, City of Surrey"},{id:"Budapest_XI_2015",name:"Budapest district XI orthophoto 2015",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",description:"5 cm resolution bald image"},{id:"Budapest_XI_2017",name:"Budapest district XI orthophoto 2017",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",best:true,description:"5 cm resolution bald image"},{id:"Cadastre",name:"Cadastre",type:"tms",template:"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation",terms_text:"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2019",description:"French land registry",icon:"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{id:"lu.geoportail.opendata.cadastre",name:"Cadastre geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"cajueiro_al",name:"Cajueiro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],terms_url:"http://www.osm-tools.org",terms_text:"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{id:"campo_alegre_al",name:"Campo Alegre AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[6.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"capela_al",name:"Capela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"BDGEx_ctm_multi",name:"Cartas Topográficas do Exército Brasileiro",type:"wms",template:"https://bdgex.eb.mil.br/mapcache?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ctmmultiescalas_mercator&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[1,22],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]]],terms_text:"BDGEx",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/Exercito.png"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{id:"Catastro-Spain",name:"Catastro Spain",type:"wms",template:"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{id:"South_Africa-CapeTown-Aerial-2013",name:"City of Cape Town 2013 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{id:"South_Africa-CapeTown-Aerial",name:"City of Cape Town 2015 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",best:true,description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{id:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{id:"DCGIS-County-Imagery-2017-Fall-Leaf-Off-6-Inch",name:"Dakota County GIS 2017 Fall Leaf-Off 6-Inch",type:"wms",template:"https://gisimg.co.dakota.mn.us/arcgis/services/AerialPhotography/2017AirPhotoLeafOff6Inch/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2017AirPhotoLeafOff6Inch:None&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[5,20],polygon:[[[-93.32967,44.79107],[-93.32964,44.63037],[-93.28189,44.63074],[-93.28169,44.47194],[-93.28176,44.47137],[-93.0395,44.47103],[-93.03924,44.51125],[-92.91932,44.51049],[-92.91899,44.54325],[-92.79268,44.54324],[-92.7926,44.62971],[-92.73207,44.62948],[-92.73122,44.71411],[-92.80342,44.74652],[-92.82767,44.75056],[-92.85209,44.74695],[-92.85959,44.75359],[-92.87724,44.77283],[-92.88149,44.77492],[-92.9049,44.77408],[-92.92808,44.78111],[-92.93969,44.77563],[-92.94843,44.76786],[-92.95859,44.76724],[-92.98604,44.77501],[-92.99291,44.77517],[-93.00306,44.77206],[-93.01685,44.77635],[-93.02153,44.79431],[-93.00523,44.81541],[-93.0119,44.83657],[-93.00859,44.85652],[-93.01041,44.86586],[-93.02074,44.89279],[-93.0309,44.8967],[-93.04083,44.90391],[-93.04445,44.91514],[-93.04725,44.9195],[-93.04724,44.92318],[-93.12863,44.92335],[-93.12882,44.91965],[-93.13257,44.91243],[-93.1641,44.89048],[-93.18289,44.8872],[-93.20075,44.86486],[-93.20325,44.85263],[-93.22179,44.83825],[-93.25188,44.81146],[-93.28177,44.80611],[-93.30453,44.7945],[-93.32645,44.79245],[-93.32961,44.79107],[-93.32967,44.79107]]],terms_url:"https://dakotacounty.us",terms_text:"Dakota County GIS",icon:"https://www.co.dakota.mn.us//SiteAssets/DakotaCountyLogo_W.png"},{id:"Duna_2013",name:"Danube flood orthophoto 2013",type:"tms",template:"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],terms_url:"http://fototerkep.hu",terms_text:"Fotótérkép.hu",description:"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{id:"Delaware2012Orthophotography",name:"Delaware 2012 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"delmiro_gouveia",name:"Delmiro Gouveia AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"der-es",name:"DER-ES",type:"wms",template:"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-40.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2013",name:"Erlangen Luftbild (2013 6,25 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2016",name:"Erlangen Luftbild (2016 5,0 cm)",type:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2016/{zoom}/{x}/{y}.jpg",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[10.97664,49.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © GEOCART GmbH"},{id:"Erlangen-2018",name:"Erlangen Luftbild (2018 5,0 cm)",type:"tms",template:"https://osm.rrze.fau.de/protected/YgktSWTTo6HS9nKi/lbe2018/{zoom}/{x}/{y}.jpg",endDate:"2018-04-09T00:00:00.000Z",startDate:"2018-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[10.85157,49.55172],[10.93037,49.55272],[10.9326,49.55818],[10.91627,49.55882],[10.91144,49.56652],[10.92281,49.60584],[10.9108,49.63751],[10.92775,49.64838],[10.94444,49.64321],[10.96487,49.63317],[10.96384,49.62711],[10.9745,49.62483],[10.9786,49.61794],[10.98478,49.61694],[10.998,49.62228],[11.00813,49.62194],[11.0071,49.61449],[11.01448,49.61394],[11.02081,49.62292],[11.05757,49.63993],[11.08136,49.62614],[11.08312,49.62034],[11.10419,49.61524],[11.11767,49.61449],[11.11997,49.60377],[11.13132,49.60348],[11.1272,49.58815],[11.10271,49.58378],[11.08898,49.59124],[11.07988,49.60837],[11.05808,49.60971],[11.06049,49.59803],[11.06512,49.59614],[11.0689,49.58879],[11.06031,49.58556],[11.04469,49.58913],[11.03851,49.58556],[11.03577,49.57276],[11.03937,49.55785],[11.04272,49.5432],[11.03465,49.5324],[10.97531,49.53467],[10.97158,49.53084],[10.94279,49.52986],[10.94273,49.50582],[10.92163,49.50566],[10.91245,49.51829],[10.88818,49.52834],[10.87518,49.51725],[10.84872,49.52291],[10.84652,49.52797],[10.84637,49.53223],[10.85157,49.55172]]],terms_text:"© Stadt Erlangen | © Hansa Luftbild AG",best:true},{id:"EsriWorldImagery",name:"Esri World Imagery",type:"tms",template:"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"EsriWorldImageryClarity",name:"Esri World Imagery (Clarity) Beta",type:"tms",template:"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri archive imagery that may be clearer and more accurate than the default layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",zoomExtent:[6,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{id:"FOMI_2000",name:"FÖMI orthophoto 2000",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"FOMI_2005",name:"FÖMI orthophoto 2005",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"Freemap.sk-Car",name:"Freemap.sk Car",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Geobase_Roads_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"geoimage.at",name:"Geoimage.at MaxRes",type:"wms",template:"https://gis.bmlfuw.gv.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",polygon:[[[-1.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"Geolittoral-Sentiers",name:"Géolittoral - Sentiers",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"GeolittoralV2-Orthophotos",name:"Géolittoral V2 - Orthophotos 2011-2014",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho Littorale V2 - MEDDE"},{id:"lu.geoportail.opendata.ortho_10cm_proto_lidar",name:"geoportail.lu LIDAR prototype Nordstad 2017",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-04-09T00:00:00.000Z",startDate:"2017-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],terms_url:"https://act.public.lu/fr/cartographie/lidar",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://i.imgur.com/aFlvMpM.png"},{id:"girau_do_pnciano",name:"Girau do Ponciano",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{id:"GrandNancy_Orthophotographie_2012",name:"GrandNancy - Orthophoto - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"https://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2019 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"https://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2019 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hampshire-Aerial-FCIR",name:"Hampshire Aerial FCIR",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"Hampshire-Aerial-RGB",name:"Hampshire Aerial RGB",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{id:"IBGE_DF_Addresses",name:"IBGE Distrito Federal",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],terms_text:"IBGE",description:"Addresses data from IBGE",overlay:true},{id:"IBGE_Setores_Rurais",name:"IBGE Mapa de Setores Rurais",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE.png"},{id:"IBGE_Setores_Urbanos",name:"IBGE Mapa de Setores Urbanos",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE.png"},{id:"IBGE_Nomes_Ruas",name:"IBGE Nomes de Ruas",type:"tms",template:"https://api.maptiler.com/maps/b2037b15-5614-4fed-9608-9830b8dc574a/256/{zoom}/{x}/{y}.png?key=YmPoUxbTlEHlrASzv56Z",zoomExtent:[4,22],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE, OSM Brasil",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE.png",overlay:true},{id:"IBGE_BC250_Aglomerado_Rural",name:"IBGE-BC250-Aglomerado Rural Isolado",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Pista_Pouso",name:"IBGE-BC250-Pista de Pouso",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rios_Drenagem",name:"IBGE-BC250-Rios Drenagem",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Terra_Indegina",name:"IBGE-BC250-Terra Indigena",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rodoviario",name:"IBGE-BC250-Trecho Rodoviario",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Uso_Sustentavel",name:"IBGE-BC250-Unidade de Uso Sistentável - APA",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Villa",name:"IBGE-BC250-Villa",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Gerador_Eletrica",name:"IBGE-BCIM-Estações Geradora de Energia Elétrica",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Municipio",name:"IBGE-BCIM-Município",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{id:"osmim-imagicode-S2A_R119_N09_20160327T050917",name:"imagico.de: Adams Bridge",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}",endDate:"2016-03-27T00:00:00.000Z",startDate:"2016-03-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Supplementing incomplete coverage in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80700162014211LGN00",name:"imagico.de: Alaska Range",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-07-31T00:00:00.000Z",startDate:"2014-07-31T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent summer image of the Alaska Range for mapping natural features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral2",name:"imagico.de: Aral Sea (high water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}",endDate:"2016-03-03T00:00:00.000Z",startDate:"2016-03-03T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral1",name:"imagico.de: Aral Sea (low water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}",endDate:"2016-09-09T00:00:00.000Z",startDate:"2016-09-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170417T140051",name:"imagico.de: Bahía Blanca (high tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-04-17T00:00:00.000Z",startDate:"2017-04-17T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170127T140051",name:"imagico.de: Bahía Blanca (low tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-01-27T00:00:00.000Z",startDate:"2017-01-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81190582014075LGN00",name:"imagico.de: Bakun Reservoir",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-03-16T00:00:00.000Z",startDate:"2014-03-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in older pre-2011 images (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81250592016107LGN00",name:"imagico.de: Batam",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80770232017156LGN00",name:"imagico.de: Bogoslof Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}",endDate:"2017-06-05T00:00:00.000Z",startDate:"2017-06-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image from after the eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81800982013291LGN00",name:"imagico.de: Bouvet Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-18T00:00:00.000Z",startDate:"2013-10-18T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",best:true,description:"For more accurate coastline and glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R017_S67_20170223T022551",name:"imagico.de: Bunger Hills",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}",endDate:"2017-02-23T00:00:00.000Z",startDate:"2017-02-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R065_N47_20160929T102022",name:"imagico.de: Central Alps in late September 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}",endDate:"2016-09-29T00:00:00.000Z",startDate:"2016-09-29T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82050982015344LGN00",name:"imagico.de: Clerke Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-10T00:00:00.000Z",startDate:"2015-12-10T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R086_N60_20160831T213532",name:"imagico.de: Cook Inlet",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}",endDate:"2016-08-31T00:00:00.000Z",startDate:"2016-08-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and glaciers in surrounding mountains (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0040712016264110KF",name:"imagico.de: Coropuna",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-09-21T00:00:00.000Z",startDate:"2016-09-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R022_N06_20151221T103009",name:"imagico.de: Cotonou",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}",endDate:"2015-12-21T00:00:00.000Z",startDate:"2015-12-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Patchy and partly cloudy coverage in usual sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R040_N01_20160311T164128",name:"imagico.de: Darwin and Wolf islands, Galapagos",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}",endDate:"2016-03-11T00:00:00.000Z",startDate:"2016-03-11T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image, only old and poor images in other sources currently (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80360072014245LGN00",name:"imagico.de: Eastern Devon Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-09-02T00:00:00.000Z",startDate:"2014-09-02T00:00:00.000Z",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82160152013239LGN00",name:"imagico.de: Eastern Iceland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-08-27T00:00:00.000Z",startDate:"2013-08-27T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492",name:"imagico.de: El Altar",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}",endDate:"2012-02-05T00:00:00.000Z",startDate:"2012-02-05T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R009_S61_20160109",name:"imagico.de: Elephant Island/Clarence Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}",endDate:"2016-01-09T00:00:00.000Z",startDate:"2016-01-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Fairly clear up-to-date image for updating glacier edges (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-enderby",name:"imagico.de: Enderby Land and Kemp Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}",endDate:"2017-03-27T00:00:00.000Z",startDate:"2017-01-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 images of Enderby Land and Kemp Coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100502015347LGN00",name:"imagico.de: Fogo, Cape Verde",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2014/2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-greenland",name:"imagico.de: Greenland mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Landsat mosaic of Greenland (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R047_S54_20160411T044330",name:"imagico.de: Heard Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}",endDate:"2016-04-12T00:00:00.000Z",startDate:"2016-04-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82280982013259LGN00",name:"imagico.de: Isla Londonderry",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-16T00:00:00.000Z",startDate:"2013-09-16T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20151008",name:"imagico.de: Kangerlussuaq Autumn",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}",endDate:"2015-10-08T00:00:00.000Z",startDate:"2015-10-08T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20160518",name:"imagico.de: Kangerlussuaq Spring",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}",endDate:"2016-05-18T00:00:00.000Z",startDate:"2016-05-18T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and roads - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20160807T083013",name:"imagico.de: Kerch Strait",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}",endDate:"2016-08-07T00:00:00.000Z",startDate:"2016-08-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"State of bridge construction in August 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar2",name:"imagico.de: Landsat off-nadir July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}",endDate:"2016-07-17T00:00:00.000Z",startDate:"2016-07-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Latest images north of the regular Landsat limit (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-larsen_2018",name:"imagico.de: Larsen C ice shelf after calving",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-01-06T00:00:00.000Z",startDate:"2018-01-06T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"For updating the ice edge after the 2017 iceberg calving (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190",name:"imagico.de: Leskov Island ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}",endDate:"2013-11-16T00:00:00.000Z",startDate:"2013-11-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81991002015286LGN00",name:"imagico.de: Leskov Island Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar",name:"imagico.de: May 2013 off-nadir Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}",endDate:"2013-05-17T00:00:00.000Z",startDate:"2013-05-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R042_S78_20170214T202521",name:"imagico.de: McMurdo Sound and Dry Valleys",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}",endDate:"2017-02-14T00:00:00.000Z",startDate:"2017-02-14T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S02_20160613T075613",name:"imagico.de: Mount Kenya 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}",endDate:"2016-06-13T00:00:00.000Z",startDate:"2016-06-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S05_20160802T075556",name:"imagico.de: Mount Kilimanjaro 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}",endDate:"2016-08-02T00:00:00.000Z",startDate:"2016-08-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80940622015159LGN00",name:"imagico.de: New Ireland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-06-08T00:00:00.000Z",startDate:"2015-06-08T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Many missing islands in OSM (mostly mapped meanwhile) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2016",name:"imagico.de: North Sea Coast 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-09-25T00:00:00.000Z",startDate:"2016-09-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2017",name:"imagico.de: North Sea Coast 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-06-02T00:00:00.000Z",startDate:"2017-06-02T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ural_s2_2016",name:"imagico.de: Northern and Polar Ural mountains August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ndvina",name:"imagico.de: Northern Dvina delta at low tide",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}",endDate:"2015-09-13T00:00:00.000Z",startDate:"2015-09-13T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Beaches, tidal flats and other costal forms (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast",name:"imagico.de: Northern Ellesmere Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-07-09T00:00:00.000Z",startDate:"2012-07-09T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2012 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast_2016",name:"imagico.de: Northern Ellesmere Island July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}",endDate:"2012-07-15T00:00:00.000Z",startDate:"2012-07-08T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2016 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00vis",name:"imagico.de: Northern German west coast tidalflats",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00ir",name:"imagico.de: Northern German west coast tidalflats (infrared)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ngreenland_ast",name:"imagico.de: Northern Greenland ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-08-13T00:00:00.000Z",startDate:"2005-06-21T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A1350972013086110KF",name:"imagico.de: Northwest Heard Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}",endDate:"2013-03-13T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R111_N09_20160604T154554",name:"imagico.de: Panama Canal",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}",endDate:"2016-06-07T00:00:00.000Z",startDate:"2016-06-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Images of the new locks (but partly cloudy) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0120532016364110KF",name:"imagico.de: Panama Canal - Pacific side",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-12-30T00:00:00.000Z",startDate:"2016-12-30T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N68_20160930T081002",name:"imagico.de: Pechora Sea Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}",endDate:"2016-09-30T00:00:00.000Z",startDate:"2016-09-30T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81511242016033LGN00",name:"imagico.de: Pensacola Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-02T00:00:00.000Z",startDate:"2016-02-02T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R136_N41_20150831T093006",name:"imagico.de: Prokletije Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}",endDate:"2015-08-31T00:00:00.000Z",startDate:"2015-08-31T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142622_03746_20110415_17533956",name:"imagico.de: Qasigiannguit",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}",endDate:"2011-04-15T00:00:00.000Z",startDate:"2011-04-15T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81510432015030LGN00",name:"imagico.de: Rann of Kutch",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R093_N41_20150828T092005",name:"imagico.de: Rila and Pirin Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}",endDate:"2015-08-28T00:00:00.000Z",startDate:"2015-08-28T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81730602015040LGN00",name:"imagico.de: Rwenzori Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-02-09T00:00:00.000Z",startDate:"2015-02-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N01_20160702T082522",name:"imagico.de: Rwenzori Mountains 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}",endDate:"2016-07-02T00:00:00.000Z",startDate:"2016-07-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80611072014036LGN00",name:"imagico.de: Scott Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-02-05T00:00:00.000Z",startDate:"2014-02-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100972015347LGN00",name:"imagico.de: Shag Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81130622013270LGN00",name:"imagico.de: Southeastern Sulawesi",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-27T00:00:00.000Z",startDate:"2013-09-27T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80281222016035LGN00",name:"imagico.de: Southern Transantarctic Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-04T00:00:00.000Z",startDate:"2016-02-04T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81030632015286LGN00",name:"imagico.de: Sudirman Range 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R088_S05_20160812T011732",name:"imagico.de: Sudirman Range 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Cloud free image of the Sudirman Range but with fresh snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-s2sval",name:"imagico.de: Svalbard mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 mosaic of Svalbard (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx",name:"imagico.de: Thule Air Base",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}",endDate:"2011-05-07T00:00:00.000Z",startDate:"2011-05-07T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule2_2015.09.25",name:"imagico.de: Thule Airbase DMS low altitude overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.10.06",name:"imagico.de: Thule Airbase DMS overflight October 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}",endDate:"2015-10-06T00:00:00.000Z",startDate:"2015-10-06T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.09.25",name:"imagico.de: Thule Airbase DMS overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R094_N79_20160812T105622",name:"imagico.de: Ushakov Island August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80910682014358LGN00",name:"imagico.de: Vanatinai",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-12-24T00:00:00.000Z",startDate:"2014-12-24T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coarse coastline due to cloud cover in Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82330892016031LGN00",name:"imagico.de: Volcán Calbuco",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-31T00:00:00.000Z",startDate:"2016-01-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R089_N52_20160623T024048",name:"imagico.de: Vostochny Cosmodrome",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}",endDate:"2016-06-23T00:00:00.000Z",startDate:"2016-06-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-walps_autumn_2017",name:"imagico.de: Western Alps autumn colors 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-10-17T00:00:00.000Z",startDate:"2017-10-17T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Autumn colors in the Alps, Jura and southwestern Germany  (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81490352013282LGN00",name:"imagico.de: Western Karakoram",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-09T00:00:00.000Z",startDate:"2013-10-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R039_S15_20160510T145731",name:"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}",endDate:"2016-05-10T00:00:00.000Z",startDate:"2016-05-10T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Poor and outdated imagery in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"ITACyL-Castile-and-Leon",name:"ITACyL - Castile and León",type:"wms",template:"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-1.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"gsi.go.jp_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_seamlessphoto",name:"Japan GSI seamlessphoto Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{zoom}/{x}/{y}.jpg",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan seamless photo",description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others."},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan",description:"Japan GSI Standard Map. Widely covered."},{id:"juno-gps",name:"Juno GPS traces",type:"tms",template:"https://gps-tile.junolab.net/{zoom}/{x}/{y}.png",startDate:"2019-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.337,40.484],[-73.572,40.484],[-73.572,40.957],[-74.337,40.957],[-74.337,40.484]]],terms_url:"https://gps-tile.junolab.net/about.html",terms_text:"© 2019 Juno",description:"Juno drivers' GPS traces from two days ago, updated daily",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/Juno-GPS.png",overlay:true},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"Aargau-AGIS-2014",name:"Kanton Aargau 25cm (AGIS 2014)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],terms_text:"AGIS OF2014",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Aargau-AGIS-2016",name:"Kanton Aargau 25cm (AGIS 2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2016",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Basel-Landschaft-2015",name:"Kanton Basel-Landschaft 10cm (2015)",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.pdf",terms_text:"Geodaten des Kantons Basel-Landschaft 2015",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"KTBASELSTADT2015",name:"Kanton Basel-Stadt 2015",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],terms_text:"Kanton Basel-Stadt OF 2015",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"KTBASELSTADT2017",name:"Kanton Basel-Stadt 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],terms_text:"Kanton Basel-Stadt OF 2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Bern-dsm-hillshade-2015",name:"Kanton Bern, Digitales Oberflaechenmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDOM50CM_LORELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Oberflächenmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"Bern-dtm-hillshade-2015",name:"Kanton Bern, Digitales Terrainmodell 50cm, Relief",type:"wms",template:"https://www.geoservice.apps.be.ch/geoservice2/services/a42geo/a42geo_hoehenwms_d_fk/MapServer/WmsServer?LAYERS=GEODB.LDTM50CM_LTRELIEF&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[6.82526,47.07901],[7.28497,46.74221],[7.06335,46.27329],[8.20129,46.43975],[8.44334,46.59001],[8.47595,46.76315],[8.41244,46.79841],[8.13984,46.7869],[7.96543,46.80687],[7.90089,46.8914],[7.97676,47.00414],[7.88784,47.05609],[7.90363,47.17665],[7.81952,47.29413],[7.55859,47.33231],[7.16583,47.31183],[6.82388,47.18131],[6.82526,47.07901]]],terms_text:"Digitales Terrainmodell LIDAR 50cm © Amt für Wald des Kantons Bern"},{id:"KTGL_ORTHO_2013",name:"Kanton Glarus Orthophoto 2013",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2013&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 2013"},{id:"KTGL_ORTHO_2015",name:"Kanton Glarus Orthophoto 2015",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2015&STYLES=default&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 2015"},{id:"KTGL_ORTHO_2017",name:"Kanton Glarus Orthophoto 2017",type:"wms",template:"https://wms.geo.gl.ch?LAYERS=ch.gl.imagery.orthofoto2017&STYLES=default&FORMAT=image/jpeg&CRS={proj}&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.99094,47.18505],[8.94836,47.13462],[8.93738,47.05609],[8.87421,47.03363],[8.9415,46.93807],[8.86597,46.84423],[8.86459,46.80852],[8.91815,46.78596],[9.04587,46.80758],[9.245,46.8968],[9.26147,46.92213],[9.25186,47.01865],[9.2189,47.04673],[9.19693,47.12154],[9.06235,47.1505],[8.99094,47.18505]]],terms_text:"Kanton Glarus, Luftbild Orthofoto 2017",best:true},{id:"Solothurn-sogis2014-tms",name:"Kanton Solothurn (SOGIS)",type:"tms",template:"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-sogis2014-dom-wms",name:"Kanton Solothurn, DOM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dom_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"DOM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"Solothurn-sogis2014-dtm-wms",name:"Kanton Solothurn, DTM Relief 2014 50cm",type:"wms",template:"https://geoweb.so.ch/wms/wms_lidar?LAYERS=dtm_relief2014_50cm&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"DTM Relief 2014 - Auflösung 50cm, WMS Solothurn (SOGIS)"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],terms_text:"Kanton Thurgau OF 2017",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zug-2011",name:"Kanton Zug 2011",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2011_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.38726,47.10908],[8.38983,47.25303],[8.42944,47.25265],[8.42894,47.22567],[8.60057,47.22407],[8.60037,47.21507],[8.61357,47.21495],[8.61338,47.20594],[8.62658,47.20582],[8.62618,47.18783],[8.63934,47.18769],[8.63914,47.1787],[8.66555,47.17844],[8.66534,47.16943],[8.7049,47.16899],[8.70427,47.14203],[8.69105,47.14215],[8.69046,47.11516],[8.67731,47.1153],[8.67706,47.10634],[8.66389,47.10647],[8.66371,47.0975],[8.65052,47.09761],[8.65031,47.08863],[8.59764,47.08915],[8.59746,47.08015],[8.49204,47.0812],[8.49245,47.09917],[8.43969,47.09967],[8.43996,47.10863],[8.38726,47.10908]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2018",name:"Kanton Zug Gemeinde Zug Süd 2018",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2018_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.50052,47.11291],[8.49638,47.11761],[8.49451,47.12364],[8.49538,47.12653],[8.50462,47.13724],[8.50322,47.13933],[8.50466,47.14722],[8.51099,47.15916],[8.56415,47.15299],[8.5652,47.14929],[8.54924,47.13843],[8.55098,47.12132],[8.50052,47.11291]]],terms_text:"GIS Kanton Zug",best:true},{id:"Zug-2016",name:"Kanton Zug Nord 2016",type:"wms",template:"https://services.geo.zg.ch:443/ows/Orthofotos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=zg.orthofoto_2016_kt_zg&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[10,21],polygon:[[[8.41093,47.16521],[8.40759,47.16918],[8.40754,47.23725],[8.419,47.23722],[8.42336,47.22958],[8.43891,47.22945],[8.48056,47.2125],[8.5294,47.22688],[8.57951,47.22275],[8.57946,47.17083],[8.57535,47.14926],[8.56428,47.14944],[8.53594,47.15205],[8.50658,47.15268],[8.50686,47.162],[8.44723,47.16256],[8.41093,47.16521]]],terms_text:"GIS Kanton Zug",best:true},{id:"OGDLidarZH-DOM",name:"Kanton Zurich, Oberflächenschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dom2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Oberflächenschummerung"},{id:"OGDOrthoZH2016",name:"Kanton Zurich, Orthofoto ZH Frühjahr 2015/16 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_w_15&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Frühjahr 2015/16 RGB"},{id:"OGDOrthoZH2015",name:"Kanton Zurich, Orthofoto ZH Sommer 2014/15 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho_s_14&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2014/15 RGB"},{id:"OGDOrthoZH2018",name:"Kanton Zurich, Orthofoto ZH Sommer 2018 RGB 10cm",type:"wms",template:"https://wms.zh.ch/OGDOrthoZH?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=ortho&FORMAT=image/jpeg&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Orthofoto ZH Sommer 2018 RGB",best:true},{id:"OGDLidarZH-DTM",name:"Kanton Zurich, Terrainschummerung 50cm",type:"wms",template:"https://wms.zh.ch/OGDLidarZH?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&LAYERS=dtm2014hillshade&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,22],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Geographisches Informationssystem des Kantons Zürich (GIS-ZH), Terrainschummerung"},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-friluft",name:"Kartverket Hiking Trails",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/",terms_text:"© Kartverket",description:"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://wiki.openstreetmap.org/wiki/No:Kartverket_import",terms_text:"© Kartverket",description:"Topographic map N50, equivalent to Norway 1:50.000 paper map series.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.kartverket.no/data/kartdata/vegdata/",terms_text:"© Kartverket",description:"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"kelowna_2012",name:"Kelowna 2012",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",endDate:"2012-05-14T00:00:00.000Z",startDate:"2012-05-13T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],description:"High quality aerial imagery taken for the City of Kelowna"},{id:"kelowna_roads",name:"Kelowna Roads overlay",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",overlay:true},{id:"landsat_233055",name:"Landsat 233055",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",endDate:"2013-09-03T00:00:00.000Z",startDate:"2013-09-03T00:00:00.000Z",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",best:true,icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"landsat_047026",name:"Latest southwest British Columbia Landsat",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",endDate:"2013-09-12T00:00:00.000Z",startDate:"2013-09-12T00:00:00.000Z",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{id:"LINZ_NZ_Aerial_Imagery",name:"LINZ NZ Aerial Imagery",type:"tms",template:"https://map.cazzaserver.com/linz_aerial/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.0",best:true,icon:"https://koordinates.a.ssl.fastly.net/media/settings/branding/favicon-lds.ico"},{id:"LINZ_NZ_Topo50_Gridless_Maps",name:"LINZ NZ Topo50 Gridless Maps",type:"tms",template:"https://map.cazzaserver.com/linz_topo/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand",icon:"https://koordinates.a.ssl.fastly.net/media/settings/branding/favicon-lds.ico"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://www.geoportal.lt",terms_text:"NŽT ORT10LT",best:true},{id:"mapbox_locator_overlay",name:"Locator Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Loire_Atlantique-Orthophotos-2012",name:"Loire-Atlantique - Orthophotos 2012 - 20 cm",type:"tms",template:"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{id:"londrina2011",name:"Londrina Ortofoto 2011",type:"tms",template:"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],terms_url:"http://siglon.londrina.pr.gov.br",terms_text:"Prefeitura do Londrinas, PR"},{id:"LPI_NSW_Administrative_Boundaries_County",name:"LPI NSW Administrative Boundaries County",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_LGA",name:"LPI NSW Administrative Boundaries LGA",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_NPWS_Reserve",name:"LPI NSW Administrative Boundaries NPWS Reserve",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Parish",name:"LPI NSW Administrative Boundaries Parish",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_StateForest",name:"LPI NSW Administrative Boundaries State Forest",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Suburb",name:"LPI NSW Administrative Boundaries Suburb",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"NSW_LPI_BaseMap",name:"LPI NSW Base Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"NSW_LPI_Imagery",name:"LPI NSW Imagery",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",best:true,icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"NSW_LPI_Imagery_Dates",name:"LPI NSW Imagery Dates",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]],[[159.22678,-31.74407],[159.26398,-31.74399],[159.28989,-31.77428],[159.28993,-31.79393],[159.26157,-31.79395],[159.22682,-31.75483],[159.22678,-31.74407]],[[159.03784,-31.49819],[159.04448,-31.5006],[159.04619,-31.49734],[159.04888,-31.49829],[159.04884,-31.48423],[159.06882,-31.48423],[159.06991,-31.482],[159.08317,-31.48203],[159.08203,-31.48434],[159.08205,-31.49567],[159.08564,-31.49703],[159.08383,-31.50058],[159.09007,-31.5026],[159.08682,-31.50859],[159.09433,-31.51136],[159.09174,-31.51585],[159.09537,-31.51724],[159.10276,-31.52611],[159.1161,-31.53006],[159.11422,-31.5342],[159.11875,-31.53417],[159.1193,-31.54888],[159.12618,-31.55796],[159.11841,-31.56323],[159.11553,-31.55983],[159.1115,-31.55983],[159.11154,-31.60158],[159.08954,-31.6016],[159.08626,-31.60845],[159.07954,-31.60611],[159.07714,-31.61149],[159.05943,-31.61155],[159.05296,-31.60369],[159.05893,-31.59087],[159.05891,-31.57897],[159.05541,-31.57773],[159.05735,-31.57387],[159.05585,-31.57333],[159.05038,-31.57335],[159.05035,-31.56329],[159.0463,-31.5619],[159.04847,-31.55793],[159.04237,-31.55601],[159.04533,-31.55038],[159.03783,-31.54763],[159.03802,-31.54723],[159.03487,-31.54724],[159.03487,-31.54383],[159.03244,-31.54297],[159.03461,-31.53808],[159.02754,-31.53554],[159.02964,-31.53159],[159.02305,-31.52935],[159.03784,-31.49819]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico",overlay:true},{id:"NSW_LPI_TopographicMap",name:"LPI NSW Topographic Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2019",icon:"http://spatialservices.finance.nsw.gov.au/__data/assets/file/0010/210520/favicon.ico"},{id:"orthophoto_lyon_2012",name:"Lyon Orthophoto 2012-03 10cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-03-01T00:00:00.000Z",startDate:"2012-03-01T00:00:00.000Z",polygon:[[[4.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon",terms_text:"Grand Lyon Smart Data DSIT"},{id:"orthophoto_lyon",name:"Lyon Orthophoto 8cm",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/lyon/{zoom}/{x}/{y}",endDate:"2018-01-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[2,22],polygon:[[[4.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon/",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://geodaten.mainz.de/map/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]],overlay:true},{id:"Maxar-Premium",name:"Maxar Premium Imagery (Beta)",type:"tms",template:"https://earthwatch.digitalglobe.com/earthservice/tmsaccess/tms/1.0.0/DigitalGlobe:ImageryTileService@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg?connectId=91e57457-aa2d-41ad-a42b-3b63a123f54a",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"Maxar Premium is a mosaic composed of Maxar basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Maxar.png"},{id:"Maxar-Standard",name:"Maxar Standard Imagery (Beta)",type:"tms",template:"https://earthwatch.digitalglobe.com/earthservice/tmsaccess/tms/1.0.0/DigitalGlobe:ImageryTileService@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg?connectId=d9c5e3ef-6300-4cec-9562-c1f27da6b2d9",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"Maxar Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Maxar.png"},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Six Inch resolution aerial imagery for the State of Maryland"},{id:"geodata.md.gov-MD_ThreeInchImagery",name:"MD Three Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{id:"geodata.md.gov-MD_ColorBasemap",name:"MD Transportation Basemap",type:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{id:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://kart.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"Mulhouse_2018",name:"Mulhouse - 2018",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/mulhouse_2018/{zoom}/{x}/{y}",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[7.53731,47.78041],[7.57439,47.84128],[7.57301,47.85602],[7.55035,47.86201],[7.53525,47.84588],[7.5016,47.85141],[7.45972,47.84174],[7.4556,47.83252],[7.4453,47.83114],[7.43088,47.84128],[7.41549,47.83831],[7.39174,47.84727],[7.38007,47.83851],[7.33475,47.83989],[7.34024,47.89563],[7.31758,47.91082],[7.28737,47.89977],[7.28462,47.88412],[7.24686,47.88228],[7.23724,47.87629],[7.23312,47.86431],[7.2139,47.86524],[7.183,47.85786],[7.17613,47.84819],[7.21115,47.82284],[7.18986,47.81085],[7.19948,47.78179],[7.16789,47.77025],[7.183,47.73517],[7.17682,47.72362],[7.19467,47.69451],[7.21802,47.68527],[7.24548,47.68527],[7.25166,47.69497],[7.2448,47.70376],[7.2551,47.71392],[7.27844,47.713],[7.27982,47.70237],[7.26814,47.69405],[7.26883,47.68434],[7.28531,47.67094],[7.30247,47.66308],[7.32376,47.65984],[7.33337,47.66724],[7.3732,47.65383],[7.39242,47.65475],[7.40822,47.6603],[7.39723,47.67648],[7.42744,47.68666],[7.47551,47.69821],[7.5222,47.69636],[7.55104,47.71531],[7.56134,47.73517],[7.53731,47.78041]]],terms_url:"https://data.mulhouse-alsace.fr/explore/dataset/m2a_orthophotographie-2018/information/",terms_text:"Mulhouse Alsace Agglomération 2018"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"USDA-NAIP",name:"National Agriculture Imagery Program",type:"wms",template:"https://gis.apfo.usda.gov/arcgis/services/NAIP/USDA_CONUS_PRIME/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],description:"The most recent year of DOQQs from the National Agriculture Imagery Program (NAIP) for each state in the contiguous United States.",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USDA.png"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-81.6792,36.5974]]],description:"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{id:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"img.nj.gov-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://img.nj.gov/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId=188471FF-2803-4145-A5AD-605DE86D3B4D",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{id:"img.nj.gov-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://img.nj.gov/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId=188471FF-2803-4145-A5AD-605DE86D3B4D",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{id:"NLSC-EMAP5",name:"NLSC General Map with Contour line",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",description:"The emap from Taiwan National Land Surveying and Mapping Center",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"IBGE_Salvador_Streets",name:"Nomes de Ruas IBGE Salvador-BA",type:"tms",template:"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Norwegian orthophotos (max zoom 21), courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"geovekst-nib2",name:"Norway Orthophoto (more recent, less zoom)",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_nib_web_mercator_wmts_v2?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Nibcache_web_mercator_v2&STYLE=default&FORMAT=image/jpgpng&tileMatrixSet=default028mm&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos (max zoom 19), courtesy of Geovekst and Kartverket.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft2/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_konsesjon_gitt_ikke_utbygd,Vindkraft_under_bygging,Vindkraft_utbygd,Vindkraftomrade,Vindturbin&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas (blue: planned, light green: construction, dark green: built).",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],terms_url:"https://gis.ny.gov/gateway/orthoprogram/index.cfm",terms_text:"New York State Statewide Digital Orthoimagery Program",description:"New York State High Resolution Digital Orthoimagery, 1 foot resolution",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[0,20],terms_url:"https://www.openstreetmap.org/copyright",terms_text:"© OpenStreetMap contributors",terms_html:"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>&larr;</span> <span style='color: #96f;'>&darr;</span> <span style='color: #6e0;'>&uarr;</span> <span style='color: #f63;'>&rarr;</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.",description:"Public GPS traces uploaded to OpenStreetMap.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{id:"lu.geoportail.opendata.ortho2010",name:"Ortho 2010 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2010-07-02T00:00:00.000Z",startDate:"2010-06-24T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2013",name:"Ortho 2013 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2013-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2016",name:"Ortho 2016 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2016-08-16T00:00:00.000Z",startDate:"2013-08-30T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2017",name:"Ortho 2017 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],overlay:true},{id:"OS-OpenData_StreetView",name:"OS OpenData StreetView",type:"tms",template:"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo1.oit.ohio.gov/arcgis/services/OSIP/OSIP_6in_best_avail/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{id:"osm-hr-knin-2007",name:"osm-hr: Knin-2007 Aerial imagery",type:"tms",template:"https://tms.osm-hr.org/knin-2007/{zoom}/{x}/{-y}.png",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[16.21712,44.08054],[16.22916,44.08041],[16.22938,44.06055],[16.2303,44.05757],[16.23715,44.04213],[16.23715,44.03615],[16.23041,44.03599],[16.22494,44.03627],[16.2243,44.03599],[16.22404,44.03504],[16.21608,44.02178],[16.21286,44.01661],[16.20391,44.01672],[16.19269,44.02601],[16.18003,44.03662],[16.18011,44.03772],[16.21129,44.06685],[16.21712,44.08054]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/hr/osm-hr.png"},{id:"osm-hr-zagreb-2012",name:"osm-hr: Zagreb 2012 Aerial imagery",type:"tms",template:"https://tms.osm-hr.org/zagreb-2012/{zoom}/{x}/{-y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[16.15334,45.96857],[16.17462,45.94041],[16.17599,45.91796],[16.18595,45.90793],[16.18423,45.89789],[16.19728,45.8924],[16.22578,45.86085],[16.22097,45.85248],[16.22938,45.84638],[16.22921,45.84148],[16.24088,45.83645],[16.21719,45.83885],[16.20655,45.82784],[16.19865,45.77638],[16.1602,45.79554],[16.12827,45.80224],[16.13033,45.79434],[16.12278,45.78716],[16.10081,45.7862],[16.07677,45.77303],[16.0572,45.75746],[16.03901,45.76082],[16.03695,45.7577],[16.03935,45.75411],[16.02699,45.75507],[16.01772,45.74453],[16.01772,45.71936],[15.98785,45.71601],[15.96554,45.69131],[15.96725,45.67236],[15.95077,45.65125],[15.95077,45.63589],[15.94768,45.62989],[15.94288,45.63109],[15.93395,45.62172],[15.92606,45.61932],[15.92125,45.6138],[15.90031,45.62244],[15.90717,45.63229],[15.89619,45.63565],[15.87421,45.65557],[15.83885,45.66517],[15.81722,45.67044],[15.8131,45.67716],[15.77568,45.68915],[15.77396,45.7081],[15.78941,45.73398],[15.79285,45.73159],[15.80898,45.7383],[15.81001,45.73063],[15.82237,45.72344],[15.83473,45.72871],[15.85155,45.71673],[15.87078,45.73159],[15.84434,45.73159],[15.84469,45.76465],[15.83834,45.76764],[15.81276,45.76764],[15.80555,45.77543],[15.80538,45.80403],[15.8325,45.80391],[15.82993,45.80762],[15.83319,45.81062],[15.82289,45.82581],[15.82186,45.83837],[15.82975,45.84136],[15.84074,45.83992],[15.8452,45.84112],[15.84434,45.84459],[15.84984,45.84805],[15.85052,45.85236],[15.85979,45.85511],[15.86031,45.85308],[15.86477,45.85272],[15.87301,45.85451],[15.87378,45.85755],[15.87328,45.86081],[15.87816,45.8621],[15.87782,45.86563],[15.88263,45.8618],[15.88649,45.86306],[15.88529,45.86545],[15.89026,45.87603],[15.89709,45.88143],[15.9082,45.88642],[15.92125,45.88953],[15.9288,45.88762],[15.93876,45.89359],[15.92194,45.89431],[15.91988,45.89789],[15.92983,45.90339],[15.94768,45.90434],[15.95352,45.90554],[15.95524,45.91223],[15.97412,45.91271],[15.99918,45.92369],[16.00811,45.9299],[16.02802,45.93324],[16.03043,45.93611],[16.04313,45.93969],[16.05206,45.93563],[16.05171,45.94447],[16.06476,45.94661],[16.06579,45.95115],[16.0778,45.95569],[16.09325,45.95903],[16.09497,45.95449],[16.10767,45.95688],[16.11317,45.96165],[16.11282,45.96762],[16.12038,45.96905],[16.13205,45.96475],[16.1372,45.96523],[16.13823,45.96786],[16.15334,45.96857]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/hr/osm-hr.png"},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{id:"pao_de_acucar",name:"Pão de Açucar AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PCN-Italy-2006",name:"PCN 2006 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"PCN-Lazio_Umbria-2008",name:"PCN 2008 - IT Lazio+Umbria",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",polygon:[[[12.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],terms_url:"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance",terms_text:"Kadaster / Beeldmateriaal.nl, CC BY 4.0",best:true,description:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"PNOA-Spain-TMS",name:"PNOA Spain",type:"tms",template:"https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://integracja02.gugik.gov.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"https://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2019 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"https://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.38,45.5666],[13.63822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2019 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{id:"rio2013",name:"Rio Mosaic 2013",type:"wms",template:"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[-43.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"rio2015",name:"Rio Mosaic 2015",type:"wms",template:"https://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"route500",name:"Route 500",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE",terms_text:"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL",description:"Routes du réseau classé (autoroutes, nationales, départementales)",overlay:true},{id:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-RGB",name:"Saxony latest aerial imagery",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Sicily-ATA2007",name:"Sicily - Italy",type:"wms",template:"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-48.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],terms_url:"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf",terms_text:"Sistema de Informações Geográficas - Governo de Santa Catarina"},{id:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{id:"Slovakia-Historic-Maps",name:"Slovakia Historic Maps",type:"tms",template:"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{id:"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017",name:"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],terms_url:"http://fototerkep.hu",terms_text:"Fototerkep.hu",best:true,description:"5 cm resolution bald image of 4 settlement"},{id:"South_Africa-CD_NGI-Aerial",name:"South Africa CD:NGI Aerial",type:"tms",template:"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto2011-20cm",name:"South Tyrol Orthofoto 2011 (highres)",type:"wms",template:"https://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",description:"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{id:"South-Tyrol-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2015-11-01T00:00:00.000Z",startDate:"2014-07-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0",best:true},{id:"South-Tyrol-Topomap",name:"South Tyrol Topomap",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",zoomExtent:[0,20],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"Bern-bern2016-tms",name:"Stadt Bern 10cm (2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true,description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Uster-2008",name:"Stadt Uster Orthophoto 2008 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],terms_text:"Stadt Uster Vermessung Orthophoto 2008",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zuerich-zh_luftbild2011-tms",name:"Stadt Zürich Luftbild 2011",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Luftbild 2011",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"Zuerich-city_map",name:"Stadtplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg",zoomExtent:[4,18],terms_url:"http://maps.stamen.com/#terrain",terms_text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"https://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2016?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002630&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2016, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.png"},{id:"Surrey-Air_Survey",name:"Surrey Air Survey",type:"tms",template:"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png",endDate:"2009-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Szeged_2011",name:"Szeged orthophoto 2011",type:"tms",template:"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"tnris.org",name:"Texas Orthophoto",type:"tms",template:"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{id:"US-TIGER-Roads-2017",name:"TIGER Roads 2017",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"tirol.gv.at-contourlines",name:"Tiris: contour lines",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien_20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{id:"tirol.gv.at-DGM",name:"Tiris: DGM (Terrain model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-DOM",name:"Tiris: DOM (Surface model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto",name:"Tiris: orthophoto",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto-cir",name:"Tiris: orthophoto infrared",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"lu.geoportail.opendata.topo",name:"Topographical Map geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Torokbalint-orthophoto-2013",name:"Törökbálint orthophoto 2013",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu",terms_text:"Törökbálint",description:"5 cm resolution bald image"},{id:"Torokbalint-orthophoto-2015",name:"Törökbálint orthophoto 2015",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",best:true,description:"5 cm resolution bald image"},{id:"Toulouse-Orthophotoplan-2007",name:"Toulouse - Orthophotoplan 2007",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2011",name:"Toulouse - Orthophotoplan 2011",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2013",name:"Toulouse - Orthophotoplan 2013",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2015",name:"Toulouse - Orthophotoplan 2015",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole",best:true},{id:"Tours-Orthophoto-2008_2010",name:"Tours - Orthophotos 2008-2010",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s) Plus 2008"},{id:"Tours-Orthophoto-2013",name:"Tours - Orthophotos 2013",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{id:"US_Forest_Service_roads",name:"U.S. Forest Service roads",type:"tms",template:"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{id:"Zuerich-zh_uebersichtsplan-tms",name:"Übersichtsplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data",description:"This imagery is provided via a proxy operated by https://sosm.ch/"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2016",name:"UrbIS-Ortho 2016",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmFR",name:"UrbisAdm FR",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmNL",name:"UrbisAdm NL",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],description:"Public domain aerial imagery, mostly NAIP",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USSR-Latvia",name:"USSR - Latvia",type:"wms",template:"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[26.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"wien.gv.at-labels",name:"Vienna: Beschriftungen (annotations)",type:"tms",template:"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{id:"wien.gv.at-gp",name:"Vienna: Mehrzweckkarte (general purpose)",type:"tms",template:"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"wien.gv.at-aerial_image",name:"Vienna: Orthofoto (aerial image)",type:"tms",template:"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{id:"vogis.cnv.at-DGM",name:"VoGIS: DGM (Terrain model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-DOM",name:"VoGIS: DOM (Surface model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2012_12cm",name:"VoGIS: Echtfarbenbild 2012 (12cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2015_10cm",name:"VoGIS: Echtfarbenbild 2015 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2018_10cm",name:"VoGIS: Echtfarbenbild 2018 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2018_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-wi2015_20cm",name:"VoGIS: Echtfarbenbild Winter 2015 (20cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[10.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
24877
24878         var presets = {aerialway:{fields:["name","aerialway"],moreFields:["layer"],geometry:["point","vertex","line"],tags:{aerialway:"*"},searchable:false,name:"Aerialway"},aeroway:{icon:"maki-airport",fields:["aeroway"],geometry:["point","vertex","line","area"],tags:{aeroway:"*"},searchable:false,name:"Aeroway"},amenity:{fields:["amenity"],geometry:["point","vertex","line","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},boundary:{fields:["boundary"],geometry:["line"],tags:{boundary:"*"},searchable:false,name:"Boundary"},building_point:{icon:"maki-home",fields:["{building}"],moreFields:["{building}"],geometry:["point"],tags:{building:"*"},matchScore:0.6,searchable:false,terms:[],name:"Building"},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},emergency:{fields:["emergency_combo"],geometry:["point","vertex","area"],tags:{emergency:"*"},searchable:false,name:"Emergency Feature"},ford_line:{geometry:["line"],tags:{ford:"*"},name:"Ford",searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},indoor:{fields:["level","indoor_type"],geometry:["point","vertex","line","area"],tags:{indoor:"*"},matchScore:0.8,searchable:false,name:"Indoor Feature"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,searchable:false,name:"Land Use"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","line","area"],tags:{leisure:"*"},searchable:false,name:"Leisure"},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],moreFields:["material"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},matchScore:0.95,searchable:false,name:"Man Made"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","line","area"],tags:{natural:"*"},searchable:false,name:"Natural"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},playground:{icon:"maki-playground",fields:["playground"],geometry:["point","vertex","line","area"],tags:{playground:"*"},searchable:false,name:"Playground Equipment"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],moreFields:["material"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","line","area"],tags:{tourism:"*"},searchable:false,name:"Tourism"},waterway:{fields:["name","waterway"],geometry:["point","vertex","line","area"],tags:{waterway:"*"},searchable:false,name:"Waterway"},"addr/interpolation":{fields:["addr/interpolation"],geometry:["line"],tags:{"addr:interpolation":"*"},name:"Address Interpolation",searchable:false,matchScore:0.2},address:{fields:["address"],geometry:["point","vertex","area"],tags:{"addr:*":"*"},addTags:{},removeTags:{},reference:{key:"addr"},name:"Address",matchScore:0.15},"advertising/billboard":{fields:["direction","lit"],geometry:["point","vertex","line"],tags:{advertising:"billboard"},name:"Billboard"},"advertising/column":{icon:"temaki-storage_tank",fields:["lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-aerialway",geometry:["point","vertex","area"],fields:["aerialway/access","aerialway/summer/access","elevation","building_area"],tags:{aerialway:"station"},matchScore:0.95,name:"Aerialway Station",searchable:false,replacement:"public_transport/station_aerialway"},"aerialway/cable_car":{icon:"fas-tram",geometry:["line"],terms:["tramway","ropeway"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"cable_car"},name:"Cable Car"},"aerialway/chair_lift":{icon:"temaki-chairlift",geometry:["line"],fields:["name","oneway_yes","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"chair_lift"},name:"Chair Lift"},"aerialway/drag_lift":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"drag_lift"},name:"Drag Lift"},"aerialway/gondola":{icon:"maki-aerialway",geometry:["line"],fields:["name","oneway","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"gondola"},name:"Gondola"},"aerialway/goods":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"goods"},name:"Goods Aerialway"},"aerialway/j-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["jbar"],tags:{aerialway:"j-bar"},name:"J-bar Lift"},"aerialway/magic_carpet":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"magic_carpet"},name:"Magic Carpet Lift"},"aerialway/mixed_lift":{geometry:["line"],fields:["name","oneway_yes","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"mixed_lift"},name:"Mixed Lift"},"aerialway/platter":{geometry:["line"],terms:["button lift","poma lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"platter"},name:"Platter Lift"},"aerialway/pylon":{geometry:["point","vertex"],fields:["ref"],tags:{aerialway:"pylon"},name:"Aerialway Pylon"},"aerialway/rope_tow":{geometry:["line"],terms:["handle tow","bugel lift"],fields:["name","oneway_yes","aerialway/capacity","aerialway/duration"],tags:{aerialway:"rope_tow"},name:"Rope Tow Lift"},"aerialway/t-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["tbar"],tags:{aerialway:"t-bar"},name:"T-bar Lift"},"aerialway/zip_line":{geometry:["line"],fields:["name","oneway_yes","aerialway/duration","maxweight","access_simple"],terms:["aerial runway","canopy","flying fox","foefie slide","gravity propelled aerial ropeslide","Tyrolean traverse","zip wire","zip-line","zipline","zipwire"],tags:{aerialway:"zip_line"},name:"Zip Line"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-airport",geometry:["point"],fields:["ref_aeroway_gate"],tags:{aeroway:"gate"},name:"Airport Gate"},"aeroway/hangar":{icon:"fas-warehouse",geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},addTags:{building:"hangar",aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["name","ref","operator","surface","lit"],moreFields:["access_simple","address","fee","opening_hours"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/holding_position":{icon:"maki-airport",geometry:["vertex"],fields:["ref"],tags:{aeroway:"holding_position"},name:"Aircraft Holding Position"},"aeroway/jet_bridge":{icon:"temaki-pedestrian",geometry:["line"],fields:["ref_aeroway_gate","width","access_simple","wheelchair"],moreFields:["manufacturer"],terms:["aerobridge","air jetty","airbridge","finger","gangway","jet way","jetway","passenger boarding bridge","PBB","portal","skybridge","terminal gate connector"],tags:{aeroway:"jet_bridge"},addTags:{aeroway:"jet_bridge",highway:"corridor"},matchScore:1.05,name:"Jet Bridge"},"aeroway/parking_position":{icon:"maki-airport",geometry:["vertex","point","line"],fields:["ref"],tags:{aeroway:"parking_position"},name:"Aircraft Parking Position"},"aeroway/runway":{icon:"fas-plane-departure",geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{icon:"fas-plane",geometry:["line"],fields:["ref_taxiway","surface"],tags:{aeroway:"taxiway"},name:"Taxiway"},"aeroway/terminal":{icon:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],moreFields:["wheelchair","smoking"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"aeroway/windsock":{icon:"fas-wind",geometry:["point","vertex"],fields:["ref","lit","height"],moreFields:["manufacturer"],tags:{aeroway:"windsock"},name:"Windsock"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-bus",fields:["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"bus_station"},name:"Bus Station / Terminal",searchable:false,replacement:"public_transport/station_bus"},"amenity/coworking_space":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"coworking_space"},name:"Coworking Space",searchable:false},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},searchable:false,name:"Embassy"},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},matchScore:0.95,name:"Ferry Station / Terminal",searchable:false,replacement:"public_transport/station_ferry"},"amenity/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],tags:{amenity:"nursing_home"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home",searchable:false},"amenity/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",searchable:false},"amenity/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{amenity:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office",searchable:false},"amenity/scrapyard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{amenity:"scrapyard"},reference:{key:"industrial",value:"scrap_yard"},name:"Scrap Yard",searchable:false},"amenity/swimming_pool":{icon:"fas-swimmer",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_boarding"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],tags:{amenity:"animal_boarding"},name:"Animal Boarding Facility"},"amenity/animal_breeding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_breeding"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],tags:{amenity:"animal_breeding"},name:"Animal Breeding Facility"},"amenity/animal_shelter":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_shelter"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca","pound"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours","website"],moreFields:["email","fax","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],moreFields:["brand","covered","height","indoor","lit","manufacturer","name","opening_hours","wheelchair"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["air_conditioning","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],geometry:["point","area"],terms:["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],tags:{amenity:"bank"},name:"Bank"},"amenity/bar":{icon:"maki-bar",fields:["name","address","building_area","outdoor_seating","brewery"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","opening_hours","payment_multi","phone","smoking","website","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bar/lgbtq":{icon:"maki-bar",geometry:["point","area"],terms:["gay bar","lesbian bar","lgbtq bar","lgbt bar","lgb bar"],tags:{amenity:"bar",lgbtq:"primary"},name:"LGBTQ+ Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","height","inscription","lit","manufacturer","operator"],geometry:["point","vertex","line"],terms:["seat","chair"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","operator/type","covered","access_simple","fee","payment_multi_fee"],moreFields:["colour","indoor","lit"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_parking/building":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","opening_hours","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"building"},reference:{key:"bicycle_parking"},terms:["Multi-Storey Bicycle Park","Multi-Storey Bike Park","Bike Parking Station"],name:"Bicycle Parking Garage"},"amenity/bicycle_parking/lockers":{icon:"maki-bicycle",geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"lockers"},reference:{key:"bicycle_parking"},terms:["Bike Lockers"],name:"Bicycle Lockers"},"amenity/bicycle_parking/shed":{icon:"maki-bicycle",fields:["{amenity/bicycle_parking}","building_area"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_parking",bicycle_parking:"shed"},reference:{key:"bicycle_parking"},terms:["Bike Shed"],name:"Bicycle Shed"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","operator/type","fee","payment_multi_fee"],moreFields:["address","email","covered","fax","opening_hours","phone","website","wheelchair"],geometry:["point","vertex","area"],terms:["bike","bicycle","bikeshare","bike share","bicycle share","hub","dock"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","payment_multi_fee","service/bicycle"],moreFields:["colour","covered","indoor","manufacturer"],geometry:["point","vertex"],terms:["bike","repair","chain","pump","tools","stand","multitool"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"fas-beer",fields:["name","address","building","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","operator/type","fee","payment_multi_fee"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","outdoor_seating","internet_access","internet_access/fee"],moreFields:["air_conditioning","bar","capacity","delivery","diet_multi","email","fax","internet_access/ssid","opening_hours","payment_multi","phone","reservation","smoking","takeaway","website","wheelchair"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","operator/type","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","operator/type","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["name","operator","address","building_area","opening_hours","payment_multi","self_service"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","access_simple","fee","payment_multi_fee"],moreFields:["brand","covered","manufacturer"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"fas-child",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","screen","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","email","fax","phone","website","wheelchair"],geometry:["point","area"],terms:["drive-in","film","flick","movie","theater","picture","show","screen"],tags:{amenity:"cinema"},name:"Cinema"},"amenity/clinic":{icon:"maki-doctor",fields:["name","operator","operator/type","healthcare/speciality","address","building_area","opening_hours"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",geometry:["point","area"],terms:[],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"abortion"},reference:{key:"amenity",value:"clinic"},name:"Abortion Clinic"},"amenity/clinic/fertility":{icon:"maki-hospital",geometry:["point","area"],terms:["egg","fertility","reproductive","sperm","ovulation"],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"fertility"},reference:{key:"amenity",value:"clinic"},name:"Fertility Clinic"},"amenity/clock":{icon:"temaki-clock",fields:["name","support","display","visibility","date","faces"],moreFields:["covered","height","indoor","lit","manufacturer"],geometry:["point","vertex"],terms:["time"],tags:{amenity:"clock"},name:"Clock"},"amenity/clock/sundial":{icon:"temaki-clock",fields:["name","support","visibility","inscription"],moreFields:[],geometry:["point","vertex"],terms:["gnomon","shadow"],tags:{amenity:"clock",display:"sundial"},reference:{key:"display",value:"sundial"},name:"Sundial"},"amenity/college":{icon:"maki-college",fields:["name","operator","operator/type","address","website","internet_access","internet_access/fee"],moreFields:["religion","denomination","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","email","fax","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/community_centre/lgbtq":{icon:"maki-town-hall",geometry:["point","area"],terms:["lgbtq event","lgbtq hall","lgbt event","lgbt hall","lgb event","lgb hall"],tags:{amenity:"community_centre",lgbtq:"primary"},name:"LGBTQ+ Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","access_simple","fee","payment_multi_fee","covered","lit"],moreFields:["brand","manufacturer"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/conference_centre":{icon:"fas-user-tie",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"conference_centre"},terms:["auditorium","conference","exhibition","exposition","lecture"],name:"Convention Center"},"amenity/courthouse":{icon:"fas-gavel",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-dentist",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/dive_centre":{icon:"temaki-scuba_diving",fields:["name","operator","address","building_area","opening_hours","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/dressing_room":{icon:"maki-clothing-store",fields:["operator","access_simple","gender","wheelchair","building_area"],moreFields:["fee","opening_hours","payment_multi_fee","ref"],geometry:["point","area"],terms:["changeroom","dressing room","fitting room","locker room"],tags:{amenity:"dressing_room"},name:"Changing Room"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","payment_multi_fee","wheelchair"],moreFields:["covered","indoor","lit"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/events_venue":{icon:"fas-users",fields:["name","operator","building_area","address","website","internet_access"],moreFields:["air_conditioning","email","fax","internet_access/fee","internet_access/ssid","phone","smoking","wheelchair"],geometry:["point","area"],tags:{amenity:"events_venue"},terms:["banquet hall","baptism","Bar Mitzvah","Bat Mitzvah","birthdays","celebrations","conferences","confirmation","meetings","parties","party","quinceañera","reunions","weddings"],name:"Events Venue"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["air_conditioning","opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/ice_cream":{icon:"fas-ice-cream",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"ice_cream"},reference:{key:"cuisine",value:"ice_cream"},name:"Ice Cream Fast Food",searchable:false},"amenity/fast_food/burger":{icon:"maki-fast-food",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/donut":{icon:"temaki-donut",geometry:["point","area"],terms:["breakfast","brunch","cafe","canteen","coffee","dine","diner","donut","doughnut","dining","eat","lunch","table"],tags:{amenity:"fast_food",cuisine:"donut"},reference:{key:"cuisine",value:"donut"},name:"Donut Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"fast_food",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"temaki-sandwich",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","height","lit"],moreFields:["covered","indoor","manufacturer"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","self_service"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"fuel"},name:"Gas Station"},"amenity/grave_yard":{icon:"maki-cemetery",fields:["religion","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",fields:["operator","access_simple","material","collection_times"],moreFields:["colour","height","lit"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","operator/type","healthcare/speciality","address","emergency"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"fas-ice-cream",fields:["name","address","building_area","opening_hours","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["gelato","sorbet","sherbet","frozen","yogurt"],tags:{amenity:"ice_cream"},name:"Ice Cream Shop"},"amenity/internet_cafe":{icon:"temaki-antenna",fields:["name","operator","operator/type","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","opening_hours","outdoor_seating","payment_multi","phone","smoking","website","wheelchair"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/karaoke":{icon:"maki-karaoke",fields:["name","operator","address","building_area","opening_hours","website"],moreFields:["air_conditioning","email","fax","payment_multi","phone","smoking","wheelchair"],geometry:["point","area"],terms:["karaoke club","karaoke room","karaoke television","KTV"],tags:{amenity:"karaoke_box"},name:"Karaoke Box"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address","phone","preschool"],moreFields:["email","fax","opening_hours","payment_multi","website","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","operator/type","address","building_area","opening_hours","language_multi"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","operator/type","building_area","address","ref/isil","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["access_simple","air_conditioning","email","fax","opening_hours","payment_multi","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["air_conditioning","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/nightclub/lgbtq":{icon:"maki-bar",geometry:["point","area"],tags:{amenity:"nightclub",lgbtq:"primary"},terms:["gay nightclub","lesbian nightclub","lgbtq nightclub","lgbt nightclub","lgb nightclub"],name:"LGBTQ+ Nightclub"},"amenity/parking_entrance":{icon:"maki-entrance-alt1",fields:["access_simple","ref"],geometry:["vertex"],tags:{amenity:"parking_entrance"},name:"Parking Garage Entrance/Exit"},"amenity/parking_space":{fields:["capacity"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"parking_space"},matchScore:0.95,name:"Parking Space"},"amenity/parking":{icon:"maki-car",fields:["operator","operator/type","parking","capacity","access_simple","fee","payment_multi_fee","surface"],moreFields:["address","covered","email","fax","maxstay","name","opening_hours","park_ride","phone","ref","supervised","website","wheelchair"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["name","{amenity/parking}","building"],moreFields:["{amenity/parking}","levels","height"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],matchScore:1.05,name:"Multilevel Parking Garage"},"amenity/parking/park_ride":{icon:"maki-car",geometry:["point","vertex","area"],tags:{amenity:"parking",park_ride:"yes"},reference:{key:"park_ride",value:"yes"},terms:["commuter parking lot","incentive parking lot","metro parking lot","park and pool lot","park and ride lot","P+R","public transport parking lot","public transit parking lot","train parking lot"],name:"Park & Ride Lot"},"amenity/parking/underground":{icon:"maki-car",fields:["{amenity/parking}","layer"],geometry:["point","vertex","area"],tags:{amenity:"parking",parking:"underground"},addTags:{amenity:"parking",parking:"underground",layer:"-1"},reference:{key:"parking",value:"underground"},terms:["automobile parking","car lot","car parking","rv parking","subsurface parking","truck parking","vehicle parking"],matchScore:1.05,name:"Underground Parking"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"far-credit-card",fields:["name","brand","address","opening_hours","payment_multi"],moreFields:["currency_multi","wheelchair"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/photo_booth":{icon:"fas-person-booth",fields:["name","operator","payment_multi","wheelchair"],moreFields:["brand","indoor"],geometry:["point","area"],terms:["photobooth","photo","booth","kiosk","camera"],tags:{amenity:"photo_booth"},name:"Photo Booth"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/ssid","opening_hours","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"place_of_worship"},name:"Place of Worship"},"amenity/place_of_worship/buddhist":{icon:"maki-religious-buddhist",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],tags:{amenity:"place_of_worship",religion:"buddhist"},reference:{key:"amenity",value:"place_of_worship"},name:"Buddhist Temple"},"amenity/place_of_worship/christian":{icon:"maki-religious-christian",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],tags:{amenity:"place_of_worship",religion:"christian"},reference:{key:"amenity",value:"place_of_worship"},name:"Christian Church"},"amenity/place_of_worship/christian/jehovahs_witness":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"jehovahs_witness"},reference:{key:"denomination",value:"jehovahs_witness"},name:"Kingdom Hall of Jehovah's Witnesses"},"amenity/place_of_worship/christian/la_luz_del_mundo":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship","the light of the world church"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"la_luz_del_mundo"},reference:{key:"denomination",value:"la_luz_del_mundo"},name:"La Luz del Mundo Temple"},"amenity/place_of_worship/christian/quaker":{icon:"maki-place-of-worship",geometry:["point","area"],terms:["christian","church","house of God","house of prayer","house of worship"],tags:{amenity:"place_of_worship",religion:"christian",denomination:"quaker"},reference:{key:"denomination",value:"quaker"},name:"Quaker Friends Meeting House"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],tags:{amenity:"place_of_worship",religion:"hindu"},reference:{key:"amenity",value:"place_of_worship"},name:"Hindu Temple"},"amenity/place_of_worship/jewish":{icon:"maki-religious-jewish",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["jewish"],tags:{amenity:"place_of_worship",religion:"jewish"},reference:{key:"amenity",value:"place_of_worship"},name:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["islam","islamic center","muslim"],tags:{amenity:"place_of_worship",religion:"muslim"},reference:{key:"amenity",value:"place_of_worship"},name:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["kami","torii"],tags:{amenity:"place_of_worship",religion:"shinto"},reference:{key:"amenity",value:"place_of_worship"},name:"Shinto Shrine"},"amenity/place_of_worship/sikh":{icon:"temaki-sikhism",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["gurudwara","temple"],tags:{amenity:"place_of_worship",religion:"sikh"},reference:{key:"amenity",value:"place_of_worship"},name:"Sikh Temple"},"amenity/place_of_worship/taoist":{icon:"temaki-taoism",fields:["name","religion","denomination","{amenity/place_of_worship}"],geometry:["point","area"],terms:["daoist","monastery","temple"],tags:{amenity:"place_of_worship",religion:"taoist"},reference:{key:"amenity",value:"place_of_worship"},name:"Taoist Temple"},"amenity/planetarium":{icon:"maki-globe",fields:["name","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-police",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/polling_station":{icon:"fas-vote-yea",fields:["name","ref","operator","address","opening_hours","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["ballot box","ballot drop","democracy","elections","polling place","vote","voting booth","voting machine"],tags:{amenity:"polling_station"},addTags:{amenity:"polling_station",polling_station:"yes"},name:"Permanent Polling Place"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["access_simple","brand","covered","height","indoor","manufacturer","wheelchair"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter drop","mail box","package drop","post box","postal box"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prep_school":{icon:"temaki-school",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["academic","ACT","SAT","homework","math","reading","test prep","tutoring","writing"],tags:{amenity:"prep_school"},name:"Test Prep / Tutoring School"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","operator/type","address"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["cell","jail","correction"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","brewery"],moreFields:["air_conditioning","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","payment_multi","phone","website","wheelchair"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/pub/lgbtq":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",lgbtq:"primary"},terms:["gay pub","lesbian pub","lgbtq pub","lgbt pub","lgb pub"],name:"LGBTQ+ Pub"},"amenity/pub/microbrewery":{icon:"maki-beer",geometry:["point","area"],tags:{amenity:"pub",microbrewery:"yes"},reference:{key:"microbrewery"},terms:["alcohol","drink","dive","beer","bier","booze","craft brewery","microbrewery","small batch brewery"],name:"Brewpub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","fee"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","payment_multi_fee","phone","website","wheelchair"],geometry:["point","area"],tags:{amenity:"public_bath"},terms:["onsen","foot bath","hot springs"],name:"Public Bath"},"amenity/public_bookcase":{icon:"maki-library",fields:["name","public_bookcase/type","operator","opening_hours","capacity","website","lit"],moreFields:["wheelchair","location","address","access_simple","brand","email","phone"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-ranger-station",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],tags:{amenity:"ranger_station"},name:"Ranger Station"},"amenity/recycling_centre":{icon:"maki-recycling",fields:["name","operator","operator/type","address","building","opening_hours","recycling_accepts"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"centre"},reference:{key:"recycling_type",value:"*"},name:"Recycling Center"},"amenity/recycling_container":{icon:"maki-recycling",fields:["operator","recycling_accepts","collection_times","material","colour"],moreFields:["covered","indoor","manufacturer"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","phone"],moreFields:["air_conditioning","bar","brewery","capacity","delivery","diet_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","microbrewery","outdoor_seating","reservation","smoking","stars","takeaway","website","wheelchair"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant"},name:"Restaurant"},"amenity/restaurant/american":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","payment_multi_fee","water_point"],moreFields:["opening_hours"],geometry:["point","vertex","area"],terms:["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],tags:{amenity:"sanitary_dump_station"},name:"RV Toilet Disposal"},"amenity/school":{icon:"maki-school",fields:["name","operator","operator/type","address","religion","denomination","website"],moreFields:["email","fax","fee","internet_access","internet_access/ssid","phone","polling_station","wheelchair"],geometry:["point","area"],terms:["academy","elementary school","middle school","high school"],tags:{amenity:"school"},name:"School Grounds"},"amenity/shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],moreFields:["lit","wheelchair"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","public transit shelter","public transport shelter","tram stop shelter","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"fas-shower",fields:["opening_hours","access_simple","fee","payment_multi_fee","supervised","building_area","wheelchair"],moreFields:["address","operator","gender"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],moreFields:["lit","wheelchair","covered"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_centre":{icon:"fas-handshake",fields:["name","brand","operator","operator/type","address","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","polling_station","website","wheelchair"],geometry:["point","area"],terms:["event","fraternal","fraternity","hall","organization","professional","society","sorority","union","vetern"],tags:{amenity:"social_centre"},name:"Social Center"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","operator/type","address","building_area","social_facility","social_facility_for"],moreFields:["email","fax","internet_access","internet_access/fee","internet_access/ssid","opening_hours","phone","website","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/ambulatory_care":{icon:"maki-wheelchair",geometry:["point","area"],tags:{amenity:"social_facility",social_facility:"ambulatory_care"},reference:{key:"social_facility",value:"ambulatory_care"},name:"Ambulatory Care"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",geometry:["point","area"],terms:[],tags:{amenity:"social_facility",social_facility:"food_bank"},reference:{key:"social_facility",value:"food_bank"},name:"Food Bank"},"amenity/social_facility/group_home":{icon:"maki-wheelchair",fields:["{amenity/social_facility}","wheelchair"],geometry:["point","area"],terms:["old","senior","living","care home","assisted living"],tags:{amenity:"social_facility",social_facility:"group_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"group_home"},name:"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{icon:"temaki-social_facility",geometry:["point","area"],terms:["houseless","unhoused","displaced"],tags:{amenity:"social_facility",social_facility:"shelter","social_facility:for":"homeless"},reference:{key:"social_facility",value:"shelter"},name:"Homeless Shelter"},"amenity/social_facility/nursing_home":{icon:"maki-wheelchair",fields:["{amenity/social_facility}","wheelchair"],geometry:["point","area"],terms:["elderly","living","nursing","old","senior","assisted living"],tags:{amenity:"social_facility",social_facility:"nursing_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home"},"amenity/studio":{icon:"fas-microphone",fields:["name","studio","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity","address"],moreFields:["access_simple","brand","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi_fee","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","access_simple","gender","diaper","wheelchair","building_area"],moreFields:["fee","opening_hours","operator","payment_multi_fee","toilets/handwashing","toilets/position"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/toilets/disposal/flush":{icon:"fas-toilet",fields:["toilets/disposal","{amenity/toilets}"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["bathroom","head","lavatory","privy","restroom","water closet","WC","W.C."],tags:{amenity:"toilets","toilets:disposal":"flush"},reference:{key:"toilets:disposal",value:"flush"},name:"Flush Toilets"},"amenity/toilets/disposal/pitlatrine":{icon:"tnp-2009541",fields:["toilets/disposal","{amenity/toilets}","toilets/handwashing"],moreFields:["{amenity/toilets}"],geometry:["point","vertex","area"],terms:["head","lavatory","long drop","outhouse","pit toilet","privy"],tags:{amenity:"toilets","toilets:disposal":"pitlatrine"},reference:{key:"toilets:disposal",value:"pitlatrine"},name:"Pit Latrine"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["email","fax","phone","polling_station","smoking","website","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/toy_library":{icon:"fas-chess-knight",fields:["operator","address","building_area","opening_hours"],moreFields:["website","wheelchair"],geometry:["point","area"],terms:["game","toy"],tags:{amenity:"toy_library"},name:"Toy Library"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["email","fax","payment_multi","phone","website","wheelchair"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],moreFields:["brand","covered","height","indoor","manufacturer"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},matchScore:0.9,name:"Vending Machine"},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",geometry:["point"],terms:["cigarette"],tags:{amenity:"vending_machine",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},name:"Cigarette Vending Machine"},"amenity/vending_machine/coffee":{icon:"temaki-vending_machine",geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",geometry:["point"],terms:["condom"],tags:{amenity:"vending_machine",vending:"condoms"},reference:{key:"vending",value:"condoms"},name:"Condom Vending Machine"},"amenity/vending_machine/drinks":{icon:"temaki-vending_machine",geometry:["point"],terms:["drink","soda","beverage","juice","pop"],tags:{amenity:"vending_machine",vending:"drinks"},reference:{key:"vending",value:"drinks"},name:"Drink Vending Machine"},"amenity/vending_machine/electronics":{icon:"temaki-vending_machine",geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["{amenity/vending_machine}"],geometry:["point"],terms:["excrement bags","poop","waste","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Dispenser"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",geometry:["point"],terms:["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],tags:{amenity:"vending_machine",vending:"feminine_hygiene"},reference:{key:"vending",value:"feminine_hygiene"},name:"Feminine Hygiene Vending Machine"},"amenity/vending_machine/food":{icon:"temaki-vending_machine",geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"far-newspaper",fields:["vending","operator","fee","payment_multi_fee","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"newspapers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",geometry:["point"],terms:["parking","ticket"],tags:{amenity:"vending_machine",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},matchScore:0.94,name:"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{icon:"temaki-vending_machine",geometry:["point"],terms:["bus","train","ferry","rail","ticket","transportation"],tags:{amenity:"vending_machine",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},name:"Transit Ticket Vending Machine"},"amenity/vending_machine/stamps":{icon:"temaki-vending_machine",geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",geometry:["point"],terms:["candy","gum","chip","pretzel","cookie","cracker"],tags:{amenity:"vending_machine",vending:"sweets"},reference:{key:"vending",value:"sweets"},name:"Snack Vending Machine"},"amenity/veterinary":{icon:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi_fee","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["operator","collection_times","material","colour"],moreFields:["covered","indoor","manufacturer"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"fas-dumpster",fields:["operator","collection_times","access_simple"],moreFields:["brand","colour","height","manufacturer","material"],geometry:["point","vertex","area"],tags:{amenity:"waste_disposal"},terms:["garbage","rubbish","litter","trash"],name:"Garbage Dumpster"},"amenity/waste_transfer_station":{icon:"maki-waste-basket",fields:["name","operator","operator/type","address","opening_hours","fee","payment_multi_fee"],moreFields:["email","fax","phone","website","wheelchair"],geometry:["point","area"],terms:["dump","garbage","recycling","rubbish","scrap","trash"],tags:{amenity:"waste_transfer_station"},name:"Waste Transfer Station"},"amenity/waste/dog_excrement":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_basket",waste:"dog_excrement"},reference:{key:"waste",value:"dog_excrement"},terms:["bin","garbage","rubbish","litter","trash","poo","dog"],name:"Dog Excrement Bin"},"amenity/water_point":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi_fee","opening_hours"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi_fee","opening_hours"],geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},terms:["polygon"],name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway","surface"],geometry:["area"],terms:["area:highway","edge of pavement","highway area","highway shape","pavement","road shape","street area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","carnival ride"],tags:{attraction:"amusement_ride"},name:"Amusement Ride"},"attraction/animal":{icon:"maki-zoo",fields:["name","operator"],geometry:["point","area"],terms:["amphibian","animal park","aquarium","bear","bird","fish","insect","lion","mammal","monkey","penguin","reptile","safari","theme park","tiger","zoo"],tags:{attraction:"animal"},name:"Animal Enclosure"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],geometry:["point","area"],terms:["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],tags:{attraction:"carousel"},name:"Carousel"},"attraction/dark_ride":{icon:"maki-rail-metro",fields:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","amusement ride","gondola","tower","big drop"],tags:{attraction:"drop_tower"},name:"Drop Tower"},"attraction/maze":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",geometry:["point","line"],terms:["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],tags:{attraction:"river_rafting"},name:"River Rafting"},"attraction/roller_coaster":{icon:"maki-amusement-park",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{icon:"temaki-sledding",geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],geometry:["point","line"],terms:["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],tags:{attraction:"train"},name:"Tourist Train"},"attraction/water_slide":{icon:"fas-swimmer",fields:["{attraction}","height"],geometry:["line","area"],terms:["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],tags:{attraction:"water_slide"},name:"Water Slide"},barrier:{icon:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/chain":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"chain"},name:"Chain"},"barrier/city_wall":{icon:"temaki-wall",fields:["height","material"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access","opening_hours"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/height_restrictor":{icon:"temaki-car_wash",fields:["maxheight"],geometry:["vertex"],tags:{barrier:"height_restrictor"},name:"Height Restrictor"},"barrier/kerb":{icon:"temaki-kerb-raised",fields:["kerb","tactile_paving","wheelchair"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},matchScore:0.8,name:"Curb"},"barrier/kerb/flush":{icon:"temaki-kerb-flush",fields:["kerb","{barrier/kerb}"],geometry:["vertex","line"],tags:{kerb:"flush"},addTags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],matchScore:0.85,name:"Flush Curb"},"barrier/kerb/lowered":{icon:"temaki-kerb-lowered",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"lowered"},addTags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],matchScore:0.85,name:"Lowered Curb"},"barrier/kerb/raised":{icon:"temaki-kerb-raised",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"raised"},addTags:{barrier:"kerb",kerb:"raised"},reference:{key:"kerb",value:"raised"},terms:[],matchScore:0.85,name:"Raised Curb"},"barrier/kerb/rolled":{icon:"temaki-kerb-rolled",fields:["kerb","{barrier/kerb}","kerb/height"],geometry:["vertex","line"],tags:{kerb:"rolled"},addTags:{barrier:"kerb",kerb:"rolled"},reference:{key:"kerb",value:"rolled"},terms:["gutter"],matchScore:0.85,name:"Rolled Curb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{icon:"temaki-wall",fields:["height","material"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/sally_port":{icon:"fas-dungeon",geometry:["vertex"],tags:{barrier:"sally_port"},terms:["Postern","castle side gate"],name:"Sally Port"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area","payment_multi","currency_multi"],moreFields:["address","email","fax","opening_hours","phone","website"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/turnstile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],terms:["baffle gate","turnstyle"],tags:{barrier:"turnstile"},name:"Turnstile"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{fields:["name","admin_level"],geometry:["line"],tags:{boundary:"administrative"},name:"Administrative Boundary",matchScore:0.5},"bridge/support":{icon:"fas-archway",fields:["bridge/support","height","layer","material"],moreFields:["colour","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support","{bridge/support}"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building_part:{icon:"maki-building",fields:["levels","height","building/material","roof/colour"],moreFields:["layer"],geometry:["area"],tags:{"building:part":"*"},matchScore:0.5,terms:["roof","simple 3D buildings"],name:"Building Part"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/levels/underground","building/material","layer","operator","roof/colour","smoking","wheelchair"],geometry:["area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station Building",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],moreFields:["{building}","polling_station"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",moreFields:["{building}","polling_station"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["{building}","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hangar":{icon:"fas-warehouse",fields:["name"],geometry:["area"],tags:{building:"hangar"},matchScore:0.5,name:"Hangar Building"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/houseboat":{icon:"maki-home",geometry:["area"],tags:{building:"houseboat"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"Houseboat"},"building/hut":{icon:"maki-home",geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],moreFields:["{building}","polling_station"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["{building}","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",moreFields:["{building}","polling_station"],geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",moreFields:["{building}","polling_station"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},club:{icon:"fas-handshake",fields:["name","club","operator","address","building_area","opening_hours"],moreFields:["access_simple","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-pitch",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","product","website","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false,replacement:"shop/jewelry"},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false,replacement:"shop/optician"},"craft/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/agricultural_engines":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"agricultural_engines"},name:"Argricultural Engines Mechanic"},"craft/basket_maker":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],tags:{craft:"distillery"},name:"Distillery"},"craft/dressmaker":{icon:"maki-clothing-store",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/floorer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"floorer"},name:"Floorer"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/joiner":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"joiner"},terms:["furniture"],name:"Joiner"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/parquet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"parquet_layer"},name:"Parquet Layer"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"fas-film",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/signmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"signmaker"},name:"Signmaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"emergency/designated":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:["emergency_combo"],geometry:["line"],tags:{emergency:"yes"},terms:[],name:"Emergency Access Yes",searchable:false,matchScore:0.01},"emergency/ambulance_station":{icon:"fas-ambulance",fields:["name","operator","building_area","address"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hose":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_hose"},name:"Fire Hose"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],tags:{emergency:"fire_hydrant"},name:"Fire Hydrant"},"emergency/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","door","access_simple","address"],matchScore:0.8,name:"Entrance/Exit"},ford:{icon:"temaki-pedestrian",fields:["name","access","seasonal"],geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/cartpath":{icon:"temaki-golf_cart",fields:["{golf/path}","maxspeed"],geometry:["line"],tags:{golf:"cartpath"},addTags:{golf:"cartpath",golf_cart:"designated",highway:"service"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath"},"golf/driving_range":{icon:"maki-golf",fields:["name","capacity"],geometry:["area"],tags:{golf:"driving_range",landuse:"grass"},reference:{key:"golf",value:"driving_range"},name:"Driving Range"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"green",landuse:"grass",leisure:"pitch",sport:"golf"},reference:{key:"golf",value:"green"},name:"Putting Green"},"golf/hole":{icon:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"lateral_water_hazard",natural:"water"},reference:{key:"golf",value:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/path":{icon:"maki-golf",fields:["name","surface","width","structure","incline"],geometry:["line"],tags:{golf:"path"},addTags:{golf:"path",highway:"path",foot:"designated"},reference:{key:"golf",value:"path"},name:"Golf Walking Path"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"tee",landuse:"grass"},terms:["teeing ground"],reference:{key:"golf",value:"tee"},name:"Tee Box"},"golf/water_hazard":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area"],moreFields:["building/levels_building","height_building","opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",geometry:["point","area"],terms:["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],tags:{healthcare:"alternative"},name:"Alternative Medicine"},"healthcare/alternative/chiropractic":{icon:"maki-hospital",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"fas-baby",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"birthing_center"},name:"Birthing Center"},"healthcare/blood_donation":{icon:"maki-blood-bank",fields:["{healthcare}","blood_components"],geometry:["point","area"],terms:["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],tags:{healthcare:"blood_donation"},name:"Blood Donor Center"},"healthcare/counselling":{icon:"fas-comments",geometry:["point","area"],tags:{healthcare:"counselling"},name:"Counselling Center"},"healthcare/hospice":{icon:"maki-hospital",geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"fas-vial",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"fas-baby",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"fas-eye",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"fas-comment",geometry:["point","area"],terms:["speech","therapist","therapy","voice"],tags:{healthcare:"speech_therapist"},name:"Speech Therapist"},"highway/bus_stop":{icon:"maki-bus",fields:["name","network","operator","bench","shelter"],geometry:["point","vertex"],tags:{highway:"bus_stop"},matchScore:0.95,name:"Bus Stop",searchable:false,replacement:"public_transport/platform/bus_point"},"highway/crossing":{fields:["crossing"],geometry:["vertex"],tags:{highway:"crossing"},searchable:false,matchScore:0.95,name:"Crossing"},"highway/bridleway":{fields:["name","surface","width","structure","access","incline","horse_scale"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],icon:"maki-horse-riding",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"maki-bus",fields:["name","operator","oneway","structure","covered"],moreFields:["trolley_wire"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/construction":{icon:"maki-barrier",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"temaki-pedestrian",fields:["name","width","level","access_simple","wheelchair"],moreFields:["covered","indoor","maxheight"],geometry:["line"],tags:{highway:"corridor"},addTags:{highway:"corridor",indoor:"yes"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},addTags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},addTags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{icon:"temaki-pedestrian",fields:["crossing","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"unmarked"},addTags:{highway:"crossing",crossing:"unmarked"},reference:{key:"crossing",value:"unmarked"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"maki-bicycle",fields:["name","oneway","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxspeed","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike path","bicyle path"],matchScore:0.9,name:"Cycle Path"},"highway/cycleway/crossing":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing"},addTags:{highway:"cycleway",cycleway:"crossing"},reference:{key:"cycleway",value:"crossing"},searchable:false,matchScore:0.95,name:"Cycle Crossing"},"highway/cycleway/bicycle_foot":{icon:"maki-bicycle",geometry:["line"],tags:{highway:"cycleway",foot:"designated"},addTags:{highway:"cycleway",foot:"designated",bicycle:"designated"},terms:["bicycle and foot path","bike and pedestrian path","green way","greenway","mixed-use trail","multi-use trail","segregated trail","rail trail"],matchScore:0.95,name:"Cycle & Foot Path"},"highway/cycleway/crossing/marked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"marked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"marked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle crosswalk","cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Marked Cycle Crossing"},"highway/cycleway/crossing/unmarked":{icon:"maki-bicycle",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{cycleway:"crossing",crossing:"unmarked"},addTags:{highway:"cycleway",cycleway:"crossing",crossing:"unmarked"},reference:{key:"cycleway",value:"crossing"},terms:["cycle path crossing","cycleway crossing","bicycle crossing","bike crossing"],name:"Unmarked Cycle Crossing"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/emergency_bay":{icon:"maki-car",geometry:["vertex"],tags:{highway:"emergency_bay"},terms:["Highway Emergency Bay"],name:"Emergency Stopping Place"},"highway/footway":{icon:"temaki-pedestrian",fields:["name","surface","width","structure","access","incline"],moreFields:["covered","dog","lit","maxweight_bridge","smoothness","wheelchair"],geometry:["line"],terms:["hike","hiking","promenade","trackway","trail","walk"],tags:{highway:"footway"},matchScore:0.9,name:"Foot Path"},"highway/footway/crossing":{fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing"},addTags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},matchScore:0.95,searchable:false,name:"Pedestrian Crossing"},"highway/footway/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"temaki-pedestrian",fields:["name","conveying","access_simple","lit","width","wheelchair"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"marked"},addTags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["marked foot path crossing","marked crossing","marked pedestrian crosswalk","zebra crossing"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"temaki-pedestrian",geometry:["line"],tags:{footway:"sidewalk"},addTags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked",traffic_calming:"table"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","tactile_paving"],geometry:["line"],tags:{footway:"crossing",crossing:"unmarked"},addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},reference:{key:"footway",value:"crossing"},terms:["unmarked foot path crossing","unmarked crosswalk","unmarked pedestrian crossing"],name:"Unmarked Crossing"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","flood_prone","junction_line","lit","maxheight","maxweight_bridge","oneway/bicycle","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["mile marker","mile post","mile stone","mileage marker","milemarker","milepost"],name:"Highway Milestone"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],terms:["traffic circle"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","ref_road_number","smoothness","toll"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-highway-motorway",fields:["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","access"],moreFields:["covered","incline","junction_line","lit","maxheight","maxweight_bridge","minspeed","smoothness","toll"],geometry:["line"],tags:{highway:"motorway"},terms:["autobahn","expressway","freeway","highway","interstate","parkway","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-other-line",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","structure","access"],geometry:["area"],tags:{highway:"pedestrian",area:"yes"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Area"},"highway/pedestrian_line":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","oneway","structure","access"],moreFields:["covered","incline","maxweight_bridge","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","flood_prone","incline","junction/ref_oneway","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","name","oneway/bicycle","ref_road_number","smoothness","toll","trolley_wire"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","ref_road_number","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","smoothness","toll","trolley_wire"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"fas-flag-checkered",fields:["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],geometry:["point","line","area"],tags:{highway:"raceway"},addTags:{highway:"raceway",sport:"motor"},terms:["auto*","formula one","kart","motocross","nascar","race*","track"],name:"Racetrack (Motorsport)"},"highway/residential":{icon:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","flood_prone","incline","junction_line","lit","oneway/bicycle","maxheight","maxspeed/advisory","maxweight_bridge","smoothness","trolley_wire"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-other-line",fields:["highway","{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","covered","structure","access"],moreFields:["flood_prone","incline","lanes","lit","maxheight","maxspeed/advisory","maxweight_bridge","oneway/bicycle","trolley_wire"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],matchScore:0.9,name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{service:"alley"},addTags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",geometry:["line"],tags:{service:"drive-through"},addTags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{service:"driveway"},addTags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",geometry:["line"],tags:{service:"emergency_access"},addTags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",geometry:["line"],tags:{service:"parking_aisle"},addTags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"temaki-security_camera",geometry:["point","vertex"],fields:["direction","ref","maxspeed"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["incline_steps","handrail","step_count","surface","lit","width"],moreFields:["covered","dog","indoor"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase","stairway"],name:"Steps"},"highway/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-bulb",geometry:["point","vertex"],tags:{highway:"street_lamp"},fields:["lamp_type","direction","ref"],terms:["streetlight","street light","lamp","light","gaslight"],name:"Street Lamp"},"highway/tertiary_link":{icon:"iD-highway-tertiary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"fas-truck-monster",fields:["name","tracktype","surface","width","structure","access","incline","smoothness"],moreFields:["covered","flood_prone","horse_scale","maxweight_bridge","mtb/scale","mtb/scale/uphill","mtb/scale/imba"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{icon:"maki-circle-stroked",geometry:["point","vertex"],fields:["direction"],tags:{highway:"traffic_mirror"},terms:["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],name:"Traffic Mirror"},"highway/traffic_signals":{icon:"temaki-traffic_signals",geometry:["vertex"],tags:{highway:"traffic_signals"},fields:["traffic_signals","traffic_signals/direction"],terms:["light","stoplight","traffic light"],name:"Traffic Signals"},"highway/trailhead":{icon:"fas-hiking",fields:["name","operator","elevation","address","access_simple","fee","payment_multi_fee"],moreFields:["opening_hours"],geometry:["vertex"],tags:{highway:"trailhead"},terms:["hiking","mile zero","mountain biking","mountaineering","trail endpoint","trail start","staging area","trekking"],name:"Trailhead"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","incline","junction_line","lit","maxheight","minspeed","maxweight_bridge","smoothness","toll"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","line","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple","start_date"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/castle/fortress":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"fortress"},tags:{historic:"castle",castle_type:"fortress"},terms:["citadel","military"],name:"Historic Fortress"},"historic/castle/palace":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"palace"},tags:{historic:"castle",castle_type:"palace"},terms:["Royal Residence","royal","king","queen"],name:"Palace"},"historic/castle/stately":{icon:"fas-crown",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],reference:{key:"castle_type",value:"stately"},tags:{historic:"castle",castle_type:"stately"},terms:["Historic Country House","Stately Home","nobility","gentry","representative"],name:"Château"},"historic/city_gate":{icon:"maki-castle",fields:["name","building_area","historic/civilization","start_date"],geometry:["point","area"],tags:{historic:"city_gate"},terms:["Town Gate"],name:"City Gate"},"historic/fort":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"fort"},terms:["military"],name:"Historic Fort"},"historic/manor":{icon:"maki-castle",fields:["name","building_area","access_simple","start_date"],geometry:["point","area"],tags:{historic:"manor"},terms:["Mansion","gentry","nobility","estate"],name:"Manor House"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription","material"],moreFields:["website"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/memorial/plaque":{icon:"maki-monument",fields:["{historic/memorial}","direction"],geometry:["point","vertex"],terms:["dedicatory","epitaph","historical marker","remember","remembrance","memory"],tags:{historic:"memorial",memorial:"plaque"},reference:{key:"memorial",value:"plaque"},name:"Commemorative Plaque"},"historic/monument":{icon:"maki-monument",fields:["name","inscription","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],moreFields:["seamark/type"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"indoor/corridor_line":{fields:["level","name"],geometry:["line"],tags:{indoor:"corridor"},searchable:false,matchScore:1.1,name:"Indoor Corridor",replacement:"highway/corridor"},"indoor/area":{fields:["level","name","ref_room_number","height"],geometry:["area"],tags:{indoor:"area"},terms:["indoor space"],matchScore:0.8,name:"Indoor Area"},"indoor/corridor":{icon:"temaki-pedestrian",fields:["level","name","ref","height"],geometry:["area"],tags:{indoor:"corridor"},terms:["concourse","foyer","hallway","passageway"],matchScore:0.8,name:"Indoor Corridor"},"indoor/door":{icon:"maki-entrance-alt1",fields:["level","ref","door_type","access_simple","width","height"],moreFields:["wheelchair"],geometry:["vertex"],tags:{indoor:"door"},addTags:{indoor:"door",door:"yes"},removeTags:{indoor:"door",door:"*"},terms:["doorframe","doorway","portal","room access","threshold"],name:"Indoor Door"},"indoor/room":{fields:["level","name","ref_room_number","room","height"],geometry:["area"],tags:{indoor:"room"},terms:["antechamber","anteroom","atrium","cell","chamber","concourse","foyer","indoor room","lobby","vestibule"],matchScore:0.8,name:"Room"},"indoor/wall":{icon:"temaki-wall",fields:["level","height"],geometry:["line"],tags:{indoor:"wall"},terms:["indoor barrier","room divider","room partition"],name:"Indoor Wall"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},matchScore:0.25,name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},"junction/circular":{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},"junction/jughandle":{geometry:["line"],fields:["name"],tags:{junction:"jughandle"},name:"Jughandle",searchable:false},"junction/roundabout":{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},"landuse/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator","opening_date","check_date","note"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"fas-tractor",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"garages"},terms:[],name:"Garage Landuse"},"landuse/grass":{geometry:["area"],tags:{landuse:"grass"},terms:[],name:"Grass"},"landuse/greenfield":{geometry:["area"],fields:["name"],tags:{landuse:"greenfield"},terms:[],matchScore:0.9,name:"Greenfield"},"landuse/greenhouse_horticulture":{icon:"maki-garden",fields:["name","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["flower","greenhouse","horticulture","grow","vivero"],tags:{landuse:"greenhouse_horticulture"},matchScore:0.9,name:"Greenhouse Horticulture"},"landuse/harbour":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{industrial:"scrap_yard"},addTags:{landuse:"industrial",industrial:"scrap_yard"},reference:{key:"industrial",value:"scrap_yard"},terms:["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],name:"Scrap Yard"},"landuse/industrial/slaughterhouse":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{industrial:"slaughterhouse"},addTags:{landuse:"industrial",industrial:"slaughterhouse"},reference:{key:"industrial",value:"slaughterhouse"},terms:["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],name:"Slaughterhouse"},"landuse/landfill":{geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:["grazing","hay field","pasture"],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"tnp-2009265",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"barracks"},addTags:{landuse:"military",military:"barracks"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{landuse:"military",military:"danger_area"},terms:["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],name:"Danger Area"},"landuse/military/naval_base":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"naval_base"},addTags:{landuse:"military",military:"naval_base"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{landuse:"military",military:"range"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Military Range"},"landuse/military/training_area":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"training_area"},addTags:{landuse:"military",military:"training_area"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Training Area"},"landuse/orchard":{icon:"maki-park",fields:["name","operator","trees"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name","operator","resource"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"quarry"},terms:[],name:"Quarry"},"landuse/railway":{icon:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},"landuse/winter_sports":{icon:"fas-skiing",geometry:["area"],fields:["name","operator"],moreFields:["address","access_simple","opening_hours"],tags:{landuse:"winter_sports"},terms:["piste area","ski area","ski hill","ski mountain","ski resort","snow board area","snowboard area"],name:"Winter Sports Area"},"leisure/adult_gaming_centre":{icon:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],geometry:["point","area"],terms:["gambling","slot machine"],tags:{leisure:"adult_gaming_centre"},name:"Adult Gaming Center"},"leisure/amusement_arcade":{icon:"maki-gaming",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","opening_hours","fee","payment_multi_fee"],moreFields:["smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-bowling",fields:["name","operator","address","building_area"],moreFields:["air_conditioning","opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["jive","swing","tango","waltz","dance teaching"],tags:{leisure:"dance","dance:teaching":"yes"},reference:{key:"leisure",value:"dance"},name:"Dance School"},"leisure/disc_golf_course":{icon:"temaki-disc_golf_basket",fields:["name","operator","access_simple","fee","payment_multi_fee","opening_hours"],moreFields:["address","dog","email","fax","lit","phone","website","wheelchair"],geometry:["point","area"],tags:{leisure:"disc_golf_course"},addTags:{leisure:"disc_golf_course",sport:"disc_golf"},terms:["disk golf","frisbee golf","flying disc golf","frolf","ultimate"],name:"Disc Golf Course"},"leisure/dog_park":{icon:"maki-dog-park",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/escape_game":{icon:"fas-puzzle-piece",fields:["name","address","building_area","opening_hours","website","fee","payment_multi_fee","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","phone","smoking","wheelchair"],geometry:["point","area"],terms:["escape game","escape the room","puzzle room","quest room"],tags:{leisure:"escape_game"},name:"Escape Room"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fishing":{icon:"fas-fish",fields:["name","access_simple","fishing"],geometry:["vertex","point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{leisure:"fitness_station",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["balance","exercise","fitness","gym","trim trail"],name:"Exercise Balance Beam"},"leisure/fitness_station/box":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["box","exercise","fitness","gym","jump","trim trail"],name:"Exercise Box"},"leisure/fitness_station/horizontal_bar":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],name:"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],name:"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["back","exercise","extension","fitness","gym","roman chair","trim trail"],name:"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","dip","exercise","fitness","gym","trim trail"],name:"Parallel Bars"},"leisure/fitness_station/push-up":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","exercise","fitness","gym","pushup","push up","trim trail"],name:"Push-Up Station"},"leisure/fitness_station/rings":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],name:"Exercise Rings"},"leisure/fitness_station/sign":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["crunch","exercise","fitness","gym","situp","sit up","trim trail"],name:"Sit-Up Station"},"leisure/fitness_station/stairs":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","steps","trim trail"],name:"Exercise Stairs"},"leisure/garden":{icon:"maki-garden",fields:["name","operator","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"fas-code",fields:["name","address","building_area","opening_hours","website","fee","payment_multi_fee","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["air_conditioning","email","fax","phone","smoking","wheelchair"],geometry:["point","area"],terms:["makerspace","hackspace","hacklab"],tags:{leisure:"hackerspace"},name:"Hackerspace"},"leisure/horse_riding":{icon:"maki-horse-riding",fields:["name","access_simple","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"tnp-2009223",fields:["name","operator","capacity","fee","payment_multi_fee","sanitary_dump_station","power_supply"],moreFields:["address","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["crazy golf","mini golf","putt-putt"],tags:{leisure:"miniature_golf"},name:"Miniature Golf"},"leisure/nature_reserve":{icon:"maki-park",geometry:["point","area"],fields:["name","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-park",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],tags:{leisure:"park"},name:"Park"},"leisure/picnic_table":{icon:"maki-picnic-site",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/picnic_table/chess":{icon:"fas-chess-pawn",geometry:["point"],tags:{leisure:"picnic_table",sport:"chess"},reference:{key:"sport",value:"chess"},terms:["bench","chess board","checkerboard","checkers","chequerboard","game table"],name:"Chess Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","access_simple","surface","lit"],moreFields:["covered","fee","indoor","payment_multi_fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","surface","hoops","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"basketball"},reference:{key:"sport",value:"basketball"},terms:[],name:"Basketball Court"},"leisure/pitch/beachvolleyball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},reference:{key:"sport",value:"beachvolleyball"},terms:["volleyball"],name:"Beach Volleyball Court"},"leisure/pitch/boules":{icon:"maki-pitch",fields:["name","boules","{leisure/pitch}"],geometry:["point","area"],tags:{leisure:"pitch",sport:"boules"},reference:{key:"sport",value:"boules"},terms:["bocce","lyonnaise","pétanque"],name:"Boules/Bocce Court"},"leisure/pitch/bowls":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["{leisure/pitch}","building"],geometry:["point","area"],tags:{leisure:"pitch",sport:"equestrian"},reference:{key:"sport",value:"equestrian"},terms:["dressage","equestrian","horse","horseback","riding"],name:"Riding Arena"},"leisure/pitch/field_hockey":{icon:"maki-pitch",geometry:["point","area"],tags:{leisure:"pitch",sport:"field_hockey"},reference:{key:"sport",value:"field_hockey"},terms:["landhockey"],name:"Field Hockey Pitch"},"leisure/pitch/horseshoes":{icon:"temaki-horseshoes",geometry:["point","area"],tags:{leisure:"pitch",sport:"horseshoes"},reference:{key:"sport",value:"horseshoes"},terms:["horse shoes"],name:"Horseshoes Pit"},"leisure/pitch/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_league"},reference:{key:"sport",value:"rugby_league"},terms:[],name:"Rugby League Field"},"leisure/pitch/rugby_union":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/shuffleboard":{icon:"temaki-shuffleboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"shuffleboard"},reference:{key:"sport",value:"shuffleboard"},terms:["deck shuffleboard","floor shuffleboard"],name:"Shuffleboard Court"},"leisure/pitch/skateboard":{icon:"maki-skateboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball Field"},"leisure/pitch/table_tennis":{icon:"maki-tennis",fields:["name","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"table_tennis"},reference:{key:"sport",value:"table_tennis"},terms:["table tennis","ping pong"],name:"Ping Pong Table"},"leisure/pitch/tennis":{icon:"maki-tennis",fields:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-playground",fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],geometry:["point","area"],terms:["jungle gym","play area"],tags:{leisure:"playground"},name:"Playground"},"leisure/resort":{icon:"maki-lodging",fields:["name","operator","resort","address","opening_hours"],moreFields:["access_simple","email","fax","internet_access","internet_access/fee","internet_access/ssid","payment_multi","phone","website"],geometry:["point","area"],tags:{leisure:"resort"},terms:["recreation center","sanatorium","ski and snowboard resort","vacation resort","winter sports resort"],name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee","payment_multi_fee"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway_point":{icon:"maki-slipway",fields:["{leisure/slipway}"],moreFields:["{leisure/slipway}"],geometry:["point","vertex"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/slipway":{icon:"maki-slipway",fields:["name","surface","access_simple","fee","payment_multi_fee","lanes"],moreFields:["lit","opening_hours","seamark/type","width"],geometry:["line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},addTags:{leisure:"slipway",highway:"service",service:"slipway"},matchScore:1.1,name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","fee","payment_multi_fee"],moreFields:["opening_hours","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/climbing":{icon:"temaki-abseiling",geometry:["point","area"],terms:["abseiling","artificial climbing wall","belaying","bouldering","rock climbing facility","indoor rock wall","rappeling","rock gym","ropes"],tags:{leisure:"sports_centre",sport:"climbing"},reference:{key:"sport",value:"climbing"},name:"Climbing Gym"},"leisure/sports_centre/swimming":{icon:"fas-swimmer",geometry:["point","area"],terms:["dive","water"],tags:{leisure:"sports_centre",sport:"swimming"},reference:{key:"sport",value:"swimming"},name:"Swimming Pool Facility"},"leisure/stadium":{icon:"maki-pitch",fields:["name","sport","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_area":{icon:"fas-swimmer",fields:["name","access_simple","supervised","fee","payment_multi_fee","lit"],moreFields:["opening_hours","operator"],geometry:["area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_area"},name:"Natural Swimming Area"},"leisure/swimming_pool":{icon:"fas-swimming-pool",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["address","opening_hours","operator"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-other-line",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],moreFields:["access","covered","indoor"],geometry:["point","line","area"],tags:{leisure:"track"},terms:["cycle","dog","greyhound","horse","race*","track"],name:"Racetrack (Non-Motorsport)"},"leisure/track/cycling_point":{icon:"maki-bicycle",fields:["{leisure/track/cycling}"],geometry:["point"],tags:{leisure:"track",sport:"cycling"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/cycling":{icon:"maki-bicycle",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"cycling"},terms:["bicycle track","bicycling track","cycle racetrack","velodrome"],name:"Cycling Track"},"leisure/track/horse_racing_point":{icon:"maki-horse-riding",fields:["{leisure/track/horse_racing}"],geometry:["point"],tags:{leisure:"track",sport:"horse_racing"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/horse_racing":{icon:"maki-horse-riding",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"horse_racing"},terms:["equestrian race track","horse race betting","horseracing","horsetrack","horse racetrack"],name:"Horse Racing Track"},"leisure/track/running_point":{icon:"maki-pitch",fields:["{leisure/track/running}"],geometry:["point"],tags:{leisure:"track",sport:"running"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/track/running":{icon:"maki-pitch",fields:["name","surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["line","area"],tags:{leisure:"track",sport:"running"},terms:["athletics track","decathlon","foot race","long distance running","marathon","middle distance running","racetrack","running","sprint","track","walking"],name:"Running Track"},"leisure/water_park":{icon:"fas-swimmer",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},terms:["polyline"],name:"Line",matchScore:0.1},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource","direction"],terms:["cave","horizontal mine entrance","tunnel","underground"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["communication_multi","operator","manufacturer","height"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/beacon":{icon:"maki-communications-tower",fields:["name","height"],moreFields:["seamark/type"],geometry:["point","area"],tags:{man_made:"beacon"},name:"Beacon",matchScore:0.5},"man_made/beehive":{icon:"fas-archive",geometry:["point","area"],fields:["ref","operator","seasonal","height","colour"],moreFields:["manufacturer"],terms:["apiary","beekeeper","farm","honey","pollination"],tags:{man_made:"beehive"},name:"Beehive"},"man_made/breakwater":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],moreFields:["manufacturer","material","seamark/type"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"bridge"},name:"Bridge",matchScore:0.85},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/cairn":{icon:"temaki-cairn",geometry:["point","area"],terms:["rock pile","stone stack","stone pile","càrn"],tags:{man_made:"cairn"},name:"Cairn"},"man_made/chimney":{icon:"temaki-chimney",fields:["operator","material","height"],geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","manufacturer","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cross":{icon:"maki-religious-christian",fields:["name","material","height","elevation","inscription","direction"],geometry:["point","vertex"],tags:{man_made:"cross"},name:"Summit Cross"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/dyke":{geometry:["line"],tags:{man_made:"dyke"},terms:["Dike","Dyke","Floodbank","Stopbank"],name:"Levee"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],moreFields:["manufacturer","material"],geometry:["point","vertex"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{fields:["material","seamark/type"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","email","fax","phone","seamark/type","website"],geometry:["point","area"],tags:{man_made:"lighthouse"},addTags:{man_made:"lighthouse","seamark:type":"light_major"},removeTags:{man_made:"lighthouse","seamark:type":"*"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["manufacturer","material","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast"},name:"Mast"},"man_made/mast/communication":{icon:"maki-communications-tower",fields:["{man_made/mast}","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/mineshaft":{icon:"maki-triangle",geometry:["point","area"],fields:["name","operator","resource"],terms:["cave","mine shaft","tunnel","underground","vertical mine entrance"],tags:{man_made:"mineshaft"},name:"Mineshaft"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","vertex","area"],fields:["monitoring_multi","operator","manufacturer"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-storage_tank",geometry:["point"],terms:["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],tags:{man_made:"petroleum_well"},name:"Oil Well"},"man_made/pier":{icon:"temaki-pedestrian",fields:["name","surface","floating","width","access","lit"],moreFields:["access","fishing","incline","{highway/footway}"],geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier"},name:"Pier"},"man_made/pier/floating":{icon:"temaki-pedestrian",geometry:["line","area"],terms:["berth","dock","jetty","landing","promenade","wharf"],tags:{man_made:"pier",floating:"yes"},addTags:{highway:"footway",man_made:"pier",floating:"yes"},name:"Floating Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["operator","location","substance","layer","diameter"],geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pipeline/underground":{icon:"iD-pipeline-line",geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline",location:"underground"},addTags:{man_made:"pipeline",location:"underground",layer:"-1"},name:"Underground Pipeline"},"man_made/pipeline/valve":{geometry:["vertex"],fields:["ref","operator","valve","location","diameter"],moreFields:["colour","manufacturer","material"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline",pipeline:"valve"},name:"Pipeline Valve"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","operator","material","building_area","height","capacity"],moreFields:["layer","location","manufacturer"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/storage_tank/water":{icon:"temaki-storage_tank",geometry:["point","area"],terms:["cistern","water tower"],tags:{man_made:"storage_tank",content:"water"},name:"Water Tank"},"man_made/street_cabinet":{icon:"fas-door-closed",geometry:["point","area"],fields:["ref","operator","street_cabinet","height","colour"],terms:["cable tv","monitoring box","technical box","telecommunications","traffic signal controls"],tags:{man_made:"street_cabinet"},name:"Street Cabinet"},"man_made/surveillance":{icon:"temaki-security_camera",geometry:["point","vertex"],fields:["surveillance","surveillance/type","surveillance/zone","direction"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance"},name:"Surveillance"},"man_made/surveillance/camera":{icon:"temaki-security_camera",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],moreFields:["manufacturer"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance","surveillance:type":"camera"},name:"Surveillance Camera"},"man_made/survey_point":{icon:"maki-monument",fields:["ref"],geometry:["point","vertex"],terms:["trig point","triangulation pillar","trigonometrical station"],tags:{man_made:"survey_point"},name:"Survey Point"},"man_made/torii":{icon:"temaki-shinto",fields:["height","material","colour","lit"],moreFields:["name","operator","ref"],geometry:["point","vertex","line"],terms:["Japanese gate","Shinto shrine"],tags:{man_made:"torii"},name:"Torii"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height","building_area"],moreFields:["architect"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/bell_tower":{icon:"fas-bell",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["belfry","bell gable","campanile","church tower","klockstapel"],tags:{man_made:"tower","tower:type":"bell_tower"},reference:{key:"tower:type",value:"bell_tower"},name:"Bell Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["{man_made/tower}","communication_multi"],geometry:["point","area"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/defensive":{icon:"maki-castle",geometry:["point","area"],tags:{man_made:"tower","tower:type":"defensive"},reference:{key:"tower:type",value:"defensive"},terms:["Defensive Tower","Castle Tower"],name:"Fortified Tower"},"man_made/tower/minaret":{icon:"temaki-tower",geometry:["point","area"],terms:["Islam","mosque","Muezzin","Muslim"],tags:{man_made:"tower","tower:type":"minaret"},reference:{key:"tower:type",value:"minaret"},name:"Minaret"},"man_made/tower/observation":{icon:"temaki-tower",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/tunnel":{icon:"tnp-2009642",fields:["name","tunnel","layer","width","length","height"],geometry:["area"],tags:{man_made:"tunnel"},addTags:{man_made:"tunnel",layer:"-1"},removeTags:{man_made:"tunnel",layer:"*"},reference:{key:"man_made",value:"tunnel"},terms:["bore","dig","shaft","underground passage","underpass"],name:"Tunnel"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["sewage*","water treatment plant","reclamation plant"],tags:{man_made:"wastewater_plant"},name:"Wastewater Plant"},"man_made/water_tower":{icon:"maki-water",fields:["operator","height"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-industry",fields:["name","operator","address","building_area","product"],moreFields:["website","phone","email","fax"],geometry:["point","area"],terms:["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],tags:{man_made:"works"},name:"Factory"},manhole:{icon:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},addTags:{man_made:"manhole",manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},addTags:{man_made:"manhole",manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},addTags:{man_made:"manhole",manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},"military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"military/trench":{icon:"temaki-military",fields:["name","trench"],geometry:["point","line"],tags:{military:"trench"},terms:["dugout","firestep","fox hole","infantry trench","war trench"],name:"Military Trench"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","line","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cape":{icon:"temaki-beach",fields:["name","elevation","description"],geometry:["point"],tags:{natural:"cape"},terms:["bay","coastline","erosion","headland","promontory"],name:"Cape"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["name","elevation","access_simple","direction","fee","payment_multi_fee"],tags:{natural:"cave_entrance"},terms:["cavern","hollow","grotto","shelter","cavity"],name:"Cave Entrance"},"natural/cliff":{icon:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],name:"Cliff"},"natural/coastline":{geometry:["line"],tags:{natural:"coastline"},terms:["shore"],name:"Coastline"},"natural/fell":{geometry:["area"],tags:{natural:"fell"},terms:[],name:"Fell"},"natural/glacier":{icon:"temaki-snow",geometry:["area"],tags:{natural:"glacier"},terms:["ice","snow"],name:"Glacier"},"natural/grassland":{geometry:["area"],tags:{natural:"grassland"},terms:["prairie","savanna"],name:"Grassland"},"natural/heath":{geometry:["area"],tags:{natural:"heath"},terms:[],name:"Heath"},"natural/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-mountain",fields:["name","elevation"],geometry:["point","vertex"],tags:{natural:"peak"},terms:["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],name:"Peak"},"natural/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/rock":{icon:"temaki-boulder2",fields:["name"],geometry:["point","area"],tags:{natural:"rock"},terms:["boulder","stone","rock"],name:"Attached Rock / Boulder"},"natural/saddle":{icon:"maki-triangle-stroked",fields:["elevation"],geometry:["point","vertex"],tags:{natural:"saddle"},terms:["pass","mountain pass","top"],name:"Saddle"},"natural/sand":{geometry:["area"],tags:{natural:"sand"},terms:["desert"],name:"Sand"},"natural/scree":{geometry:["area"],tags:{natural:"scree"},terms:["loose rocks"],name:"Scree"},"natural/scrub":{geometry:["area"],tags:{natural:"scrub"},terms:["bush","shrubs"],name:"Scrub"},"natural/shingle":{geometry:["area"],tags:{natural:"shingle"},terms:["beach","gravel","pebbles","riverbed","rounded rock fragments"],name:"Shingle"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/stone":{icon:"temaki-boulder1",fields:["name"],geometry:["point","area"],tags:{natural:"stone"},terms:["boulder","stone","rock"],name:"Unattached Stone / Boulder"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree Row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation","diameter"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/valley":{icon:"maki-triangle-stroked",fields:["name","elevation","description"],geometry:["vertex","point","line"],tags:{natural:"valley"},terms:["canyon","dale","dell","dene","depression","glen","gorge","gully","gulley","gultch","hollow","ravine","rift","vale"],name:"Valley"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["name","water","intermittent"],moreFields:["fishing","salt","tidal"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"iD-waterway-canal",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["{natural/water}","salt","tidal"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/moat":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"moat"},name:"Moat"},"natural/water/pond":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"iD-waterway-river",fields:["{natural/water}","tidal"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"iD-waterway-stream",fields:["{natural/water}"],geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"stream"},terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],name:"Stream"},"natural/water/wastewater":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"wastewater"},reference:{key:"water",value:"wastewater"},terms:["excrement","shit","sewage","wastewater","Settling Basin","Clarifier Basin"],name:"Wastewater Basin"},"natural/wetland":{icon:"maki-wetland",fields:["wetland","salt","tidal"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","fen","marsh","mire","moor","muskeg","peatland","quagmire","reedbed","saltmarsh","swamp","tidalflat","wet meadow"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access","internet_access/fee","internet_access/ssid","operator","phone","smoking","website","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"fas-drafting-compass",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/bail_bond_agent":{icon:"maki-bank",moreFields:["{office}","currency_multi","payment_multi"],geometry:["point","area"],tags:{office:"bail_bond_agent"},terms:["bail bond dealer","bail bond man","bail bondsman","bail bondsperson"],name:"Bail Bond Agent"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["coworking","office"],tags:{office:"coworking"},reference:{key:"amenity",value:"coworking_space"},name:"Coworking Space"},"office/diplomatic":{icon:"maki-embassy",fields:["name","diplomatic","country","target","diplomatic/services","{office}"],geometry:["point","area"],tags:{office:"diplomatic"},terms:[],name:"Diplomatic Office"},"office/diplomatic/consulate":{icon:"maki-embassy",fields:["name","consulate","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"consulate"},reference:{key:"diplomatic",value:"consulate"},terms:[],name:"Consulate"},"office/diplomatic/embassy":{icon:"maki-embassy",fields:["name","embassy","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"embassy"},reference:{key:"diplomatic",value:"embassy"},terms:[],name:"Embassy"},"office/diplomatic/liaison":{icon:"maki-embassy",fields:["name","liaison","{office/diplomatic}"],geometry:["point","area"],tags:{office:"diplomatic",diplomatic:"liaison"},reference:{key:"diplomatic",value:"liaison"},terms:[],name:"Liaison Office"},"office/educational_institution":{icon:"maki-school",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial_advisor"},terms:["401k","inheritance","savings","stocks","retirement","wealth management"],name:"Financial Advisor"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","operator"],geometry:["point","area"],terms:["clerk","marriage","death","birth","certificate"],tags:{office:"government",government:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office"},"office/government/tax":{icon:"maki-town-hall",fields:["{office}","operator"],geometry:["point","area"],terms:["fiscal authorities","revenue office","tax office"],tags:{office:"government",government:"tax"},reference:{key:"government",value:"tax"},name:"Tax and Revenue Office"},"office/guide":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"fas-newspaper",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"fas-stamp",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"fas-user-secret",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet service provider","isp","network","telephone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/downhill/halfpipe":{icon:"fas-snowboarding",geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-skating",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"temaki-sledding",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-sleigh",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{icon:"temaki-pedestrian",geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"zipwire"},name:"Zip Wire"},point:{fields:["name"],geometry:["vertex","point"],tags:{},terms:["node","other","vertex","vertices"],name:"Point",matchScore:0.1},polling_station:{icon:"fas-vote-yea",fields:["name","ref","operator","address","opening_hours","building_area"],moreFields:["air_conditioning","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","website","wheelchair"],geometry:["point","area"],terms:["ballot box","ballot drop","democracy","elections","polling place","vote","voting booth","voting machine"],tags:{polling_station:"*"},matchScore:0.75,name:"Temporary Polling Place"},"power/sub_station":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},addTags:{power:"cable",location:"underground",layer:"-1"},name:"Underground Power Cable"},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:method":"photovoltaic"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"power/generator/source/hydro":{icon:"temaki-power",fields:["operator","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["height","manufacturer"],geometry:["point","vertex","area"],terms:["dam","generator","francis turbine","hydroelectricity","kaplan turbine","pelton turbine"],tags:{power:"generator","generator:source":"hydro"},addTags:{power:"generator","generator:source":"hydro","generator:output:electricity":"yes"},reference:{key:"generator:source",value:"hydro"},name:"Water Turbine"},"power/generator/source/nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["fission","generator","nuclear","nuke","reactor"],tags:{power:"generator","generator:source":"nuclear","generator:method":"fission"},reference:{key:"generator:source",value:"nuclear"},name:"Nuclear Reactor"},"power/generator/source/wind":{icon:"temaki-wind_turbine",fields:["operator","generator/type","generator/output/electricity","height","ref"],moreFields:["manufacturer"],geometry:["point","vertex","area"],terms:["generator","turbine","windmill","wind"],tags:{power:"generator","generator:source":"wind","generator:method":"wind_turbine"},reference:{key:"generator:source",value:"wind"},name:"Wind Turbine"},"power/line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],terms:["electric power transmission line","high voltage line","high tension line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-industry",fields:["name","operator","address","plant/output/electricity","start_date"],geometry:["area"],tags:{power:"plant"},addTags:{power:"plant",landuse:"industrial"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref","material","operator","manufacturer"],geometry:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["design","ref","material","operator","manufacturer"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},matchScore:1.05,name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","manufacturer","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/platform_point":{icon:"maki-rail",fields:["name","network","operator","departures_board","shelter"],moreFields:["bench","bin","lit","wheelchair"],geometry:["point"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform":{icon:"temaki-pedestrian",fields:["ref_platform","network","operator","departures_board","surface"],moreFields:["access","covered","indoor","layer","lit","wheelchair"],geometry:["line","area"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Platform",matchScore:0.2},"public_transport/platform/aerialway_point":{icon:"maki-aerialway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Aerialway Stop / Platform"},"public_transport/platform/ferry_point":{icon:"maki-ferry",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],searchable:false,name:"Ferry Stop / Platform"},"public_transport/platform/light_rail_point":{icon:"temaki-light_rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",light_rail:"yes"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],searchable:false,name:"Light Rail Stop / Platform"},"public_transport/platform/monorail_point":{icon:"temaki-monorail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",monorail:"yes"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],searchable:false,name:"Monorail Stop / Platform"},"public_transport/platform/subway_point":{icon:"temaki-subway",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",subway:"yes"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],searchable:false,name:"Subway Stop / Platform"},"public_transport/platform/train_point":{icon:"maki-rail",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",train:"yes"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],searchable:false,name:"Train Stop / Platform"},"public_transport/platform/tram_point":{icon:"temaki-tram",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point"],tags:{public_transport:"platform",tram:"yes"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],searchable:false,name:"Tram Stop / Platform"},"public_transport/platform/aerialway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Platform"},"public_transport/platform/bus_point":{icon:"maki-bus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop"},"public_transport/platform/bus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",bus:"yes"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Platform"},"public_transport/platform/ferry":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Platform"},"public_transport/platform/light_rail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Platform"},"public_transport/platform/monorail":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Platform"},"public_transport/platform/subway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Platform"},"public_transport/platform/train":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Platform"},"public_transport/platform/tram":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Platform"},"public_transport/platform/trolleybus_point":{icon:"temaki-trolleybus",fields:["{public_transport/platform_point}"],moreFields:["{public_transport/platform_point}"],geometry:["point","vertex"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop"},"public_transport/platform/trolleybus":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["line","area"],tags:{public_transport:"platform",trolleybus:"yes"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Platform"},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],geometry:["point","vertex","area"],tags:{public_transport:"station",aerialway:"yes"},reference:{key:"aerialway",value:"station"},terms:["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],name:"Aerialway Station"},"public_transport/station_bus":{icon:"maki-bus",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","public transit","public transportation","station","terminal","transit","transportation"],name:"Bus Station / Terminal"},"public_transport/station_ferry":{icon:"maki-ferry",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},reference:{key:"amenity",value:"ferry_terminal"},terms:["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],name:"Ferry Station / Terminal"},"public_transport/station_light_rail":{icon:"temaki-light_rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},reference:{key:"station",value:"light_rail"},terms:["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],name:"Light Rail Station"},"public_transport/station_monorail":{icon:"temaki-monorail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{public_transport:"station",monorail:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],name:"Monorail Station"},"public_transport/station_subway":{icon:"temaki-subway",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},reference:{key:"station",value:"subway"},terms:["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],name:"Subway Station"},"public_transport/station_train_halt":{icon:"maki-rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",train:"yes",railway:"halt"},reference:{key:"railway",value:"halt"},terms:["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],name:"Train Station (Halt / Request)"},"public_transport/station_train":{icon:"maki-rail",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["vertex","point","area"],tags:{public_transport:"station",train:"yes"},addTags:{public_transport:"station",train:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],name:"Train Station"},"public_transport/station_tram":{icon:"temaki-tram",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",tram:"yes"},reference:{key:"public_transport",value:"station"},terms:["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],name:"Tram Station"},"public_transport/station_trolleybus":{icon:"temaki-trolleybus",fields:["{public_transport/station}"],moreFields:["{public_transport/station}"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Station / Terminal"},"public_transport/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access"],moreFields:["air_conditioning","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{public_transport:"station"},terms:["public transit","public transportation","station","terminal","transit","transportation"],name:"Transit Station",matchScore:0.2},"public_transport/stop_area":{icon:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",aerialway:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["aerialway","cable car","public transit","public transportation","transit","transportation"],name:"Aerialway Stopping Location"},"public_transport/stop_position_bus":{icon:"maki-bus",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",bus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","public transit","public transportation","transit","transportation"],name:"Bus Stopping Location"},"public_transport/stop_position_ferry":{icon:"maki-ferry",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",ferry:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],name:"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{icon:"temaki-light_rail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{icon:"temaki-monorail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["monorail","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stopping Location"},"public_transport/stop_position_subway":{icon:"temaki-subway",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stopping Location"},"public_transport/stop_position_train":{icon:"maki-rail",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{public_transport:"stop_position",train:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stopping Location"},"public_transport/stop_position_tram":{icon:"temaki-tram",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},reference:{key:"public_transport",value:"stop_position"},terms:["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{icon:"temaki-trolleybus",fields:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],geometry:["vertex"],tags:{public_transport:"stop_position",trolleybus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stopping Location"},"public_transport/stop_position":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position"},terms:["public transit","public transportation","transit","transportation"],name:"Transit Stopping Location",matchScore:0.2},"railway/halt":{icon:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"temaki-pedestrian",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Platform",searchable:false,replacement:"public_transport/platform/train"},"railway/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],tags:{railway:"station"},terms:["train station","station"],matchScore:0.95,name:"Train Station",searchable:false,replacement:"public_transport/station_train"},"railway/tram_stop":{icon:"temaki-tram",fields:["name","network","operator"],geometry:["vertex"],tags:{railway:"tram_stop"},terms:["light rail","streetcar","tram","trolley"],name:"Tram Stopping Position",searchable:false},"railway/abandoned":{icon:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],moreFields:["covered"],geometry:["line"],tags:{railway:"abandoned"},terms:[],matchScore:0.85,name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/construction":{icon:"iD-railway-rail",fields:["name","opening_date","check_date","note","structure","gauge","electrified"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","service_rail","usage_rail","voltage_electrified"],geometry:["line"],tags:{railway:"construction"},name:"Railway Under Construction"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["operator","structure","service_rail","usage_rail"],moreFields:["covered"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",fields:["name","operator","structure","gauge","service_rail"],moreFields:["covered"],geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"temaki-light_rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"temaki-monorail",fields:["name","operator","structure","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","operator","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","highspeed","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"rail"},terms:["rail line","railroad track","train track"],name:"Rail"},"railway/rail/highspeed":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"rail",highspeed:"yes"},reference:{key:"highspeed"},terms:["bullet train","fast rail","high speed rail","highspeed rail","HSR"],name:"High-Speed Rail"},"railway/signal":{icon:"temaki-railway_signals",geometry:["point","vertex"],fields:["railway/position","railway/signal/direction","ref"],tags:{railway:"signal"},terms:["signal","lights"],name:"Railway Signal"},"railway/subway_entrance":{icon:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"temaki-subway",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"temaki-tram",fields:["{railway/rail}"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"maki-ferry",geometry:["line"],fields:["name","operator","duration","access","toll","to","from"],moreFields:["dog","interval","maxheight","maxweight","network","opening_hours","ref_route","wheelchair"],tags:{route:"ferry"},terms:["boat","merchant vessel","ship","water bus","water shuttle","water taxi"],name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape","seamark/type"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category","seamark/type"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],moreFields:["air_conditioning","brand","building/levels_building","height_building","currency_multi","email","fax","internet_access","internet_access/fee","internet_access/ssid","phone","second_hand","website","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},searchable:false,name:"Boutique"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},searchable:false,name:"Fashion Store"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",geometry:["point","area"],terms:["oven","stove"],tags:{shop:"furnace"},name:"Furnace Store",searchable:false},"shop/vacant":{icon:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"fas-tractor",fields:["{shop}","agrarian"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"fas-wine-bottle",fields:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"fas-dragon",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",geometry:["point","area"],terms:["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],tags:{shop:"appliance"},name:"Appliance Store"},"shop/art":{icon:"maki-shop",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"fas-baby-carriage",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"fas-suitcase-rolling",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},terms:["bread","cakes","rolls"],name:"Bakery"},"shop/bathroom_furnishing":{icon:"fas-bath",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",geometry:["point","area"],terms:["manicure","pedicure"],tags:{shop:"beauty",beauty:"nails"},reference:{key:"shop",value:"beauty"},name:"Nail Salon"},"shop/beauty/tanning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},terms:["drinks"],name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair","tricycle","unicycle"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/boat":{icon:"temaki-boating",geometry:["point","area"],terms:["fishing boat","jetski","motorboat","rowboat","sailboat","vessel","watercraft"],tags:{shop:"boat"},name:"Boat Store"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting","bookie"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"fas-book",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/butcher":{icon:"fas-bacon",geometry:["point","area"],terms:["chicken","beef","lamb","meat","pork"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"fas-burn",geometry:["point","area"],tags:{shop:"candles"},terms:["wax"],name:"Candle Shop"},"shop/cannabis":{icon:"fas-cannabis",geometry:["point","area"],terms:["420","marijuana","pot","reefer","weed"],tags:{shop:"cannabis"},name:"Cannabis Shop"},"shop/car_parts":{icon:"fas-car-battery",geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],tags:{shop:"caravan"},terms:["auto","camper","recreational vehicle"],name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"fas-cheese",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},terms:["cocoa"],name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},terms:["blouses","boutique","bras","clothes","dresses","fashion","pants","shirts","shorts","skirts","slacks","socks","suits","underwear"],name:"Clothing Store"},"shop/clothes/underwear":{icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes",clothes:"underwear"},reference:{key:"clothes",value:"underwear"},terms:["boutique","bras","brassieres","briefs","boxers","fashion","lingerie","panties","slips","socks","stockings","underclothes","undergarments","underpants","undies"],name:"Underwear Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"fas-laptop",geometry:["point","area"],tags:{shop:"computer"},terms:["desktop","laptop","hardware","operating system","software"],name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"fas-shopping-basket",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop"},terms:["print","scan"],name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},terms:["make-up","makeup"],name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"fas-palette",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"fas-cheese",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"temaki-clothes_hanger",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vape","vaping","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"fas-plug",geometry:["point","area"],terms:["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],tags:{shop:"electronics"},name:"Electronics Store"},"shop/erotic":{icon:"maki-shop",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/erotic/lgbtq":{icon:"maki-shop",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic",lgbtq:"primary"},name:"LGBTQ+ Erotic Store"},"shop/fabric":{icon:"fas-tape",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion_accessories":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion_accessories"},terms:["bag","cologne","fragrance","hat","jewellery","purfume","purse","scarf","sunglasses","umbrella","wallet","watch"],name:"Fashion Accessories Store"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},terms:["bait","fishing line","flies","fly","lure","reel","rod","tackle"],name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"fas-vector-square",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/games":{icon:"fas-dice",geometry:["point","area"],tags:{shop:"games"},terms:["board game","card game","dice game","game shop","live action role-playing game","miniatures wargame","strategy game"],name:"Tabletop Game Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/general":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"general"},terms:["Village Shop"],name:"General Store"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"fas-carrot",geometry:["point","area"],terms:["fruit","produce","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"fas-leaf",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"temaki-speaker",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/hobby":{icon:"fas-dragon",geometry:["point","area"],tags:{shop:"hobby"},terms:["manga","figurine","model"],name:"Hobby Shop"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household","kitchenware"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},terms:["arrows","bows","bullets","crossbows","rifles","traps"],name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["bracelet","diamond","earrings","gem","gold","jeweler","jewellery","jeweller","necklace","pins","ring","silver"],tags:{shop:"jewelry"},name:"Jewelry Store"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},terms:["cabinets","countertops","sinks"],name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["{shop}","self_service"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/laundry/self_service":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry",self_service:"yes"},terms:["Coin Laundry","Laundromat","Coin Wash","Launderette","Washateria"],name:"Self-Service Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/lighting":{icon:"far-lightbulb",geometry:["point","area"],terms:["fluorescent lighting","lamps","LEDs","light fixtures","lightbulbs"],tags:{shop:"lighting"},name:"Lighting Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/military_surplus":{icon:"temaki-military",geometry:["point","area"],terms:["armor","army-navy store","army surplus","navy surplus","tactical gear","war surplus shop","weapons"],tags:{shop:"military_surplus"},name:"Military Surplus Store"},"shop/mobile_phone":{icon:"fas-mobile-alt",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","brand","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"fas-compact-disc",geometry:["point","area"],terms:["tape casettes","CDs","compact discs","vinyl records"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"fas-guitar",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"fas-newspaper",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],terms:["health","supplement","vitamin"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",fields:["{shop}","clothes"],geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/outpost":{icon:"maki-shop",geometry:["point","area"],terms:["online","pick up","pickup"],tags:{shop:"outpost"},name:"Online Retailer Outpost"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"temaki-balloon",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},terms:["cologne","fragrance","purfume"],name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["cat","dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"fas-camera-retro",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/printer_ink":{icon:"maki-shop",geometry:["point","area"],terms:["copier ink","fax ink","ink cartridges","toner"],tags:{shop:"printer_ink"},name:"Printer Ink Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},terms:["fireworks"],name:"Fireworks Store"},"shop/radiotechnics":{icon:"fas-microchip",geometry:["point","area"],tags:{shop:"radiotechnics"},terms:["antenna","transistor"],name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"temaki-scuba_diving",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},terms:["boots","cleats","clogs","heels","loafers","oxfords","sneakers"],name:"Shoe Store"},"shop/sports":{icon:"fas-futbol",fields:["name","operator","sport","{shop}"],geometry:["point","area"],tags:{shop:"sports"},terms:["athletics"],name:"Sporting Goods Store"},"shop/stationery":{icon:"fas-paperclip",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},terms:["garages"],name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/swimming_pool":{icon:"fas-swimmer",geometry:["point","area"],terms:["hot tub equipment store","hot tub maintenance store","hot tub supply store","pool shop","pool store","swimming pool equipment store","swimming pool installation store","swimming pool maintenance store","swimming pool supply shop"],tags:{shop:"swimming_pool"},name:"Pool Supply Store"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},terms:["ink"],name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"fas-ticket-alt",geometry:["point","area"],tags:{shop:"ticket"},terms:["box office"],name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},terms:["cigarettes","cigars"],name:"Tobacco Shop"},"shop/toys":{icon:"fas-space-shuttle",geometry:["point","area"],tags:{shop:"toys"},terms:["games"],name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"fas-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD","VHS","video casette"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"tnp-2009234",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tactile_paving:{icon:"temaki-blind",fields:["colour","description"],geometry:["vertex","point","line","area"],tags:{tactile_paving:"*"},matchScore:0.25,terms:["blind path","detectable warning surfaces","tactile ground surface indicators","tactile walking surface indicators","truncated domes","visually impaired path"],name:"Tactile Paving"},"telecom/data_center":{icon:"fas-server",fields:["name","ref","operator","building_area"],moreFields:["address","phone","website"],geometry:["point","area"],tags:{telecom:"data_center"},terms:["computer systems storage","information technology","server farm","the cloud","telecommunications"],name:"Data Center"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","fee","payment_multi_fee"],moreFields:["email","fax","internet_access/ssid","phone","reservation","website","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi_fee","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/bust":{icon:"fas-user-alt",fields:["name","artist","material"],geometry:["point","vertex"],tags:{tourism:"artwork",artwork_type:"bust"},reference:{key:"artwork_type"},terms:["figure"],name:"Bust"},"tourism/artwork/graffiti":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"graffiti"},reference:{key:"artwork_type"},terms:["Street Artwork","Guerilla Artwork","Graffiti Artwork"],name:"Graffiti"},"tourism/artwork/installation":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"installation"},reference:{key:"artwork_type"},terms:["interactive art","intervention art","modern art"],name:"Art Installation"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"fas-female",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","line","area"],tags:{tourism:"attraction"},matchScore:0.75,name:"Tourist Attraction"},"tourism/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{tourism:"camp_pitch"},name:"Camp Pitch"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","payment_multi_fee","internet_access","internet_access/fee"],moreFields:["email","fax","internet_access/ssid","phone","power_supply","reservation","sanitary_dump_station","website","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access","internet_access/fee"],moreFields:["operator","fee","payment_multi_fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair","reservation"],geometry:["point","vertex","area"],terms:["Motor Home","Camper"],tags:{tourism:"caravan_site"},name:"RV Park"},"tourism/chalet":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],geometry:["point","area"],terms:["holiday","holiday cottage","holiday home","vacation","vacation home"],tags:{tourism:"chalet"},name:"Holiday Cottage"},"tourism/gallery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","guest_house","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","smoking","payment_multi","internet_access/ssid","website","phone","email","fax","wheelchair","reservation"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["{tourism/guest_house}"],moreFields:["{tourism/guest_house}"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"fas-concierge-bell",fields:["{tourism/motel}"],moreFields:["{tourism/motel}","stars","bar"],geometry:["point","area"],tags:{tourism:"hotel"},name:"Hotel"},"tourism/information":{icon:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-information",fields:["name","operator","board_type","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"board"},reference:{key:"information",value:"board"},name:"Information Board"},"tourism/information/guidepost":{icon:"fas-map-signs",fields:["name","elevation","operator","ref"],moreFields:["material"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"fas-map",fields:["operator","map_type","map_size","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"map"},reference:{key:"information",value:"map"},name:"Map"},"tourism/information/office":{icon:"maki-information",fields:["name","operator","address","building_area","internet_access","internet_access/fee"],moreFields:["building/levels_building","height_building","email","fax","internet_access/ssid","phone","website","wheelchair"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/information/route_marker":{icon:"maki-information",fields:["ref","operator","colour","material","elevation"],geometry:["point","vertex"],terms:["cairn","painted blaze","route flag","route marker","stone pile","trail blaze","trail post","way marker"],tags:{tourism:"information",information:"route_marker"},reference:{key:"information",value:"route_marker"},name:"Trail Marker"},"tourism/information/terminal":{icon:"maki-information",fields:["operator"],geometry:["point","vertex"],tags:{tourism:"information",information:"terminal"},reference:{key:"information",value:"terminal"},name:"Information Terminal"},"tourism/motel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access","internet_access/fee"],moreFields:["air_conditioning","building/levels_building","height_building","email","fax","internet_access/ssid","operator","payment_multi","phone","reservation","smoking","website","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"temaki-museum",fields:["name","operator","operator/type","address","building_area","opening_hours"],moreFields:["air_conditioning","building/levels_building","height_building","fee","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],tags:{tourism:"museum"},name:"Museum"},"tourism/picnic_site":{icon:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","smoking","fee","payment_multi_fee","phone","reservation","website","wheelchair"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","address","opening_hours","website","phone","email","fax"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","fee","payment_multi_fee","fireplace"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","reservation","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},"tourism/zoo/petting":{icon:"fas-horse",geometry:["point","area"],tags:{tourism:"zoo",zoo:"petting_zoo"},reference:{key:"zoo",value:"petting_zoo"},terms:["Children's Zoo","Children's Farm","Petting Farm","farm animals"],name:"Petting Zoo"},"tourism/zoo/safari":{icon:"temaki-zoo",geometry:["point","area"],tags:{tourism:"zoo",zoo:"safari_park"},reference:{key:"zoo",value:"safari_park"},terms:["Drive-Through Zoo","Drive-In Zoo"],name:"Safari Park"},"tourism/zoo/wildlife":{icon:"fas-frog",geometry:["point","area"],tags:{tourism:"zoo",zoo:"wildlife_park"},reference:{key:"zoo",value:"wildlife_park"},terms:["indigenous animals"],name:"Wildlife Park"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line","area"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex","line","area"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"fas-directions",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/public_transport/stop_area_group":{icon:"iD-relation",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area_group"},reference:{key:"public_transport",value:"stop_area_group"},name:"Transit Stop Area Group"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],moreFields:["colour","interval","opening_hours","wheelchair"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"maki-bicycle",fields:["name","ref_route","network_bicycle","cycle_network","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"maki-bus",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"maki-ferry",fields:["{route/ferry}"],moreFields:["{route/ferry}"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"temaki-pedestrian",fields:["name","ref_route","operator","network_foot","to","from"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"fas-hiking",fields:["name","ref_route","operator","network_foot","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"maki-horse-riding",fields:["name","ref_route","operator","network_horse","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"temaki-light_rail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/monorail":{icon:"temaki-monorail",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"monorail"},name:"Monorail Route"},"type/route/pipeline":{icon:"iD-pipeline-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"fas-skiing",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-power-line",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-highway-unclassified",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"temaki-subway",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-railway-rail",fields:["name","ref_route","operator","network","to","from"],moreFields:["colour","interval","opening_hours","duration","wheelchair"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"temaki-tram",fields:["{type/route/train}"],moreFields:["{type/route/train}"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-waterway-stream",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","structure_waterway","width","intermittent","lock"],moreFields:["fishing","salt","tidal"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/canal/lock":{icon:"iD-waterway-canal",fields:["name","width","lock"],moreFields:["intermittent","salt","tidal"],geometry:["line"],tags:{waterway:"canal",lock:"yes"},name:"Canal Lock"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name","operator","height","material"],moreFields:["seamark/type","website"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["{waterway/drain}"],moreFields:["{waterway/drain}"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],moreFields:["covered"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/lock_gate":{icon:"maki-dam",geometry:["vertex","line"],fields:["name","ref","height","material"],tags:{waterway:"lock_gate"},addTags:{waterway:"lock_gate","seamark:type":"gate"},terms:["canal"],name:"Lock Gate"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent","tidal"],moreFields:["covered","fishing","salt"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","payment_multi_fee","water_point"],moreFields:["opening_hours","seamark/type"],geometry:["point","vertex","area"],terms:["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],tags:{waterway:"sanitary_dump_station"},name:"Marine Toilet Disposal"},"waterway/stream_intermittent":{icon:"iD-waterway-stream",fields:["{waterway/stream}"],moreFields:["{waterway/stream}"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],moreFields:["covered","fishing","salt","tidal"],geometry:["line"],terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],tags:{waterway:"stream"},name:"Stream"},"waterway/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-waterfall",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",fields:["name","operator","height","material"],moreFields:["seamark/type"],geometry:["vertex","line"],terms:["low-head dam","low-rise dam","wier"],tags:{waterway:"weir"},name:"Weir"},"amenity/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",imageURL:"https://graph.facebook.com/SomosAbanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9598744",amenity:"bank"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",imageURL:"https://graph.facebook.com/abnamro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q287471",amenity:"bank"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V."},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",imageURL:"https://graph.facebook.com/AbsaSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q331688",amenity:"bank"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",imageURL:"https://graph.facebook.com/aib/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1642179",amenity:"bank"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",imageURL:"https://graph.facebook.com/ANZAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714641",amenity:"bank"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"},countryCodes:["au","nz"],terms:["anz bank"],matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ASBBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297214",amenity:"bank"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",imageURL:"https://graph.facebook.com/ATBFinancial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298762",amenity:"bank"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",imageURL:"https://graph.facebook.com/axainsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160054",amenity:"bank"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Access Bank":{name:"Access Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AccessBankPlc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672418",amenity:"bank"},addTags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Addiko Bank":{name:"Addiko Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/addiko.ba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27926559",amenity:"bank"},addTags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"},countryCodes:["ba","hr","me","rs","si"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Affinity Credit Union":{name:"Affinity Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/affinitycu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4688969",amenity:"bank"},addTags:{amenity:"bank",brand:"Affinity Credit Union","brand:wikidata":"Q4688969","brand:wikipedia":"en:Affinity Credit Union",name:"Affinity Credit Union"},countryCodes:["ca"],terms:["affinity"],matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgraniBankLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517050",amenity:"bank"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (USA)":{name:"Agribank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/63806221089/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4693829",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Vietnam)":{name:"Agribank (Vietnam)",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgribankVN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1924723",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Agribank (Zimbabwe)":{name:"Agribank (Zimbabwe)",icon:"maki-bank",imageURL:"https://graph.facebook.com/agribankzim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4693887",amenity:"bank"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"},countryCodes:["zw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Akbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q416624",amenity:"bank"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Aktia":{name:"Aktia",icon:"maki-bank",imageURL:"https://graph.facebook.com/aktia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11850417",amenity:"bank"},addTags:{amenity:"bank",brand:"Aktia","brand:wikidata":"Q11850417","brand:wikipedia":"fi:Aktia",name:"Aktia"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AliorBankSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9148395",amenity:"bank"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/991552653015502848/xDR-OAbM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2018840",amenity:"bank"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allied Bank (Pakistan)":{name:"Allied Bank (Pakistan)",icon:"maki-bank",imageURL:"https://graph.facebook.com/alliedbankpk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4732553",amenity:"bank"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732553","brand:wikipedia":"en:Allied Bank Limited",name:"Allied Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Allied Bank (defunct bank in Philipiness)":{name:"Allied Bank (defunct bank in Philipiness)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4732555",amenity:"bank"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/125297404838251/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q747394",amenity:"bank"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Alterna Savings":{name:"Alterna Savings",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1149323517273563136/tFR7tzyC_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4736322",amenity:"bank"},addTags:{amenity:"bank",brand:"Alterna Savings","brand:wikidata":"Q4736322","brand:wikipedia":"en:Alterna Savings",name:"Alterna Savings"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/America First Credit Union":{name:"America First Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/americafirstcu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4742758",amenity:"bank"},addTags:{amenity:"bank",brand:"America First Credit Union","brand:wikidata":"Q4742758","brand:wikipedia":"en:America First Credit Union",name:"America First Credit Union",short_name:"AFCU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/official.andhrabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003476",amenity:"bank"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633689",amenity:"bank"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Apple Bank":{name:"Apple Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AppleBankfan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4781125",amenity:"bank"},addTags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",imageURL:"https://graph.facebook.com/argenta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q932856",amenity:"bank"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/ArvestBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4802393",amenity:"bank"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AUB.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4806482",amenity:"bank"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/askaribankpakistan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807137",amenity:"bank"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/associatedbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4809155",amenity:"bank"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/AttijariWB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758052",amenity:"bank"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/axisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003549",amenity:"bank"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",imageURL:"https://graph.facebook.com/BACCredomaticSV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5715556",amenity:"bank"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",imageURL:"https://graph.facebook.com/bawag.psk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q379938",amenity:"bank"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBTBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795486",amenity:"bank"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBBank.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795504",amenity:"bank"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",imageURL:"https://graph.facebook.com/GrupoBBVA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806189",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVASeguros.mx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbvaintheusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835088",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAenPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",imageURL:"https://graph.facebook.com/bbva.argentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876788",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/608231074435440640/GlPmkzgL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q806626",amenity:"bank"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"},terms:["bank bca"],matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBci/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882083",amenity:"bank"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"},terms:["banco bci"],matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeCreditoBolivia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16826675",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["fr"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},countryCodes:["lu"],terms:["banque bcp","bcp"],matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodecreditobcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854124",amenity:"bank"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},countryCodes:["pe"],terms:["banco de crédito del perú"],matchScore:2,suggestion:true},"amenity/bank/BCR (Banca Comercială Română)":{name:"BCR (Banca Comercială Română)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BCRRomania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806149",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"},countryCodes:["ro"],terms:["banca comercială română"],matchScore:2,suggestion:true},"amenity/bank/BCR (Costa Rica)":{name:"BCR (Costa Rica)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6951632",amenity:"bank"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"},countryCodes:["cr"],terms:["banco de costa rica"],matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBCR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854129",amenity:"bank"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasBankPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20744004",amenity:"bank"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BIAT":{name:"BIAT",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueInternationaleArabedeTunisie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q690739",amenity:"bank"},addTags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"},countryCodes:["tn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMCEBankOfAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2300433",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},countryCodes:["ma"],terms:["bmce"],matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/793836106156507137/6hm9zrfV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2883409",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},countryCodes:["ma"],terms:["bmci bank"],matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBMN%20nuevo%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3754900",amenity:"bank"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank (USA)":{name:"BMO Harris Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bmoharrisbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835981",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},countryCodes:["us"],terms:["BMO","BMO Bank of Montreal","BMO Harris Bank","Bank of Montreal","Harris Bank"],matchScore:2,suggestion:true},"amenity/bank/BMO (Canada)":{name:"BMO (Canada)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BMOcommunity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806693",amenity:"bank"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"},countryCodes:["ca"],terms:["BMO","BMO Bank of Montreal","BMO Banque de Montréal","Bank of Montreal","Banque de Montréal"],matchScore:2,suggestion:true},"amenity/bank/BNA (Algeria)":{name:"BNA (Algeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bnalgerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883410",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNA (Tunisia)":{name:"BNA (Tunisia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanqueNationaleAgricole/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883413",amenity:"bank"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"},countryCodes:["tn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882611",amenity:"bank"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"},terms:["bank bni"],matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNLBNPParibas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2201225",amenity:"bank"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",imageURL:"https://graph.facebook.com/mabanque.bnpparibas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q499707",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasFortisBelgique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796827",amenity:"bank"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofchina.cn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"},terms:[],matchScore:2,suggestion:true},"amenity/bank/BOQ":{name:"BOQ",icon:"maki-bank",imageURL:"https://graph.facebook.com/BOQOnline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856173",amenity:"bank"},addTags:{amenity:"bank",brand:"BOQ","brand:wikidata":"Q4856173","brand:wikipedia":"en:Bank of Queensland",name:"BOQ",official_name:"Bank of Queensland"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2501256",amenity:"bank"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"},terms:["bpi family savings bank"],matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRDGroupeSocieteGenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796927",amenity:"bank"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRED.Banque.Populaire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2877455",amenity:"bank"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",imageURL:"https://graph.facebook.com/BRIofficialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623042",amenity:"bank"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"},countryCodes:["id"],terms:["bank bri"],matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.btn.co.id/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474534",amenity:"bank"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/LBBW.Stuttgart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q798891",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:de":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank"},countryCodes:["de"],terms:["baden-württembergische bank"],matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",imageURL:"https://graph.facebook.com/Citibanamex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q749474",amenity:"bank"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancaintesa.rs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q647092",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa"},countryCodes:["it","rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/529243270367309824/JFWCTY94_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q578252",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBPM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806154",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano"},countryCodes:["it"],terms:["bpm"],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633742",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q686176",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3167468",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127200",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaRomaneascaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854052",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancasella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633749",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancaTransilvania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806161",amenity:"bank"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",imageURL:"https://graph.facebook.com/Bancaribe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717827",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",imageURL:"https://graph.facebook.com/AVVillas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854068",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancoagrario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20013358",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoAzteca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854076",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoBPM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27331643",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco BPM","brand:en":"BPM Bank","brand:es":"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM","name:en":"BPM Bank","name:es":"Banco BPM"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Caja Social":{name:"Banco Caja Social",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoCajaSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717869",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancociudad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856204",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Paraguay)":{name:"Banco Continental (Paraguay)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bcontinentalpy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62054564",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Continental (Peru)":{name:"Banco Continental (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVAenPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835089",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoEstado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5718188",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofalabella/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854088",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella"},countryCodes:["cl","co","pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Fassil":{name:"Banco Fassil",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancofassil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118592",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoGTC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717949",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank","name:es":"Banco G&T Continental"},countryCodes:["gt","sv"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancogeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27618271",amenity:"bank"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"},countryCodes:["cr","pa"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",imageURL:"https://graph.facebook.com/bindARG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16489444",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Chile)":{name:"Banco Internacional (Chile)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/438324350148571136/fCNvpo-F_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q56605586",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Internacional (Ecuador)":{name:"Banco Internacional (Ecuador)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/986297558493487104/4Y3z4QEF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q806187",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Metropolitano":{name:"Banco Metropolitano",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanmetCuba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118612",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",imageURL:"https://graph.facebook.com/bnmascerca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2917708",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nacional de Costa Rica","brand:en":"National Bank of Costa Rica","brand:es":"Banco Nacional de Costa Rica","brand:wikidata":"Q2917708","brand:wikipedia":"es:Banco Nacional de Costa Rica",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional",official_name:"Banco Nacional de Costa Rica","official_name:en":"National Bank of Costa Rica","official_name:es":"Banco Nacional de Costa Rica",short_name:"BNCR"},countryCodes:["cr","pa"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Nación":{name:"Banco Nación",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20pastor168x78.gif%3Bpv91c0cc0e0080a771.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806193",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoPichinchaEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854135",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Popular de Ahorro":{name:"Banco Popular de Ahorro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bpa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118626",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"},countryCodes:["cu"],terms:["bpa"],matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancoprovincia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856209",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosabadell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q762330",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"},countryCodes:["es"],terms:["banc sabadell","sabadell"],matchScore:2,suggestion:true},"amenity/bank/Banco Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSantaFe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6046871",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosantander/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6496310",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander",official_name:"Santander Group"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Angola)":{name:"Banco Sol (Angola)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancosolangola/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118744",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"},countryCodes:["ao"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Bolivia)":{name:"Banco Sol (Bolivia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSolidarioBolivia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62118746",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"},countryCodes:["bo"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeBogota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854122",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:en":"Bank of Bogota","brand:es":"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá","name:en":"Bank of Bogota","name:es":"Banco de Bogotá"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancochile.cl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882085",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:en":"Bank of Chile","brand:es":"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile","name:en":"Bank of Chile","name:es":"Banco de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanruralHonduras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:en":"Bank of Banrural Development","brand:es":"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural","name:en":"Bank of Banrural Development","name:es":"Banco de Desarrollo Banrural"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Fomento Angola (BFA)":{name:"Banco de Fomento Angola (BFA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/Banco.BFA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806197",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:en":"Angola Development Bank (BFA)","brand:es":"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)","name:en":"Angola Development Bank (BFA)","name:es":"Banco de Fomento Angola (BFA)"},countryCodes:["ao"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",imageURL:"https://graph.facebook.com/BcoOccidente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854127",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodeVenezuelaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517093",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},countryCodes:["ve"],terms:["de venezuela"],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Argentina)":{name:"Banco de la Nación (Argentina)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banconacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883376",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Peru)":{name:"Banco de la Nación (Peru)",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancodelaNacion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856206",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco del Austro":{name:"Banco del Austro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodelaustro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122344",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3633835",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806205",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodobrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610817",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancodonordeste/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854137",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancolombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806206",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVASeguros.mx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854143",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanescoBancoUniversal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854841",amenity:"bank"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/371998329537690/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankalhabiblimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4034833",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankAlfalahOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855895",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/941602537043525632/UALD6dxn_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q697619",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",imageURL:"https://graph.facebook.com/DanamonIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855913",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankmandiricare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806639",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",imageURL:"https://graph.facebook.com/syariahmandiri/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474533",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankMegaID/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12474504",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankMuamalatIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855949",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},countryCodes:["id","my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankpekaosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",imageURL:"https://graph.facebook.com/myBANKRAKYAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4855964",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofafrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882627",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487907",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofbaroda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003797",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",imageURL:"https://graph.facebook.com/BANKOFCEYLON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882652",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4856092",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofCyprusOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806678",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},countryCodes:["cy","gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankOfIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004439",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankofIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806689",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",imageURL:"https://graph.facebook.com/BOM1685/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004304",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNZBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806687",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofscotland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q627381",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankoftheWest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2881919",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankia.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806807",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankinter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806808",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bankwest":{name:"Bankwest",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankwest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856817",amenity:"bank"},addTags:{amenity:"bank",brand:"Bankwest","brand:wikidata":"Q4856817","brand:wikipedia":"en:Bankwest",name:"Bankwest"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bannerbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4856910",amenity:"bank"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",imageURL:"https://graph.facebook.com/banorte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806914",amenity:"bank"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",imageURL:"https://graph.facebook.com/BqAtlantiqueOfficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882890",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",imageURL:"https://graph.facebook.com/BLaurentienne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1360087",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banque Nationale (Canada)":{name:"Banque Nationale (Canada)",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"},countryCodes:["ca"],terms:["banque nationale du canada","national bank of canada"],matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",imageURL:"https://graph.facebook.com/PopulaireEtDigitale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2883441",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",imageURL:"https://graph.facebook.com/banrisul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4857098",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrural":{name:"Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanruralHonduras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"},countryCodes:["gt","hn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",imageURL:"https://graph.facebook.com/BarclaysUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q245343",amenity:"bank"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},terms:["barclays bank"],matchScore:2,suggestion:true},"amenity/bank/Bcc":{name:"Bcc",icon:"maki-bank",imageURL:"https://graph.facebook.com/BCCRomaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25060394",amenity:"bank"},addTags:{amenity:"bank",brand:"Bcc","brand:wikidata":"Q25060394","brand:wikipedia":"en:Banca di Credito Cooperativo di Roma",name:"Bcc"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",imageURL:"https://graph.facebook.com/belfius/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1956014",amenity:"bank"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BendigoBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4887077",amenity:"bank"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BerlinerVolksbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q821855",amenity:"bank"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",imageURL:"https://graph.facebook.com/BicentenarioBU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5728123",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",imageURL:"https://graph.facebook.com/BICICIGroupeBNPParibas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1667302",amenity:"bank"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},countryCodes:["ci"],terms:["agence bicici"],matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/bradesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806181",amenity:"bank"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},countryCodes:["br"],terms:["banco bradesco"],matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/budapestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27493463",amenity:"bank"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CBAO":{name:"CBAO",icon:"maki-bank",imageURL:"https://graph.facebook.com/161410284020244/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q532104",amenity:"bank"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},countryCodes:["sn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1023306",amenity:"bank"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/with.cib.hu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839566",amenity:"bank"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIBC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q666694",amenity:"bank"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},countryCodes:["ca"],terms:["cibc banking centre"],matchScore:2,suggestion:true},"amenity/bank/CIC":{name:"CIC",icon:"maki-bank",imageURL:"https://graph.facebook.com/cic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q746525",amenity:"bank"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/cihbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006220",amenity:"bank"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},countryCodes:["ma"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIMBMalaysia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045976",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",imageURL:"https://graph.facebook.com/CIMBIndonesia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5011747",amenity:"bank"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CNEP":{name:"CNEP",icon:"maki-bank",imageURL:"https://graph.facebook.com/CNEPOfficielle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2931752",amenity:"bank"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},countryCodes:["dz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CRDB Bank":{name:"CRDB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/crdbbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5013848",amenity:"bank"},addTags:{amenity:"bank",brand:"CRDB Bank","brand:wikidata":"Q5013848","brand:wikipedia":"en:CRDB Bank",name:"CRDB Bank"},countryCodes:["tz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",imageURL:"https://graph.facebook.com/desjardins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",imageURL:"https://graph.facebook.com/Caisse.Epargne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547738",amenity:"bank"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal (Brazil)":{name:"Caixa Econômica Federal (Brazil)",icon:"maki-bank",imageURL:"https://graph.facebook.com/caixa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q835283",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},countryCodes:["br"],terms:["caixa","caixabank"],matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaixa%20Geral%20de%20Dep%C3%B3sitos%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1026044",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},countryCodes:["es","fr","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixabank (Spain)":{name:"Caixabank (Spain)",icon:"maki-bank",imageURL:"https://graph.facebook.com/CaixaBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q847225",amenity:"bank"},addTags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Duero":{name:"Caja Duero",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3821055",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q966985",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaja%20Rural.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3649971",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaja%20Rural.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18720350",amenity:"bank"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",imageURL:"https://graph.facebook.com/Cajasur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3751637",amenity:"bank"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cajamar":{name:"Cajamar",icon:"maki-bank",imageURL:"https://graph.facebook.com/cajamar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8254971",amenity:"bank"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/California Coast Credit Union":{name:"California Coast Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/CalCoastCU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25025281",amenity:"bank"},addTags:{amenity:"bank",brand:"California Coast Credit Union","brand:wikidata":"Q25025281","brand:wikipedia":"en:California Coast Credit Union",name:"California Coast Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/canarabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003777",amenity:"bank"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital Bank":{name:"Capital Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5035481",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",imageURL:"https://graph.facebook.com/capitalone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1034654",amenity:"bank"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},countryCodes:["us"],terms:["capital one bank"],matchScore:2,suggestion:true},"amenity/bank/Carige":{name:"Carige",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/608212417395499008/oUMlcP6e_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3633695",amenity:"bank"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditAgricoleItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2938832",amenity:"bank"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3661937",amenity:"bank"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",imageURL:"https://graph.facebook.com/CassadiRisparmiodelVeneto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3661909",amenity:"bank"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20cx%20original.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3750952",amenity:"bank"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Cathay Bank":{name:"Cathay Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/cathaybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4189507",amenity:"bank"},addTags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"},countryCodes:["cn","tw","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/CentralBankofIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2007090",amenity:"bank"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",imageURL:"https://graph.facebook.com/chase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524629",amenity:"bank"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},terms:["chase bank"],matchScore:2,suggestion:true},"amenity/bank/China Bank":{name:"China Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/chinabank.ph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5100080",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",imageURL:"https://graph.facebook.com/cbschinabanksavings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18387359",amenity:"bank"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1145693638959226881/A09fvJzn_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q857063",amenity:"bank"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank",short_name:"Citi"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Eastern USA)":{name:"Citizens Bank (Eastern USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/citizensbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5122694",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122694","brand:wikipedia":"en:Citizens Financial Group",name:"Citizens Bank",short_name:"Citizens"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Kentucky)":{name:"Citizens Bank (Kentucky)",icon:"maki-bank",imageURL:"https://graph.facebook.com/citizensbankofkentucky/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5122711",amenity:"bank"},addTags:{alt_name:"Citizens Bank of Kentucky",amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122711","brand:wikipedia":"en:Citizens National Bank (Eastern Kentucky)",name:"Citizens Bank",official_name:"Citizens National Bank",short_name:"Citizens"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank (Nepal)":{name:"Citizens Bank (Nepal)",icon:"maki-bank",imageURL:"https://graph.facebook.com/ctznbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13186934",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank International","brand:wikidata":"Q13186934","brand:wikipedia":"en:Citizens Bank International",name:"Citizens Bank",official_name:"Citizens Bank International Ltd.",short_name:"Citizens"},countryCodes:["np"],terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (California)":{name:"City National Bank (California)",icon:"maki-bank",imageURL:"https://graph.facebook.com/CityNationalBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123314",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/City National Bank (Florida)":{name:"City National Bank (Florida)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1098260637703172096/um-tzWqP_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q16958644",amenity:"bank"},addTags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank of Florida",name:"City National Bank",official_name:"City National Bank of Florida"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/clydesdalebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q971680",amenity:"bank"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Coast Capital Savings":{name:"Coast Capital Savings",icon:"maki-bank",imageURL:"https://graph.facebook.com/coastcapitalsavings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5138088",amenity:"bank"},addTags:{amenity:"bank",brand:"Coast Capital Savings","brand:wikidata":"Q5138088","brand:wikipedia":"en:Coast Capital Savings",name:"Coast Capital Savings",official_name:"Coast Capital Savings Federal Credit Union"},countryCodes:["ca"],terms:["coast capital","coast capital savings credit union"],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (New Jersey)":{name:"Columbia Bank (New Jersey)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084096",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Columbia Bank (Washington)":{name:"Columbia Bank (Washington)",icon:"maki-bank",imageURL:"https://graph.facebook.com/columbiastatebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62084089",amenity:"bank"},addTags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/comerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1114148",amenity:"bank"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",imageURL:"https://graph.facebook.com/combanksl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5152468",amenity:"bank"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/commerzbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157617",amenity:"bank"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/commonwealthbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q285328",amenity:"bank"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Community Bank":{name:"Community Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/communitybankna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5154635",amenity:"bank"},addTags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1041960346926440448/31ZynavT_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2003387",amenity:"bank"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",imageURL:"https://graph.facebook.com/credem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3696881",amenity:"bank"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancocredicoopcl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854086",amenity:"bank"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditsuisse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q372657",amenity:"bank"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",imageURL:"https://graph.facebook.com/Creval/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3696888",amenity:"bank"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",imageURL:"https://graph.facebook.com/Crelan.Banque/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q389872",amenity:"bank"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditAgricole/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q590952",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",imageURL:"https://graph.facebook.com/CreditMaritimeGrandOuest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17176866",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditmutuel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q642627",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",imageURL:"https://graph.facebook.com/GroupeArkea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006236",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",imageURL:"https://graph.facebook.com/creditdunord/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3006209",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupocreditoagricola/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10262017",amenity:"bank"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DanskeBankDanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1636974",amenity:"bank"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},countryCodes:["dk","fi","gb","lt","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoDavivienda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5242054",amenity:"bank"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DenizBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1115064",amenity:"bank"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Desjardins":{name:"Desjardins",icon:"maki-bank",imageURL:"https://graph.facebook.com/desjardins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933350",amenity:"bank"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/DeutscheBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q66048",amenity:"bank"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Dollar Bank":{name:"Dollar Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dollarbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5289205",amenity:"bank"},addTags:{amenity:"bank",brand:"Dollar Bank","brand:wikidata":"Q5289205","brand:wikipedia":"en:Dollar Bank",name:"Dollar Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dib.uae/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5310570",amenity:"bank"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",imageURL:"https://graph.facebook.com/EastWestBanker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5327595",amenity:"bank"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},countryCodes:["ph"],terms:["eastwest bank"],matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/EcobankGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q930225",amenity:"bank"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},terms:["agence ecobank"],matchScore:2,suggestion:true},"amenity/bank/Emigrant Savings Bank":{name:"Emigrant Savings Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5371104",amenity:"bank"},addTags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Emirates NBD":{name:"Emirates NBD",icon:"maki-bank",imageURL:"https://graph.facebook.com/EmiratesNBD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5372575",amenity:"bank"},addTags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Congo)":{name:"Equity Bank (Congo)",icon:"maki-bank",imageURL:"https://graph.facebook.com/www.equitybank.cd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21178738",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"},countryCodes:["cd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Kenya)":{name:"Equity Bank (Kenya)",icon:"maki-bank",imageURL:"https://graph.facebook.com/KeEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384664",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"},countryCodes:["ke"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Rwanda)":{name:"Equity Bank (Rwanda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/RwEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384665",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"},countryCodes:["rw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (South Sudan)":{name:"Equity Bank (South Sudan)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5384666",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"},countryCodes:["ss"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Tanzania)":{name:"Equity Bank (Tanzania)",icon:"maki-bank",imageURL:"https://graph.facebook.com/TzEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384667",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"},countryCodes:["tz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (USA)":{name:"Equity Bank (USA)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/624655695741366272/12-izccG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62260414",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414","brand:wikipedia":"en:Equity Bank USA",name:"Equity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Equity Bank (Uganda)":{name:"Equity Bank (Uganda)",icon:"maki-bank",imageURL:"https://graph.facebook.com/UgEquityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5384668",amenity:"bank"},addTags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"},countryCodes:["ug"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1008639007046107136/-MtFGuJT_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q696867",amenity:"bank"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},countryCodes:["at","hr","hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Greece)":{name:"Eurobank (Greece)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/928963286518910976/KZD7wKh9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q951850",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"},countryCodes:["gr"],terms:["eurobank ergasias"],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Poland)":{name:"Eurobank (Poland)",icon:"maki-bank",imageURL:"https://graph.facebook.com/eurobanksa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9256201",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Eurobank (Serbia)":{name:"Eurobank (Serbia)",icon:"maki-bank",imageURL:"https://graph.facebook.com/EurobankSrbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5411684",amenity:"bank"},addTags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"amenity/bank/FNB (South Africa)":{name:"FNB (South Africa)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3072956",amenity:"bank"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"},countryCodes:["bw","mz","na","us","za","zm"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/faysalbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5439099",amenity:"bank"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/federalbankltd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2044983",amenity:"bank"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Ghana)":{name:"Fidelity Bank (Ghana)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelitybankgh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446778",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (Nigeria)":{name:"Fidelity Bank (Nigeria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/FidelityBankplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5446777",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fidelity Bank (USA)":{name:"Fidelity Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/fidelityinvestments/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411292",amenity:"bank"},addTags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FifthThirdBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411810",amenity:"bank"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"},countryCodes:["us"],terms:["5/3"],matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/qnbfinansbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1416237",amenity:"bank"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First Bank (North and South Carolina)":{name:"First Bank (North and South Carolina)",icon:"maki-bank",imageURL:"https://graph.facebook.com/localfirstbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452332",amenity:"bank"},addTags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452332","brand:wikipedia":"en:First Bancorp",name:"First Bank"},countryCodes:["us"],terms:["1st bancorp","1st bank","first bancorp"],matchScore:2,suggestion:true},"amenity/bank/First Bank (Puerto Rico)":{name:"First Bank (Puerto Rico)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFirst%20BanCorp%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5452333",amenity:"bank"},addTags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452333","brand:wikipedia":"en:First BanCorp",name:"First Bank"},countryCodes:["us"],terms:["1st bancorp","1st bank","first bancorp"],matchScore:2,suggestion:true},"amenity/bank/First Bank (Western USA)":{name:"First Bank (Western USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/efirstbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452217",amenity:"bank"},addTags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"},countryCodes:["us"],terms:["1st bank"],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank (Trinidad and Tobago)":{name:"First Citizens Bank (Trinidad and Tobago)",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstCitizens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452734",amenity:"bank"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},countryCodes:["bb","tt"],terms:["1st citizens bank"],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank (USA)":{name:"First Citizens Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/firstcitizensbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452733",amenity:"bank"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452733","brand:wikipedia":"en:First Citizens BancShares",name:"First Citizens Bank"},countryCodes:["us"],terms:["1st citizens bank"],matchScore:2,suggestion:true},"amenity/bank/First Financial Bank":{name:"First Financial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstFinancialBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453009",amenity:"bank"},addTags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"},countryCodes:["us"],terms:["1st financial bank"],matchScore:2,suggestion:true},"amenity/bank/First Interstate Bank":{name:"First Interstate Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstInterstateBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453107",amenity:"bank"},addTags:{amenity:"bank",brand:"First Interstate BancSystem","brand:wikidata":"Q5453107","brand:wikipedia":"en:First Interstate BancSystem",name:"First Interstate Bank"},countryCodes:["us"],terms:["1st interstate","1st interstate bancsystem","1st interstate bank","first interstate","first interstate bancsystem"],matchScore:2,suggestion:true},"amenity/bank/First Midwest Bank":{name:"First Midwest Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FirstMidwest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453331",amenity:"bank"},addTags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First National Bank (USA)":{name:"First National Bank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5426765",amenity:"bank"},addTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/First West Credit Union":{name:"First West Credit Union",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/2620760877/6gtc0ga7q8q9srd7tjvg_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q5454073",amenity:"bank"},addTags:{alt_name:"First West",amenity:"bank",brand:"First West Credit Union","brand:wikidata":"Q5454073","brand:wikipedia":"en:First West Credit Union",name:"First West Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Frost Bank":{name:"Frost Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/FrostBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5506152",amenity:"bank"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Fulton Bank":{name:"Fulton Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16976594",amenity:"bank"},addTags:{amenity:"bank",brand:"Fulton Bank","brand:wikidata":"Q16976594",name:"Fulton Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/gcbbanklimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1521346",amenity:"bank"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Galicia":{name:"Galicia",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancogalicia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5717952",amenity:"bank"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20garanti%20bbva.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20garanti%20bbva.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q322962",amenity:"bank"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/GetinBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9267646",amenity:"bank"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Golden 1 Credit Union":{name:"Golden 1 Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/golden1cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7736976",amenity:"bank"},addTags:{amenity:"bank",brand:"Golden 1 Credit Union","brand:wikidata":"Q7736976","brand:wikipedia":"en:Golden 1 Credit Union",name:"Golden 1 Credit Union"},countryCodes:["us"],terms:["golden 1","golden one","golden one credit union","the golden 1 credit union","the golden one credit union"],matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1126552175327567874/X3D9CTSp_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5600185",amenity:"bank"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",imageURL:"https://graph.facebook.com/groupama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3083531",amenity:"bank"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HBLBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1566843",amenity:"bank"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},countryCodes:["pk"],terms:["hbl"],matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HDFC.bank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q631047",amenity:"bank"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HNB":{name:"HNB",icon:"maki-bank",imageURL:"https://graph.facebook.com/HNBPLC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3532080",amenity:"bank"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/HSBC UK (UK)":{name:"HSBC UK (UK)",icon:"maki-bank",imageURL:"https://graph.facebook.com/hsbcuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64767453",amenity:"bank"},addTags:{amenity:"bank",brand:"HSBC UK","brand:wikidata":"Q64767453",name:"HSBC UK"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/HSBC (Global)":{name:"HSBC (Global)",icon:"maki-bank",imageURL:"https://graph.facebook.com/HSBC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q190464",amenity:"bank"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",imageURL:"https://graph.facebook.com/halifax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3310164",amenity:"bank"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HalkbankBeograd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3593818",amenity:"bank"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",imageURL:"https://graph.facebook.com/Handelsbanken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1421630",amenity:"bank"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},countryCodes:["dk","fi","gb","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/heritage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5738690",amenity:"bank"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HLBMalaysia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4383943",amenity:"bank"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/mojpunnovcanik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5923981",amenity:"bank"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/HuntingtonBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q798819",amenity:"bank"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/950681154906095618/sFON4jIk_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q220189",amenity:"bank"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ICBC":{name:"ICBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/icbcglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},terms:[],matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/icicibank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653258",amenity:"bank"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},countryCodes:["ca","gb","in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/IDBIBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3633485",amenity:"bank"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",imageURL:"https://graph.facebook.com/ING/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q645708",amenity:"bank"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},terms:["ing bank"],matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/735066633992065024/1b4aJQUq_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1410383",amenity:"bank"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",imageURL:"https://graph.facebook.com/Ibercaja/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5907815",amenity:"bank"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/MyIndianBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003789",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankiob/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2003611",amenity:"bank"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/InterbankPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2835558",amenity:"bank"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",imageURL:"https://graph.facebook.com/intesasanpaolo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1343118",amenity:"bank"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Investors Bank":{name:"Investors Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Investorsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109896",amenity:"bank"},addTags:{amenity:"bank",brand:"Investors Bank","brand:wikidata":"Q15109896","brand:wikipedia":"en:Investors Bank",name:"Investors Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Itaú (Brazil)":{name:"Itaú (Brazil)",icon:"maki-bank",imageURL:"https://graph.facebook.com/itau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1424293",amenity:"bank"},addTags:{amenity:"bank",brand:"Itaú Unibanco","brand:wikidata":"Q1424293","brand:wikipedia":"pt:Itaú Unibanco",name:"Itaú"},countryCodes:["br"],terms:["banco itau"],matchScore:2,suggestion:true},"amenity/bank/Itaú (Chile)":{name:"Itaú (Chile)",icon:"maki-bank",imageURL:"https://graph.facebook.com/corpbanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2423252",amenity:"bank"},addTags:{amenity:"bank",brand:"Itaú Corpbanca","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},countryCodes:["cl"],terms:["banco itau"],matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/JSBankLtd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6108986",amenity:"bank"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3347028",amenity:"bank"},addTags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড","brand:bn":"জনতা ব্যাংক লিমিটেড","brand:en":"Janata Bank Limited","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"জনতা ব্যাংক লিমিটেড","name:bn":"জনতা ব্যাংক লিমিটেড","name:en":"Janata Bank Limited"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1062308131567517702/0I4wgGmc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q136672",amenity:"bank"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/dontsokosan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6393834",amenity:"bank"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KBC":{name:"KBC",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/117198928/KBC_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q941020",amenity:"bank"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},countryCodes:["be","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/KanbawzaBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6360949",amenity:"bank"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},countryCodes:["mm"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/KarnatakaBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2042632",amenity:"bank"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",imageURL:"https://graph.facebook.com/kasastefczykapl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57624461",amenity:"bank"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/KeyBank":{name:"KeyBank",icon:"maki-bank",imageURL:"https://graph.facebook.com/keybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1740314",amenity:"bank"},addTags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/komercni.banka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1541079",amenity:"bank"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kotak Mahindra Bank":{name:"Kotak Mahindra Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/KotakBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2040404",amenity:"bank"},addTags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Kutxabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5139377",amenity:"bank"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Kuveyt Türk":{name:"Kuveyt Türk",icon:"maki-bank",imageURL:"https://graph.facebook.com/KuveytTurk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6036058",amenity:"bank"},addTags:{amenity:"bank",brand:"Kuveyt Türk","brand:wikidata":"Q6036058","brand:wikipedia":"tr:Kuveyt Türk",name:"Kuveyt Türk"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/LCL":{name:"LCL",icon:"maki-bank",imageURL:"https://graph.facebook.com/LCL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779722",amenity:"bank"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/LCNB":{name:"LCNB",icon:"maki-bank",imageURL:"https://graph.facebook.com/LCNBNATBANK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65095575",amenity:"bank"},addTags:{alt_name:"Lebanon Citizens National Bank",amenity:"bank",brand:"LCNB","brand:wikidata":"Q65095575",name:"LCNB",official_name:"LCNB National Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",imageURL:"https://graph.facebook.com/labanquepostale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3206431",amenity:"bank"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",imageURL:"https://graph.facebook.com/fundlacaixa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q287753",amenity:"bank"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",imageURL:"https://graph.facebook.com/laboralkutxa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12052386",amenity:"bank"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Lake Michigan Credit Union":{name:"Lake Michigan Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/LakeMichiganCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6476906",amenity:"bank"},addTags:{amenity:"bank",brand:"Lake Michigan Credit Union","brand:wikidata":"Q6476906","brand:wikipedia":"en:Lake Michigan Credit Union",name:"Lake Michigan Credit Union",short_name:"LMCU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/landbankofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6483872",amenity:"bank"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},countryCodes:["ph"],terms:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],matchScore:2,suggestion:true},"amenity/bank/Leeds Building Society":{name:"Leeds Building Society",icon:"maki-bank",imageURL:"https://graph.facebook.com/LeedsBS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6515848",amenity:"bank"},addTags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/liberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2891018",amenity:"bank"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/lloydsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1152847",amenity:"bank"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},countryCodes:["gb","im"],terms:["lloyds","lloyds tsb"],matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/MandTBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3272257",amenity:"bank"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15982510",amenity:"bank"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},terms:["mcb bank"],matchScore:2,suggestion:true},"amenity/bank/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/726534904452931588/E4dnojuF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q24282966",amenity:"bank"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Macro":{name:"Macro",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancomacro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2335199",amenity:"bank"},addTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Maybank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1364018",amenity:"bank"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/MeezanBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6807934",amenity:"bank"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mercantil":{name:"Mercantil",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6818004",amenity:"bank"},addTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Meridian Credit Union":{name:"Meridian Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/MeridianCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6819303",amenity:"bank"},addTags:{alt_name:"Meridian",amenity:"bank",brand:"Meridian Credit Union","brand:wikidata":"Q6819303","brand:wikipedia":"en:Meridian Credit Union",name:"Meridian Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Metro Bank (UK)":{name:"Metro Bank (UK)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/864061345330855936/lBp9CKv7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6824499",amenity:"bank"},addTags:{amenity:"bank",brand:"Metro Bank","brand:wikidata":"Q6824499","brand:wikipedia":"en:Metro Bank (United Kingdom)",name:"Metro Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Metrobank (Philippines)":{name:"Metrobank (Philippines)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1140117795809550338/ySSJStq-_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1925799",amenity:"bank"},addTags:{amenity:"bank",brand:"Metrobank","brand:wikidata":"Q1925799","brand:wikipedia":"en:Metrobank (Philippines)",name:"Metrobank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",imageURL:"https://graph.facebook.com/MibancoOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558589",amenity:"bank"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/bank/MidFirst Bank":{name:"MidFirst Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1096428932889362432/-d2Y2wF4_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q17081131",amenity:"bank"},addTags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/684026097688817664/fg1i7QVc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4855947",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},countryCodes:["pl"],terms:["bank millennium"],matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",imageURL:"https://graph.facebook.com/MaisMillennium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118581",amenity:"bank"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mission Federal Credit Union":{name:"Mission Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/missionfedcu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18345955",amenity:"bank"},addTags:{amenity:"bank",brand:"Mission Federal Credit Union","brand:wikidata":"Q18345955","brand:wikipedia":"en:Mission Federal Credit Union",name:"Mission Federal Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",imageURL:"https://graph.facebook.com/bancamps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q46730",amenity:"bank"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/303285168/logo_Montepio_259x248_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1946091",amenity:"bank"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Mountain America Credit Union":{name:"Mountain America Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/MountainAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6924862",amenity:"bank"},addTags:{amenity:"bank",brand:"Mountain America Credit Union","brand:wikidata":"Q6924862","brand:wikipedia":"en:Mountain America Credit Union",name:"Mountain America Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",imageURL:"https://graph.facebook.com/NAB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1430985",amenity:"bank"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/NSB":{name:"NSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/NSBSLOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12500189",amenity:"bank"},addTags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"},countryCodes:["lk"],terms:["national savings bank"],matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",imageURL:"https://graph.facebook.com/NatWest/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2740021",amenity:"bank"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},countryCodes:["gb","gg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/National Bank":{name:"National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/banquenationale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634298",amenity:"bank"},addTags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",imageURL:"https://graph.facebook.com/NationwideBuildingSociety/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q846735",amenity:"bank"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/NavyFederal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6982632",amenity:"bank"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Nedbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2751701",amenity:"bank"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",imageURL:"https://graph.facebook.com/Nordea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1123823",amenity:"bank"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",imageURL:"https://graph.facebook.com/planetanovobanco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17488861",amenity:"bank"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/OLB":{name:"OLB",icon:"maki-bank",imageURL:"https://graph.facebook.com/OLB.Bank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",imageURL:"https://graph.facebook.com/otpbank.hu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},terms:["otp bank"],matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/oberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2009139",amenity:"bank"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},countryCodes:["at","cz","de","hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",imageURL:"https://graph.facebook.com/1086400904717496/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854108",amenity:"bank"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},countryCodes:["ve"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/OLB.Bank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q879591",amenity:"bank"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7093019",amenity:"bank"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oriental":{name:"Oriental",icon:"maki-bank",imageURL:"https://graph.facebook.com/OrientalBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64887002",amenity:"bank"},addTags:{alt_name:"Oriental Bank",amenity:"bank",brand:"Oriental","brand:wikidata":"Q64887002",name:"Oriental"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",imageURL:"https://graph.facebook.com/OBCIndOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q367008",amenity:"bank"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Osuuspankki":{name:"Osuuspankki",icon:"maki-bank",imageURL:"https://graph.facebook.com/OP.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4045597",amenity:"bank"},addTags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PBZ":{name:"PBZ",icon:"maki-bank",imageURL:"https://graph.facebook.com/privrednabankazagreb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7246343",amenity:"bank"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",imageURL:"https://graph.facebook.com/PKOBankPolski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q578832",amenity:"bank"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"},countryCodes:["pl"],terms:["pko bank polski"],matchScore:2,suggestion:true},"amenity/bank/PNB":{name:"PNB",icon:"maki-bank",imageURL:"https://graph.facebook.com/PNBph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1657971",amenity:"bank"},addTags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/pncbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38928",amenity:"bank"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},countryCodes:["us"],terms:["pnc"],matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",imageURL:"https://graph.facebook.com/psbankofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7185203",amenity:"bank"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/paninbankfanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12502751",amenity:"bank"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoPatagonia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882078",amenity:"bank"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankpekaosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806642",amenity:"bank"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/PenFed Credit Union":{name:"PenFed Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/PenFed/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3374885",amenity:"bank"},addTags:{alt_name:"Pentagon Federal Credit Union",amenity:"bank",brand:"PenFed Credit Union","brand:wikidata":"Q3374885","brand:wikipedia":"en:Pentagon Federal Credit Union",name:"PenFed Credit Union",short_name:"PenFed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/peoplesunited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7165802",amenity:"bank"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Peoples Bank (Ohio)":{name:"Peoples Bank (Ohio)",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/473816917182930946/kWDoDGQx_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q65716607",amenity:"bank"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q65716607",name:"Peoples Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Peoples Bank (Washington)":{name:"Peoples Bank (Washington)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7166050",amenity:"bank"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/piraeusbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},countryCodes:["bg","cy","gr","ro","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Popular":{name:"Popular",icon:"maki-bank",imageURL:"https://graph.facebook.com/PopularVI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7229656",amenity:"bank"},addTags:{alt_name:"Banco Popular","alt_name:en":"Popular Bank","alt_name:es":"Banco Popular",amenity:"bank",brand:"Popular","brand:en":"Popular","brand:es":"Popular","brand:wikidata":"Q7229656","brand:wikipedia":"en:Popular, Inc.",name:"Popular","name:en":"Popular","name:es":"Popular",official_name:"Banco Popular de Puerto Rico","official_name:es":"Banco Popular de Puerto Rico",short_name:"BPPR"},countryCodes:["us"],terms:["popular bank"],matchScore:2,suggestion:true},"amenity/bank/Postbank (Bulgaria)":{name:"Postbank (Bulgaria)",icon:"maki-bank",imageURL:"https://graph.facebook.com/PostbankBG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7234083",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Postbank (Germany)":{name:"Postbank (Germany)",icon:"maki-bank",imageURL:"https://graph.facebook.com/postbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q708835",amenity:"bank"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},countryCodes:["de"],terms:["postbank finanzcenter"],matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/primabankaslovensko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13538661",amenity:"bank"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Provincial":{name:"Provincial",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1151125571289718786/INihTiHa_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4835087",amenity:"bank"},addTags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"},countryCodes:["ve"],terms:["bbva provincial"],matchScore:2,suggestion:true},"amenity/bank/Public Bank (Malaysia)":{name:"Public Bank (Malaysia)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3046561",amenity:"bank"},addTags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"},terms:["public bank berhad"],matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/pnbindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2743499",amenity:"bank"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/rbc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735261",amenity:"bank"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"},terms:["rbc financial group","rbc royal bank","royal bank"],matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",imageURL:"https://graph.facebook.com/royalbankofscotland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160126",amenity:"bank"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"},countryCodes:["gb","je","ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",imageURL:"https://graph.facebook.com/RCBCGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7339070",amenity:"bank"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"},countryCodes:["ph"],terms:["rcbc savings bank"],matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/rabobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q252004",amenity:"bank"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},countryCodes:["au","id","nl","nz","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/BNPParibasBankPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9303218",amenity:"bank"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},countryCodes:["de","pl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisenbank":{name:"Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q24282825",amenity:"bank"},addTags:{amenity:"bank",brand:"Raiffeisenbank","brand:wikidata":"Q24282825","brand:wikipedia":"cs:Raiffeisenbank",name:"Raiffeisenbank"},terms:["raiffeisen","raiffeisenkasse"],matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/RegionsBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q917131",amenity:"bank"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Republic Bank (Eastern Caribbean)":{name:"Republic Bank (Eastern Caribbean)",icon:"maki-bank",imageURL:"https://graph.facebook.com/republicbanktnt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7314386",amenity:"bank"},addTags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"},countryCodes:["bb","gd","gy","tt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Republic Bank (USA)":{name:"Republic Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/republicbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7314387",amenity:"bank"},addTags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314387","brand:wikipedia":"en:Republic Bank & Trust Company",name:"Republic Bank",official_name:"Republic Bank & Trust Company"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/República":{name:"República",icon:"maki-bank",imageURL:"https://graph.facebook.com/BROU.uy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4077337",amenity:"bank"},addTags:{amenity:"bank",brand:"República","brand:wikidata":"Q4077337","brand:wikipedia":"en:Banco de la República Oriental del Uruguay",name:"República"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/bank/S-Pankki":{name:"S-Pankki",icon:"maki-bank",imageURL:"https://graph.facebook.com/kauppapankki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7387053",amenity:"bank"},addTags:{amenity:"bank",brand:"S-Pankki","brand:wikidata":"Q7387053","brand:wikipedia":"fi:S-Pankki",name:"S-Pankki"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SC제일은행":{name:"SC제일은행",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardCharteredKR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q625531",amenity:"bank"},addTags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행","brand:wikidata":"Q625531","brand:wikipedia":"en:Standard Chartered Korea",name:"SC제일은행","name:ko":"SC제일은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",imageURL:"https://graph.facebook.com/sebsverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q975655",amenity:"bank"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},countryCodes:["de","ee","lt","lv","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",imageURL:"https://graph.facebook.com/societegenerale.cotedivoire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3488360",amenity:"bank"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},countryCodes:["ci"],terms:["agence sgbci"],matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/devolksbanknl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1857899",amenity:"bank"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/Sampathbankplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7410095",amenity:"bank"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/San Diego County Credit Union":{name:"San Diego County Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/SDCCU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7413628",amenity:"bank"},addTags:{amenity:"bank",brand:"San Diego County Credit Union","brand:wikidata":"Q7413628","brand:wikipedia":"en:San Diego County Credit Union",name:"San Diego County Credit Union",short_name:"SDCCU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",imageURL:"https://graph.facebook.com/SantanderBankUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5835668",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},terms:["santander consumer bank"],matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",imageURL:"https://graph.facebook.com/Santander.Ar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3385268",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",imageURL:"https://graph.facebook.com/santanderpt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854116",amenity:"bank"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Scotiabank (Québec)":{name:"Scotiabank (Québec)",icon:"maki-bank",imageURL:"https://graph.facebook.com/scotiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451476",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Scotia","brand:wikidata":"Q451476","brand:wikipedia":"fr:Banque Scotia",name:"Banque Scotia"},countryCodes:["ca"],terms:["Scotia"],matchScore:2,suggestion:true},"amenity/bank/Scotiabank (non-Québec)":{name:"Scotiabank (non-Québec)",icon:"maki-bank",imageURL:"https://graph.facebook.com/scotiabank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451476",amenity:"bank"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},terms:["Scotia"],matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SecurityBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7444945",amenity:"bank"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Security Service Federal Credit Union":{name:"Security Service Federal Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ssfcu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7444993",amenity:"bank"},addTags:{amenity:"bank",brand:"Security Service Federal Credit Union","brand:wikidata":"Q7444993","brand:wikipedia":"en:Security Service Federal Credit Union",name:"Security Service Federal Credit Union",short_name:"SSFCU"},countryCodes:["us"],terms:["security service fcu"],matchScore:2,suggestion:true},"amenity/bank/Service Credit Union":{name:"Service Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ServiceCreditUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7455675",amenity:"bank"},addTags:{amenity:"bank",brand:"Service Credit Union","brand:wikidata":"Q7455675","brand:wikipedia":"en:Service Credit Union",name:"Service Credit Union"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Servus Credit Union":{name:"Servus Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ServusCU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2274396",amenity:"bank"},addTags:{alt_name:"Servus",amenity:"bank",brand:"Servus Credit Union","brand:wikidata":"Q2274396","brand:wikipedia":"en:Servus Credit Union",name:"Servus Credit Union"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SeylanBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3532083",amenity:"bank"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Siam Commercial Bank":{name:"Siam Commercial Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",imageURL:"https://graph.facebook.com/sicooboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28679754",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicredi":{name:"Sicredi",icon:"maki-bank",imageURL:"https://graph.facebook.com/Sicredi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3483060",amenity:"bank"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Simmons Bank":{name:"Simmons Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/simmonsbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28402389",amenity:"bank"},addTags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",imageURL:"https://graph.facebook.com/SlovenskaSporitelna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7541907",amenity:"bank"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",imageURL:"https://graph.facebook.com/societegenerale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270363",amenity:"bank"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Société Marseillaise de Crédit":{name:"Société Marseillaise de Crédit",icon:"maki-bank",imageURL:"https://graph.facebook.com/societemarseillaisedecredit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3488479",amenity:"bank"},addTags:{amenity:"bank",brand:"Société Marseillaise de Crédit","brand:wikidata":"Q3488479","brand:wikipedia":"fr:Société marseillaise de crédit",name:"Société Marseillaise de Crédit"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/sb.ltd.bd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3350382",amenity:"bank"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"},countryCodes:["bd"],terms:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/thesouthindianbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2044973",amenity:"bank"},addTags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/South State Bank":{name:"South State Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SouthStateBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55633597",amenity:"bank"},addTags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SpardaVerband/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2307136",amenity:"bank"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/StanbicBankGhana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7597999",amenity:"bank"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/standardbankgrp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1576610",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardChartered/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q548278",amenity:"bank"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},terms:["standard chartered bank"],matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",imageURL:"https://graph.facebook.com/StateBankOfIndia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1340361",amenity:"bank"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},terms:[],matchScore:2,suggestion:true},"amenity/bank/State Employees Credit Union":{name:"State Employees Credit Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/stateemployeescreditunion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7603196",amenity:"bank"},addTags:{amenity:"bank",brand:"State Employees Credit Union","brand:wikidata":"Q7603196","brand:wikipedia":"en:State Employees Credit Union",name:"State Employees Credit Union",short_name:"SECU"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/SummitBankPK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7637775",amenity:"bank"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},countryCodes:["pk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",imageURL:"https://graph.facebook.com/suntrust/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181507",amenity:"bank"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},countryCodes:["us"],terms:["suntrust bank"],matchScore:2,suggestion:true},"amenity/bank/Suncorp":{name:"Suncorp",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q24189567",amenity:"bank"},addTags:{amenity:"bank",brand:"Suncorp","brand:wikidata":"Q24189567","brand:wikipedia":"en:Suncorp Bank",name:"Suncorp"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Supervielle":{name:"Supervielle",icon:"maki-bank",imageURL:"https://graph.facebook.com/BancoSupervielle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5718035",amenity:"bank"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",imageURL:"https://graph.facebook.com/swedbanksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1145493",amenity:"bank"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},countryCodes:["ee","lt","lv","se"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/syndicatebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2004088",amenity:"bank"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/TCFbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669687",amenity:"bank"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/TDBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669891",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",imageURL:"https://graph.facebook.com/TDBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1080670",amenity:"bank"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TEB":{name:"TEB",icon:"maki-bank",imageURL:"https://graph.facebook.com/teb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7862447",amenity:"bank"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",imageURL:"https://graph.facebook.com/TSBbankUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7671560",amenity:"bank"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Takarékszövetkezet":{name:"Takarékszövetkezet",icon:"maki-bank",imageURL:"https://graph.facebook.com/takarekcsoport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30324674",amenity:"bank"},addTags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Tangerine":{name:"Tangerine",icon:"maki-bank",imageURL:"https://graph.facebook.com/TangerineBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15238797",amenity:"bank"},addTags:{amenity:"bank",brand:"Tangerine","brand:wikidata":"Q15238797","brand:wikipedia":"en:Tangerine Bank",name:"Tangerine"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",imageURL:"https://graph.facebook.com/targobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1455437",amenity:"bank"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},countryCodes:["de","es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",imageURL:"https://graph.facebook.com/tatrabanka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1718069",amenity:"bank"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",imageURL:"https://graph.facebook.com/isbankasi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/U.S. Bank":{name:"U.S. Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/usbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q739084",amenity:"bank"},addTags:{amenity:"bank",brand:"U.S. Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"U.S. Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UBA":{name:"UBA",icon:"maki-bank",imageURL:"https://graph.facebook.com/ubagroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q513457",amenity:"bank"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBIBanca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1476162",amenity:"bank"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBLUnitedBankLtd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887504",amenity:"bank"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},countryCodes:["pk"],terms:["ubl bank"],matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",imageURL:"https://graph.facebook.com/UBSglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q193199",amenity:"bank"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",imageURL:"https://graph.facebook.com/official.ucobank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2005310",amenity:"bank"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UCPB":{name:"UCPB",icon:"maki-bank",imageURL:"https://graph.facebook.com/UCPB.Connect/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887615",amenity:"bank"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UIB":{name:"UIB",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q18636687",amenity:"bank"},addTags:{amenity:"bank",brand:"UIB","brand:wikidata":"Q18636687","brand:wikipedia":"en:United Industrial Bank",name:"UIB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UNI":{name:"UNI",icon:"maki-bank",imageURL:"https://graph.facebook.com/unicooperation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2933348",amenity:"bank"},addTags:{amenity:"bank",brand:"UNI","brand:wikidata":"Q2933348","brand:wikipedia":"fr:UNI Coopération financière",name:"UNI",official_name:"UNI Coopération financière"},countryCodes:["ca"],terms:["caisse populaire","caisse populaire acadienne"],matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUOB%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2064074",amenity:"bank"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/USAA":{name:"USAA",icon:"maki-bank",imageURL:"https://graph.facebook.com/USAA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7865722",amenity:"bank"},addTags:{amenity:"bank",brand:"USAA","brand:wikidata":"Q7865722","brand:wikipedia":"en:USAA",name:"USAA",official_name:"United Services Automobile Association"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2613366",amenity:"bank"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1151175725711364096/6S_1o7Fj_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7881772",amenity:"bank"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/938454142338596864/uYxN76cQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q45568",amenity:"bank"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},terms:["unicredit","unicredit banca"],matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054637020713234432/c1iwfyOm_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2543704",amenity:"bank"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco",short_name:"Unicaja"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnion%20Bank%20of%20India%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2004078",amenity:"bank"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Union Bank (USA)":{name:"Union Bank (USA)",icon:"maki-bank",imageURL:"https://graph.facebook.com/unionbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1442804",amenity:"bank"},addTags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"},countryCodes:["us"],terms:["mufg union bank","union bank of california"],matchScore:2,suggestion:true},"amenity/bank/UnionBank (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnionBankPH.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7885403",amenity:"bank"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},countryCodes:["ph"],terms:["union bank of the philippines"],matchScore:2,suggestion:true},"amenity/bank/United Bank (Connecticut)":{name:"United Bank (Connecticut)",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankatunited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64825157",amenity:"bank"},addTags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q64825157",name:"United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/United Bank (WestVirginia)":{name:"United Bank (WestVirginia)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnited%20Bank%20(West%20Virginia)%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16920636",amenity:"bank"},addTags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q16920636","brand:wikipedia":"en:United Bank (West Virginia)",name:"United Bank"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1116607604568940545/27IKknhk_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1148521",amenity:"bank"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vancity":{name:"Vancity",icon:"maki-bank",imageURL:"https://graph.facebook.com/Vancity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7914085",amenity:"bank"},addTags:{amenity:"bank",brand:"Vancity","brand:wikidata":"Q7914085","brand:wikipedia":"en:Vancity",name:"Vancity",official_name:"Vancouver City Savings Credit Union"},countryCodes:["ca"],terms:["vancouver city savings"],matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3127221",amenity:"bank"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2003171",amenity:"bank"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Volksbank Köln Bonn eG":{name:"Volksbank Köln Bonn eG",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q41680844",amenity:"bank"},addTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank Köln Bonn eG"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bank/VÚB":{name:"VÚB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVUB.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q12778981",amenity:"bank"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWashington%20Federal%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7971859",amenity:"bank"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1088877344624758784/OH8VFkEY_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q744149",amenity:"bank"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},countryCodes:["us"],terms:["wells fargo bank"],matchScore:2,suggestion:true},"amenity/bank/WesBanco":{name:"WesBanco",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesBanco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7983629",amenity:"bank"},addTags:{amenity:"bank",brand:"WesBanco","brand:wikidata":"Q7983629","brand:wikipedia":"en:WesBanco",name:"WesBanco"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"bank"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1135693176243597312/mE_lUXFY_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2031726",amenity:"bank"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q8049138",amenity:"bank"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/875682560315097088/YOR4LIIO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q8055678",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1145614834526040065/R06gfLHu_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q12073381",amenity:"bank"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZagreba%C4%8Dka-banka-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q140381",amenity:"bank"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/880350862647980032/mvRee-i3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5978240",amenity:"bank"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/796327044867100672/6kVcx5hR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q696003",amenity:"bank"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},terms:[],matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/978550505856225280/lx2kkb1A_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1160928",amenity:"bank"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/st.george":{name:"st.george",icon:"maki-bank",imageURL:"https://graph.facebook.com/stgeorgebankaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1606050",amenity:"bank"},addTags:{amenity:"bank",brand:"st.george","brand:wikidata":"Q1606050","brand:wikipedia":"en:St.George Bank",name:"st.george"},countryCodes:["au"],terms:["st.george bank"],matchScore:2,suggestion:true},"amenity/bank/Ålandsbanken":{name:"Ålandsbanken",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlandsbanken-logotype.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4349236",amenity:"bank"},addTags:{amenity:"bank",brand:"Ålandsbanken","brand:wikidata":"Q4349236","brand:wikipedia":"sv:Ålandsbanken",name:"Ålandsbanken"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",imageURL:"https://graph.facebook.com/csob/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q340135",amenity:"bank"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1129037135598804996/t6sH0DmI_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q341100",amenity:"bank"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",imageURL:"https://graph.facebook.com/isbankasi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909613",amenity:"bank"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/889398220853522432/S7AkARZ9_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1816028",amenity:"bank"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",imageURL:"https://graph.facebook.com/piraeusbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312",amenity:"bank"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/А-Банк":{name:"А-Банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q28705400",amenity:"bank"},addTags:{amenity:"bank",brand:"А-Банк","brand:wikidata":"Q28705400","brand:wikipedia":"uk:А-Банк",name:"А-Банк"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Авангард":{name:"Авангард",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankavangard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122617",amenity:"bank"},addTags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1126053531507621888/L60raYv6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1377835",amenity:"bank"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/БПС-Сбербанк":{name:"БПС-Сбербанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank.bps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2074915",amenity:"bank"},addTags:{amenity:"bank",brand:"БПС-Сбербанк","brand:wikidata":"Q2074915","brand:wikipedia":"be:БПС-Сбербанк",name:"БПС-Сбербанк"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Банк Дабрабыт":{name:"Банк Дабрабыт",icon:"maki-bank",imageURL:"https://graph.facebook.com/bank.dabrabyt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63981850",amenity:"bank"},addTags:{amenity:"bank",brand:"Банк Дабрабыт","brand:wikidata":"Q63981850",name:"Банк Дабрабыт"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5206146",amenity:"bank"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/818408470319865857/4hE0A76d_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1991373",amenity:"bank"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/asb.belarusbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1997334",amenity:"bank"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Белинвестбанк":{name:"Белинвестбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/belinvestbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4081940",amenity:"bank"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/binbank.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4086829",amenity:"bank"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054295031916453888/lvi_M_Cc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1549389",amenity:"bank"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},countryCodes:["ru","ua"],terms:["втб банк москвы"],matchScore:2,suggestion:true},"amenity/bank/Возрождение":{name:"Возрождение",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4114952",amenity:"bank"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGazprombank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1924338",amenity:"bank"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Генбанк":{name:"Генбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/GENBANK.Crimea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122630",amenity:"bank"},addTags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FQazkom%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1168179",amenity:"bank"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304145",amenity:"bank"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4304446",amenity:"bank"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Народный банк":{name:"Народный банк",icon:"maki-bank",imageURL:"https://graph.facebook.com/halykbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046186",amenity:"bank"},addTags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"},countryCodes:["kg","kz","uz"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",imageURL:"https://graph.facebook.com/otpbank.hu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q912778",amenity:"bank"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",imageURL:"https://graph.facebook.com/UnitedBulgarianBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887555",amenity:"bank"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Открытие":{name:"Открытие",icon:"maki-bank",imageURL:"https://graph.facebook.com/otkritie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4327204",amenity:"bank"},addTags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"},countryCodes:["ru"],terms:["банк открытие"],matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/oschadbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4340839",amenity:"bank"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1085114991370485762/D3vO4DSe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4341156",amenity:"bank"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1054324676284112896/8hNCP82s_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q24930461",amenity:"bank"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Пощенска банка":{name:"Пощенска банка",icon:"maki-bank",imageURL:"https://graph.facebook.com/PostbankBG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7234083",amenity:"bank"},addTags:{amenity:"bank",brand:"Пощенска банка","brand:wikidata":"Q7234083","brand:wikipedia":"bg:Пощенска банка",name:"Пощенска банка","name:en":"Postbank"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1515015",amenity:"bank"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Приднестровский Сбербанк":{name:"Приднестровский Сбербанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4378147",amenity:"bank"},addTags:{amenity:"bank",brand:"Приднестровский Сбербанк","brand:en":"Pridnestrovian Savings Bank","brand:ru":"Приднестровский Сбербанк","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Приднестровский Сбербанк","name:en":"Pridnestrovian Savings Bank","name:ru":"Приднестровский Сбербанк"},countryCodes:["md"],terms:["приднестровский cбербанк"],matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/Priorbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3919658",amenity:"bank"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1141277923082723328/OXpPm2xv_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q649100",amenity:"bank"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1089811715519365120/cq5jOtOD_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16912944",amenity:"bank"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1136158344052379648/wQYX1AVH_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4389244",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/880303932081352704/d66pHime_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4389243",amenity:"bank"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1061886098891292672/qw4qUcW2_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1119857",amenity:"bank"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/952899724914446336/9itJSe9x_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3920226",amenity:"bank"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1153224562890432512/yI6eOKN__bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4400854",amenity:"bank"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sberbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q205012",amenity:"bank"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Sberbank","brand:ru":"Сбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Сбербанк","name:en":"Sberbank","name:ru":"Сбербанк"},countryCodes:["kz","ru"],terms:["cбербанк","cбербанк россии","сбербанк россии"],matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/sovcombank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4426566",amenity:"bank"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",imageURL:"https://graph.facebook.com/UKRSIBBANK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1976290",amenity:"bank"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrgasbank%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4470692",amenity:"bank"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q3547885",amenity:"bank"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4476693",amenity:"bank"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q25632240",amenity:"bank"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},countryCodes:["mn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1058027651502366720/Pi8dYujA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4500466",amenity:"bank"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק אגוד":{name:"בנק אגוד",icon:"maki-bank",imageURL:"https://graph.facebook.com/igudbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2903265",amenity:"bank"},addTags:{"alt_name:en":"Bank Igud",amenity:"bank",brand:"בנק אגוד","brand:en":"Union Bank of Israel","brand:he":"בנק אגוד","brand:wikidata":"Q2903265","brand:wikipedia":"en:Union Bank of Israel",name:"בנק אגוד","name:en":"Union Bank of Israel","name:he":"בנק אגוד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק אוצר החייל":{name:"בנק אוצר החייל",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOtsarLogoHE.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2900674",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק אוצר החייל","brand:en":"Bank Otsar Ha-Hayal","brand:he":"בנק אוצר החייל","brand:wikidata":"Q2900674","brand:wikipedia":"en:Bank Otsar Ha-Hayal",name:"בנק אוצר החייל","name:en":"Bank Otsar Ha-Hayal","name:he":"בנק אוצר החייל"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק דיסקונט":{name:"בנק דיסקונט",icon:"maki-bank",imageURL:"https://graph.facebook.com/discountbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q250362",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק דיסקונט לישראל","brand:en":"Israel Discount Bank","brand:he":"בנק דיסקונט לישראל","brand:wikidata":"Q250362","brand:wikipedia":"en:Israel Discount Bank",name:"בנק דיסקונט","name:en":"Bank Discount","name:he":"בנק דיסקונט"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/950970103667052544/Ymilo1Mp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2666775",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק יהד":{name:"בנק יהד",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7187611",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק יהד","brand:en":"Bank Yahav","brand:he":"בנק יהד","brand:wikidata":"Q7187611","brand:wikipedia":"he:בנק יהב",name:"בנק יהד","name:en":"Bank Yahav","name:he":"בנק יהד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק ירושלים":{name:"בנק ירושלים",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2900227",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק ירושלים","brand:en":"Bank of Jerusalem","brand:he":"בנק ירושלים","brand:wikidata":"Q2900227","brand:wikipedia":"en:Bank of Jerusalem",name:"בנק ירושלים","name:en":"Bank of Jerusalem","name:he":"בנק ירושלים"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806641",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק מסד":{name:"בנק מסד",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7187667",amenity:"bank"},addTags:{amenity:"bank",brand:"בנק מסד","brand:en":"Bank Massad","brand:he":"בנק מסד","brand:wikidata":"Q7187667","brand:wikipedia":"en:Bank Massad",name:"בנק מסד","name:en":"Bank Massad","name:he":"בנק מסד"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/הבנק הבינלאומי":{name:"הבנק הבינלאומי",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHaBank%20Hbinleumi%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2777497",amenity:"bank"},addTags:{amenity:"bank",brand:"הבנק הבינלאומי","brand:en":"First International Bank of Israel","brand:he":"הבנק הבינלאומי","brand:wikidata":"Q2777497","brand:wikipedia":"en:First International Bank of Israel",name:"הבנק הבינלאומי","name:en":"First International Bank of Israel","name:he":"הבנק הבינלאומי"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/מזרחי טפחות":{name:"מזרחי טפחות",icon:"maki-bank",imageURL:"https://graph.facebook.com/bank.mizrahi.tefahot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2777129",amenity:"bank"},addTags:{amenity:"bank",brand:"מזרחי טפחות","brand:en":"Mizrahi-Tefahot","brand:he":"מזרחי טפחות","brand:wikidata":"Q2777129","brand:wikipedia":"en:Bank Mizrahi-Tefahot",name:"בנק מזרחי טפחות","name:en":"Bank Mizrahi-Tefahot","name:he":"בנק מזרחי טפחות"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5938144",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5323768",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک انصار":{name:"بانک انصار",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5862675",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ایران زمین":{name:"بانک ایران زمین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5934423",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک تجارت":{name:"بانک تجارت",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7695198",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک توسعه تعاون":{name:"بانک توسعه تعاون",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5684450",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRefah-Bank-Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7307083",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},countryCodes:["ir"],terms:["بانک رفاه کارگران"],matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4117676",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7424291",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2882624",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860246",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5941033",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Saderat%20Iran%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2882608",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},countryCodes:["ir"],terms:["بانک صادرات ایران","صادرات"],matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10860253",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20maskan.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855942",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855944",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک ملی":{name:"بانک ملی",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q806640",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"},countryCodes:["ir"],terms:["بانک ملی ایران","ملی"],matchScore:2,suggestion:true},"amenity/bank/بانک مهر اقتصاد":{name:"بانک مهر اقتصاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5942921",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2410404",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4855962",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6395007",amenity:"bank"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7233625",amenity:"bank"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},countryCodes:["ir"],terms:[],matchScore:2,suggestion:true},"amenity/bank/অগ্রণী ব্যাংক লিমিটেড":{name:"অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",imageURL:"https://graph.facebook.com/AgraniBankLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q517050",amenity:"bank"},addTags:{amenity:"bank",brand:"অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/গ্রামীণ ব্যাংক":{name:"গ্রামীণ ব্যাংক",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q188567",amenity:"bank"},addTags:{amenity:"bank",brand:"গ্রামীণ ব্যাংক","brand:wikidata":"Q188567","brand:wikipedia":"en:Grameen Bank",name:"গ্রামীণ ব্যাংক","name:en":"Grameen Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/বাংলাদেশ কৃষি ব্যাংক":{name:"বাংলাদেশ কৃষি ব্যাংক",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16345932",amenity:"bank"},addTags:{amenity:"bank",brand:"বাংলাদেশ কৃষি ব্যাংক","brand:wikidata":"Q16345932","brand:wikipedia":"en:Bangladesh Krishi Bank",name:"বাংলাদেশ কৃষি ব্যাংক","name:en":"Bangladesh Krishi Bank"},countryCodes:["bd"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",imageURL:"https://graph.facebook.com/371998329537690/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806483",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1100959964040814599/Wv9V7iMd_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q962865",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1146600752816648192/7TphMSUQ_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q276557",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6579041",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",imageURL:"https://graph.facebook.com/scb.thailand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2038986",amenity:"bank"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/902036508672106496/L8rp7WY6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2882956",amenity:"bank"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/ゆうちょ銀行":{name:"ゆうちょ銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJapan%20Post%20Bank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q907103",amenity:"bank"},addTags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/りそな銀行":{name:"りそな銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FResona%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11281447",amenity:"bank"},addTags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/smbc.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2660418",amenity:"bank"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/bk.mufg.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q988284",amenity:"bank"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4207208",amenity:"bank"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/东亚银行":{name:"东亚银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20East%20Asia%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806679",amenity:"bank"},addTags:{amenity:"bank",brand:"东亚银行","brand:wikidata":"Q806679","brand:wikipedia":"en:Bank of East Asia",name:"东亚银行","name:en":"Bank of East Asia"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中信银行":{name:"中信银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q38960",amenity:"bank"},addTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",imageURL:"https://graph.facebook.com/icbcglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国民生银行":{name:"中国民生银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q911543",amenity:"bank"},addTags:{amenity:"bank",brand:"中国民生银行","brand:en":"China Minsheng Bank","brand:wikidata":"Q911543","brand:wikipedia":"en:China Minsheng Bank",name:"中国民生银行","name:en":"China Minsheng Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPostal%20Savings%20Bank%20of%20China%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q986744",amenity:"bank"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",imageURL:"https://graph.facebook.com/bankofchina.cn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5100191",amenity:"bank"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20Communications%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806680",amenity:"bank"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京城商業銀行":{name:"京城商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10883132",amenity:"bank"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11374844",amenity:"bank"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"ja:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11375713",amenity:"bank"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10889602",amenity:"bank"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q709757",amenity:"bank"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/农业银行":{name:"农业银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgricultural%20Bank%20of%20China%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26298",amenity:"bank"},addTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11402354",amenity:"bank"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q5878076",amenity:"bank"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTcbbank%20headoffice.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q6136958",amenity:"bank"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q697293",amenity:"bank"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7676420",amenity:"bank"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDepartment%20of%20Business%2C%20Taiwan%20Cooperative%20Bank%2020171216.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q701540",amenity:"bank"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q702656",amenity:"bank"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10937047",amenity:"bank"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q10946952",amenity:"bank"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",imageURL:"https://graph.facebook.com/icbcglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26463",amenity:"bank"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/常陽銀行":{name:"常陽銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q6297774",amenity:"bank"},addTags:{amenity:"bank",brand:"常陽銀行","brand:wikidata":"Q6297774","brand:wikipedia":"en:Joyo Bank",name:"常陽銀行"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/建设银行":{name:"建设银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Construction%20Bank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q26299",amenity:"bank"},addTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCentral%20Branch%2C%20Chang%20Hwa%20Bank%2020101213.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5071627",amenity:"bank"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1073327",amenity:"bank"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/日本銀行":{name:"日本銀行",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1695643374/medama_moji_en_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q333101",amenity:"bank"},addTags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/東亞銀行":{name:"東亞銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20of%20East%20Asia%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806679",amenity:"bank"},addTags:{amenity:"bank",brand:"東亞銀行","brand:en":"Bank of East Asia","brand:wikidata":"Q806679","brand:wikipedia":"zh:東亞銀行","brand:zh-Hans":"东亚银行","brand:zh-Hant":"東亞銀行",name:"東亞銀行 BEA","name:en":"Bank of East Asia","name:zh-Hans":"东亚银行","name:zh-Hant":"東亞銀行"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11104946",amenity:"bank"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q2744340",amenity:"bank"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20SinoPac%20logo%2020121103.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4855976",amenity:"bank"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/渣打國際商業銀行":{name:"渣打國際商業銀行",icon:"maki-bank",imageURL:"https://graph.facebook.com/StandardCharteredTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267023",amenity:"bank"},addTags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.SUN%20Bank.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5321663",amenity:"bank"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11602128",amenity:"bank"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15927195",amenity:"bank"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15913812",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q717592",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15909616",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q706533",amenity:"bank"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11620043",amenity:"bank"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q15911143",amenity:"bank"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q11658759",amenity:"bank"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q7499501",amenity:"bank"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q496606",amenity:"bank"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"},countryCodes:["kr"],terms:["국민은행 (gungmin bank)"],matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q483855",amenity:"bank"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/농협":{name:"농협",icon:"maki-bank",imageURL:"https://graph.facebook.com/nhnonghyupbank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15283673",amenity:"bank"},addTags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"},countryCodes:["kr"],terms:["nh농협은행"],matchScore:2,suggestion:true},"amenity/bank/새마을금고":{name:"새마을금고",icon:"maki-bank",imageURL:"https://graph.facebook.com/kfcc.kr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12600614",amenity:"bank"},addTags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q487230",amenity:"bank"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"},countryCodes:["kr"],terms:["신한은행 (sinhan bank)"],matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/2838394455/1686ad262e3d37918e0830b9479d6aea_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q494369",amenity:"bank"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"},countryCodes:["kr"],terms:["우리은행 (uri bank)"],matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/894461767065128960/SK5wN3DO_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q484047",amenity:"bank"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/bar/All Bar One":{name:"All Bar One",icon:"maki-bar",imageURL:"https://pbs.twimg.com/profile_images/717013484467306497/vjG-lkGe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4728624",amenity:"bar"},addTags:{amenity:"bar",brand:"All Bar One","brand:wikidata":"Q4728624","brand:wikipedia":"en:All Bar One",name:"All Bar One"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bar/Revolución de Cuba":{name:"Revolución de Cuba",icon:"maki-bar",imageURL:"https://pbs.twimg.com/profile_images/1001476884482396160/3NEm7OnI_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64024691",amenity:"bar"},addTags:{amenity:"bar",brand:"Revolución de Cuba","brand:wikidata":"Q64024691",name:"Revolución de Cuba"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bar/Revolution":{name:"Revolution",icon:"maki-bar",imageURL:"https://graph.facebook.com/revolutionbars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64024398",amenity:"bar"},addTags:{amenity:"bar",brand:"Revolution","brand:wikidata":"Q64024398",name:"Revolution"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/callabikesharing/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q1060525",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Grid":{name:"Grid",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Gridbikes/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104168",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/MiBici":{name:"MiBici",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/MiBiciPublica/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q60966987",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/Swapfiets":{name:"Swapfiets",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Swapfiets/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104374",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"},countryCodes:["be","de","dk","nl"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/metropolradruhr":{name:"metropolradruhr",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/nextbike/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q62104274",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bicycle_rental/nextbike":{name:"nextbike",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/nextbike/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q2351279",amenity:"bicycle_rental"},addTags:{amenity:"bicycle_rental",brand:"nextbike","brand:wikidata":"Q2351279","brand:wikipedia":"de:Nextbike",name:"nextbike"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/CADECA":{name:"CADECA",icon:"maki-bank",imageURL:"https://graph.facebook.com/CadecaCasasdeCambioOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122716",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",imageURL:"https://graph.facebook.com/TravelexUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2337964",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/85°C":{name:"85°C",icon:"maki-cafe",imageURL:"https://graph.facebook.com/85CBakeryCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644852",amenity:"cafe"},addTags:{alt_name:"85C",amenity:"cafe",brand:"85°C","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop;chinese",name:"85°C",takeaway:"yes"},countryCodes:["au","us"],terms:["85 cafe","85 degrees","85 degrees c","85 degrees celsius","85c bakery cafe","85c daily cafe","85oc"],matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",imageURL:"https://graph.facebook.com/85CBakeryCafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644852",amenity:"cafe"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Aroma Espresso Bar":{name:"Aroma Espresso Bar",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Israel.Aroma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2909872",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"Aroma Espresso Bar",takeaway:"yes"},countryCodes:["ca","kz","ro","ua","us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BaristaCoffeeCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q644735",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"},countryCodes:["in","lk","mv","np"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Beck's Coffe Shop":{name:"Beck's Coffe Shop",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/773289632230322180/YtO0yEVy_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11191008",amenity:"cafe"},addTags:{alt_name:"ベックス・コーヒーショップ",amenity:"cafe",brand:"Beck's Coffe Shop","brand:wikidata":"Q11191008","brand:wikipedia":"ja:Beck's Coffe Shop",cuisine:"coffee_shop",name:"Beck's Coffe Shop",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Biggby Coffee":{name:"Biggby Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BiggbyCoffee.Bhappy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906876",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Biggby Coffee","brand:wikidata":"Q4906876","brand:wikipedia":"en:Biggby Coffee",cuisine:"coffee_shop",name:"Biggby Coffee",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Black Rock Coffee":{name:"Black Rock Coffee",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/705857382715293696/SEQJftR7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64225934",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Black Rock Coffee","brand:wikidata":"Q64225934",cuisine:"coffee_shop",name:"Black Rock Coffee",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Bonafide":{name:"Bonafide",icon:"maki-cafe",imageURL:"https://graph.facebook.com/BonafideArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122746",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"},countryCodes:["ar","cl"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Bridgehead":{name:"Bridgehead",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/1112740662041030656/nX5CaG2O_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4966509",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Bridgehead","brand:wikidata":"Q4966509","brand:wikipedia":"en:Bridgehead Coffee",cuisine:"coffee_shop",name:"Timothy's",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafecoffeeday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017235",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",imageURL:"https://graph.facebook.com/caffenerous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q675808",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"},countryCodes:["gb","ie","tr","us"],terms:["cafe nero"],matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Café Dépôt":{name:"Café Dépôt",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafedepot.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64924449",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Dépôt","brand:wikidata":"Q64924449",cuisine:"coffee_shop;cake;bagel;bistro",name:"Café Dépôt",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CafeMartinezSitioOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16540032",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cariboucoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039494",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16829306",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Chatime","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"Chatime","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/CoCo":{name:"CoCo",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64827025",amenity:"cafe"},addTags:{amenity:"cafe",brand:"CoCo","brand:wikidata":"Q64827025",cuisine:"bubble_tea",name:"Coco",takeaway:"yes"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeFellowsDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461429",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"},countryCodes:["de","lu","nl"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee House (Finland)":{name:"Coffee House (Finland)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/raflaamo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11855430",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Island":{name:"Coffee Island",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeIslandUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60867333",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"},countryCodes:["cy","gr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CoffeeTimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5140932",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cofix":{name:"Cofix",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Cofix.co.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16132717",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cofix","brand:en":"Cofix","brand:he":"קפויקס","brand:wikidata":"Q16132717","brand:wikipedia":"he:קופיקס",cuisine:"coffee_shop",name:"Cofix","name:en":"Cofix","name:he":"קופיקס",takeaway:"yes"},countryCodes:["il","ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cofizz":{name:"Cofizz",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64606270",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cofizz","brand:en":"Cofizz","brand:he":"קופיז","brand:wikidata":"Q64606270",cuisine:"coffee_shop",name:"Cofizz","name:en":"Cofizz","name:he":"קופיז",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",imageURL:"https://graph.facebook.com/costacoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608845",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"},terms:["costa coffee"],matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",imageURL:"https://graph.facebook.com/CountryStyleCDN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177435",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Cộng Cà Phê":{name:"Cộng Cà Phê",icon:"maki-cafe",imageURL:"https://graph.facebook.com/congcaphe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63864181",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"},countryCodes:["kr","vn"],terms:["cong"],matchScore:2,suggestion:true},"amenity/cafe/Dutch Bros. Coffee":{name:"Dutch Bros. Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/dutchbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5317253",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"},countryCodes:["us"],terms:["dutch bros","dutch brothers"],matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",imageURL:"https://graph.facebook.com/EspressoHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10489162",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Fran's Café":{name:"Fran's Café",icon:"maki-cafe",imageURL:"https://graph.facebook.com/franscafeoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075645",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Gong Cha (Vietnam)":{name:"Gong Cha (Vietnam)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{"alt_name:vi":"Cống Trà",amenity:"cafe",brand:"Gong Cha","brand:vi":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"vi:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",name:"Gong Cha","name:vi":"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Gong Cha (worldwide)":{name:"Gong Cha (worldwide)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"en:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["au","bn","ca","mm","mo","my","nz","ph","sg","us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",imageURL:"https://graph.facebook.com/HavannaUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2900869",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"},countryCodes:["ar","pe"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Highlands Coffee":{name:"Highlands Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/highlandscoffeevietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5759361",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"},countryCodes:["vn"],terms:["highlands"],matchScore:2,suggestion:true},"amenity/cafe/Insomnia":{name:"Insomnia",icon:"maki-cafe",imageURL:"https://graph.facebook.com/InsomniaCoffeeCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6038271",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"},countryCodes:["ie"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",imageURL:"https://graph.facebook.com/joeandthejuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26221514",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/La Colombe Coffee Roasters":{name:"La Colombe Coffee Roasters",icon:"maki-cafe",imageURL:"https://graph.facebook.com/lacolombecoffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461663",amenity:"cafe"},addTags:{amenity:"cafe",brand:"La Colombe Coffee Roasters","brand:wikidata":"Q23461663","brand:wikipedia":"en:La Colombe Coffee Roasters",cuisine:"coffee_shop",name:"La Colombe Coffee Roasters",short_name:"La Colombe",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",imageURL:"https://graph.facebook.com/lepainquotidienusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2046903",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Mado":{name:"Mado",icon:"maki-cafe",imageURL:"https://graph.facebook.com/MADOglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17116336",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",imageURL:"https://graph.facebook.com/276517512552782/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3114287",amenity:"cafe"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",imageURL:"https://graph.facebook.com/patisserievalerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22101966",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/peets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094101",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"},countryCodes:["us"],terms:["peets","peets coffee & tea"],matchScore:2,suggestion:true},"amenity/cafe/Prime":{name:"Prime",icon:"maki-cafe",imageURL:"https://graph.facebook.com/PRIMENATURALFOOD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122839",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Pronto":{name:"Pronto",icon:"maki-cafe",imageURL:"https://pbs.twimg.com/profile_images/1002458417733120000/lQc9dDWQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11336224",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"},countryCodes:["jp"],terms:["プロント"],matchScore:2,suggestion:true},"amenity/cafe/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q27825961",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"},countryCodes:["gb"],terms:["pumpkin cafe","pumpkin cafe shop"],matchScore:2,suggestion:true},"amenity/cafe/Quickly":{name:"Quickly",icon:"maki-cafe",imageURL:"https://graph.facebook.com/quicklyphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3771463",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Quickly","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"en:Quickly","brand:zh":"快可立",cuisine:"bubble_tea",name:"Quickly","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SecondCup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q862180",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",imageURL:"https://graph.facebook.com/SegafredoZanettiItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21282762",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Sharetea":{name:"Sharetea",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q64827032",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Sharetea","brand:wikidata":"Q64827032",cuisine:"bubble_tea",name:"Sharetea","name:en":"Sharetea","name:zh":"歇腳亭",takeaway:"yes"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",official_name:"Starbucks Coffee",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",imageURL:"https://graph.facebook.com/thecoffeebean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141384",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",imageURL:"https://graph.facebook.com/tccau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726599",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/The Coffee House (Vietnam)":{name:"The Coffee House (Vietnam)",icon:"maki-cafe",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Coffee%20House%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q60775742",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"},countryCodes:["vn"],terms:["coffee house"],matchScore:2,suggestion:true},"amenity/cafe/The Human Bean":{name:"The Human Bean",icon:"maki-cafe",imageURL:"https://graph.facebook.com/HumanBeanNoCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7740821",amenity:"cafe"},addTags:{amenity:"cafe",brand:"The Human Bean","brand:wikidata":"Q7740821","brand:wikipedia":"en:The Human Bean",cuisine:"coffee_shop",name:"The Human Bean",takeaway:"yes"},countryCodes:["us"],terms:["human bean"],matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TimHortonsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q175106",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Timothy's":{name:"Timothy's",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TimothysCafes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7807011",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Timothy's","brand:wikidata":"Q7807011","brand:wikipedia":"en:Timothy's World Coffee",cuisine:"coffee_shop",name:"Timothy's",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TravelersCoffeeMoscow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4051716",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Trung Nguyên Coffee":{name:"Trung Nguyên Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/trungnguyenlegend/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541154",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"},countryCodes:["vn"],terms:["trung nguyen"],matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",imageURL:"https://graph.facebook.com/WaynesCoffeeInternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2637272",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Wild Bean Cafe":{name:"Wild Bean Cafe",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q61804826",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/cafe/Даблби":{name:"Даблби",icon:"maki-cafe",imageURL:"https://graph.facebook.com/DoubleBCoffeeTea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62501686",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",imageURL:"https://graph.facebook.com/shoko.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30891188",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"},countryCodes:["ru"],terms:["шоколад"],matchScore:2,suggestion:true},"amenity/cafe/Штолле":{name:"Штолле",icon:"maki-cafe",imageURL:"https://graph.facebook.com/stollerussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62502236",amenity:"cafe"},addTags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Israel.Aroma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2909872",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/לנדוור":{name:"לנדוור",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafelandwer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6485288",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה לנדוור","brand:en":"Landwer Coffee","brand:he":"קפה לנדוור","brand:wikidata":"Q6485288","brand:wikipedia":"he:קפה לנדוור",cuisine:"coffee_shop",name:"לנדוור","name:en":"Landwer","name:he":"לנדוור",takeaway:"yes"},countryCodes:["il"],terms:["קפה לדנוור"],matchScore:2,suggestion:true},"amenity/cafe/סי קפה":{name:"סי קפה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/242590255775924/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64606227",amenity:"cafe"},addTags:{alt_name:"סי אספרסו","alt_name:en":"Si Espresso","alt_name:he":"סי אספרסו",amenity:"cafe",brand:"סי קפה","brand:en":"Si Cafe","brand:he":"סי קפה","brand:wikidata":"Q64606227",cuisine:"coffee_shop",name:"סי קפה","name:en":"Si Cafe","name:he":"סי קפה",takeaway:"yes"},countryCodes:["il"],terms:["si cafe","si espresso"],matchScore:2,suggestion:true},"amenity/cafe/קפה ג'ו":{name:"קפה ג'ו",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafejoe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6774425",amenity:"cafe"},addTags:{alt_name:"קפה Joe",amenity:"cafe",brand:"קפה ג'ו","brand:en":"Cafe Joe","brand:he":"קפה ג'ו","brand:wikidata":"Q6774425","brand:wikipedia":"he:קפה ג'ו",cuisine:"coffee_shop",name:"קפה ג'ו","name:en":"Cafe Joe","name:he":"קפה ג'ו",takeaway:"yes"},countryCodes:["il"],terms:["ג'ו קפה"],matchScore:2,suggestion:true},"amenity/cafe/קפה גרג":{name:"קפה גרג",icon:"maki-cafe",imageURL:"https://graph.facebook.com/gregcafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43295499",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה גרג","brand:en":"Greg Cafe","brand:he":"קפה גרג","brand:wikidata":"Q43295499","brand:wikipedia":"he:קפה גרג",cuisine:"coffee_shop",name:"קפה גרג","name:en":"Greg Cafe","name:he":"קפה גרג",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/קפה נמרוד":{name:"קפה נמרוד",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafenimrod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64606192",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה נמרוד","brand:en":"Cafe Nimrod","brand:he":"קפה נמרוד","brand:wikidata":"Q64606192",cuisine:"coffee_shop",name:"קפה נמרוד","name:en":"Cafe Nimrod","name:he":"קפה נמרוד",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/קפה קפה":{name:"קפה קפה",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafe.cafe.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017233",amenity:"cafe"},addTags:{amenity:"cafe",brand:"קפה קפה","brand:en":"Cafe Cafe","brand:he":"קפה קפה","brand:wikidata":"Q5017233","brand:wikipedia":"he:קפה קפה",cuisine:"coffee_shop",name:"קפה קפה","name:en":"Cafe Cafe","name:he":"קפה קפה",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/רולדין":{name:"רולדין",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q18390972",amenity:"cafe"},addTags:{amenity:"cafe",brand:"רולדין","brand:en":"Roladin","brand:he":"רולדין","brand:wikidata":"Q18390972","brand:wikipedia":"he:רולדין",cuisine:"coffee_shop",name:"רולדין","name:en":"Roladin","name:he":"רולדין",takeaway:"yes"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",imageURL:"https://graph.facebook.com/cafeamazonofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43247503",amenity:"cafe"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],tags:{"brand:wikidata":"Q11289828",amenity:"cafe"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/pokkacreate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17219077",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatnoirCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294597",amenity:"cafe"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",imageURL:"https://graph.facebook.com/komeda.coffee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302679",amenity:"cafe"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/saintmarccafephilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11305989",amenity:"cafe"},addTags:{"alt_name:en":"Saint Marc Café",amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",imageURL:"https://graph.facebook.com/TullysCoffeeShops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3541983",amenity:"cafe"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Fun.Doutor.Fan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11322732",amenity:"cafe"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"},countryCodes:["jp"],terms:["ドトールコーヒー"],matchScore:2,suggestion:true},"amenity/cafe/快可立":{name:"快可立",icon:"maki-cafe",imageURL:"https://graph.facebook.com/quicklyphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3771463",amenity:"cafe"},addTags:{amenity:"cafe",brand:"快可立","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"zh:快可立","brand:zh":"快可立",cuisine:"bubble_tea",name:"快可立","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/日出茶太":{name:"日出茶太",icon:"maki-cafe",imageURL:"https://graph.facebook.com/ChatimeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16829306",amenity:"cafe"},addTags:{amenity:"cafe",brand:"日出茶太","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"zh:日出茶太","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"日出茶太","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/珈琲館":{name:"珈琲館",icon:"maki-cafe",imageURL:"https://graph.facebook.com/kohikancorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11573290",amenity:"cafe"},addTags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 Gong Cha":{name:"貢茶 Gong Cha",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶 Gong Cha","brand:en":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)","brand:zh":"貢茶",cuisine:"bubble_tea",name:"貢茶 Gong Cha","name:en":"Gong Cha","name:zh":"貢茶",takeaway:"yes"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 (Japan)":{name:"貢茶 (Japan)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶","brand:ja":"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"ja:貢茶","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:ja":"貢茶","name:zh":"貢茶",takeaway:"yes"},countryCodes:["ja"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/貢茶 (Taiwan)":{name:"貢茶 (Taiwan)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:zh":"貢茶",takeaway:"yes"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/贡茶 (China)":{name:"贡茶 (China)",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"贡茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:贡茶 (连锁店)","brand:zh-Hans":"贡茶","brand:zh-Hant":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"贡茶","name:zh-Hans":"贡茶","name:zh-Hant":"貢茶",takeaway:"yes"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/공차":{name:"공차",icon:"maki-cafe",imageURL:"https://graph.facebook.com/GongChaTaiwan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5581670",amenity:"cafe"},addTags:{amenity:"cafe",brand:"공차","brand:ko":"공차","brand:wikidata":"Q5581670","brand:wikipedia":"ko:공차","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"공차","name:ko":"공차","name:zh":"貢茶",takeaway:"yes"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",imageURL:"https://graph.facebook.com/Starbucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37158",amenity:"cafe"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/AlamoRentACar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1429287",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/avis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q791136",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"},terms:["avis car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Budget/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001437",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget",official_name:"Budget Rent a Car"},terms:["budget car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/DollarCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1235661",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar",official_name:"Dollar Rent A Car"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/Enterprise/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17085454",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise",official_name:"Enterprise Rent-A-Car"},terms:["enterprise car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/europcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1376256",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/hertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1543874",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},terms:["hertz car rental"],matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/localizahertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10319490",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/National":{name:"National",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/NationalCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1424142",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"National","brand:wikidata":"Q1424142","brand:wikipedia":"en:National Car Rental",name:"National",official_name:"National Car Rental"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/sixt.rentacar.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q705664",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/ThriftyCarRental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2429546",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},terms:["thrifty car rental"],matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/uhaul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7862902",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},countryCodes:["ca","us"],terms:["uhaul neighborhood dealer"],matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/227957351080226/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11123021",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/rentacarjapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11321580",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"},countryCodes:["jp"],terms:["トヨタレンタリース"],matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/115494788561573/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11086533",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",imageURL:"https://graph.facebook.com/231926140196841/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11086838",amenity:"car_rental"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/Bluely":{name:"Bluely",icon:"maki-car",imageURL:"https://graph.facebook.com/bluely.eu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16039715",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"},countryCodes:["fr"],terms:["station bluely"],matchScore:2,suggestion:true},"amenity/car_sharing/Enterprise Car Club":{name:"Enterprise Car Club",icon:"maki-car",imageURL:"https://graph.facebook.com/EnterpriseCarClub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123055",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"},countryCodes:["gb"],terms:["city car club"],matchScore:2,suggestion:true},"amenity/car_sharing/Greenwheels":{name:"Greenwheels",icon:"maki-car",imageURL:"https://graph.facebook.com/Greenwheels.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q316782",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Greenwheels","brand:wikidata":"Q316782","brand:wikipedia":"en:Greenwheels",name:"Greenwheels"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/Zipcar":{name:"Zipcar",icon:"maki-car",imageURL:"https://graph.facebook.com/zipcar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1069924",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"},terms:[],matchScore:2,suggestion:true},"amenity/car_sharing/stadtmobil":{name:"stadtmobil",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FStadtmobil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2327629",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"},countryCodes:["de"],terms:["stadtmobil carsharing-station"],matchScore:2,suggestion:true},"amenity/car_sharing/teilAuto":{name:"teilAuto",icon:"maki-car",imageURL:"https://graph.facebook.com/teilauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2400658",amenity:"car_sharing"},addTags:{amenity:"car_sharing",brand:"teilAuto","brand:wikidata":"Q2400658","brand:wikipedia":"de:TeilAuto",name:"teilAuto"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Blink":{name:"Blink",icon:"fas-charging-station",imageURL:"https://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",geometry:["point"],tags:{"brand:wikidata":"Q62065645",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/ChargePoint/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q5176149",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Circuit électrique":{name:"Circuit électrique",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/lecircuitelectrique/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q64969699",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Circuit électrique","brand:wikidata":"Q64969699",name:"Circuit électrique"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/E-WALD":{name:"E-WALD",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/E.WALD.emobility/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q61804335",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"},countryCodes:["de"],terms:["e-wald ladestation"],matchScore:2,suggestion:true},"amenity/charging_station/Enel":{name:"Enel",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/enelsharing/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q651222",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"},countryCodes:["it"],terms:["enel - stazione di ricarica"],matchScore:2,suggestion:true},"amenity/charging_station/FLO":{name:"FLO",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/flonetwork/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q64971203",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"FLO","brand:wikidata":"Q64971203",name:"FLO"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Source London":{name:"Source London",icon:"fas-charging-station",imageURL:"https://graph.facebook.com/SourceLondon/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7565133",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Source London","brand:wikidata":"Q7565133","brand:wikipedia":"en:Source London",name:"Source London"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point"],tags:{"brand:wikidata":"Q17089620",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},terms:[],matchScore:2,suggestion:true},"amenity/charging_station/eVgo":{name:"eVgo",icon:"fas-charging-station",imageURL:"https://pbs.twimg.com/profile_images/1072541771777888256/E1Ma7jGm_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q61803820",amenity:"charging_station"},addTags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/childcare/Kids 'R' Kids":{name:"Kids 'R' Kids",icon:"fas-child",imageURL:"https://graph.facebook.com/kidsrkidscorporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65560342",amenity:"childcare"},addTags:{after_school:"yes",amenity:"childcare",brand:"Kids 'R' Kids","brand:wikidata":"Q65560342",grades:"PK",name:"Kids 'R' Kids",nursery:"yes",official_name:"Kids 'R' Kids Learning Academies",preschool:"yes"},countryCodes:["us"],terms:["kids are kids"],matchScore:2,suggestion:true},"amenity/childcare/YMCA Child Care":{name:"YMCA Child Care",icon:"fas-child",imageURL:"https://graph.facebook.com/YMCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157169",amenity:"childcare"},addTags:{amenity:"childcare",brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",name:"YMCA Child Care"},countryCodes:["us"],terms:["ymca","ymca child care center"],matchScore:2,suggestion:true},"amenity/cinema/109シネマズ":{name:"109シネマズ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/438297009664571/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10854269",amenity:"cinema"},addTags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/AMC":{name:"AMC",icon:"maki-cinema",imageURL:"https://graph.facebook.com/amctheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q294721",amenity:"cinema"},addTags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"},countryCodes:["us"],terms:["amc cinema","amc cinemas","amc theater","amc theaters","amc theatre","amc theatres"],matchScore:2,suggestion:true},"amenity/cinema/B&B Theatres":{name:"B&B Theatres",icon:"maki-cinema",imageURL:"https://pbs.twimg.com/profile_images/796752289859969025/6La-tnNc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4833576",amenity:"cinema"},addTags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q4833576","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"},countryCodes:["us"],terms:["b&b theaters"],matchScore:2,suggestion:true},"amenity/cinema/Caribbean Cinemas":{name:"Caribbean Cinemas",icon:"maki-cinema",imageURL:"https://graph.facebook.com/caribbeancinemas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039364",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Caribbean Cinemas","brand:wikidata":"Q5039364","brand:wikipedia":"en:Caribbean Cinemas",name:"Caribbean Cinemas"},countryCodes:["ag","do","fr","gy","kn","lc","nl","pa","tt","us"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Century Theatres":{name:"Century Theatres",icon:"maki-cinema",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCentury%20Theater.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2946307",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Century Theatres","brand:wikidata":"Q2946307","brand:wikipedia":"en:Century Theatres",name:"Century Theatres",short_name:"Century"},countryCodes:["us"],terms:["century theater","century theaters","century theatre"],matchScore:2,suggestion:true},"amenity/cinema/CineStar":{name:"CineStar",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CineStarDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q321889",amenity:"cinema"},addTags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",imageURL:"https://graph.facebook.com/CinemaCityPoland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q543651",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},countryCodes:["cz","hu","pl","ro"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemarkoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707530",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemaxx (Europe)":{name:"Cinemaxx (Europe)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q881860",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q881860","brand:wikipedia":"de:CinemaxX",name:"Cinemaxx"},countryCodes:["de","dk"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemaxx (Indonesia)":{name:"Cinemaxx (Indonesia)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinemaxxtheater/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19942740",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q19942740","brand:wikipedia":"id:Cinemaxx",name:"Cinemaxx"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",imageURL:"https://graph.facebook.com/Cinemex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3333072",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplanet":{name:"Cineplanet",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineplanet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5769680",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineplexx":{name:"Cineplexx",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineplexxAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q873340",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cinepolisbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5686673",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},terms:[],matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",imageURL:"https://graph.facebook.com/cineworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5120901",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Event":{name:"Event",icon:"maki-cinema",imageURL:"https://graph.facebook.com/EventCinemas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5416698",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Event","brand:wikidata":"Q5416698","brand:wikipedia":"en:Event Cinemas",name:"Event",official_name:"Event Cinemas"},countryCodes:["au","nz"],terms:["event cinema"],matchScore:2,suggestion:true},"amenity/cinema/Harkins Theatres":{name:"Harkins Theatres",icon:"maki-cinema",imageURL:"https://graph.facebook.com/harkinstheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5658199",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Harkins Theatres","brand:wikidata":"Q5658199","brand:wikipedia":"en:Harkins Theatres",name:"Harkins Theatres",short_name:"Harkins"},countryCodes:["us"],terms:["harkins theater","harkins theaters","harkins theatre"],matchScore:2,suggestion:true},"amenity/cinema/Hoyts":{name:"Hoyts",icon:"maki-cinema",imageURL:"https://graph.facebook.com/hoytsaustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5922976",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Hoyts","brand:wikidata":"Q5922976","brand:wikipedia":"en:Hoyts",name:"Hoyts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Landmark Theatres":{name:"Landmark Theatres",icon:"maki-cinema",imageURL:"https://graph.facebook.com/LandmarkTheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6484805",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Landmark Theatres","brand:wikidata":"Q6484805","brand:wikipedia":"en:Landmark Theatres",name:"Landmark Theatres",short_name:"Landmark"},countryCodes:["us"],terms:["landmark theater","landmark theaters","landmark theatre"],matchScore:2,suggestion:true},"amenity/cinema/MOVIX":{name:"MOVIX",icon:"maki-cinema",geometry:["point","area"],tags:{"brand:wikidata":"Q11532184",amenity:"cinema"},addTags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Marcus Cinema":{name:"Marcus Cinema",icon:"maki-cinema",imageURL:"https://graph.facebook.com/marcustheatres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64083352",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Marcus Cinema","brand:wikidata":"Q64083352",name:"Marcus Cinema",short_name:"Marcus"},countryCodes:["us"],terms:["marcus cinemas","marcus theater","marcus theaters","marcus theatre","marcus theatres"],matchScore:2,suggestion:true},"amenity/cinema/Movie Tavern":{name:"Movie Tavern",icon:"maki-cinema",imageURL:"https://graph.facebook.com/movietavern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64083534",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Movie Tavern","brand:wikidata":"Q64083534",name:"Movie Tavern"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Multikino":{name:"Multikino",icon:"maki-cinema",imageURL:"https://graph.facebook.com/MultikinoPolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1144802",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"},countryCodes:["lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",imageURL:"https://graph.facebook.com/ODEON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6127470",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},countryCodes:["gb","gr","ie","it"],terms:["odeon cinema"],matchScore:2,suggestion:true},"amenity/cinema/Regal Cinemas":{name:"Regal Cinemas",icon:"maki-cinema",imageURL:"https://graph.facebook.com/RegalMovies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q835638",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Regal Cinemas","brand:wikidata":"Q835638","brand:wikipedia":"en:Regal Cinemas",name:"Regal Cinemas",short_name:"Regal"},countryCodes:["us"],terms:["regal cinema"],matchScore:2,suggestion:true},"amenity/cinema/Showcase Cinemas":{name:"Showcase Cinemas",icon:"maki-cinema",imageURL:"https://graph.facebook.com/ShowcaseUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7503170",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Showcase Cinemas","brand:wikidata":"Q7503170","brand:wikipedia":"en:Showcase Cinemas",name:"Showcase Cinemas",short_name:"Showcase"},countryCodes:["ar","gb","us"],terms:["showcase cinema"],matchScore:2,suggestion:true},"amenity/cinema/TOHOシネマズ":{name:"TOHOシネマズ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/tohocinemasmagagine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11235261",amenity:"cinema"},addTags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",short_name:"TOHO"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/The Space Cinema":{name:"The Space Cinema",icon:"maki-cinema",imageURL:"https://graph.facebook.com/TheSpaceCinema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3989406",amenity:"cinema"},addTags:{amenity:"cinema",brand:"The Space Cinema","brand:wikidata":"Q3989406","brand:wikipedia":"it:The Space Cinema",name:"The Space Cinema"},countryCodes:["it"],terms:["the space"],matchScore:2,suggestion:true},"amenity/cinema/Vue (IrelandAndUK)":{name:"Vue (IrelandAndUK)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/VueCinemas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2535134",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"},countryCodes:["gb","ie"],terms:["vue cinema","vue cinemas"],matchScore:2,suggestion:true},"amenity/cinema/Vue (Netherlands)":{name:"Vue (Netherlands)",icon:"maki-cinema",imageURL:"https://graph.facebook.com/vuecinemasnl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2421690",amenity:"cinema"},addTags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2421690","brand:wikipedia":"nl:Vue (bioscoopketen)",name:"Vue"},countryCodes:["nl"],terms:["vue cinema"],matchScore:2,suggestion:true},"amenity/cinema/イオンシネマ":{name:"イオンシネマ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/aeoncinema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17192792",amenity:"cinema"},addTags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/cinema/ユナイテッド・シネマ":{name:"ユナイテッド・シネマ",icon:"maki-cinema",imageURL:"https://graph.facebook.com/unitedcinemasgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11345629",amenity:"cinema"},addTags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/CityMD":{name:"CityMD",icon:"maki-doctor",imageURL:"https://graph.facebook.com/CityMD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22295471",amenity:"clinic"},addTags:{amenity:"clinic",brand:"CityMD","brand:wikidata":"Q22295471","brand:wikipedia":"en:CityMD",healthcare:"clinic",name:"CityMD"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/DaVita Dialysis":{name:"DaVita Dialysis",icon:"maki-doctor",imageURL:"https://graph.facebook.com/davitakidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5207184",amenity:"clinic"},addTags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["davita","davita kidney care"],matchScore:2,suggestion:true},"amenity/clinic/Dialysis Clinic":{name:"Dialysis Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/DialysisClinicInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5270633",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5270633","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["dialysis clinic inc"],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Kidney Care":{name:"Fresenius Kidney Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Fresenius Medical Care":{name:"Fresenius Medical Care",icon:"maki-doctor",imageURL:"https://graph.facebook.com/freseniuskidneycare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650259",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Planned Parenthood":{name:"Planned Parenthood",icon:"maki-doctor",imageURL:"https://graph.facebook.com/PlannedParenthood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2553262",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Planned Parenthood","brand:wikidata":"Q2553262",healthcare:"counselling","healthcare:counselling":"antenatal;sexual",name:"Planned Parenthood"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/Satellite Healthcare":{name:"Satellite Healthcare",icon:"maki-doctor",imageURL:"https://graph.facebook.com/satellitehealthcare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50039787",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["satellite","satellite dialysis"],matchScore:2,suggestion:true},"amenity/clinic/Terveystalo":{name:"Terveystalo",icon:"maki-doctor",imageURL:"https://graph.facebook.com/Terveystalo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11897034",amenity:"clinic"},addTags:{amenity:"clinic",brand:"Terveystalo","brand:wikidata":"Q11897034","brand:wikipedia":"fi:Terveystalo",healthcare:"clinic",name:"Terveystalo"},reference:{key:"amenity",value:"clinic"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/VA Clinic":{name:"VA Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/VeteransHealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6580225",amenity:"clinic"},addTags:{amenity:"clinic",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"clinic","healthcare:for":"veterans",name:"VA Clinic",short_name:"VA"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:["department of veterans affairs clinic","veterans administration","veterans administration clinic","veterans affairs","veterans affairs clinic"],matchScore:2,suggestion:true},"amenity/dentist/Aspen Dental":{name:"Aspen Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/AspenDental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807808",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Comfort Dental":{name:"Comfort Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/comfortdental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22079521",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Comfort Dental","brand:wikidata":"Q22079521","brand:wikipedia":"en:Comfort Dental",healthcare:"dentist",name:"Comfort Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Kool Smiles":{name:"Kool Smiles",icon:"maki-dentist",imageURL:"https://graph.facebook.com/MyKoolSmiles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6430587",amenity:"dentist"},addTags:{amenity:"dentist",brand:"Kool Smiles","brand:wikidata":"Q6430587","brand:wikipedia":"en:Kool Smiles",healthcare:"dentist",name:"Kool Smiles"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/dentist/Western Dental":{name:"Western Dental",icon:"maki-dentist",imageURL:"https://graph.facebook.com/WesternDental/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64211989",amenity:"dentist"},addTags:{alt_name:"Western Dental & Orthodontics",amenity:"dentist",brand:"Western Dental","brand:wikidata":"Q64211989","brand:wikipedia":"en:Western Dental",healthcare:"dentist",name:"Western Dental"},reference:{key:"amenity",value:"dentist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/doctors/MinuteClinic":{name:"MinuteClinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/minuteclinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6871141",amenity:"doctors"},addTags:{amenity:"doctors",brand:"MinuteClinic","brand:wikidata":"Q6871141","brand:wikipedia":"en:MinuteClinic",healthcare:"doctor","healthcare:speciality":"community",name:"MinuteClinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/doctors/RediClinic":{name:"RediClinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/RediClinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64138408",amenity:"doctors"},addTags:{amenity:"doctors",brand:"RediClinic","brand:wikidata":"Q64138408",healthcare:"doctor","healthcare:speciality":"community",name:"RediClinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/doctors/The Little Clinic":{name:"The Little Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/thelittleclinic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64138262",amenity:"doctors"},addTags:{amenity:"doctors",brand:"The Little Clinic","brand:wikidata":"Q64138262",healthcare:"doctor","healthcare:speciality":"community",name:"The Little Clinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:["little clinic"],matchScore:2,suggestion:true},"amenity/doctors/Walgreens Healthcare Clinic":{name:"Walgreens Healthcare Clinic",icon:"maki-doctor",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",amenity:"doctors"},addTags:{amenity:"doctors",brand:"Walgreens","brand:wikidata":"Q1591889",healthcare:"doctor","healthcare:speciality":"community",name:"Walgreens Healthcare Clinic"},reference:{key:"amenity",value:"doctors"},countryCodes:["us"],terms:["healthcare clinic","takecare","takecare clinic","walgreens"],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/405801939456462/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818848",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/awrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q277641",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Andok's":{name:"Andok's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/andokslitsonmanok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267166",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Angel's Burger":{name:"Angel's Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/angburgerngbayan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62267228",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/arbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q630866",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","tr","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Au Bon Pain":{name:"Au Bon Pain",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/aubonpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818942",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["in","th","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/auntieannespretzels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4822010",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"},countryCodes:["us"],terms:["auntie annes pretzels"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Back Yard Burgers":{name:"Back Yard Burgers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/backyardburgers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2878376",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Back Yard Burgers","brand:wikidata":"Q2878376","brand:wikipedia":"en:Back Yard Burgers",cuisine:"burger",name:"Back Yard Burgers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Baja Fresh":{name:"Baja Fresh",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/bajafresh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2880019",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Barburrito":{name:"Barburrito",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/BarburritoUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16983668",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Barburrito","brand:wikidata":"Q16983668","brand:wikipedia":"en:Barburrito",cuisine:"mexican",name:"Barburrito",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bembos":{name:"Bembos",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bembos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466971",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Blimpie":{name:"Blimpie",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/Blimpie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4926479",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Blimpie","brand:wikidata":"Q4926479","brand:wikipedia":"en:Blimpie",cuisine:"sandwich",name:"Blimpie",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/bobsbrasil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1392113",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ao","br","cl","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Bojangles1977/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q891163",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/boosterjuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943796",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BostonMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q603617",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Braum's":{name:"Braum's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BraumsIceCreamandDairyStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4958263",amenity:"fast_food",cuisine:"ice_cream"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Bruegger's Bagels":{name:"Bruegger's Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Brueggers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4978656",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",short_name:"Bruegger's",takeaway:"yes"},countryCodes:["us"],terms:["breuger's","breugger's","bruger's","brugger's"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["burguer king"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgermachineofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4998549",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BurgerFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39045496",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgerim":{name:"Burgerim",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/iBurgerim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760354",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgerim","brand:en":"Burgerim","brand:he":"בורגרים","brand:wikidata":"Q64760354",cuisine:"burger",name:"Burgerim","name:en":"Burgerim","name:he":"בורגרים",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgers Bar":{name:"Burgers Bar",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/BurgersBarIL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760337",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgers Bar","brand:en":"Burgers Bar","brand:he":"בורגרס בר","brand:wikidata":"Q64760337",cuisine:"burger","diet:kosher":"yes",name:"Burgers Bar","name:en":"Burgers Bar","name:he":"בורגרס בר",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Burgerville":{name:"Burgerville",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/burgerville/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4998570",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Burgerville","brand:wikidata":"Q4998570","brand:wikipedia":"en:Burgerville",cuisine:"burger",name:"Burgerville",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CaptainDs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5036616",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/carlsjr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1043486",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Charleys Philly Steaks":{name:"Charleys Philly Steaks",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/CharleysPhillySteaks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1066777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["charleys"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/checkersrallys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63919315",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chester's":{name:"Chester's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/ChestersIntl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5093401",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chester's","brand:wikidata":"Q5093401","brand:wikipedia":"en:Chester's International",cuisine:"chicken",name:"Chester's",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:["chesters chicken"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/ChickfilA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q491516",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/chickenexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5096235",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/China Wok":{name:"China Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ChinaWokPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5766542",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Chipotle":{name:"Chipotle",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/chipotle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q465751",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Chopt":{name:"Chopt",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/choptsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17509305",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/chowkingph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1076816",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/churchschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1089932",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cinnabon":{name:"Cinnabon",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Cinnabon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1092539",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/cocoichicurry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5986105",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"CoCo Ichibanya","brand:ja":"CoCo壱番屋","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"CoCo Ichibanya","name:ja":"CoCo壱番屋",takeaway:"yes"},countryCodes:["cn","jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/CookOut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5166992",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Così":{name:"Così",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/getcosi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175243",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Così","brand:wikidata":"Q5175243","brand:wikipedia":"en:Così (restaurant)",cuisine:"sandwich",name:"Così",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Cultures":{name:"Cultures",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/culturesrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64876898",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Cultures","brand:wikidata":"Q64876898",cuisine:"sandwich",name:"Cultures",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Culver's":{name:"Culver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/culvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143589",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/DQ Grill & Chill":{name:"DQ Grill & Chill",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Dairy Queen":{name:"Dairy Queen",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/dairyqueen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141226",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},terms:["dq"],matchScore:2,suggestion:true},"amenity/fast_food/donut/Daylight Donuts":{name:"Daylight Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DaylightDonutFlourCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48970508",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Del Taco":{name:"Del Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/deltaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183818",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Dig Inn":{name:"Dig Inn",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/diginnmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28226241",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",short_name:"Domino's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"temaki-donut",imageURL:"https://graph.facebook.com/DunkinUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q847743",amenity:"fast_food",cuisine:"donut;coffee"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:["dunkin doughnuts"],matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/einsteinbros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5349788",amenity:"fast_food"},addTags:{alt_name:"Einstein Brothers Bagels",amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"},countryCodes:["us"],terms:["einstein bros","einstein brothers"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/El Pollo Loco":{name:"El Pollo Loco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ElPolloLoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2353849",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Everest":{name:"Everest",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/everest.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273299",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TheExtremePita/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422367",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Fazolis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1399195",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/firehousesubs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5451873",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fiveguys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1131810",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ice_cream/Freddy's":{name:"Freddy's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddysUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5496837",amenity:"fast_food",cuisine:"ice_cream;burger"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",official_name:"Freddys Frozen Custard & Steakburgers",takeaway:"yes"},reference:{key:"cuisine",value:"ice_cream"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Freebirds":{name:"Freebirds",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/freebirdsworldburrito/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5500367",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gabriel Pizza":{name:"Gabriel Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/gabrielpizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5515791",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gino's Pizza":{name:"Gino's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://pbs.twimg.com/profile_images/1240550288/TwitterProfile_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5563205",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Gino's Pizza","brand:wikidata":"Q5563205","brand:wikipedia":"en:Gino's Pizza and Spaghetti",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Gold Star Chili":{name:"Gold Star Chili",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/goldstarchili/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16994254",amenity:"fast_food"},addTags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Golden Krust Caribbean Bakery & Grill":{name:"Golden Krust Caribbean Bakery & Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/GoldenKrust/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5579615",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Great American Cookies":{name:"Great American Cookies",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/greatamericancookies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598629",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Great American Cookies","brand:wikidata":"Q5598629","brand:wikipedia":"en:Great American Cookies",cuisine:"cookies",name:"Great American Cookies",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/GreenwichPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2691308",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habibsoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2504930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"},countryCodes:["br","mx"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Hallo.Pizza.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571798",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hardees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585088",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HarveysCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1466184",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Herfy":{name:"Herfy",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/herfyfscksa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5738371",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Herfy","brand:ar":"هرفي","brand:en":"Herfy","brand:wikidata":"Q5738371","brand:wikipedia":"en:Herfy",cuisine:"burger",name:"Herfy","name:ar":"هرفي","name:en":"Herfy",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ae","bd","bh","kw","sa"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hesburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1276832",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Hot Dog on a Stick":{name:"Hot Dog on a Stick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HotDogonaStick/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5909922",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Hot Head Burritos":{name:"Hot Head Burritos",icon:"fas-pepper-hot",imageURL:"https://pbs.twimg.com/profile_images/956274820035022853/SBuliAdo_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5910008",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",short_name:"Hot Head",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hungry Howie's":{name:"Hungry Howie's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/hungryhowies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16985303",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["hungry howies pizza"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/HungryJacks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3036373",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInNOut.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1205312",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jackinthebox/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538507",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jambajuice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088784",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/jerseymikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6184897",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",short_name:"Jersey Mike's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/jimmyjohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1689380",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Jimmy the Greek":{name:"Jimmy the Greek",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/gimmejimmy.jtg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17077817",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Jimmy the Greek","brand:wikidata":"Q17077817","brand:wikipedia":"en:Jimmy the Greek (restaurant)",cuisine:"greek",name:"Jimmy the Greek",takeaway:"yes"},countryCodes:["ae","ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/JollibeePhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q37614",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Just Salad":{name:"Just Salad",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/justsalad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23091823",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{alt_name:"Kentucky Fried Chicken",amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Kernels Popcorn":{name:"Kernels Popcorn",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/kernelspopcorn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64876684",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Kernels Popcorn","brand:wikidata":"Q64876684",cuisine:"popcorn",name:"Kernels Popcorn",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kochloeffel.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q315539",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["de","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/kotipizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1628625",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/Krispy Kreme":{name:"Krispy Kreme",icon:"temaki-donut",imageURL:"https://graph.facebook.com/KrispyKreme/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1192805",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},terms:["krispy kreme doughnuts"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Krystal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q472195",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/L&L Drive-Inn (Hawaii)":{name:"L&L Drive-Inn (Hawaii)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"},countryCodes:["us"],terms:["l&l","l&l drive-in"],matchScore:2,suggestion:true},"amenity/fast_food/L&L Hawaiian Barbecue":{name:"L&L Hawaiian Barbecue",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hawaiianbarbecue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6455441",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"},countryCodes:["us"],terms:["l&l","l&l hawaiian bbq"],matchScore:2,suggestion:true},"amenity/fast_food/burger/La Belle Province":{name:"La Belle Province",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/restolbp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3206579",amenity:"fast_food",cuisine:"burger;sandwich"},addTags:{amenity:"fast_food",brand:"La Belle Province","brand:wikidata":"Q3206579","brand:wikipedia":"fr:La Belle Province (restaurant)",cuisine:"burger;sandwich",name:"La Belle Province",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Lee's Sandwiches":{name:"Lee's Sandwiches",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/LeesSandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6512823",amenity:"fast_food",cuisine:"vietnamese;sandwich"},addTags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LittleCaesars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1393809",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["little caesars pizza","little ceasars","little ceasars pizza"],matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/LongJohnSilvers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1535221",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MODPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19903469",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Manchu Wok":{name:"Manchu Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ManchuWOKRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6747622",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MangInasalPhilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6748573",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Manhattan Bagel":{name:"Manhattan Bagel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ManhattanBagel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64517333",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Manhattan Bagel","brand:wikidata":"Q64517333",cuisine:"bagel",name:"Manhattan Bagel",takeaway:"yes"},countryCodes:["us"],terms:["manhattan bagels"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Max":{name:"Max",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/maxburgers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1912172",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Meson Sandwiches":{name:"Meson Sandwiches",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/elmesonsandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5351585",amenity:"fast_food",cuisine:"sandwich"},addTags:{alt_name:"El Meson Sandwiches",amenity:"fast_food",brand:"Meson Sandwiches","brand:wikidata":"Q5351585","brand:wikipedia":"en:El Meson Sandwiches",cuisine:"sandwich",name:"Meson Sandwiches",short_name:"Meson",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["el meson"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Mighty Taco":{name:"Mighty Taco",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MyMightyTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6844210",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Minute Burger":{name:"Minute Burger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/MinuteBurger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273503",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MoesSouthwestGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6889938",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",short_name:"Moe's",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/mrsub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6929225",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Mucho Burrito":{name:"Mucho Burrito",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/MuchoBurritoHQ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65148332",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Mucho Burrito","brand:wikidata":"Q65148332",cuisine:"mexican",name:"Mucho Burrito",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/New York Fries":{name:"New York Fries",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NewYorkFries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7013558",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"New York Fries","brand:wikidata":"Q7013558","brand:wikipedia":"en:New York Fries",cuisine:"fries",name:"New York Fries",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/newyorkpizza.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2639128",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Noah's Bagels":{name:"Noah's Bagels",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NoahsBagels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64517373",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Noah's Bagels","brand:wikidata":"Q64517373",cuisine:"bagel",name:"Noah's Bagels",official_name:"Noah's New York Bagels",takeaway:"yes"},countryCodes:["us"],terms:["noahs ny bagels"],matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NORDSEEDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q74866",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Num Pang":{name:"Num Pang",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/NumPangKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62079702",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/O'Tacos":{name:"O'Tacos",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/Otacos.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28494040",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Oporto":{name:"Oporto",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Oportos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4412342",amenity:"fast_food",cuisine:"burger;chicken"},addTags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",cuisine:"burger;chicken",name:"Oporto",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Orange Julius":{name:"Orange Julius",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/OrangeJulius/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3355059",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Orange Julius","brand:wikidata":"Q3355059","brand:wikipedia":"en:Orange Julius",cuisine:"juice",name:"Orange Julius",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Palsweb/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7126094",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",official_name:"Pal's Sudden Service",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/panago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111672",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PandaExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1358690",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"},terms:["panda"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Panera Bread":{name:"Panera Bread",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/panerabread/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7130852",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",short_name:"Panera",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["papa john","papa john pizza","papa johns pizza"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papamurphyspizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132349",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:["papa murphy","papa murphy pizza","papa murphys pizza"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Penn Station":{name:"Penn Station",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/pennstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7163311",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/PhillyPretzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60097339",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"},countryCodes:["us"],terms:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pinulito":{name:"Pinulito",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/elsabordenuestragente/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273613",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/pitapitusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7757289",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaNova/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199971",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaPizzaCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1194143",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Schmizza":{name:"Pizza Schmizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/schmizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199979",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Pizza Schmizza","brand:wikidata":"Q7199979","brand:wikipedia":"en:Pizza Schmizza",cuisine:"pizza",name:"Pizza Schmizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/CamperoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q942741",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Costa Rica)":{name:"Pollo Granjero (Costa Rica)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273665",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Granjero (Guatemala)":{name:"Pollo Granjero (Guatemala)",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloGranjeroGuatemala/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273652",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["gt"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Tropical":{name:"Pollo Tropical",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PolloTropical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3395356",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeyes":{name:"Popeyes",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/PopeyesLouisianaKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1330910",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/potbellysandwichshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7234777",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",official_name:"Potbelly Sandwich Works",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["potbelly sandwich shop"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Pret A Manger":{name:"Pret A Manger",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/pretamangerusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2109109",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Pretzelmaker":{name:"Pretzelmaker",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/pretzelmaker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242321",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Pretzelmaker","brand:wikidata":"Q7242321","brand:wikipedia":"en:Pretzelmaker",cuisine:"pretzel",name:"Pretzelmaker",takeaway:"yes"},countryCodes:["us"],terms:["pretzel time"],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Qdoba":{name:"Qdoba",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/qdoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1363885",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Quick":{name:"Quick",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/QuickBelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q286494",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/Quiznos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1936229",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["quiznos sub","quiznos subs"],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RaisingCanesChickenFingers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7285144",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/checkersrallys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63919323",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/RedRoosterAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376466",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Roy Rogers":{name:"Roy Rogers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/RoyRogersRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7373311",amenity:"fast_food",cuisine:"burger;sandwich;chicken"},addTags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Rubio's":{name:"Rubio's",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/rubios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7376154",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Rubio's","brand:wikidata":"Q7376154","brand:wikipedia":"en:Rubio's Coastal Grill",cuisine:"mexican",name:"Rubio's",official_name:"Rubio's Coastal Grill",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:["rubios fresh mexican grill"],matchScore:2,suggestion:true},"amenity/fast_food/burger/SUSU & Sons":{name:"SUSU & Sons",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/susuandsons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760081",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"SUSU & Sons","brand:en":"SUSU & Sons","brand:he":"סוסו אנד סאנס","brand:wikidata":"Q64760081",cuisine:"burger",name:"SUSU & Sons","name:en":"SUSU & Sons","name:he":"סוסו אנד סאנס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:["סוסו ובניו"],matchScore:2,suggestion:true},"amenity/fast_food/Sarku Japan":{name:"Sarku Japan",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/SarkuJapanColombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7424243",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Sarku Japan","brand:wikidata":"Q7424243",cuisine:"japanese",name:"Sarku Japan",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Sbarro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589409",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:["Sbarro Pizzeria"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/Schlotzskys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2244796",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:["schlotzskys deli"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/shakeshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1058722",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sibyllasverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q488643",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/smashburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17061332",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/SmoothieKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5491421",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sonicdrivein/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7561808",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",drive_in:"yes",name:"Sonic",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:["sonic drive in"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Specialty's":{name:"Specialty's",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/specialtys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64339210",amenity:"fast_food",cuisine:"sandwich;bakery"},addTags:{amenity:"fast_food",brand:"Specialty's","brand:wikidata":"Q64339210",cuisine:"sandwich;bakery",name:"Specialty's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/St-Hubert Express":{name:"St-Hubert Express",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/sthubert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3495225",amenity:"fast_food",cuisine:"chicken;barbecue"},addTags:{amenity:"fast_food",brand:"St-Hubert","brand:wikidata":"Q3495225","brand:wikipedia":"en:St-Hubert",cuisine:"chicken;barbecue",name:"St-Hubert Express",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Steak Escape":{name:"Steak Escape",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/steakescape/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605235",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/OfficialSteers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56599145",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},terms:["subway sandwiches"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/supermacsofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643750",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Sushi Shop":{name:"Sushi Shop",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sushishopboutique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64840990",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Sushi Shop","brand:wikidata":"Q64840990",cuisine:"sushi",name:"Sushi Shop",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/TCBY":{name:"TCBY",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tcby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7669631",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tacobell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q752941",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Bueno":{name:"Taco Bueno",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/buenoheadquarters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673958",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Cabana":{name:"Taco Cabana",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/TacoCabana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12070488",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Del Mar":{name:"Taco Del Mar",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacodelmarcorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673972",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco John's":{name:"Taco John's",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacojohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673962",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Time":{name:"Taco Time",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/tacotime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7673969",amenity:"fast_food",cuisine:"mexican"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"},reference:{key:"cuisine",value:"mexican"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Ted's Hot Dogs":{name:"Ted's Hot Dogs",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TedsHotDogs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7692930",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Ted's Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted's Hot Dogs",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/telepizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2699863",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Teriyaki Experience":{name:"Teriyaki Experience",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TeriyakiExperience/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7702453",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Teriyaki Experience","brand:wikidata":"Q7702453",cuisine:"japanese",name:"Teriyaki Experience",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thai Express (Singapore)":{name:"Thai Express (Singapore)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ThaiExpressSG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7709119",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"},countryCodes:["sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Thaï Express (North America)":{name:"Thaï Express (North America)",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/EatThaiExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7711610",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"},countryCodes:["ca","us"],terms:["thai express"],matchScore:2,suggestion:true},"amenity/fast_food/burger/The Habit Burger Grill":{name:"The Habit Burger Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/habitburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18158741",amenity:"fast_food",cuisine:"burger"},addTags:{alt_name:"Habit Burger Grill",amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",short_name:"Habit Burger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["the habit burger"],matchScore:2,suggestion:true},"amenity/fast_food/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/thepizzacompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2413520",amenity:"fast_food",cuisine:"pizza"},addTags:{alt_name:"Pizza Company",amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Togo's":{name:"Togo's",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/togossandwiches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3530375",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Tropical Smoothie Cafe":{name:"Tropical Smoothie Cafe",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tropicalsmoothiecafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7845817",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Tropical Smoothie Cafe","brand:wikidata":"Q7845817","brand:wikipedia":"en:Tropical Smoothie Cafe",cuisine:"juice",name:"Tropical Smoothie Cafe",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Valentine":{name:"Valentine",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/valentineqc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3553635",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Valentine","brand:wikidata":"Q3553635","brand:wikipedia":"en:Groupe Valentine Inc.",cuisine:"burger",name:"Valentine",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Veggie Grill":{name:"Veggie Grill",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/veggiegrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18636427",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Villa Madina":{name:"Villa Madina",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/villamadinarestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64876884",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Villa Madina","brand:wikidata":"Q64876884",cuisine:"mediterranean",name:"Villa Madina",takeaway:"yes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wahoo's Fish Taco":{name:"Wahoo's Fish Taco",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WahoosFishTaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7959827",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",short_name:"Wahoo's",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wendys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q550258",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/whataburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q376627",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Which Wich?":{name:"Which Wich?",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/whichwich/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7993556",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ae","gb","gt","mx","om","qa","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/WhiteCastle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1244034",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Wienerschnitzel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324679",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wimpyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2811992",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Xi'an Famous Foods":{name:"Xi'an Famous Foods",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/xianfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8044020",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",imageURL:"https://graph.facebook.com/Zaxbys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8067525",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",official_name:"Zaxby's Chicken Fingers & Buffalo Wings",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Zoës Kitchen":{name:"Zoës Kitchen",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ZoesKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8074747",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Zoës Kitchen","brand:wikidata":"Q8074747","brand:wikipedia":"en:Zoës Kitchen",cuisine:"mediterranean",name:"Zoës Kitchen",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/immergrün":{name:"immergrün",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/mein.immergruen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62589254",amenity:"fast_food",cuisine:"sandwich;salad;juice"},addTags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["de"],terms:["immergün"],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Γρηγόρης":{name:"Γρηγόρης",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/gregorys.gr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273834",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"Γρηγόρης","brand:el":"Γρηγόρης","brand:en":"Gregorys","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης","name:el":"Γρηγόρης","name:en":"Gregorys",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:ru":"Бургер Кинг","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King","name:ru":"Бургер Кинг",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["by","kz","ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Домино'c Пицца":{name:"Домино'c Пицца",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Домино'c Пицца","brand:en":"Domino's Pizza","brand:ru":"Домино'c Пицца","brand:wikidata":"Q839466","brand:wikipedia":"ru:Domino’s Pizza",name:"Домино'c Пицца","name:en":"Domino's Pizza","name:ru":"Домино'c Пицца",short_name:"Домино'c","short_name:en":"Domino's","short_name:ru":"Домино'c",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/kartoshka.moscow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4241838",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:en":"Kroshka Kartoshka","brand:ru":"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка","name:en":"Kroshka Kartoshka","name:ru":"Крошка Картошка",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:ru":"Макдоналдс","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's","name:ru":"Макдоналдс",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/papajohns/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2759586",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:ru":"Папа Джонс","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's","name:ru":"Папа Джонс",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/Робин Сдобин":{name:"Робин Сдобин",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/robinsdobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62273880",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Робин Сдобин","brand:en":"Robins Dobin","brand:ru":"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин","name:en":"Robins Dobin","name:ru":"Робин Сдобин",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Русский Аппетит":{name:"Русский Аппетит",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/1502979646622576/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086063",amenity:"fast_food",cuisine:"sandwich;salad;regional"},addTags:{amenity:"fast_food",brand:"Русский Аппетит","brand:en":"Russkiy Appetit","brand:ru":"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит","name:en":"Russkiy Appetit","name:ru":"Русский Аппетит",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/StardogsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4439856",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:ru":"Стардог!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s","name:ru":"Стардог!s",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/sushiwokofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25444754",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:ru":"Суши Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok","name:ru":"Суши Wok",takeaway:"yes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/teremok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4455593",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:ru":"Теремок","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok","name:ru":"Теремок",takeaway:"yes"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/אגדיר":{name:"אגדיר",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/agadirburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760070",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"אגדיר","brand:en":"Agadir","brand:he":"אגדיר","brand:wikidata":"Q64760070",cuisine:"burger",name:"אגדיר","name:en":"Agadir","name:he":"אגדיר",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/McDonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12061542",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/עד העצם אקספרס":{name:"עד העצם אקספרס",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/adhatzemexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760165",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"עד העצם אקספרס","brand:en":"Ad Haetzem Express","brand:he":"עד העצם אקספרס","brand:wikidata":"Q64760165",cuisine:"burger",name:"עד העצם אקספרס","name:en":"Ad Haetzem Express","name:he":"עד העצם אקספרס",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/دجاج كنتاكي":{name:"دجاج كنتاكي",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ماكدونالدز":{name:"ماكدونالدز",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/هرفي":{name:"هرفي",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/herfyfscksa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5738371",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"هرفي","brand:ar":"هرفي","brand:en":"Herfy","brand:wikidata":"Q5738371","brand:wikipedia":"ar:هرفي",cuisine:"burger",name:"هرفي","name:ar":"هرفي","name:en":"Herfy",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ae","bh","kw","sa"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",imageURL:"https://abs.twimg.com/sticky/default_profile_images/default_profile_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q11263916",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/1125940338793693184/GAXNsHP4_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2855257",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kurasushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6445491",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/1074928090885672960/nTgKn0jh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6137375",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/てんや":{name:"てんや",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/TWtenya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11319830",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"てんや","brand:en":"Tenya","brand:ja":"てんや","brand:wikidata":"Q11319830","brand:wikipedia":"jp:テンコーポレーション",cuisine:"fries",name:"てんや","name:en":"Tenya","name:ja":"てんや",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/107330239328355/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11274132",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/1743876322501841/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17220385",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/516896005176524/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5878035",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ゆで太郎":{name:"ゆで太郎",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/273267212711878/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11280824",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ウェンディーズ":{name:"ウェンディーズ",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/wendys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q550258",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ウェンディーズ","brand:en":"Wendy's","brand:ja":"ウェンディーズ","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"ウェンディーズ","name:en":"Wendy's","name:ja":"ウェンディーズ",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/152356971456128/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11292632",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"temaki-sandwich",imageURL:"https://graph.facebook.com/subway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q244457",amenity:"fast_food",cuisine:"sandwich"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/akindosushiro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257037",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ドミノ・ピザ":{name:"ドミノ・ピザ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Dominos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q839466",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",short_name:"ドミノ","short_name:en":"Domino's","short_name:ja":"ドミノ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/バーガーキング":{name:"バーガーキング",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBurger%20King%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"バーガーキング","brand:en":"Burger King","brand:ja":"バーガーキング","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"バーガーキング","name:en":"Burger King","name:ja":"バーガーキング",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザ・カリフォルニア":{name:"ピザ・カリフォルニア",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{"brand:wikidata":"Q75324",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザーラ":{name:"ピザーラ",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzala.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199948",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/pizza/ファーストキッチン":{name:"ファーストキッチン",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/firstkitchen.offical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5453133",amenity:"fast_food",cuisine:"pizza"},addTags:{amenity:"fast_food",brand:"ファーストキッチン","brand:en":"First Kitchen","brand:ja":"ファーストキッチン","brand:wikidata":"Q5453133","brand:wikipedia":"ja:ファーストキッチン",cuisine:"pizza",name:"ファーストキッチン","name:en":"First Kitchen","name:ja":"ファーストキッチン",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/フレッシュネスバーガー":{name:"フレッシュネスバーガー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/freshness.burger.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503087",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/donut/ミスタードーナツ":{name:"ミスタードーナツ",icon:"temaki-donut",imageURL:"https://graph.facebook.com/misdo.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1065819",amenity:"fast_food",cuisine:"donut"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"},reference:{key:"cuisine",value:"donut"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mosburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/ラーメン二郎":{name:"ラーメン二郎",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/jirolian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11347765",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/tw.yoshinoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q776272",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/fujisoba/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11414722",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/Kourakuen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11484003",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mosburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1204169",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/日高屋":{name:"日高屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/hidakayavietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11326050",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/matsuyafoods.matsuya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q848773",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya","brand:ja":"松屋","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya","name:ja":"松屋",official_name:"松屋フーズ","official_name:en":"Matsuya Foods","official_name:ja":"松屋フーズ",takeaway:"yes"},countryCodes:["cn","hk","jp","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/箱根そば":{name:"箱根そば",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q11603345",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/築地銀だこ":{name:"築地銀だこ",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/GindacoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11603490",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"築地銀だこ","brand:en":"Gindaco","brand:ja":"築地銀だこ","brand:wikidata":"Q11603490","brand:wikipedia":"ja:築地銀だこ",cuisine:"takoyaki",name:"築地銀だこ","name:en":"Gindaco","name:ja":"築地銀だこ",takeaway:"yes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/chicken/肯德基":{name:"肯德基",icon:"fas-drumstick-bite",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKFC%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麥當勞","brand:zh":"麥當勞","brand:zh-Hant":"麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:zh":"麥當勞","name:zh-Hant":"麥當勞",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["hk","mo","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳","brand:zh":"麦当劳","brand:zh-Hans":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳","name:zh-Hans":"麦当劳",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["cn","sg"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/ilovelotteria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q249525",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/맘스터치":{name:"맘스터치",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/momstouchmain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23044856",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"맘스터치","brand:ko":"맘스터치","brand:wikidata":"Q23044856","brand:wikipedia":"en:Mom's Touch",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/맥도날드":{name:"맥도날드",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"맥도날드","brand:en":"McDonald's","brand:ko":"맥도날드","brand:wikidata":"Q38076","brand:wikipedia":"ko:맥도날드",cuisine:"burger",name:"맥도날드","name:en":"McDonald's","name:ko":"맥도날드",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4545742",amenity:"fuel"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},countryCodes:["dk","pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"amenity/fuel/76":{name:"76",icon:"maki-fuel",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",imageURL:"https://graph.facebook.com/abcasemat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10397504",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ADNOCDistribution/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aegean":{name:"Aegean",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AegeanOil.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28146598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2829178",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q377915",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Agrola":{name:"Agrola",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AGROLA.AG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q397351",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aloha Petroleum":{name:"Aloha Petroleum",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4734197",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aloha Petroleum","brand:wikidata":"Q4734197","brand:wikipedia":"en:Aloha Petroleum",name:"Aloha Petroleum",official_name:"Aloha Petroleum Ltd"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alon":{name:"Alon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/alonbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274304",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Alpet":{name:"Alpet",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ALPETtr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TheAmericanPetroleumInstitute/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466043",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",imageURL:"https://graph.facebook.com/araldeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/arco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q304769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Asda":{name:"Asda",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Atem":{name:"Atem",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postosatem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332255",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"},countryCodes:["br"],terms:["posto atem"],matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1069532667018993664/9AUsuTdx_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q300147",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},terms:["station avia"],matchScore:2,suggestion:true},"amenity/fuel/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q19903165",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Axion":{name:"Axion",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AXIONenergyOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62131749",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"},countryCodes:["ar","py","uy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aytemiz":{name:"Aytemiz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AytemizOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BEBECO":{name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274373",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BHPetrol":{name:"BHPetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BHP.Petrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"},countryCodes:["my"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},terms:["BP Gas Station"],matchScore:2,suggestion:true},"amenity/fuel/BR":{name:"BR",icon:"maki-fuel",imageURL:"https://graph.facebook.com/postospetrobras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836468",amenity:"fuel"},addTags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"},countryCodes:["br"],terms:["br petrobras","petrobras","posto br"],matchScore:2,suggestion:true},"amenity/fuel/Bangchak":{name:"Bangchak",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bangchak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BharatPetroleumcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q854826",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Biomax":{name:"Biomax",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BiomaxColombia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274413",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q4016378",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1031623",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CEPSAespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q608819",amenity:"fuel"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/582354948345634816/nzfEGDG1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q277470",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},terms:["canadian tire","canadian tire gas bar"],matchScore:2,suggestion:true},"amenity/fuel/Carrefour":{name:"Carrefour",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",amenity:"fuel"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour"},terms:["carrefour market"],matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",imageURL:"https://graph.facebook.com/caseys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940968",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},terms:["caseys"],matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CenexStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5011381",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q5065795",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},countryCodes:["lk"],terms:["lanka filling station"],matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Chevron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319642",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CITGOPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974437",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ClarkCrownBrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5127157",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},countryCodes:["ca"],terms:["coop"],matchScore:2,suggestion:true},"amenity/fuel/Coles Express":{name:"Coles Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ColesExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5144653",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/conoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1126518",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11681461",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Copetrol":{name:"Copetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Copetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274431",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},countryCodes:["au","ca","mx","us"],terms:["costco","costco gas","costco wholesale"],matchScore:2,suggestion:true},"amenity/fuel/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CoucheTardQc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2836957",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crevier":{name:"Crevier",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GroupeCrevier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743451",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Crodux":{name:"Crodux",icon:"maki-fuel",imageURL:"https://graph.facebook.com/croduxhr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",imageURL:"https://graph.facebook.com/CumberlandFarms/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143685",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (Panama & Costa Rica)":{name:"Delta (Panama & Costa Rica)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroleosDelta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62274638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"},countryCodes:["cr","us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Delta (USA)":{name:"Delta (USA)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62274661",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q16973722",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Domo":{name:"Domo",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/924850916536107008/9ZCP6jwR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5291326",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3045934",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HELPEgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q903198",amenity:"fuel"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},countryCodes:["bg","cy","gr","me","mk","rs"],terms:["εκο"],matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",imageURL:"https://graph.facebook.com/eneos.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q57980752",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},countryCodes:["de","fr","nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Engen":{name:"Engen",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1014490248112373760/rL8smOvY_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3054251",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/875644564459012097/fsDlSI7T_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q565594",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},countryCodes:["at","ch","fr","it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Erg":{name:"Erg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FERG%20logo2018.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q739503",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},terms:["station esso"],matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2350336",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4781944",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/F24":{name:"F24",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12310853",amenity:"fuel"},addTags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Fas Gas":{name:"Fas Gas",icon:"maki-fuel",imageURL:"https://graph.facebook.com/FasGasPlusCorporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743505",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},countryCodes:["ca"],terms:["fas gas plus"],matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",imageURL:"https://graph.facebook.com/FirezoneNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q14628080",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Flying J":{name:"Flying J",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pilottravelcenters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64130592",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q64130592",name:"Flying J"},countryCodes:["ca","us"],terms:["flying j travel plaza"],matchScore:2,suggestion:true},"amenity/fuel/Flying V":{name:"Flying V",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OfficialFlyingV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62275048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",imageURL:"https://graph.facebook.com/768624663275807/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/GALP":{name:"GALP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/468503569977955/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1492739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazel":{name:"Gazel",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62529885",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"},countryCodes:["co","mx","pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GazpromNewsEn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q102673",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GiantEagleGetGo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5553766",amenity:"fuel"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Glusco":{name:"Glusco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Glusco.Ukraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62284719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GOIL.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5555383",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},countryCodes:["gh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gulf":{name:"Gulf",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGulf%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1296860",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GullNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5617739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"fuel"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},countryCodes:["us"],terms:["h-e-b gas"],matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTamoil.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1563517",amenity:"fuel"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/HP":{name:"HP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/hpcl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1619375",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"},countryCodes:["in"],terms:["hp petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",imageURL:"https://graph.facebook.com/harnoisenergies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743558",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hess":{name:"Hess",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HessCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1615684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Hofer":{name:"Hofer",icon:"maki-fuel",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",imageURL:"https://graph.facebook.com/holidaystations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880490",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Husky":{name:"Husky",icon:"maki-fuel",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IES":{name:"IES",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/512948242925891586/WqYuXs0m_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q62287387",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",imageURL:"https://graph.facebook.com/IPperlitalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q646807",amenity:"fuel"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/IndianOilCorpLimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1289348",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ingosverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17048617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},countryCodes:["dk","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},terms:["intermarché super"],matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ipirangaoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2081136",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},countryCodes:["br"],terms:["posto ipiranga"],matchScore:2,suggestion:true},"amenity/fuel/Irving":{name:"Irving",icon:"maki-fuel",imageURL:"https://graph.facebook.com/irvingoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1673286",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q11225213",amenity:"fuel"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},countryCodes:["jp"],terms:["ja"],matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q568940",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Jetti":{name:"Jetti",icon:"maki-fuel",imageURL:"https://graph.facebook.com/drivewithjetti/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62288720",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kangaroo Express":{name:"Kangaroo Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/KangarooExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61747408",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",short_name:"Kangaroo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kobil":{name:"Kobil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/kenolkobil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22906119",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},countryCodes:["bi","et","ke","rw","tz","ug","zm"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},terms:["kroger fuel"],matchScore:2,suggestion:true},"amenity/fuel/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",imageURL:"https://graph.facebook.com/kumandgo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6443340",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos":{name:"Lotos",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lotos Optima":{name:"Lotos Optima",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GrupaLOTOS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1256909",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos Optima"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/lovestravelstops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1872496",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Lukoil.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MEROIL":{name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62292559",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MOL":{name:"MOL",icon:"maki-fuel",imageURL:"https://graph.facebook.com/molcesko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q549181",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q56274919",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},countryCodes:["ng"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/918945400538714112/bRGd_5pv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4043527",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/MacEwen":{name:"MacEwen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MacEwenServiceStation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61740335",amenity:"fuel"},addTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},terms:["Marathon Gas"],matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",imageURL:"https://graph.facebook.com/maverikadventure/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149010",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q64149010","brand:wikipedia":"en:Maverik, Inc.",name:"Maverik"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/684702839143317504/DqCgzXbW_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3302837",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Metano":{name:"Metano",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62294765",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Migrol":{name:"Migrol",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Migrol.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1747771",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},terms:["mobile"],matchScore:2,suggestion:true},"amenity/fuel/Moil":{name:"Moil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/milanpetrol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62296914",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Morrisons":{name:"Morrisons",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Morrisons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Moya":{name:"Moya",icon:"maki-fuel",imageURL:"https://graph.facebook.com/moyastacja/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62297700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MurphyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19604459",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q7842382",amenity:"fuel"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},countryCodes:["tt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",imageURL:"https://graph.facebook.com/NesteUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q616376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20OIL!.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2007561",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12329785",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/OKQ8":{name:"OKQ8",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OKQ8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OilibyaMisr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7081491",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},terms:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",imageURL:"https://graph.facebook.com/opet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072824",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Orlen":{name:"Orlen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ORLENOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q971649",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PSO":{name:"PSO",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PSOCL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2741455",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},countryCodes:["pk"],terms:["pso petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/PT":{name:"PT",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ptstation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62298612",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PTTNews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2089536",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PacificPrideUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7122637",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pecsa":{name:"Pecsa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PecsaPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62299262",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Pemex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q871308",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pertamina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1641044",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro":{name:"Petro",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TravelCentersOfAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64051305",amenity:"fuel"},addTags:{alt_name:"Petro Stopping Centers",amenity:"fuel",brand:"Petro","brand:wikidata":"Q64051305",name:"Petro"},countryCodes:["ca","us"],terms:["petro stopping center"],matchScore:2,suggestion:true},"amenity/fuel/Petro-Canada":{name:"Petro-Canada",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petro-T":{name:"Petro-T",icon:"maki-fuel",imageURL:"https://graph.facebook.com/115786179112919/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61743540",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petroperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2506390",amenity:"fuel"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroChina.Ltd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroecuadorEP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1812822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrolofisi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1278087",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/tapdoanxangdauvietnam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10831598",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petrolinaholdings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17013948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},countryCodes:["cy"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetromRo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1755034",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petron":{name:"Petron",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetronCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179011",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",imageURL:"https://graph.facebook.com/petronas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q221692",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",imageURL:"https://graph.facebook.com/info.petronor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1726547",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Phillips66Co/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1656230",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",imageURL:"https://graph.facebook.com/phoenixfuels.ph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7186949",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pilot":{name:"Pilot",icon:"maki-fuel",imageURL:"https://graph.facebook.com/pilottravelcenters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64128179",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q64128179",name:"Pilot"},countryCodes:["ca","us"],terms:["pilot travel centers"],matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PioneerEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7196684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",imageURL:"https://graph.facebook.com/preem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q598835",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},countryCodes:["pl","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Ecuador)":{name:"Primax (Ecuador)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxEcuador/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332857",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Primax (Peru)":{name:"Primax (Peru)",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrimaxPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62332638",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Prio":{name:"Prio",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PrioEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530421",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Puma":{name:"Puma",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PumaEnergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7259769",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q1":{name:"Q1",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Q1EnergieAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086498",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OKQ8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634762",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},countryCodes:["be","dk","es","it","lu","nl","pt"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Q8italia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1806948",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},countryCodes:["be","it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10647961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Quiktrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7271953",amenity:"fuel"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},terms:["qt"],matchScore:2,suggestion:true},"amenity/fuel/RaceTrac":{name:"RaceTrac",icon:"maki-fuel",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/repsol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q174747",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Revoil":{name:"Revoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/revoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62530755",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Rompetrol.Romania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1788862",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Royalfarmsstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7374169",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3446514",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Safeway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SasolSACareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q905998",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SEAOIL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7389549",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},terms:["posto shell","shell gas station","shell petrol station","shell station","station shell"],matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",imageURL:"https://graph.facebook.com/shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2289188",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinclair":{name:"Sinclair",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SinclairOilCorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1290900",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"},countryCodes:["cn"],terms:["sinopec fuel"],matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",imageURL:"https://graph.facebook.com/MySlovnaft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1587563",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},countryCodes:["cz","pl","sk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SOCARofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1622293",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SokimexGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1149575",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},countryCodes:["kh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",imageURL:"https://graph.facebook.com/SprintTankstelle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57588452",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",imageURL:"https://graph.facebook.com/st1suomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7592214",amenity:"fuel"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",imageURL:"https://graph.facebook.com/123909017686285/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2031095",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Station Service E. Leclerc":{name:"Station Service E. Leclerc",icon:"maki-fuel",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",amenity:"fuel"},addTags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"},terms:["e. leclerc"],matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Equinor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1776022",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},countryCodes:["dk","ee","ie","pl","ru","se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YourStewarts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7615690",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/GoSunoco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1423218",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/TA":{name:"TA",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TravelCentersOfAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7835892",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TamoilNederland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706793",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},countryCodes:["ch","de","es","fr","it","nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TangoTankstations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2423920",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q10690640",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",imageURL:"https://graph.facebook.com/teboil.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7692079",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tela":{name:"Tela",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TelaCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62534875",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"},countryCodes:["kh"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tempo":{name:"Tempo",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62535175",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Terpel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7703003",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q17145596",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TexacoWithTechron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q775060",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2132028",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1039514449244114945/evpJUxKM_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7824764",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},countryCodes:["ie"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TotalUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},terms:["station total"],matchScore:2,suggestion:true},"amenity/fuel/Total Access":{name:"Total Access",icon:"maki-fuel",imageURL:"https://graph.facebook.com/TotalUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154037",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/TotalErg":{name:"TotalErg",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTotalerg%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3995933",amenity:"fuel"},addTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",imageURL:"https://graph.facebook.com/turkeyhillmm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q42376970",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Turmoel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1473279",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},countryCodes:["us"],terms:["udf fuels","united dairy farmers"],matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",imageURL:"https://graph.facebook.com/190502784374269/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3548078",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",imageURL:"https://graph.facebook.com/unitedpetroleum/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28224393",amenity:"fuel"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},terms:["united petroleum"],matchScore:2,suggestion:true},"amenity/fuel/Uno":{name:"Uno",icon:"maki-fuel",imageURL:"https://graph.facebook.com/UnoGasolineras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62535574",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"},countryCodes:["bz","cr","gt","hn","ni","sv"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",imageURL:"https://graph.facebook.com/unoxdanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3362746",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Valero":{name:"Valero",icon:"maki-fuel",imageURL:"https://graph.facebook.com/valeroenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1283291",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ViadaLietuva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12663942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},countryCodes:["lt","lv"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Vito":{name:"Vito",icon:"maki-fuel",imageURL:"https://graph.facebook.com/VITOCORSICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62536473",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",imageURL:"https://graph.facebook.com/azsWOG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12072939",amenity:"fuel"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Walmart":{name:"Walmart",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62606411",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",imageURL:"https://graph.facebook.com/WestfalenAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1411209",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/XTR":{name:"XTR",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/1849683826/XTRASlogo_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q62537250",amenity:"fuel"},addTags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YPFoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2006989",amenity:"fuel"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Z":{name:"Z",icon:"maki-fuel",imageURL:"https://graph.facebook.com/zenergynz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8063337",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",imageURL:"https://graph.facebook.com/768624663275807/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1009104",amenity:"fuel"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/din-X":{name:"din-X",icon:"maki-fuel",imageURL:"https://graph.facebook.com/bensinbolagettvartom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10472858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Авіас":{name:"Авіас",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q12122687",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",imageURL:"https://graph.facebook.com/BRSM.NAFTA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56356523",amenity:"fuel"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bashneft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q809985",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Белоруснефть":{name:"Белоруснефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/belorusneft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4082693",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Газпромнефть":{name:"Газпромнефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/gazprom.neft/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1461799",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},countryCodes:["by","kg","kz","ru","tj"],terms:["газпром"],matchScore:2,suggestion:true},"amenity/fuel/Гелиос":{name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62286471",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"},countryCodes:["kz"],terms:["helios"],matchScore:2,suggestion:true},"amenity/fuel/ЕКА":{name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q62543029",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КЛО":{name:"КЛО",icon:"maki-fuel",imageURL:"https://graph.facebook.com/klo.oil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60966526",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q1417227",amenity:"fuel"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Lukoil.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q329347",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},terms:["лукоил"],matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",imageURL:"https://graph.facebook.com/makpetrol.ultra/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1886438",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},countryCodes:["mk"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",imageURL:"https://graph.facebook.com/AllianceOilUkraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4063700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:en":"Alliance Oil","brand:ru":"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс","name:en":"Alliance Oil","name:ru":"НК Альянс"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Нефтьмагистраль":{name:"Нефтьмагистраль",icon:"maki-fuel",imageURL:"https://graph.facebook.com/neftm.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62544323",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",imageURL:"https://graph.facebook.com/okkoua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ОМВ":{name:"ОМВ",icon:"maki-fuel",imageURL:"https://graph.facebook.com/OMV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168238",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"},countryCodes:["bg","rs"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ptk.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4360193",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetrolAD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24315",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"},countryCodes:["bg"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",imageURL:"https://graph.facebook.com/RosneftRu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141123",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSng2.gif&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680776",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2298901",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTatneft%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1616858",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrnafta.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2447961",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/דור אלון":{name:"דור אלון",icon:"maki-fuel",imageURL:"https://graph.facebook.com/dor.alon.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16130352",amenity:"fuel"},addTags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",imageURL:"https://graph.facebook.com/sonolsogood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3701622",amenity:"fuel"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/פז":{name:"פז",icon:"maki-fuel",imageURL:"https://graph.facebook.com/YellowPaz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2211731",amenity:"fuel"},addTags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ادنوك":{name:"ادنوك",icon:"maki-fuel",imageURL:"https://graph.facebook.com/ADNOCDistribution/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q166729",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"},countryCodes:["ae"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Bangchak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ป.ต.ท.":{name:"ป.ต.ท.",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PTTNews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1810389",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เชลล์":{name:"เชลล์",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",imageURL:"https://graph.facebook.com/EssoGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q867662",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"},countryCodes:["jp"],terms:["エッソ石油"],matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",imageURL:"https://graph.facebook.com/eneos.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1640290",amenity:"fuel"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCosmo%20Oil%20company%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2498318",amenity:"fuel"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/ゼネラル":{name:"ゼネラル",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTonenGeneral.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11528048",amenity:"fuel"},addTags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",imageURL:"https://graph.facebook.com/Sinopec/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q831445",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},countryCodes:["cn"],terms:["中国石化 Sinopec"],matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",imageURL:"https://graph.facebook.com/PetroChina.Ltd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503182",amenity:"fuel"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2216770",amenity:"fuel"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q21527177",amenity:"fuel"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},countryCodes:["tw"],terms:["中油"],matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q277115",amenity:"fuel"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"},countryCodes:["jp"],terms:["昭和シェル石油"],matchScore:2,suggestion:true},"amenity/hospital/VA Medical Center":{name:"VA Medical Center",icon:"maki-hospital",imageURL:"https://graph.facebook.com/VeteransHealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6580225",amenity:"hospital"},addTags:{amenity:"hospital",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"hospital","healthcare:for":"veterans",name:"VA Medical Center",short_name:"VA"},reference:{key:"amenity",value:"hospital"},countryCodes:["us"],terms:["department of veterans affairs medical center","veterans administration","veterans administration hospital","veterans administration medical center","veterans affairs","veterans affairs hospital","veterans affairs medical center"],matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BenandJerryAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q816412",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Bruster's Ice Cream":{name:"Bruster's Ice Cream",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/BrustersRealIceCream/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4979810",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Bruster's Ice Cream","brand:wikidata":"Q4979810","brand:wikipedia":"en:Bruster's Ice Cream",cuisine:"ice_cream",name:"Bruster's Ice Cream"},countryCodes:["us"],terms:["brusters"],matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/coldstonecreamery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1094923",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},countryCodes:["ng","us"],terms:["cold stone"],matchScore:2,suggestion:true},"amenity/ice_cream/D'Onofrio":{name:"D'Onofrio",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/DonofrioDOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5203166",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/FreddoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28823999",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Graeter's":{name:"Graeter's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/Graeters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5592430",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"},countryCodes:["us"],terms:["greaters"],matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/GridoHelados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5885724",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},countryCodes:["ar"],terms:["grido helado"],matchScore:2,suggestion:true},"amenity/ice_cream/Häagen-Dazs":{name:"Häagen-Dazs",icon:"fas-ice-cream",imageURL:"https://pbs.twimg.com/profile_images/827598241403371520/qHkQxKH3_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1143333",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Häagen-Dazs","brand:wikidata":"Q1143333","brand:wikipedia":"en:Häagen-Dazs",name:"Häagen-Dazs"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/La Michoacana":{name:"La Michoacana",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/LaMichoacana.sv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17118857",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"La Michoacana","brand:wikidata":"Q17118857","brand:wikipedia":"en:Paletería La Michoacana",name:"La Michoacana"},countryCodes:["mx"],terms:["paleteria la michoacana"],matchScore:2,suggestion:true},"amenity/ice_cream/Marble Slab Creamery":{name:"Marble Slab Creamery",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/marbleslabcreamery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020087",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Marble Slab Creamery","brand:wikidata":"Q17020087","brand:wikipedia":"en:Marble Slab Creamery",cuisine:"ice_cream",name:"Marble Slab Creamery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Menchie's":{name:"Menchie's",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/MyMenchies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6816528",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Menchie's","brand:wikidata":"Q6816528","brand:wikipedia":"en:Menchie's Frozen Yogurt",cuisine:"frozen_yogurt",name:"Menchie's"},countryCodes:["ae","bh","bs","ca","cn","gb","in","jp","kw","qa","sa","us"],terms:["menchie's frozen yoghurt","menchie's frozen yogurt"],matchScore:2,suggestion:true},"amenity/ice_cream/Pinkberry":{name:"Pinkberry",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/pinkberry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2904053",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Pinkberry","brand:wikidata":"Q2904053","brand:wikipedia":"en:Pinkberry",cuisine:"frozen_yogurt",name:"Pinkberry",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Ralph's Italian Ices":{name:"Ralph's Italian Ices",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RalphsFamous/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62576909",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"},countryCodes:["us"],terms:["ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices and ice cream"],matchScore:2,suggestion:true},"amenity/ice_cream/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/RitasItalianIceCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7336456",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},countryCodes:["us"],terms:["ritas","ritas water ice"],matchScore:2,suggestion:true},"amenity/ice_cream/Yogen Früz":{name:"Yogen Früz",icon:"fas-ice-cream",imageURL:"https://pbs.twimg.com/profile_images/717339887498878977/ZDfPSjfD_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q8054358",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Yogen Früz","brand:wikidata":"Q8054358","brand:wikipedia":"en:Yogen Früz",cuisine:"frozen_yogurt",name:"Yogen Früz",takeaway:"yes"},terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/Yogurtland":{name:"Yogurtland",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/yogurtland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8054428",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"Yogurtland","brand:wikidata":"Q8054428","brand:wikipedia":"en:Yogurtland",cuisine:"frozen_yogurt",name:"Yogurtland",takeaway:"yes"},countryCodes:["ae","au","sg","th","us","ve"],terms:[],matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/sweetfrogfroyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16952110",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},countryCodes:["us"],terms:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],matchScore:2,suggestion:true},"amenity/ice_cream/サーティワンアイスクリーム":{name:"サーティワンアイスクリーム",icon:"fas-ice-cream",imageURL:"https://graph.facebook.com/baskinrobbinsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584601",amenity:"ice_cream"},addTags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Children's Learning Adventure":{name:"Children's Learning Adventure",icon:"maki-school",imageURL:"https://graph.facebook.com/Childrenslearningadventure/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64821213",amenity:"kindergarten"},addTags:{after_school:"yes",amenity:"kindergarten",brand:"Children's Learning Adventure","brand:wikidata":"Q64821213","brand:wikipedia":"en:Children's Learning Adventure",fee:"yes","isced:level":"0",name:"Children's Learning Adventure",nursery:"yes",preschool:"yes",short_name:"CLA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Childtime":{name:"Childtime",icon:"maki-school",imageURL:"https://graph.facebook.com/Childtime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877793",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"Childtime","brand:wikidata":"Q64877793",fee:"yes","isced:level":"0",name:"Childtime",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["childtime learning center","childtime learning centers"],matchScore:2,suggestion:true},"amenity/kindergarten/KinderCare":{name:"KinderCare",icon:"maki-school",imageURL:"https://graph.facebook.com/kindercare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6410551",amenity:"kindergarten"},addTags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/La Petite Academy":{name:"La Petite Academy",icon:"maki-school",imageURL:"https://graph.facebook.com/LaPetiteAcademy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877784",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"La Petite Academy","brand:wikidata":"Q64877784",fee:"yes","isced:level":"0",name:"La Petite Academy",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["la petite"],matchScore:2,suggestion:true},"amenity/kindergarten/New Horizon Academy":{name:"New Horizon Academy",icon:"maki-school",imageURL:"https://pbs.twimg.com/profile_images/778681004206592001/ZQF3Eurh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821306",amenity:"kindergarten"},addTags:{after_school:"yes",amenity:"kindergarten",brand:"New Horizon Academy","brand:wikidata":"Q64821306",fee:"yes","isced:level":"0",name:"New Horizon Academy",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Primrose School":{name:"Primrose School",icon:"maki-school",imageURL:"https://graph.facebook.com/PrimroseSchools/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7243677",amenity:"kindergarten"},addTags:{after_school:"yes",alt_name:"Primrose Schools",amenity:"kindergarten",brand:"Primrose School","brand:wikidata":"Q7243677",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"Primrose School",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["primrose"],matchScore:2,suggestion:true},"amenity/kindergarten/The Children's Courtyard":{name:"The Children's Courtyard",icon:"maki-school",imageURL:"https://graph.facebook.com/ChildrensCourtyard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877852",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"The Children's Courtyard","brand:wikidata":"Q64877852",fee:"yes","isced:level":"0",name:"The Children's Courtyard",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["children's courtyard"],matchScore:2,suggestion:true},"amenity/kindergarten/The Goddard School":{name:"The Goddard School",icon:"maki-school",imageURL:"https://graph.facebook.com/goddardschool/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5576260",amenity:"kindergarten"},addTags:{after_school:"yes",alt_name:"Goddard School",amenity:"kindergarten",brand:"The Goddard School","brand:wikidata":"Q5576260",fee:"yes","isced:level":"0",min_age:"6 weeks",name:"The Goddard School",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/kindergarten/Tutor Time":{name:"Tutor Time",icon:"maki-school",imageURL:"https://graph.facebook.com/TutorTime/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64877826",amenity:"kindergarten"},addTags:{amenity:"kindergarten",brand:"Tutor Time","brand:wikidata":"Q64877826",fee:"yes","isced:level":"0",name:"Tutor Time",nursery:"yes",preschool:"yes"},countryCodes:["us"],terms:["tutor time child care","tutor time child care learning center","tutor time learning center","tutor time learning centers"],matchScore:2,suggestion:true},"amenity/language_school/AEON":{name:"AEON",icon:"maki-school",imageURL:"https://graph.facebook.com/AEONCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4687898",amenity:"language_school"},addTags:{amenity:"language_school",brand:"AEON","brand:en":"Aeon","brand:ja":"AEON","brand:ja-Hira":"イーオン","brand:ja-Latn":"AEON","brand:wikidata":"Q4687898","brand:wikipedia":"ja:イーオン","language:en":"main",name:"AEON","name:en":"Aeon","name:ja":"AEON","name:ja-Hira":"イーオン","name:ja-Latn":"AEON"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/Berlitz":{name:"Berlitz",icon:"maki-school",imageURL:"https://graph.facebook.com/BerlitzUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q821960",amenity:"language_school"},addTags:{amenity:"language_school",brand:"Berlitz","brand:wikidata":"Q821960","brand:wikipedia":"en:Berlitz Corporation",name:"Berlitz"},terms:[],matchScore:2,suggestion:true},"amenity/language_school/ECC外語学院":{name:"ECC外語学院",icon:"maki-school",imageURL:"https://graph.facebook.com/ecc.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5322655",amenity:"language_school"},addTags:{amenity:"language_school",brand:"ECC外語学院","brand:en":"ECC Foreign Language Institute","brand:ja":"ECC外語学院","brand:ja-Hira":"イーシーシーがいごがくいん","brand:ja-Latn":"ECC Gaigo Gakuin","brand:wikidata":"Q5322655","brand:wikipedia":"ja:ECC総合教育機関","language:en":"main",name:"ECC外語学院","name:en":"ECC Foreign Language Institute","name:ja":"ECC外語学院","name:ja-Hira":"イーシーシーがいごがくいん","name:ja-Latn":"ECC Gaigo Gakuin",short_name:"ECC","short_name:en":"ECC","short_name:ja":"ECC","short_name:ja-Hira":"イーシーシー","short_name:ja-Latn":"ECC"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/ELS":{name:"ELS",icon:"maki-school",imageURL:"https://graph.facebook.com/els/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5323325",amenity:"language_school"},addTags:{amenity:"language_school",brand:"ELS","brand:en":"ELS","brand:wikidata":"Q5323325","brand:wikipedia":"en:ELS Language Centers","language:en":"main",name:"ELS","name:en":"ELS",official_name:"ELS Language Centers","official_name:en":"ELS Language Centers"},countryCodes:["ca","in","my","pa","sa","tr","us","vn"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/GABA":{name:"GABA",icon:"maki-school",imageURL:"https://graph.facebook.com/gaba.corp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5515241",amenity:"language_school"},addTags:{amenity:"language_school",brand:"GABA","brand:en":"Gaba","brand:ja":"GABA","brand:ja-Kana":"ガバ","brand:ja-Latn":"GABA","brand:wikidata":"Q5515241","brand:wikipedia":"ja:GABA (企業)","language:en":"main",name:"GABA","name:en":"Gaba","name:ja":"GABA","name:ja-Kana":"ガバ","name:ja-Latn":"GABA"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/NOVA":{name:"NOVA",icon:"maki-school",imageURL:"https://graph.facebook.com/nova.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7064000",amenity:"language_school"},addTags:{amenity:"language_school",brand:"NOVA","brand:en":"Nova","brand:ja":"NOVA","brand:ja-Hira":"ノヴァ","brand:ja-Latn":"NOVA","brand:wikidata":"Q7064000","brand:wikipedia":"ja:NOVA","language:en":"main",name:"NOVA","name:en":"Nova","name:ja":"NOVA","name:ja-Hira":"ノヴァ","name:ja-Latn":"NOVA"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/Shane English School":{name:"Shane English School",icon:"maki-school",imageURL:"https://graph.facebook.com/ShaneEnglishSchool/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17054332",amenity:"language_school"},addTags:{amenity:"language_school",brand:"Shane English School","brand:en":"Shane English School","brand:ja":"シェーン英会話","brand:ja-Latn":"Shēn Eikaiwa","brand:wikidata":"Q17054332","brand:wikipedia":"en:Shane English School","language:en":"main",name:"Shane English School","name:en":"Shane English School","name:ja":"シェーン英会話","name:ja-Latn":"Shēn Eikaiwa"},countryCodes:["cn","dz","gb","hk","id","kr","pl","th","tw","vn"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/シェーン英会話":{name:"シェーン英会話",icon:"maki-school",imageURL:"https://graph.facebook.com/ShaneEnglishSchool/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17054332",amenity:"language_school"},addTags:{amenity:"language_school",brand:"シェーン英会話","brand:en":"Shane English School","brand:ja":"シェーン英会話","brand:ja-Latn":"Shēn Eikaiwa","brand:wikidata":"Q17054332","brand:wikipedia":"ja:シェーン英会話スクール","language:en":"main",name:"シェーン英会話","name:en":"Shane English School","name:ja":"シェーン英会話","name:ja-Latn":"Shēn Eikaiwa"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/セイハ英語学院":{name:"セイハ英語学院",icon:"maki-school",geometry:["point","area"],tags:{"brand:wikidata":"Q7446694",amenity:"language_school"},addTags:{amenity:"language_school",brand:"セイハ英語学院","brand:en":"Seiha English Academy","brand:ja":"セイハ英語学院","brand:ja-Hani":"セイハえいごがくいん","brand:ja-Latn":"Seiha Eigo Gakuin","brand:wikidata":"Q7446694","language:en":"main",name:"セイハ英語学院","name:en":"Seiha English Academy","name:ja":"セイハ英語学院","name:ja-Hani":"セイハえいごがくいん","name:ja-Latn":"Seiha Eigo Gakuin"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/ベルリッツ":{name:"ベルリッツ",icon:"maki-school",imageURL:"https://graph.facebook.com/BerlitzJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4892545",amenity:"language_school"},addTags:{amenity:"language_school",brand:"ベルリッツ","brand:en":"Berlitz","brand:ja":"ベルリッツ","brand:ja-Hira":"ベルリッツ","brand:wikidata":"Q4892545","brand:wikipedia":"ja:ベルリッツ・ジャパン",name:"ベルリッツ","name:en":"Berlitz","name:ja":"ベルリッツ","name:ja-Hira":"ベルリッツ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/language_school/ペッピーキッズクラブ":{name:"ペッピーキッズクラブ",icon:"maki-school",geometry:["point","area"],tags:{"brand:wikidata":"Q7166471",amenity:"language_school"},addTags:{amenity:"language_school",brand:"ペッピーキッズクラブ","brand:en":"Peppy Kids Club","brand:ja":"ペッピーキッズクラブ","brand:ja-Latn":"Peppi Kizzu Kurabu","brand:wikidata":"Q7166471","brand:wikipedia":"ja:ペッピーキッズクラブ","language:en":"main",name:"ペッピーキッズクラブ","name:en":"Peppy Kids Club","name:ja":"ペッピーキッズクラブ","name:ja-Latn":"Peppi Kizzu Kurabu"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/ExpressUnionFinance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3062276",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},countryCodes:["td"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Hoa Phát":{name:"Hoa Phát",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/692515699349135364/P4MUVfcJ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q65116775",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Hoa Phát","brand:wikidata":"Q65116775",name:"Hoa Phát","name:vi":"Hoa Phát"},countryCodes:["us"],terms:["hoa phat goi tien","hoa phat gui tien"],matchScore:2,suggestion:true},"amenity/money_transfer/MoneyGram":{name:"MoneyGram",icon:"maki-bank",imageURL:"https://graph.facebook.com/moneygram/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1944412",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"MoneyGram","brand:wikidata":"Q1944412","brand:wikipedia":"en:MoneyGram",name:"MoneyGram"},countryCodes:["de","fr","gr"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Orange Money":{name:"Orange Money",icon:"maki-bank",imageURL:"https://graph.facebook.com/orange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16668220",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"},countryCodes:["ml"],terms:[],matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",imageURL:"https://graph.facebook.com/WesternUnion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q861042",amenity:"money_transfer"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},terms:[],matchScore:2,suggestion:true},"amenity/parking/Parking Company of America":{name:"Parking Company of America",icon:"maki-car",imageURL:"https://graph.facebook.com/parkingcompanyofamerica/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q65491376",amenity:"parking"},addTags:{amenity:"parking",brand:"Parking Company of America","brand:wikidata":"Q65491376",fee:"yes",name:"Parking Company of America",short_name:"PCA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/parking/SP+":{name:"SP+",icon:"maki-car",imageURL:"https://graph.facebook.com/sppluscorp/picture?type=large",geometry:["point","vertex","area"],tags:{"brand:wikidata":"Q7598289",amenity:"parking"},addTags:{alt_name:"SP Plus",amenity:"parking",brand:"SP+","brand:wikidata":"Q7598289","brand:wikipedia":"en:SP Plus Corporation",fee:"yes",name:"SP+"},countryCodes:["ca","us"],terms:["central parking","central parking system","standard parking"],matchScore:2,suggestion:true},"amenity/payment_centre/Abitab":{name:"Abitab",icon:"maki-bank",imageURL:"https://graph.facebook.com/Abitaboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16488129",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",imageURL:"https://graph.facebook.com/Rapipago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6100413",amenity:"payment_centre"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"far-credit-card",imageURL:"https://graph.facebook.com/qiwirussia/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q4047736",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"far-credit-card",imageURL:"https://graph.facebook.com/privatbank/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q1515015",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"far-credit-card",imageURL:"https://graph.facebook.com/elecsnet/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q4530795",amenity:"payment_terminal"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apteka366/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q226889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:["аптека 36,6"],matchScore:2,suggestion:true},"amenity/pharmacy/Amcal":{name:"Amcal",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/AmcalAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367373",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["amcal pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Apollo Pharmacy":{name:"Apollo Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ApolloPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62562612",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apotekhjartat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10416114",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BartellDrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4865152",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benavides":{name:"Benavides",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasBenavides/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Benu":{name:"Benu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmaciesBENUSwitzerland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62562792",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Blooms The Chemist":{name:"Blooms The Chemist",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BloomsTheChemistPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367543",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/bootsuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6123139",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["boots pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Boticas y Salud":{name:"Boticas y Salud",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/844038768993601/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563126",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/CVS Pharmacy":{name:"CVS Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CVS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2078880",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS Pharmacy",short_name:"CVS"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Camelia":{name:"Camelia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/camelia.vaistine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15867413",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciaCatena/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24035728",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist King Discount Pharmacy":{name:"Chemist King Discount Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ChemistKingDiscountPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367667",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["chemist king","chemist king discount pharmacies"],matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ChemistWarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48782120",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Clicks":{name:"Clicks",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ClicksSouthAfrica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563622",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Azul":{name:"Cruz Azul",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/CruzAzul.Farmacias/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108219",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias cruz azul"],matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasCruzVerde1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856071",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:["farmacias cruz verde"],matchScore:2,suggestion:true},"amenity/pharmacy/Day Lewis Pharmacy":{name:"Day Lewis Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DayLewisPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563772",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dbam o Zdrowie":{name:"Dbam o Zdrowie",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/725613555530133504/f2lYAu0M_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62563833",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Dr. Max":{name:"Dr. Max",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/lekarnadrmax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56317371",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cz","pl","sk"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrogaRaia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10357101",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrogariaSaoPaulo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5308184",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Drogasil":{name:"Drogasil",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDrogazil.logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5308185",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/duanereade/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5310380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q267205",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Extrafarma":{name:"Extrafarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Extrafarma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20055480",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Familiprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3064881",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacenter (Colombia)":{name:"Farmacenter (Colombia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmacenterCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62563928",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasBenavides/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435613",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1748872266/avatar_Twitter_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5435609",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacias guadalajara"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFarmacias%20ahumada.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5856069",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (Ecuador)":{name:"Farmacias Económicas (Ecuador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicasEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108380",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Económicas (El Salvador)":{name:"Farmacias Económicas (El Salvador)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasEconomicas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62108397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["sv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Similares":{name:"Farmacias Similares",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:["similares"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Ahorro":{name:"Farmacias del Ahorro",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FAhorro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086647",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["mx"],terms:["farmacia del ahorro"],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias del Dr. Simi":{name:"Farmacias del Dr. Simi",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/DrSimiChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl","gt","mx"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Farmacity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856076",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ra"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmahorroVe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20015002",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmatodovenezuela/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5856092",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Felicia":{name:"Felicia",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciafelicia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564805",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Fybeca":{name:"Fybeca",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/fybeca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Generika":{name:"Generika",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/GenerikaDrugstorePH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564876",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:["generika drugstore"],matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Gintarine.Vaistine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15857801",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Asia)":{name:"Guardian (Asia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Guardianmy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63371124",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["bn","id","kh","my","sg","vn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Australia)":{name:"Guardian (Australia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/GuardianAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367814",amenity:"pharmacy"},addTags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["guardian pharmacies","guardian pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Guardian (Canada)":{name:"Guardian (Canada)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q65553864",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q65553864",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Health Mart":{name:"Health Mart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HealthMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5690597",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Health Mart","brand:wikidata":"Q5690597","brand:wikipedia":"en:Health Mart",healthcare:"pharmacy",name:"Health Mart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["health mart pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/I.D.A.":{name:"I.D.A.",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q65553883",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"I.D.A.","brand:wikidata":"Q65553883",healthcare:"pharmacy",name:"I.D.A."},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/inkafarmaperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10997748",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/JeanCoutu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3117457",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/KimiaFarmaCare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11264892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/kinneydrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6414090",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/lloydspharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6662870",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["be","gb","ie","im"],terms:["lloyds"],matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/LondonDrugs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3258955",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Longs Drugs (Hawaii)":{name:"Longs Drugs (Hawaii)",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLongs%20Drugs%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16931196",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Longs Drugs","brand:wikidata":"Q16931196","brand:wikipedia":"en:Longs Drugs",healthcare:"pharmacy",name:"Longs Drugs",short_name:"Longs"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mannings":{name:"Mannings",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/manningshongkong/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13646560",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cn","hk","mo"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Marc's Pharmacy":{name:"Marc's Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/MedPlus":{name:"MedPlus",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q65684234",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"MedPlus","brand:wikidata":"Q65684234","brand:wikipedia":"en:MedPlus",healthcare:"pharmacy",name:"MedPlus"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/mercurydrugph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6818610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mifarma":{name:"Mifarma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MifarmaPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564998",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Multipharma":{name:"Multipharma",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Multipharma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62565018",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/MenessAptieka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57583051",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciaspaguemenos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7124466",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:["farmácia pague menos"],matchScore:2,suggestion:true},"amenity/pharmacy/PharmaChoice":{name:"PharmaChoice",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/875423108513091584/kcsmBdjL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7180716",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"PharmaChoice","brand:wikidata":"Q7180716","brand:wikipedia":"en:PharmaChoice",healthcare:"pharmacy",name:"PharmaChoice"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/PharmaSave (Australia)":{name:"PharmaSave (Australia)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmasaveBrentfordSquare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367906",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmaciePrincipale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547749",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacy 4 Less":{name:"Pharmacy 4 Less",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/pharmacy4less/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367608",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/shoppersdrugmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave (Canada)":{name:"Pharmasave (Canada)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmasaveAtlantic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17093822",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Priceline Pharmacy":{name:"Priceline Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PricelineAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242652",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["priceline"],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Colombia)":{name:"Punto Farma (Colombia)",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q62595271",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Honduras)":{name:"Punto Farma (Honduras)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasPuntoFarma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595229",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["hn"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Punto Farma (Paraguay)":{name:"Punto Farma (Paraguay)",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Puntofarmapy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595220",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["py"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Remedy'sRx":{name:"Remedy'sRx",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q65553833",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Remedy'sRx","brand:wikidata":"Q65553833",healthcare:"pharmacy",name:"Remedy'sRx"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Rexall/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7319360",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/riteaid/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433273",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["rite aid pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Rose Pharmacy":{name:"Rose Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RosePharmacyInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663208",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rowlands Pharmacy":{name:"Rowlands Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/RowlandsPharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663235",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Salcobrand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2877054",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],terms:["farmacias salcobrand"],matchScore:2,suggestion:true},"amenity/pharmacy/Sana Sana":{name:"Sana Sana",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/FarmaciasSanaSanaEc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62564499",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ec"],terms:["farmacias sana sana"],matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Sensiblu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12740640",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/shoppersdrugmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1820137",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/southstardrugph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7568544",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/Superdrug/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643261",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/São João":{name:"São João",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/farmaciassaojoao/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663306",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/TGP":{name:"TGP",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/tgpthegenericspharmacy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61948677",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/TerryWhite Chemmart":{name:"TerryWhite Chemmart",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/terrywhitechemmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24089773",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["terrywhite","terrywhite chemist","terrywhite chemists"],matchScore:2,suggestion:true},"amenity/pharmacy/UFS":{name:"UFS",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ufsdispensaries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63367573",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["au"],terms:["ufs dispensaries"],matchScore:2,suggestion:true},"amenity/pharmacy/Unichem Pharmacy":{name:"Unichem Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/UnichemNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663379",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/uniprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q683265",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Watsons":{name:"Watsons",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},reference:{key:"amenity",value:"pharmacy"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/PharmacyWell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726524",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["gb"],terms:["well"],matchScore:2,suggestion:true},"amenity/pharmacy/Ziko Apteka":{name:"Ziko Apteka",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/ZikoUrodaiZdrowie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63432892",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/А5":{name:"А5",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/apteka5/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62663476",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Бережная аптека":{name:"Бережная аптека",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/BereznayaApteka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62664194",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Ригла":{name:"Ригла",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/rigla.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4394431",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/סופר-פארם":{name:"סופר-פארם",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/super.pharm.co.il/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13220217",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/kusurinofukutaro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17214460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウェルパーク":{name:"ウェルパーク",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288610",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",imageURL:"https://graph.facebook.com/WelciaBHG.SG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11288684",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11288687",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11295397",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11297751",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/クリエイト":{name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11299163",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1050257672753229825/lhBcsYat_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301948",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11305867",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/スギ薬局":{name:"スギ薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11311460",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11314133",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ダイコクドラッグ":{name:"ダイコクドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q11316754",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/ツルハドラッグ":{name:"ツルハドラッグ",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1061863510546640898/j9crJ6gs_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11318826",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/トモズ":{name:"トモズ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q7820097",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:["トモズエキスプレス"],matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q8014776",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/Canada Post":{name:"Canada Post",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q1032001",amenity:"post_box"},addTags:{amenity:"post_box",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q157645",amenity:"post_box"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag"],matchScore:2,suggestion:true},"amenity/post_box/FedEx":{name:"FedEx",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/FedEx/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q459477",amenity:"post_box"},addTags:{amenity:"post_box",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},terms:[],matchScore:2,suggestion:true},"amenity/post_box/UPS":{name:"UPS",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/ups/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q155026",amenity:"post_box"},addTags:{amenity:"post_box",brand:"UPS","brand:wikidata":"Q155026","brand:wikipedia":"en:United Parcel Service",name:"UPS"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"temaki-post_box",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","vertex"],tags:{"brand:wikidata":"Q668687",amenity:"post_box"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",imageURL:"https://graph.facebook.com/australiapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1142936",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",imageURL:"https://graph.facebook.com/109452512407680/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909429",amenity:"post_office"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},countryCodes:["mo"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032001",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",imageURL:"https://graph.facebook.com/correios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375004",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreoOficialSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036566",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",imageURL:"https://graph.facebook.com/correoschile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172893",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172894",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de México":{name:"Correos de México",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeMexico.Mexpost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172898",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de México","brand:wikidata":"Q5172898","brand:wikipedia":"en:Correos de México",name:"Correos de México"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",imageURL:"https://graph.facebook.com/dhl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489815",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL"},terms:["dhl paketshop"],matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",imageURL:"https://graph.facebook.com/350375105088695/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q541030",amenity:"post_office"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},countryCodes:["at","de","pl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",imageURL:"https://graph.facebook.com/deutschepost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157645",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},countryCodes:["de"],terms:["deutsche post ag","deutsche post filiale"],matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",imageURL:"https://graph.facebook.com/FANCourier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12727984",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",imageURL:"https://graph.facebook.com/FedEx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q459477",amenity:"post_office"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",imageURL:"https://graph.facebook.com/Hermesparcels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1613532",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},countryCodes:["de"],terms:["hermes"],matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",imageURL:"https://graph.facebook.com/LBCexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17075584",amenity:"post_office"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},countryCodes:["ph"],terms:["lbc express"],matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",imageURL:"https://graph.facebook.com/laposte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q373724",amenity:"post_office"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",imageURL:"https://graph.facebook.com/mrwespana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23767821",amenity:"post_office"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",imageURL:"https://graph.facebook.com/correos.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q776605",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},terms:["correos"],matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",imageURL:"https://graph.facebook.com/pocztapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q168833",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/PostalAnnex":{name:"PostalAnnex",icon:"maki-post",imageURL:"https://graph.facebook.com/PostalAnnex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61960357",amenity:"post_office"},addTags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",imageURL:"https://graph.facebook.com/PosteItaliane/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q495026",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Serpost":{name:"Serpost",icon:"maki-post",imageURL:"https://graph.facebook.com/428188863953059/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19521863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"},countryCodes:["pe"],terms:["servicios postales del perú"],matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",imageURL:"https://graph.facebook.com/slovenskaposta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191849",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},countryCodes:["sk"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",imageURL:"https://graph.facebook.com/theupsstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7771029",amenity:"post_office"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store",short_name:"UPS"},countryCodes:["ca","us"],terms:["ups store"],matchScore:2,suggestion:true},"amenity/post_office/United States Post Office":{name:"United States Post Office",icon:"maki-post",imageURL:"https://graph.facebook.com/USPS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q668687",amenity:"post_office"},addTags:{amenity:"post_office",brand:"United States Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"United States Post Office"},countryCodes:["us"],terms:["united states postal service","us post office","us postal service","usps"],matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",imageURL:"https://graph.facebook.com/HellenicPostELTA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1275135",amenity:"post_office"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Белпошта":{name:"Белпошта",icon:"maki-post",imageURL:"https://graph.facebook.com/belpost.by/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2662336",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"},countryCodes:["by"],terms:["белпочта"],matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",imageURL:"https://graph.facebook.com/Kazpost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q746263",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},countryCodes:["kz"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта":{name:"Нова Пошта",icon:"maki-post",imageURL:"https://graph.facebook.com/nova.poshta.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12133863",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Нова Пошта","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта"},countryCodes:["ua"],terms:["Нова Пошта №1","Нова Пошта №2","Нова Пошта №3","Нова Пошта №4"],matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",imageURL:"https://graph.facebook.com/ruspost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502763",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/СДЭК":{name:"СДЭК",icon:"maki-post",imageURL:"https://graph.facebook.com/edostavka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28665980",amenity:"post_office"},addTags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",imageURL:"https://graph.facebook.com/ukrposhta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2470783",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",geometry:["point","area"],tags:{"brand:wikidata":"Q1066476",amenity:"post_office"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"amenity/prep_school/Huntington Learning Center":{name:"Huntington Learning Center",icon:"temaki-school",imageURL:"https://graph.facebook.com/HuntingtonHelps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5945399",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"},countryCodes:["us"],terms:["huntington"],matchScore:2,suggestion:true},"amenity/prep_school/KUMON (Japan)":{name:"KUMON (Japan)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"},countryCodes:["jp"],terms:["くもん","公文"],matchScore:2,suggestion:true},"amenity/prep_school/Kumon (International)":{name:"Kumon (International)",icon:"temaki-school",imageURL:"https://graph.facebook.com/kumon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q142054",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"},terms:["kumon learning center"],matchScore:2,suggestion:true},"amenity/prep_school/Mathnasium":{name:"Mathnasium",icon:"temaki-school",imageURL:"https://graph.facebook.com/mathnasium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6787302",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Mathnasium","brand:wikidata":"Q6787302","brand:wikipedia":"en:Mathnasium",name:"Mathnasium"},countryCodes:["us"],terms:["mathnasium learning center"],matchScore:2,suggestion:true},"amenity/prep_school/Russian School of Mathematics":{name:"Russian School of Mathematics",icon:"temaki-school",imageURL:"https://graph.facebook.com/RussianMath/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382122",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"},countryCodes:["us"],terms:["rsm","russian school of math"],matchScore:2,suggestion:true},"amenity/prep_school/Sylvan":{name:"Sylvan",icon:"temaki-school",imageURL:"https://graph.facebook.com/SylvanLearning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7660663",amenity:"prep_school"},addTags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"},countryCodes:["us"],terms:["sylvan learning"],matchScore:2,suggestion:true},"amenity/prep_school/栄光ゼミナール":{name:"栄光ゼミナール",icon:"temaki-school",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEikoh%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11535632",amenity:"prep_school"},addTags:{amenity:"prep_school",brand:"栄光ゼミナール","brand:ja":"栄光ゼミナール","brand:ja-Hira":"えいこうゼミナール","brand:ja-Latn":"Eikō Zemināru","brand:wikidata":"Q11535632","brand:wikipedia":"ja:栄光ゼミナール",name:"栄光ゼミナール","name:en":"Eikoh Seminar","name:ja":"栄光ゼミナール","name:ja-Hira":"えいこうゼミナール","name:ja-Latn":"Eikō Zemināru"},countryCodes:["jp"],terms:["eikoh"],matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",imageURL:"https://graph.facebook.com/LittleFreeLibrary/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6650101",amenity:"public_bookcase"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/100MontaditosSpain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8355805",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"},countryCodes:["es","it","pt"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/3 Brewers (On)":{name:"3 Brewers (On)",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/3Brasseursca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3230326",amenity:"restaurant",cuisine:"burger;pizza;seafood"},addTags:{amenity:"restaurant",brand:"3 Brasseurs","brand:wikidata":"Q3230326","brand:wikipedia":"fr:Les 3 Brasseurs",cuisine:"burger;pizza;seafood",name:"3 Brewers","name:fr":"3 Brasseurs",official_name:"Les 3 Brasseurs"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ASKItalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4807056",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee's":{name:"Applebee's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Applebeesmundoe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q621532",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"},reference:{key:"cuisine",value:"american"},terms:["applebees bar and grill","applebees grill and bar","applebees neighborhood bar and grill"],matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/AutogrillOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q786790",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},countryCodes:["at","es","fr","it"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/BBB":{name:"BBB",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BurgusBurgerBar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760094",amenity:"restaurant"},addTags:{alt_name:"Burgus Burger Bar","alt_name:en":"Burgus Burger Bar",amenity:"restaurant",brand:"Burgus Burger Bar","brand:en":"Burgus Burger Bar","brand:wikidata":"Q64760094",cuisine:"burger",name:"BBB","name:en":"BBB"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/BJ's":{name:"BJ's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BJsRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835755",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bellaitalia.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4883362",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Benihana":{name:"Benihana",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/Benihana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4887996",amenity:"restaurant",cuisine:"japanese;teppanyaki;steak"},addTags:{amenity:"restaurant",brand:"Benihana","brand:wikidata":"Q4887996","brand:wikipedia":"en:Benihana",cuisine:"japanese;teppanyaki;steak",name:"Benihana"},reference:{key:"cuisine",value:"japanese"},countryCodes:["aw","br","ca","pa","sv","us"],terms:["benihana of tokyo"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Bertucci's":{name:"Bertucci's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Bertuccis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4895917",amenity:"restaurant",cuisine:"pizza;italian"},addTags:{amenity:"restaurant",brand:"Bertucci's","brand:wikidata":"Q4895917","brand:wikipedia":"en:Bertucci's",cuisine:"pizza;italian",name:"Bertucci's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Black":{name:"Black",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/blackbarnburger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760158",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Black Bar Burger","brand:en":"Black Bar Burger","brand:he":"בלאק בורגר","brand:wikidata":"Q64760158",cuisine:"burger",name:"Black","name:en":"Black","name:he":"בלאק"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BlackBearDiner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4920343",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Blaze Pizza":{name:"Blaze Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BlazePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23016666",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["bh","ca","kw","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bobevans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4932386",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Bonanza Steakhouse":{name:"Bonanza Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ponbonsteakhouses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64045992",amenity:"restaurant",cuisine:"american;steak;buffet"},addTags:{amenity:"restaurant",brand:"Bonanza Steakhouse","brand:wikidata":"Q64045992",cuisine:"american;steak;buffet",name:"Bonanza Steakhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["bonanza"],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/bonefishgrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4941599",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/BostonPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q894578",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bravo":{name:"Bravo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bravoitalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64055574",amenity:"restaurant",cuisine:"italian"},addTags:{alt_name:"Bravo Cucina Italiana",amenity:"restaurant",brand:"Bravo","brand:wikidata":"Q64055574",cuisine:"italian",name:"Bravo"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Brio":{name:"Brio",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/brioitalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64055835",amenity:"restaurant",cuisine:"italian"},addTags:{alt_name:"Brio Tuscan Grille",amenity:"restaurant",brand:"Brio","brand:wikidata":"Q64055835",cuisine:"italian",name:"Brio"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Buca di Beppo":{name:"Buca di Beppo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bucadibeppo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982340",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/buffalogrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q944655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},countryCodes:["es","fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BuffaloWildWings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509255",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wings & Rings":{name:"Buffalo Wings & Rings",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wingsandrings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985900",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/CafeRio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5017108",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/californiapizzakitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109854",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/carluccios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25111797",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Carrabbas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045999",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cheddar's":{name:"Cheddar's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CheddarsScratchKitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089187",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cheeburger Cheeburger":{name:"Cheeburger Cheeburger",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/136947372998541/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089247",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cheeburger Cheeburger","brand:wikidata":"Q5089247","brand:wikipedia":"en:Cheeburger Cheeburger",cuisine:"burger",name:"Cheeburger Cheeburger"},countryCodes:["ca","sa","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Chevys":{name:"Chevys",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ChevysFreshMex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5094466",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"},reference:{key:"cuisine",value:"mexican"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Chilis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1072948",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/chiquito.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5101775",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/ChuckECheese/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2438391",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:["chuck e cheese"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/Cicis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2972189",amenity:"restaurant",cuisine:"pizza;buffet"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza;buffet",name:"Cici's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Claim Jumper":{name:"Claim Jumper",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ClaimJumperRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5125081",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Coast to Coast":{name:"Coast to Coast",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/coasttocoastrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22000729",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Coast to Coast","brand:wikidata":"Q22000729","brand:wikipedia":"en:Coast to Coast (restaurant)",cuisine:"american",name:"Coast to Coast"},reference:{key:"cuisine",value:"american"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cora":{name:"Cora",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/948562746962071553/e99P1Xiq_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2996960",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cora","brand:wikidata":"Q2996960","brand:wikipedia":"en:Cora (restaurant)",cuisine:"breakfast",name:"Cora"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Cosmo":{name:"Cosmo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CosmoRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174239",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Country Pride":{name:"Country Pride",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/CountryPrideRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64051992",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Country Pride","brand:wikidata":"Q64051992",cuisine:"american",name:"Country Pride"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["country pride restaurant"],matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q3116688",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/crackerbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4492609",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Dave & Buster's":{name:"Dave & Buster's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/daveandbusters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5228205",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Dave & Buster's","brand:wikidata":"Q5228205","brand:wikipedia":"en:Dave & Buster's",cuisine:"american",name:"Dave & Buster's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1189695",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/dickeysbarbecuepit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19880747",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},countryCodes:["us"],terms:["dickeys barbecue"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Donatos Pizza":{name:"Donatos Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/DonatosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1240741",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["donatos"],matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eastsidemarios/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5329375",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Eat'n Park":{name:"Eat'n Park",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/EatnParkRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5331211",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Eat'n Park","brand:wikidata":"Q5331211","brand:wikipedia":"en:Eat'n Park",cuisine:"american",name:"Eat'n Park"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/famousdaves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433448",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},countryCodes:["us"],terms:["famous daves bbq"],matchScore:2,suggestion:true},"amenity/restaurant/american/First Watch":{name:"First Watch",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/FirstWatch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5454064",amenity:"restaurant",cuisine:"american;breakfast"},addTags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american;breakfast",name:"First Watch"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/flunch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629326",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fostershollywood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5864366",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frankiebennys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5490892",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Freshii":{name:"Freshii",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/freshii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5503051",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/friendlys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1464513",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Frisch's Big Boy":{name:"Frisch's Big Boy",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/frischsbigboy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5504660",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/fuddruckers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5507056",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Gatti's Pizza":{name:"Gatti's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://pbs.twimg.com/profile_images/1034520805923684352/wc5SE5R6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5527509",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Gatti's Pizza","brand:wikidata":"Q5527509","brand:wikipedia":"en:Gatti's Pizza",cuisine:"pizza",name:"Gatti's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Giordano's Pizzeria":{name:"Giordano's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/giordanospizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5563393",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Giordano's Pizzeria","brand:wikidata":"Q5563393","brand:wikipedia":"en:Giordano's Pizzeria",cuisine:"pizza",name:"Giordano's Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Godfather's Pizza":{name:"Godfather's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/godfatherspizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5576353",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/goldencorral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4039560",amenity:"restaurant",cuisine:"american;buffet"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american;buffet",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["golden corral buffet","golden corral buffet and grill"],matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/gourmetburgerkitchen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5588445",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},countryCodes:["gb","gr","ie"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Grotto Pizza":{name:"Grotto Pizza",icon:"maki-restaurant-pizza",imageURL:"https://pbs.twimg.com/profile_images/3122105126/6f68644cf2b9b86b935ad99ee57fffad_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q20709024",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Grotto Pizza","brand:wikidata":"Q20709024","brand:wikipedia":"en:Grotto Pizza",cuisine:"pizza",name:"Grotto Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Handmade Burger Co.":{name:"Handmade Burger Co.",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/handmadeburgercompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56154673",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Handmade Burger Co.","brand:wikidata":"Q56154673",cuisine:"burger",name:"Handmade Burger Co."},countryCodes:["gb"],terms:["Handmade Burger Company"],matchScore:2,suggestion:true},"amenity/restaurant/Hans im Glück":{name:"Hans im Glück",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hansimglueck.burgergrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22569868",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"},countryCodes:["at","ch","de","sg"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Happy's Pizza":{name:"Happy's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/EatHappysPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5652393",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Happy's Pizza","brand:wikidata":"Q5652393","brand:wikipedia":"en:Happy's Pizza",cuisine:"pizza",name:"Happy's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hardrock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q918151",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Harvester":{name:"Harvester",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/harvesterrestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5676915",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Hippopotamus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3136174",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hooters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1025921",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/HuddleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5928324",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Husky House":{name:"Husky House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",cuisine:"diner",name:"Husky House"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/IHOP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1185675",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"},terms:["international house of pancakes"],matchScore:2,suggestion:true},"amenity/restaurant/italian/IL Патио":{name:"IL Патио",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosInter.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4397763",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"italian",name:"IL Патио"},reference:{key:"cuisine",value:"italian"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Iron Skillet":{name:"Iron Skillet",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/IronSkilletRestaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64052855",amenity:"restaurant",cuisine:"american;buffet"},addTags:{amenity:"restaurant",brand:"Iron Skillet","brand:wikidata":"Q64052855",cuisine:"american;buffet",name:"Iron Skillet"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["iron skillet restaurant"],matchScore:2,suggestion:true},"amenity/restaurant/american/Jack Astor's":{name:"Jack Astor's",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1003974042351792130/-v3NNNEb_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6111066",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Jack Astor's","brand:wikidata":"Q6111066","brand:wikipedia":"en:Jack Astor's Bar and Grill",cuisine:"american",name:"Jack Astor's"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/JasonsDeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997641",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/JetsPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997713",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/joescrabshack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6208210",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Johnny Carino's":{name:"Johnny Carino's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/carinositalian/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5039637",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Johnny Carino's","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino's"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:["carinios"],matchScore:2,suggestion:true},"amenity/restaurant/Johnny Rockets":{name:"Johnny Rockets",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/johnnyrockets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1051593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"},terms:["johnny rocket"],matchScore:2,suggestion:true},"amenity/restaurant/american/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KelseysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6386459",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},reference:{key:"cuisine",value:"american"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Kudu":{name:"Kudu",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/KuduRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6441777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},countryCodes:["sa"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/La Boucherie":{name:"La Boucherie",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/restaurantlaboucherie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21427479",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/La Cage":{name:"La Cage",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/lacagebrasseriesportive/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3206980",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"La Cage","brand:wikidata":"Q3206980","brand:wikipedia":"fr:La Cage aux Sports",cuisine:"burger;chicken;sandwich;fish;pasta",name:"La Cage"},countryCodes:["ca"],terms:["La Cage aux Sports"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/LaRosa's Pizzeria":{name:"LaRosa's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/LaRosasPizzeria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6460833",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Legal Sea Foods":{name:"Legal Sea Foods",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/LegalSeaFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6517417",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Legal Sea Foods","brand:wikidata":"Q6517417","brand:wikipedia":"en:Legal Sea Foods",cuisine:"seafood",name:"Legal Sea Foods"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Les 3 Brasseurs (Qc,Br,Fr)":{name:"Les 3 Brasseurs (Qc,Br,Fr)",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/3Brasseursca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3230326",amenity:"restaurant",cuisine:"burger;pizza;seafood"},addTags:{amenity:"restaurant",brand:"3 Brasseurs","brand:wikidata":"Q3230326","brand:wikipedia":"fr:Les 3 Brasseurs",cuisine:"burger;pizza;seafood",name:"3 Brasseurs","name:en":"3 Brewers",official_name:"Les 3 Brasseurs"},reference:{key:"cuisine",value:"pizza"},countryCodes:["br","ca","fr"],terms:["3 Brasseurs"],matchScore:2,suggestion:true},"amenity/restaurant/american/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Logans.Roadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6666872",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/longhornsteakhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3259007",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Lou Malnati's Pizzeria":{name:"Lou Malnati's Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/loumalnatis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6685628",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Lou Malnati's Pizzeria","brand:wikidata":"Q6685628","brand:wikipedia":"en:Lou Malnati's Pizzeria",cuisine:"pizza",name:"Lou Malnati's Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/LovingHutUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3491655",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/leondebruxellesofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21041507",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/thai/MK Restaurants":{name:"MK Restaurants",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/mkrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075359",amenity:"restaurant",cuisine:"thai"},addTags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"},reference:{key:"cuisine",value:"thai"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MarcosPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6757382",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Marie Callender's":{name:"Marie Callender's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/MarieCallenders/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6762784",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Marie Callender's","brand:wikidata":"Q6762784","brand:wikipedia":"en:Marie Callender's",cuisine:"american",name:"Marie Callender's"},reference:{key:"cuisine",value:"american"},countryCodes:["mx","us"],terms:["marie calendar","marie calendar's","marie callendar's"],matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/MaxsRestaurantNA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6794477",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's Restaurant",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},countryCodes:["ph"],terms:["Max's"],matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mcalistersdeli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020829",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/McCormick & Schmick's":{name:"McCormick & Schmick's",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/mccormickandschmicks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6800562",amenity:"restaurant",cuisine:"seafood;steak"},addTags:{amenity:"restaurant",brand:"McCormick & Schmick's","brand:wikidata":"Q6800562","brand:wikipedia":"en:McCormick & Schmick's",cuisine:"seafood;steak",name:"McCormick & Schmick's"},reference:{key:"cuisine",value:"seafood"},countryCodes:["us"],terms:["mccormick and schmick","mccormick and schmicks grill"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mellowmushroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17021360",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mikes":{name:"Mikes",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/MikesRestaurant.PageOfficielle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3313615",amenity:"restaurant",cuisine:"pizza;pasta;sandwich"},addTags:{amenity:"restaurant",brand:"Mikes","brand:wikidata":"Q3313615","brand:wikipedia":"fr:Mikes",cuisine:"pizza;pasta;sandwich",name:"Mikes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mimiscafe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022081",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Montana's":{name:"Montana's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/montanasBBQ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022490",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Montana's","brand:wikidata":"Q17022490","brand:wikipedia":"en:Montana's BBQ & Bar",cuisine:"barbecue",name:"Montana's",official_name:"Montana's BBQ & Bar"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Morton's The Steakhouse":{name:"Morton's The Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/mortons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17022759",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Morton's The Steakhouse","brand:wikidata":"Q17022759","brand:wikipedia":"en:Morton's The Steakhouse",cuisine:"steak_house",name:"Morton's The Steakhouse"},countryCodes:["us"],terms:["mortons"],matchScore:2,suggestion:true},"amenity/restaurant/Moses":{name:"Moses",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/MosesIsrael/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760150",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Moses","brand:en":"Moses","brand:he":"מוזס","brand:wikidata":"Q64760150",cuisine:"burger",name:"Moses","name:en":"Moses","name:he":"מוזס"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mountain Mike's":{name:"Mountain Mike's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/mountainmikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925120",amenity:"restaurant",cuisine:"pizza"},addTags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/NandosUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3472954",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/noodlesandcompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7049673",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},countryCodes:["us"],terms:["noodles and co","noodles co","noodles company"],matchScore:2,suggestion:true},"amenity/restaurant/american/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ocharleysfans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071703",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Ocean Basket":{name:"Ocean Basket",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/daoceanbasket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075311",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"},reference:{key:"cuisine",value:"seafood"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/OldChicago/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64411347",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q64411347",cuisine:"pizza",name:"Old Chicago",official_name:"Old Chicago Pizza & Taproom"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OWWofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25402475",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OliveGarden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045312",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/On The Border":{name:"On The Border",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/OnTheBorderMexicanGrillandCantina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7091305",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"tex-mex",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/778575984958267392/MGtDYhwg_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1064893",amenity:"restaurant",cuisine:"american;steak"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american;steak",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pfchangs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5360181",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's",official_name:"P.F. Chang's China Bistro"},reference:{key:"cuisine",value:"asian"},countryCodes:["mx","us"],terms:["pf chang"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Papa Gino's":{name:"Papa Gino's",icon:"maki-restaurant-pizza",imageURL:"https://pbs.twimg.com/profile_images/645764802531454976/5QHfmIzP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7132333",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Papa Gino's","brand:wikidata":"Q7132333","brand:wikipedia":"en:Papa Gino's",cuisine:"pizza",name:"Papa Gino's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Pardos Chicken":{name:"Pardos Chicken",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pardoschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17624435",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/peiwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7160898",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},countryCodes:["us"],terms:["pei wei asian diner"],matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eatatperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7169056",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở 24":{name:"Phở 24",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pho24.24giavitinhte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63863118",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{amenity:"restaurant",brand:"Phở 24","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"},reference:{key:"cuisine",value:"vietnamese"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở Hòa":{name:"Phở Hòa",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/phohoanoodlesoup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55629932",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"},reference:{key:"cuisine",value:"vietnamese"},countryCodes:["ca","id","kr","ms","ph","tw","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pieology Pizzeria":{name:"Pieology Pizzeria",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pieology/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60746053",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["pieology"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzafactoryinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39054369",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzahutus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191615",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/PizzaRanchRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7199978",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/pizzaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q662845",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Restaumarch%C3%A9.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7316076",amenity:"restaurant",cuisine:"french"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ponderosa Steakhouse":{name:"Ponderosa Steakhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ponbonsteakhouses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64038204",amenity:"restaurant",cuisine:"american;steak;buffet"},addTags:{amenity:"restaurant",brand:"Ponderosa Steakhouse","brand:wikidata":"Q64038204",cuisine:"american;steak;buffet",name:"Ponderosa Steakhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["ae","eg","qa","tw","us"],terms:["ponderosa"],matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/loveprezzo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242489",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Quaker Steak & Lube":{name:"Quaker Steak & Lube",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TheOfficialQSL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7268570",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Quaker Steak & Lube","brand:wikidata":"Q7268570","brand:wikipedia":"en:Quaker Steak & Lube",cuisine:"wings",name:"Quaker Steak & Lube"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",imageURL:"https://graph.facebook.com/redlobster/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q846301",amenity:"restaurant",cuisine:"seafood"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},reference:{key:"cuisine",value:"seafood"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RedRobin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304886",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Romano's Macaroni Grill":{name:"Romano's Macaroni Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RomanosMacaroniGrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7362714",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"},reference:{key:"cuisine",value:"italian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/RoundTablePizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7371139",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:["round table"],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/rubytuesday/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7376400",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Ruth's Chris Steak House":{name:"Ruth's Chris Steak House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RuthsChrisSteakHouseNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7382829",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Saltgrass Steak House":{name:"Saltgrass Steak House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/saltgrass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7406113",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Saltgrass Steak House","brand:wikidata":"Q7406113","brand:wikipedia":"en:Saltgrass Steak House",cuisine:"steak_house",name:"Saltgrass Steak House"},countryCodes:["us"],terms:["saltgrass"],matchScore:2,suggestion:true},"amenity/restaurant/Scores":{name:"Scores",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/RestaurantScores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3476059",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Scores","brand:wikidata":"Q3476059","brand:wikipedia":"fr:Scores",cuisine:"chicken;barbecue",name:"Scores"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/shakeyspizzaparlorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6134929",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SharisPies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7489612",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/shoneys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500392",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/sizzler/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1848822",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SkylineChili/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151224",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SmittysRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7545728",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Snappy Tomato Pizza":{name:"Snappy Tomato Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/SnappyTomatoPizza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7547352",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SpurSteakRanches/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581546",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},countryCodes:["za"],terms:["spur steak ranches"],matchScore:2,suggestion:true},"amenity/restaurant/St-Hubert":{name:"St-Hubert",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/sthubert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3495225",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"St-Hubert","brand:wikidata":"Q3495225","brand:wikipedia":"en:St-Hubert",cuisine:"chicken;barbecue",name:"St-Hubert"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/St. Louis Bar & Grill":{name:"St. Louis Bar & Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/stlouisbarandgrill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65567668",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"St. Louis Bar & Grill","brand:wikidata":"Q65567668",cuisine:"chicken",name:"St. Louis Bar & Grill"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/steaknshake/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605233",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SunsetGrillBreakfast/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62112489",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"},reference:{key:"cuisine",value:"american"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/SwissChalet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2372909",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TGIFridays/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1524184",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/texasroadhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7707945",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thecheesecakefactory/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1045842",amenity:"restaurant",cuisine:"american"},addTags:{alt_name:"Cheesecake Factory",amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/thekegsteakhouseandbar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7744066",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},countryCodes:["ca","us"],terms:["keg"],matchScore:2,suggestion:true},"amenity/restaurant/The Melting Pot":{name:"The Melting Pot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/themeltingpotrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7750948",amenity:"restaurant"},addTags:{alt_name:"Melting Pot",amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1091279321795309573/A5J8Nhws_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7811777",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/mexican/Toks":{name:"Toks",icon:"fas-pepper-hot",imageURL:"https://graph.facebook.com/ToksMx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48835586",amenity:"restaurant",cuisine:"mexican"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/TonyRomas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2213883",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},terms:["tony roma"],matchScore:2,suggestion:true},"amenity/restaurant/pizza/Toppers Pizza":{name:"Toppers Pizza",icon:"maki-restaurant-pizza",imageURL:"https://graph.facebook.com/ToppersRocks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7825113",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Toppers Pizza","brand:wikidata":"Q7825113","brand:wikipedia":"en:Toppers Pizza",cuisine:"pizza",name:"Toppers Pizza"},reference:{key:"cuisine",value:"pizza"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Vapiano/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q506252",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},reference:{key:"cuisine",value:"italian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/villageinnrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7930659",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/VIPSMX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48783378",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"},countryCodes:["es","mx"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/WaffleHouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1701206",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/wagamama.spain/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q503715",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/WasabiUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23891278",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Western Sizzlin'":{name:"Western Sizzlin'",icon:"maki-restaurant",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWestern%20Sizzlin'%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7988295",amenity:"restaurant",cuisine:"american;steak"},addTags:{amenity:"restaurant",brand:"Western Sizzlin'","brand:wikidata":"Q7988295","brand:wikipedia":"en:Western Sizzlin'",cuisine:"american;steak",name:"Western Sizzlin'"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:["western sizzling"],matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/whitespot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7995414",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Wild Wing":{name:"Wild Wing",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/WildWingRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8000869",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Wild Wing","brand:wikidata":"Q8000869","brand:wikipedia":"en:Wild Wing Restaurants",cuisine:"chicken",name:"Wild Wing"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Wingstop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8025339",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",imageURL:"https://graph.facebook.com/YOSushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105441",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/Yard House":{name:"Yard House",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/yardhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21189156",amenity:"restaurant",cuisine:"american"},addTags:{alcohol:"yes",amenity:"restaurant",brand:"Yard House","brand:wikidata":"Q21189156","brand:wikipedia":"en:Yard House",cuisine:"american",name:"Yard House"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/wearezizzi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8072944",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/sushi/Планета Суши":{name:"Планета Суши",icon:"fas-fish",imageURL:"https://graph.facebook.com/sushiplanet.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62739250",amenity:"restaurant",cuisine:"sushi"},addTags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"},reference:{key:"cuisine",value:"sushi"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/Тануки":{name:"Тануки",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/tanuki.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62758690",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"},reference:{key:"cuisine",value:"japanese"},countryCodes:["kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/בורגר סאלון":{name:"בורגר סאלון",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BurgerSaloon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64760057",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"בורגר סאלון","brand:en":"Burger Saloon","brand:he":"בורגר סאלון","brand:wikidata":"Q64760057",cuisine:"burger",name:"בורגר סאלון","name:en":"Burger Saloon","name:he":"בורגר סאלון"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/いきなり!ステーキ":{name:"いきなり!ステーキ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ikinari.steak/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21652405",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/hanamaruudon.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11275674",amenity:"restaurant",cuisine:"japanese;udon"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11276815",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/やよい軒":{name:"やよい軒",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/yayoiphilippines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11280577",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/カプリチョーザ":{name:"カプリチョーザ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/capricciosa.restaurant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294660",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ココス":{name:"ココス",icon:"maki-restaurant-noodle",imageURL:"https://pbs.twimg.com/profile_images/875584429069959169/5l38DoS7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11301951",amenity:"restaurant",cuisine:"western;japanese"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Saizeriya4Fun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886564",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11310517",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1098912743497711618/uM80VkgK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11310628",amenity:"restaurant",cuisine:"italian;japanese"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"},reference:{key:"cuisine",value:"italian"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q10852718",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ステーキガスト":{name:"ステーキガスト",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ステーキガスト","brand:en":"Skylark","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:en":"Skylark","name:ja":"ステーキガスト"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/デニーズ":{name:"デニーズ",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11320661",amenity:"restaurant",cuisine:"western;japanese"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",cuisine:"western;japanese",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant-noodle",imageURL:"https://pbs.twimg.com/profile_images/1098907474789163010/uXiRaQ9S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11328598",amenity:"restaurant",cuisine:"chinese"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",cuisine:"chinese",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"},reference:{key:"cuisine",value:"chinese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bigboyrestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4386779",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q7334856",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11120884",amenity:"restaurant",cuisine:"japanese;italian;french"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/marugame/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10877253",amenity:"restaurant",cuisine:"noodle"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"},reference:{key:"cuisine",value:"noodle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/八方雲集":{name:"八方雲集",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/8wayTW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28417381",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/和食さと":{name:"和食さと",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/satorsgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11304897",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:["さと"],matchScore:2,suggestion:true},"amenity/restaurant/japanese/夢庵":{name:"夢庵",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11253593",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ootoya/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11435522",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/大阪王将":{name:"大阪王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/osakaohsho/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48743717",amenity:"restaurant",cuisine:"japanese;chinese"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11442172",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11450866",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/木曽路":{name:"木曽路",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11518589",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"木曽路","brand:en":"Kisoji","brand:jp":"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路","name:en":"Kisoji","name:jp":"木曽路"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11131335",amenity:"restaurant",cuisine:"chinese;breakfast"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",cuisine:"chinese;breakfast",name:"永和豆漿","name:en":"Yonghe Soy Milk"},reference:{key:"cuisine",value:"chinese"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11349387",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/japanese/華屋与兵衛":{name:"華屋与兵衛",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{"brand:wikidata":"Q11620063",amenity:"restaurant",cuisine:"japanese"},addTags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛"},reference:{key:"cuisine",value:"japanese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/chinese/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/ohshosaiyo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11666805",amenity:"restaurant",cuisine:"chinese;gyoza"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"},reference:{key:"cuisine",value:"chinese"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/빕스":{name:"빕스",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/ivips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12599540",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"amenity/school/Imagine Schools":{name:"Imagine Schools",icon:"maki-school",imageURL:"https://pbs.twimg.com/profile_images/378800000441414844/d5dd1489ee04654b0efb3f99873bea51_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6002737",amenity:"school"},addTags:{amenity:"school",brand:"Imagine Schools","brand:wikidata":"Q6002737","brand:wikipedia":"en:Imagine Schools",name:"Imagine Schools","operator:type":"private_non_profit"},countryCodes:["us"],terms:["imagine","imagine school"],matchScore:2,suggestion:true},"amenity/school/KIPP":{name:"KIPP",icon:"maki-school",imageURL:"https://graph.facebook.com/KIPPFoundation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6423304",amenity:"school"},addTags:{amenity:"school",brand:"KIPP","brand:wikidata":"Q6423304","brand:wikipedia":"en:KIPP (organization)",name:"KIPP",official_name:"Knowledge Is Power Program","operator:type":"private_non_profit"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/school/Success Academy":{name:"Success Academy",icon:"maki-school",imageURL:"https://graph.facebook.com/SuccessAcademies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q14707388",amenity:"school"},addTags:{amenity:"school",brand:"Success Academy","brand:wikidata":"Q14707388","brand:wikipedia":"en:Success Academy Charter Schools",name:"Success Academy","operator:type":"private_non_profit"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/social_centre/American Legion Hall":{name:"American Legion Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/americanlegionhq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q468865",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"},countryCodes:["us"],terms:["american legion"],matchScore:2,suggestion:true},"amenity/social_centre/Eagles Lodge":{name:"Eagles Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/foegrandaerie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5493810",amenity:"social_centre"},addTags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"},countryCodes:["us"],terms:["aeries","eagles","foe"],matchScore:2,suggestion:true},"amenity/social_centre/Elks Lodge":{name:"Elks Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/107605905935671/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2895789",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"},countryCodes:["us"],terms:["bpoe","elks"],matchScore:2,suggestion:true},"amenity/social_centre/Moose Lodge":{name:"Moose Lodge",icon:"fas-handshake",imageURL:"https://graph.facebook.com/heardofmoose/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6908585",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"},countryCodes:["bm","ca","us"],terms:["moose"],matchScore:2,suggestion:true},"amenity/social_centre/Odd Fellows Hall":{name:"Odd Fellows Hall",icon:"fas-handshake",imageURL:"https://graph.facebook.com/IOOFSGL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425508",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"},terms:["ioof","odd fellow","odd fellows"],matchScore:2,suggestion:true},"amenity/social_centre/VFW Post":{name:"VFW Post",icon:"fas-handshake",imageURL:"https://graph.facebook.com/VFWFans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3556413",amenity:"social_centre"},addTags:{amenity:"social_centre",brand:"Veterans of Foreign Wars of the United States","brand:wikidata":"Q3556413","brand:wikipedia":"en:Veterans of Foreign Wars",name:"VFW Post","name:en":"VFW Post",official_name:"Veterans of Foreign Wars of the United States","social_centre:for":"veterans"},countryCodes:["de","jp","kr","ph","th","us"],terms:["vfw"],matchScore:2,suggestion:true},"amenity/social_facility/Vet Center":{name:"Vet Center",icon:"temaki-social_facility",imageURL:"https://graph.facebook.com/VeteransHealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6580225",amenity:"social_facility"},addTags:{amenity:"social_facility",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"counselling","healthcare:counselling":"psychiatry","healthcare:for":"veterans",name:"Vet Center",social_facility:"healthcare;outreach","social_facility:for":"veterans"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/university/DeVry University":{name:"DeVry University",icon:"maki-college",imageURL:"https://graph.facebook.com/DEVRYUNIVERSITY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3298441",amenity:"university"},addTags:{amenity:"university",brand:"DeVry University","brand:wikidata":"Q3298441","brand:wikipedia":"en:DeVry University",name:"DeVry University",short_name:"DeVry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/university/Strayer University":{name:"Strayer University",icon:"maki-college",imageURL:"https://graph.facebook.com/StrayerUniversity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7622587",amenity:"university"},addTags:{amenity:"university",brand:"Strayer University","brand:wikidata":"Q7622587","brand:wikipedia":"en:Strayer University",name:"Strayer University",short_name:"Strayer"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/university/University of Phoenix":{name:"University of Phoenix",icon:"maki-college",imageURL:"https://graph.facebook.com/universityofphoenix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1889100",amenity:"university"},addTags:{amenity:"university",brand:"University of Phoenix","brand:wikidata":"Q1889100","brand:wikipedia":"en:University of Phoenix",name:"University of Phoenix",short_name:"UOPX"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Autosur":{name:"Autosur",icon:"maki-car",imageURL:"https://graph.facebook.com/autosurfrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224807",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Autosur","brand:wikidata":"Q64224807",name:"Autosur"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Autovision":{name:"Autovision",icon:"maki-car",imageURL:"https://graph.facebook.com/AutovisionFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224842",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Autovision","brand:wikidata":"Q64224842",name:"Autovision"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Dekra":{name:"Dekra",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/3238634623/8ccb79c10c4bfb652432961fe776c6c3_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q383711",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",official_name:"Dekra Automotive"},countryCodes:["de","fr"],terms:[],matchScore:2,suggestion:true},"amenity/vehicle_inspection/Sécuritest":{name:"Sécuritest",icon:"maki-car",imageURL:"https://graph.facebook.com/218871841874062/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224992",amenity:"vehicle_inspection"},addTags:{amenity:"vehicle_inspection",brand:"Sécuritest","brand:wikidata":"Q64224992",name:"Sécuritest"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup/Amazon Locker":{name:"Amazon Locker",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/amazon/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q16974764",amenity:"vending_machine",vending:"parcel_pickup"},addTags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/AmeriGas":{name:"AmeriGas",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/AmeriGas/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q23130318",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"AmeriGas","brand:wikidata":"Q23130318","fuel:lpg":"yes",name:"AmeriGas",vending:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/Automat ŚKUP":{name:"Automat ŚKUP",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q24945427",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/BKK-automata":{name:"BKK-automata",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/bkkbudapest/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q608917",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"BKK-automata","brand:wikidata":"Q608917","brand:wikipedia":"hu:Budapesti Közlekedési Központ",name:"BKK-automata",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["hu"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Blue Rhino":{name:"Blue Rhino",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/BlueRhino/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q65681213",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Blue Rhino","brand:wikidata":"Q65681213","fuel:lpg":"yes",name:"Blue Rhino",vending:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/CVS Pharmacy":{name:"CVS Pharmacy",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/CVS/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q2078880",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",name:"CVS Pharmacy",short_name:"CVS",vending:"chemist"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1766703",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/DHL Paketbox":{name:"DHL Paketbox",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2046604",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",vending:"parcel_mail_in"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Dog-Station":{name:"Dog-Station",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q63720061",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},countryCodes:["at","de","dk"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Home City Ice":{name:"Home City Ice",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/HomeCityIceJobs/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q5888287",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Home City Ice","brand:wikidata":"Q5888287",name:"Home City Ice",vending:"ice_cubes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q57515549",amenity:"vending_machine",vending:"public_transport_tickets"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/paczkomaty/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q3182097",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parking_tickets/ParkPlus (Calgary)":{name:"ParkPlus (Calgary)",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/CalgaryParkingAuthority/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q63719595",amenity:"vending_machine",vending:"parking_tickets"},addTags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/redbox/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7305489",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"movies"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/Reddy Ice":{name:"Reddy Ice",icon:"temaki-vending_machine",imageURL:"https://graph.facebook.com/RealReddyIce/picture?type=large",geometry:["point"],tags:{"brand:wikidata":"Q7305666",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"Reddy Ice","brand:wikidata":"Q7305666",name:"Reddy Ice",vending:"ice_cubes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/excrement_bags/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q2159689",amenity:"vending_machine",vending:"excrement_bags"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Smartpost":{name:"Smartpost",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q7543889",amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},addTags:{amenity:"vending_machine",brand:"Smartpost","brand:wikidata":"Q7543889","brand:wikipedia":"fi:SmartPOST",name:"Smartpost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/cigarettes/Tobaccoland":{name:"Tobaccoland",icon:"temaki-vending_machine",geometry:["point"],tags:{"brand:wikidata":"Q1439872",amenity:"vending_machine",vending:"cigarettes"},addTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/drinks/コカ・コーラ":{name:"コカ・コーラ",icon:"temaki-vending_machine",imageURL:"https://pbs.twimg.com/profile_images/1149007644918784001/b5PBpHkK_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q2813",amenity:"vending_machine",vending:"drinks"},addTags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",vending:"drinks"},reference:{key:"vending",value:"drinks"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/vending_machine/ポッカサッポロ":{name:"ポッカサッポロ",icon:"temaki-vending_machine",imageURL:"https://pbs.twimg.com/profile_images/937822527543377920/j8-XeRV8_bigger.jpg",geometry:["point"],tags:{"brand:wikidata":"Q7208665",amenity:"vending_machine"},addTags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"},countryCodes:["jp"],terms:["pokka sapporo"],matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/BanfieldPetHospital/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882416",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/veterinary/VCA Animal Hospital":{name:"VCA Animal Hospital",icon:"temaki-veterinary_care",imageURL:"https://graph.facebook.com/VCAAnimalHospitals/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7906620",amenity:"veterinary"},addTags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"craft/signmaker/Fastsigns":{name:"Fastsigns",icon:"temaki-tools",imageURL:"https://graph.facebook.com/FASTSIGNS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5437127",craft:"signmaker"},addTags:{brand:"Fastsigns","brand:wikidata":"Q5437127","brand:wikipedia":"en:Fastsigns",craft:"signmaker",name:"Fastsigns"},countryCodes:["ae","ca","cl","gb","ky","mx","sa","us"],terms:[],matchScore:2,suggestion:true},"healthcare/blood_donation/Australian Red Cross Blood Service":{name:"Australian Red Cross Blood Service",icon:"maki-blood-bank",imageURL:"https://graph.facebook.com/AustralianRedCross/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4824610",healthcare:"blood_donation"},addTags:{brand:"Australian Red Cross","brand:wikidata":"Q4824610","brand:wikipedia":"en:Australian Red Cross","donation:compensation":"no",healthcare:"blood_donation",name:"Australian Red Cross Blood Service",short_name:"Blood Service"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"amenity/clinic/ZoomCare":{name:"ZoomCare",icon:"maki-doctor",imageURL:"https://graph.facebook.com/ZOOMCare/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64120374",amenity:"clinic"},addTags:{amenity:"clinic",brand:"ZoomCare","brand:wikidata":"Q64120374","brand:wikipedia":"en:ZoomCare",healthcare:"clinic",name:"ZoomCare",urgent_care:"yes"},reference:{key:"amenity",value:"clinic"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"healthcare/counselling/Jenny Craig":{name:"Jenny Craig",icon:"fas-comments",imageURL:"https://graph.facebook.com/jennycraig/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6179221",healthcare:"counselling"},addTags:{brand:"Jenny Craig","brand:wikidata":"Q6179221","brand:wikipedia":"en:Jenny Craig, Inc.",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"Jenny Craig"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"healthcare/counselling/WW Studio":{name:"WW Studio",icon:"fas-comments",imageURL:"https://graph.facebook.com/WW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1929466",healthcare:"counselling"},addTags:{alt_name:"Weight Watchers",brand:"WW Studio","brand:wikidata":"Q1929466","brand:wikipedia":"en:WW International",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"WW Studio"},terms:["ww"],matchScore:2,suggestion:true},"landuse/residential/Avalon":{name:"Avalon",icon:"maki-building",imageURL:"https://pbs.twimg.com/profile_images/859879308940193792/us4WbKaN_bigger.jpg",geometry:["area"],tags:{"brand:wikidata":"Q64665938",landuse:"residential"},addTags:{brand:"Avalon","brand:wikidata":"Q64665938",landuse:"residential",name:"Avalon",residential:"apartments"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/escape_game/Escapology":{name:"Escapology",icon:"fas-puzzle-piece",imageURL:"https://graph.facebook.com/EscapologySanDiego/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64137163",leisure:"escape_game"},addTags:{brand:"Escapology","brand:wikidata":"Q64137163",leisure:"escape_game",name:"Escapology"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/24HourFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4631849",leisure:"fitness_centre"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/anytimefitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4778364",leisure:"fitness_centre"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Basic-Fit":{name:"Basic-Fit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/BasicFitEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40165577",leisure:"fitness_centre"},addTags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"},countryCodes:["be","es","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Clever fit":{name:"Clever fit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/cleverfit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27909675",leisure:"fitness_centre"},addTags:{brand:"Clever fit","brand:wikidata":"Q27909675","brand:wikipedia":"de:Clever fit",leisure:"fitness_centre",name:"Clever fit"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/CorePower Yoga":{name:"CorePower Yoga",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/CorePowerYoga/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21015663",leisure:"fitness_centre"},addTags:{brand:"CorePower Yoga","brand:wikidata":"Q21015663","brand:wikipedia":"en:CorePower Yoga",leisure:"fitness_centre",name:"CorePower Yoga",sport:"yoga"},countryCodes:["us"],terms:["corepower"],matchScore:2,suggestion:true},"leisure/fitness_centre/Crunch Fitness":{name:"Crunch Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/CRUNCH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5190093",leisure:"fitness_centre"},addTags:{brand:"Crunch Fitness","brand:wikidata":"Q5190093","brand:wikipedia":"en:Crunch Fitness",leisure:"fitness_centre",name:"Crunch Fitness"},countryCodes:["au","ca","us"],terms:["crunch"],matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Curves/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5196080",leisure:"fitness_centre"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/F45 Training":{name:"F45 Training",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/F45FunctionalTraining/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64390973",leisure:"fitness_centre"},addTags:{brand:"F45 Training","brand:wikidata":"Q64390973",leisure:"fitness_centre",name:"F45 Training"},terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fit4Less  (Canada)":{name:"Fit4Less  (Canada)",icon:"fas-dumbbell",imageURL:"https://pbs.twimg.com/profile_images/1002267809248768000/7GDwAjgc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821050",leisure:"fitness_centre"},addTags:{brand:"Fit4Less","brand:wikidata":"Q64821050",leisure:"fitness_centre",name:"Fit4Less"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fit4less  (UK)":{name:"Fit4less  (UK)",icon:"fas-dumbbell",imageURL:"https://pbs.twimg.com/profile_images/570920453774917632/3SpVGgNU_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q64821053",leisure:"fitness_centre"},addTags:{brand:"Fit4less","brand:wikidata":"Q64821053",leisure:"fitness_centre",name:"Fit4less"},countryCodes:["uk"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fitness First":{name:"Fitness First",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/FitnessFirstGER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127120",leisure:"fitness_centre"},addTags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"},countryCodes:["ae","au","de","gb","ph","th"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Fitness24Seven":{name:"Fitness24Seven",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Fitness24SevenSweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61112447",leisure:"fitness_centre"},addTags:{brand:"Fitness24Seven","brand:wikidata":"Q61112447","brand:wikipedia":"sv:Fitness24Seven",leisure:"fitness_centre",name:"Fitness24Seven"},countryCodes:["fi","se"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/goldsgym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1536234",leisure:"fitness_centre"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},countryCodes:["ae","in","ph","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/GoodLife Fitness":{name:"GoodLife Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{"brand:wikidata":"Q3110654",leisure:"fitness_centre"},addTags:{brand:"GoodLife Fitness","brand:wikidata":"Q3110654","brand:wikipedia":"en:GoodLife Fitness",leisure:"fitness_centre",name:"GoodLife Fitness"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Jazzercise":{name:"Jazzercise",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/Jazzerciseinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6168434",leisure:"fitness_centre"},addTags:{brand:"Jazzercise","brand:wikidata":"Q6168434","brand:wikipedia":"en:Jazzercise",leisure:"fitness_centre",name:"Jazzercise"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/LAFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6457180",leisure:"fitness_centre"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Life Time":{name:"Life Time",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/LifeTime.Life/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6545004",leisure:"fitness_centre"},addTags:{brand:"Life Time","brand:wikidata":"Q6545004","brand:wikipedia":"en:Life Time Fitness",leisure:"fitness_centre",name:"Life Time"},countryCodes:["ca","us"],terms:["life time athletic","life time fitness"],matchScore:2,suggestion:true},"leisure/fitness_centre/McFit":{name:"McFit",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/mcfit.DE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q871302",leisure:"fitness_centre"},addTags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"},countryCodes:["at","de","es","it","pl"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Orangetheory Fitness":{name:"Orangetheory Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/OrangeTheoryFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25005163",leisure:"fitness_centre"},addTags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"},countryCodes:["ca","es","us"],terms:["orangetheory"],matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/planetfitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7201095",leisure:"fitness_centre"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/PureGym":{name:"PureGym",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/puregym/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18345898",leisure:"fitness_centre"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Retro Fitness":{name:"Retro Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/RetroFitness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994955",leisure:"fitness_centre"},addTags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",imageURL:"https://graph.facebook.com/SnapFitness247/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7547254",leisure:"fitness_centre"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},terms:[],matchScore:2,suggestion:true},"leisure/playground/McDonald's PlayPlace":{name:"McDonald's PlayPlace",icon:"maki-playground",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",leisure:"playground"},addTags:{access:"customers",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",leisure:"playground",name:"McDonald's PlayPlace"},terms:["mcdonald's"],matchScore:2,suggestion:true},"leisure/sports_centre/YMCA":{name:"YMCA",icon:"maki-pitch",imageURL:"https://graph.facebook.com/YMCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157169",leisure:"sports_centre"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"},terms:[],matchScore:2,suggestion:true},"leisure/sports_centre/iFLY":{name:"iFLY",icon:"maki-pitch",imageURL:"https://graph.facebook.com/iFLYUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64767105",leisure:"sports_centre"},addTags:{brand:"iFLY","brand:wikidata":"Q64767105",leisure:"sports_centre",name:"iFLY",sport:"indoor_skydiving"},terms:[],matchScore:2,suggestion:true},"shop/beauty/tanning/Palm Beach Tan":{name:"Palm Beach Tan",icon:"maki-shop",imageURL:"https://graph.facebook.com/PBTOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64027086",shop:"beauty",beauty:"tanning"},addTags:{beauty:"tanning",brand:"Palm Beach Tan","brand:wikidata":"Q64027086","brand:wikipedia":"en:Palm Beach Tan",leisure:"tanning_salon",name:"Palm Beach Tan",shop:"beauty"},reference:{key:"leisure",value:"tanning_salon"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/bail_bond_agent/Aladdin Bail Bonds":{name:"Aladdin Bail Bonds",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAladdin%20Bail%20Bonds%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q64166257",office:"bail_bond_agent"},addTags:{brand:"Aladdin Bail Bonds","brand:wikidata":"Q64166257","brand:wikipedia":"en:Aladdin Bail Bonds",name:"Aladdin Bail Bonds",office:"bail_bond_agent",opening_hours:"24/7"},countryCodes:["us"],terms:["aladdin","aladin bail bonds","alladin bail bonds"],matchScore:2,suggestion:true},"office/coworking/Awfis":{name:"Awfis",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/myawfis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60747757",office:"coworking"},addTags:{brand:"Awfis","brand:wikidata":"Q60747757","brand:wikipedia":"en:Awfis",fee:"yes",name:"Awfis",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"office/coworking/Ucommune (China)":{name:"Ucommune (China)",icon:"maki-suitcase",geometry:["point","area"],tags:{"brand:wikidata":"Q60785187",office:"coworking"},addTags:{brand:"优客工场","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"优客工场","brand:zh-Hans":"优客工场",fee:"yes",name:"优客工场","name:en":"Ucommune","name:zh":"优客工场","name:zh-Hans":"优客工场",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"office/coworking/Ucommune (Hong Kong)":{name:"Ucommune (Hong Kong)",icon:"maki-suitcase",geometry:["point","area"],tags:{"brand:wikidata":"Q60785187",office:"coworking"},addTags:{brand:"優客工場 Ucommune","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"優客工場","brand:zh-Hans":"优客工场","brand:zh-Hant":"優客工場",fee:"yes",name:"優客工場 Ucommune","name:en":"Ucommune","name:zh":"優客工場","name:zh-Hans":"优客工场","name:zh-Hant":"優客工場",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"office/coworking/Ucommune (Singapore)":{name:"Ucommune (Singapore)",icon:"maki-suitcase",geometry:["point","area"],tags:{"brand:wikidata":"Q60785187",office:"coworking"},addTags:{brand:"Ucommune","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"优客工场","brand:zh-Hans":"优客工场",fee:"yes",name:"Ucommune","name:en":"Ucommune","name:zh":"优客工场","name:zh-Hans":"优客工场",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["sg"],terms:[],matchScore:2,suggestion:true},"office/coworking/Ucommune (Taiwan)":{name:"Ucommune (Taiwan)",icon:"maki-suitcase",geometry:["point","area"],tags:{"brand:wikidata":"Q60785187",office:"coworking"},addTags:{brand:"優客工場","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"優客工場","brand:zh-Hans":"优客工场","brand:zh-Hant":"優客工場",fee:"yes",name:"優客工場","name:en":"Ucommune","name:zh":"優客工場","name:zh-Hans":"优客工场","name:zh-Hant":"優客工場",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"office/coworking/WeWork":{name:"WeWork",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/wework/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19995004",office:"coworking"},addTags:{brand:"WeWork","brand:wikidata":"Q19995004","brand:wikipedia":"en:WeWork",fee:"yes",name:"WeWork",office:"coworking"},reference:{key:"amenity",value:"coworking_space"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/employment_agency/Adecco":{name:"Adecco",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/adeccogroupDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q353494",office:"employment_agency"},addTags:{brand:"Adecco","brand:wikidata":"Q353494","brand:wikipedia":"en:The Adecco Group",name:"Adecco",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/employment_agency/Manpower":{name:"Manpower",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/ManpowerGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1472539",office:"employment_agency"},addTags:{brand:"Manpower","brand:wikidata":"Q1472539","brand:wikipedia":"en:ManpowerGroup",name:"Manpower",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/employment_agency/Pôle Emploi":{name:"Pôle Emploi",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/poleemploi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8901192",office:"employment_agency"},addTags:{brand:"Pôle Emploi","brand:wikidata":"Q8901192","brand:wikipedia":"en:Pôle emploi",name:"Pôle Emploi",office:"employment_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/employment_agency/Randstad":{name:"Randstad",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Randstad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q267840",office:"employment_agency"},addTags:{brand:"Randstad","brand:wikidata":"Q267840","brand:wikipedia":"en:Randstad Holding",name:"Randstad",office:"employment_agency"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Century 21":{name:"Century 21",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/century21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1054480",office:"estate_agent"},addTags:{brand:"Century 21","brand:wikidata":"Q1054480","brand:wikipedia":"en:Century 21 (real estate)",name:"Century 21",office:"estate_agent"},terms:["century 21 real estate"],matchScore:2,suggestion:true},"office/estate_agent/Coldwell Banker":{name:"Coldwell Banker",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/coldwellbanker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q738853",office:"estate_agent"},addTags:{brand:"Coldwell Banker","brand:wikidata":"Q738853","brand:wikipedia":"en:Coldwell Banker",name:"Coldwell Banker",office:"estate_agent"},terms:["coldwell banker real estate"],matchScore:2,suggestion:true},"office/estate_agent/Engel & Völkers":{name:"Engel & Völkers",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/engelvoelkershq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1341765",office:"estate_agent"},addTags:{brand:"Engel & Völkers","brand:wikidata":"Q1341765","brand:wikipedia":"en:Engel & Völkers",name:"Engel & Völkers",office:"estate_agent"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Foncia":{name:"Foncia",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/Foncia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1435638",office:"estate_agent"},addTags:{brand:"Foncia","brand:wikidata":"Q1435638","brand:wikipedia":"fr:Foncia",name:"Foncia",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Guy Hoquet":{name:"Guy Hoquet",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/GuyHoquetImmobilier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25383970",office:"estate_agent"},addTags:{brand:"Guy Hoquet","brand:wikidata":"Q25383970","brand:wikipedia":"fr:Guy Hoquet l'immobilier",name:"Guy Hoquet",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Orpi":{name:"Orpi",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/OrpiFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3356080",office:"estate_agent"},addTags:{brand:"Orpi","brand:wikidata":"Q3356080","brand:wikipedia":"fr:Organisation régionale des professionnels de l'immobilier",name:"Orpi",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/REMAX":{name:"RE/MAX",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/remax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q965845",office:"estate_agent"},addTags:{brand:"RE/MAX","brand:wikidata":"Q965845","brand:wikipedia":"en:RE/MAX",name:"RE/MAX",office:"estate_agent"},terms:[],matchScore:2,suggestion:true},"office/estate_agent/Royal LePage":{name:"Royal LePage",icon:"temaki-real_estate_agency",imageURL:"https://graph.facebook.com/royallepage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7374385",office:"estate_agent"},addTags:{brand:"Royal LePage","brand:wikidata":"Q7374385","brand:wikipedia":"en:Royal LePage",name:"Royal LePage",office:"estate_agent"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"office/estate_agent/Square Habitat":{name:"Square Habitat",icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{"brand:wikidata":"Q64027038",office:"estate_agent"},addTags:{brand:"Square Habitat","brand:wikidata":"Q64027038","brand:wikipedia":"fr:Square Habitat",name:"Square Habitat",office:"estate_agent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/financial_advisor/Edward Jones":{name:"Edward Jones",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/edwardjones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5343830",office:"financial_advisor"},addTags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"office/insurance/AAA Insurance":{name:"AAA Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/AAAFanPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q463436",office:"insurance"},addTags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"AAA Insurance",office:"insurance",short_name:"AAA"},countryCodes:["us"],terms:["american automobile association"],matchScore:2,suggestion:true},"office/insurance/AOK":{name:"AOK",icon:"maki-suitcase",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAllgemeine%20Ortskrankenkasse%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q835141",office:"insurance"},addTags:{brand:"AOK","brand:wikidata":"Q835141","brand:wikipedia":"de:Allgemeine Ortskrankenkasse",name:"AOK",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/AXA":{name:"AXA",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/axainsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q160054",office:"insurance"},addTags:{brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Allianz":{name:"Allianz",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/allianz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487292",office:"insurance"},addTags:{brand:"Allianz","brand:wikidata":"Q487292","brand:wikipedia":"en:Allianz",name:"Allianz",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Allstate":{name:"Allstate",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Allstate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2645636",office:"insurance"},addTags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"},countryCodes:["us"],terms:["allstate insurance"],matchScore:2,suggestion:true},"office/insurance/American Family Insurance":{name:"American Family Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/amfam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4743730",office:"insurance"},addTags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"},countryCodes:["us"],terms:["american family","amfam"],matchScore:2,suggestion:true},"office/insurance/Aviva":{name:"Aviva",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Aviva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q791179",office:"insurance"},addTags:{brand:"Aviva","brand:wikidata":"Q791179","brand:wikipedia":"en:Aviva",name:"Aviva",office:"insurance"},countryCodes:["fr","ie","pl"],terms:[],matchScore:2,suggestion:true},"office/insurance/DEVK":{name:"DEVK",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/devk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1153049",office:"insurance"},addTags:{brand:"DEVK","brand:wikidata":"Q1153049","brand:wikipedia":"de:DEVK",name:"DEVK",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/Debeka":{name:"Debeka",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/Debeka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1181452",office:"insurance"},addTags:{brand:"Debeka","brand:wikidata":"Q1181452","brand:wikipedia":"de:Debeka",name:"Debeka",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/Erie Insurance":{name:"Erie Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/erieinsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5388314",office:"insurance"},addTags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"},countryCodes:["us"],terms:["erie"],matchScore:2,suggestion:true},"office/insurance/Farmers Insurance":{name:"Farmers Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/FarmersInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1396863",office:"insurance"},addTags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"},countryCodes:["us"],terms:["farmers"],matchScore:2,suggestion:true},"office/insurance/GEICO":{name:"GEICO",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/geico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1498689",office:"insurance"},addTags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/insurance/Generali":{name:"Generali",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/GENERALIes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q670482",office:"insurance"},addTags:{brand:"Generali","brand:wikidata":"Q670482","brand:wikipedia":"it:Assicurazioni Generali",name:"Generali",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Grange Insurance":{name:"Grange Insurance",icon:"maki-suitcase",imageURL:"https://pbs.twimg.com/profile_images/476391605457260545/J37LFSJc_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q17183481",office:"insurance"},addTags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"},countryCodes:["us"],terms:["grange"],matchScore:2,suggestion:true},"office/insurance/Groupama":{name:"Groupama",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/groupama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3083531",office:"insurance"},addTags:{brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"fr:Groupama",name:"Groupama",office:"insurance",official_name:"Groupe des Assurances Mutuelles Agricoles"},terms:[],matchScore:2,suggestion:true},"office/insurance/Knappschaft":{name:"Knappschaft",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/KNAPPSCHAFT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1313465",office:"insurance"},addTags:{brand:"Knappschaft","brand:wikidata":"Q1313465","brand:wikipedia":"de:Knappschaft (Krankenkasse)",name:"Knappschaft",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/MAAF":{name:"MAAF",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/maafassurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331028",office:"insurance"},addTags:{brand:"MAAF","brand:wikidata":"Q3331028","brand:wikipedia":"fr:Mutuelle d'assurance des artisans de France",name:"MAAF",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/MMA":{name:"MMA",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MMA.Assurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331046",office:"insurance"},addTags:{brand:"MMA","brand:wikidata":"Q3331046","brand:wikipedia":"fr:MMA (assurance)",name:"MMA",office:"insurance",official_name:"Mutuelles du Mans Assurances"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Macif":{name:"Macif",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/lEssentielparMacif/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331021",office:"insurance"},addTags:{brand:"Macif","brand:wikidata":"Q3331021","brand:wikipedia":"fr:Mutuelle assurance des commerçants et industriels de France et des cadres et des salariés de l'industrie et du commerce",name:"Macif",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Maif":{name:"Maif",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MAIFassureur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3331029",office:"insurance"},addTags:{brand:"Maif","brand:wikidata":"Q3331029","brand:wikipedia":"fr:Maif",name:"Maif",office:"insurance",official_name:"Mutuelle d'assurance des instituteurs de France"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Mapfre":{name:"Mapfre",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/mapfreinsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q544532",office:"insurance"},addTags:{brand:"Mapfre","brand:wikidata":"Q544532","brand:wikipedia":"en:Mapfre",name:"Mapfre",office:"insurance"},terms:[],matchScore:2,suggestion:true},"office/insurance/Matmut":{name:"Matmut",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/MatmutAssurances/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3299185",office:"insurance"},addTags:{brand:"Matmut","brand:wikidata":"Q3299185","brand:wikipedia":"fr:Matmut",name:"Matmut",office:"insurance"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"office/insurance/Nationwide":{name:"Nationwide",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/nationwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6979886",office:"insurance"},addTags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"},countryCodes:["us"],terms:["nationwide insurance"],matchScore:2,suggestion:true},"office/insurance/PZU":{name:"PZU",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/grupapzu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1807170",office:"insurance"},addTags:{brand:"PZU","brand:wikidata":"Q1807170","brand:wikipedia":"pl:Powszechny Zakład Ubezpieczeń",name:"PZU",office:"insurance"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"office/insurance/Progressive":{name:"Progressive",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/progressive/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7248721",office:"insurance"},addTags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"},countryCodes:["us"],terms:["progressive insurance"],matchScore:2,suggestion:true},"office/insurance/State Farm":{name:"State Farm",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/statefarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2007336",office:"insurance"},addTags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"},countryCodes:["us"],terms:["state farm insurance"],matchScore:2,suggestion:true},"office/insurance/Swinton":{name:"Swinton",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/SwintonInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7658785",office:"insurance"},addTags:{brand:"Swinton","brand:wikidata":"Q7658785",name:"Swinton",office:"insurance"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"office/insurance/Techniker Krankenkasse":{name:"Techniker Krankenkasse",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/DieTechniker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q607531",office:"insurance"},addTags:{brand:"Techniker Krankenkasse","brand:wikidata":"Q607531","brand:wikipedia":"de:Techniker Krankenkasse",name:"Techniker Krankenkasse",office:"insurance"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"office/insurance/The Co-operators":{name:"The Co-operators",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/TheCooperatorsInsurance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3520320",office:"insurance"},addTags:{brand:"The Co-operators","brand:wikidata":"Q3520320","brand:wikipedia":"en:The Co-operators",name:"The Co-operators",office:"insurance"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"office/insurance/Росгосстрах":{name:"Росгосстрах",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/RGS.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4397745",office:"insurance"},addTags:{brand:"Росгосстрах","brand:wikidata":"Q4397745","brand:wikipedia":"en:Rosgosstrakh",name:"Росгосстрах",office:"insurance"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Block Advisors":{name:"Block Advisors",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/BlockAdvisors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64166231",office:"tax_advisor"},addTags:{brand:"Block Advisors","brand:wikidata":"Q64166231",name:"Block Advisors",office:"tax_advisor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/H&R Block":{name:"H&R Block",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/hrblock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5627799",office:"tax_advisor"},addTags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"},countryCodes:["au","ca","in","us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Jackson Hewitt":{name:"Jackson Hewitt",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/jacksonhewitt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6117132",office:"tax_advisor"},addTags:{brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor",official_name:"Jackson Hewitt Tax Service"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/tax_advisor/Liberty Tax":{name:"Liberty Tax",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/libertytax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6541978",office:"tax_advisor"},addTags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Ooredoo":{name:"Ooredoo",icon:"maki-telephone",imageURL:"https://graph.facebook.com/ooredooqatar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q919935",office:"telecommunication"},addTags:{brand:"Ooredoo","brand:wikidata":"Q919935","brand:wikipedia":"en:Ooredoo",name:"Ooredoo",office:"telecommunication"},terms:[],matchScore:2,suggestion:true},"office/telecommunication/Velcom":{name:"Velcom",icon:"maki-telephone",imageURL:"https://graph.facebook.com/velcomlikes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1888809",office:"telecommunication"},addTags:{brand:"Velcom","brand:wikidata":"Q1888809","brand:wikipedia":"en:Velcom",name:"Velcom",office:"telecommunication"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Ростелеком":{name:"Ростелеком",icon:"maki-telephone",imageURL:"https://graph.facebook.com/288785311160831/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1477012",office:"telecommunication"},addTags:{brand:"Ростелеком","brand:wikidata":"Q1477012","brand:wikipedia":"en:Rostelecom",name:"Ростелеком",office:"telecommunication"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"office/telecommunication/Укртелеком":{name:"Укртелеком",icon:"maki-telephone",imageURL:"https://graph.facebook.com/Ukrtelecom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1505321",office:"telecommunication"},addTags:{brand:"Укртелеком","brand:wikidata":"Q1505321","brand:wikipedia":"en:Ukrtelecom",name:"Укртелеком",office:"telecommunication"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/agrarian/Granngården":{name:"Granngården",icon:"fas-tractor",imageURL:"https://graph.facebook.com/granngarden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10508136",shop:"agrarian"},addTags:{brand:"Granngården","brand:wikidata":"Q10508136","brand:wikipedia":"sv:Granngården AB",name:"Granngården",shop:"agrarian"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/agrarian/Southern States":{name:"Southern States",icon:"fas-tractor",imageURL:"https://graph.facebook.com/SouthernStatesCoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7570508",shop:"agrarian"},addTags:{agrarian:"seed;feed;tools",brand:"Southern States","brand:wikidata":"Q7570508","brand:wikipedia":"en:Southern States Cooperative",name:"Southern States",official_name:"Southern States Cooperative",shop:"agrarian"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"fas-wine-bottle",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlko.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1849187",shop:"alcohol"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1302250656/winesplash-icon_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q43079557",shop:"alcohol"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"fas-wine-bottle",geometry:["point","area"],tags:{"brand:wikidata":"Q4836848",shop:"alcohol"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/998956835796205568/21tNi907_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q16971315",shop:"alcohol"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/BevMo!":{name:"BevMo!",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1128010188038893568/TCOuuRrD_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4899308",shop:"alcohol"},addTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/465419847128473601/ybOMjW8-_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5214075",shop:"alcohol"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Fine Wine & Good Spirits":{name:"Fine Wine & Good Spirits",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/PAWineSpirits/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64514776",shop:"alcohol"},addTags:{brand:"Fine Wine & Good Spirits","brand:wikidata":"Q64514776",name:"Fine Wine & Good Spirits",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Gall & Gall":{name:"Gall & Gall",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/652468758515068928/dzFqRsLG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q13639185",shop:"alcohol"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/481885343986102272/mGMV-t--_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q845263",shop:"alcohol"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/378800000468322180/92219ed513322ff2f4d6d416dc477704_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q2283837",shop:"alcohol"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Majestic":{name:"Majestic",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1139531853759729665/3J0irT72_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q6737725",shop:"alcohol"},addTags:{brand:"Majestic","brand:wikidata":"Q6737725",name:"Majestic",shop:"alcohol"},countryCodes:["gb"],terms:["majestic wine","majestic wine warehouse"],matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/842779196082573314/AtkEMQlh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3340012",shop:"alcohol"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},countryCodes:["be","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Oddbins":{name:"Oddbins",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/547781884533436416/xshXfITG_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7077472",shop:"alcohol"},addTags:{brand:"Oddbins","brand:wikidata":"Q7077472",name:"Oddbins",shop:"alcohol"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/SAQ":{name:"SAQ",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1064657571133308928/zhzEYvxp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3488077",shop:"alcohol"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/SAQ Express":{name:"SAQ Express",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1064657571133308928/zhzEYvxp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3488077",shop:"alcohol"},addTags:{brand:"SAQ Express","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ Express",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/SAQ Sélection":{name:"SAQ Sélection",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1064657571133308928/zhzEYvxp_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3488077",shop:"alcohol"},addTags:{brand:"SAQ Sélection","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ Sélection",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1147150560644272129/jeg6tzSF_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7574415",shop:"alcohol"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/456046476032872449/mg3NXDpc_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1476113",shop:"alcohol"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/1112700310441676800/Gyk3rZl6_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q16243674",shop:"alcohol"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Total Wine":{name:"Total Wine",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/3095579292/69f5115c869a3b0f73bfb7ad25ba2a37_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q7828084",shop:"alcohol"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",official_name:"Total Wine & More",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/VirginiaABC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7934236",shop:"alcohol"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Бристоль":{name:"Бристоль",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/bristolretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q59155583",shop:"alcohol"},addTags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"fas-wine-bottle",imageURL:"https://graph.facebook.com/krasnoe.beloe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24933790",shop:"alcohol"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},countryCodes:["ru"],terms:["красное и белое"],matchScore:2,suggestion:true},"shop/alcohol/カクヤス":{name:"カクヤス",icon:"fas-wine-bottle",geometry:["point","area"],tags:{"brand:wikidata":"Q11293990",shop:"alcohol"},addTags:{brand:"カクヤス","brand:en":"Kakuyasu","brand:ja":"カクヤス","brand:wikidata":"Q11293990","brand:wikipedia":"ja:カクヤス",name:"カクヤス","name:en":"Kakuyasu","name:ja":"カクヤス",shop:"alcohol"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/art/YellowKorner":{name:"YellowKorner",icon:"maki-shop",imageURL:"https://graph.facebook.com/YellowKorner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3572115",shop:"art"},addTags:{brand:"YellowKorner","brand:wikidata":"Q3572115","brand:wikipedia":"fr:YellowKorner",name:"YellowKorner",shop:"art"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Aubert":{name:"Aubert",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/Aubert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62964657",shop:"baby_goods"},addTags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/babiesrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17232036",shop:"baby_goods"},addTags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/BabyOne":{name:"BabyOne",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/BabyOne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57540408",shop:"baby_goods"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Buy Buy Baby":{name:"Buy Buy Baby",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/buybuyBABY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5003352",shop:"baby_goods"},addTags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/mothercareuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136738",shop:"baby_goods"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},terms:[],matchScore:2,suggestion:true},"shop/baby_goods/西松屋":{name:"西松屋",icon:"fas-baby-carriage",imageURL:"https://graph.facebook.com/nishimatsuya.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11628761",shop:"baby_goods"},addTags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bag/Carpisa":{name:"Carpisa",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/CarpisaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28035409",shop:"bag"},addTags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/bag/Coach":{name:"Coach",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/coach/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q727697",shop:"bag"},addTags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"},countryCodes:["ca","us"],terms:["coach new york","coach ny"],matchScore:2,suggestion:true},"shop/bag/Kipling":{name:"Kipling",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/KiplingU.S.A/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6414641",shop:"bag"},addTags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"},countryCodes:["be","gb"],terms:[],matchScore:2,suggestion:true},"shop/bag/Samsonite":{name:"Samsonite",icon:"fas-suitcase-rolling",imageURL:"https://pbs.twimg.com/profile_images/1117861430366175232/3u8m-kIE_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1203426",shop:"bag"},addTags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Tumi":{name:"Tumi",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/TumiTravel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4465402",shop:"bag"},addTags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"},terms:[],matchScore:2,suggestion:true},"shop/bag/Vera Bradley":{name:"Vera Bradley",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/VeraBradley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7920749",shop:"bag"},addTags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Anker":{name:"Anker",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Ankerbrot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q557116",shop:"bakery"},addTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},countryCodes:["at","sk"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Awiteks":{name:"Awiteks",icon:"maki-bakery",imageURL:"https://graph.facebook.com/awiteks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62054190",shop:"bakery"},addTags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Backwerk":{name:"Backwerk",icon:"maki-bakery",imageURL:"https://graph.facebook.com/155997891116938/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q798298",shop:"bakery"},addTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},countryCodes:["at","ch","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",imageURL:"https://graph.facebook.com/bakersdelight/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4849261",shop:"bakery"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",imageURL:"https://graph.facebook.com/bakkerbartNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2177445",shop:"bakery"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",imageURL:"https://graph.facebook.com/293934294060419/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2882405",shop:"bakery"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Birds":{name:"Birds",icon:"maki-bakery",imageURL:"https://graph.facebook.com/birdsbakeryderby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63001935",shop:"bakery"},addTags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Breadtop":{name:"Breadtop",icon:"maki-bakery",imageURL:"https://graph.facebook.com/we.love.breadtop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4959217",shop:"bakery"},addTags:{brand:"Breadtop","brand:wikidata":"Q4959217","brand:wikipedia":"en:Breadtop",cuisine:"chinese",name:"Breadtop",shop:"bakery"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",imageURL:"https://graph.facebook.com/baeckereifuchs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q42825993",shop:"bakery"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/COBS Bread":{name:"COBS Bread",icon:"maki-bakery",imageURL:"https://graph.facebook.com/bakersdelight/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4849261",shop:"bakery"},addTags:{brand:"COBS Bread","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"COBS Bread",shop:"bakery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cadera":{name:"Cadera",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Cadera1853/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086410",shop:"bakery"},addTags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Cooplands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5167971",shop:"bakery"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Dat Backhus":{name:"Dat Backhus",icon:"maki-bakery",imageURL:"https://graph.facebook.com/datbackhus.hamburg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62093175",shop:"bakery"},addTags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/derbeck.baeckerei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1192443",shop:"bakery"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",imageURL:"https://graph.facebook.com/ditsch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q911573",shop:"bakery"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Fornetti":{name:"Fornetti",icon:"maki-bakery",imageURL:"https://graph.facebook.com/fornetti.magyarorszag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1003020",shop:"bakery"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",imageURL:"https://graph.facebook.com/GoldilocksPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5580198",shop:"bakery"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},countryCodes:["ca","ph","th","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",imageURL:"https://graph.facebook.com/greggsofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3403981",shop:"bakery"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",imageURL:"https://graph.facebook.com/hofpfisterei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1623217",shop:"bakery"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ihle":{name:"Ihle",icon:"maki-bakery",imageURL:"https://graph.facebook.com/1845011368873218/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1626371",shop:"bakery"},addTags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"},countryCodes:["de"],terms:["landbäckerei ihle"],matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",imageURL:"https://graph.facebook.com/KU.Backkultur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1719433",shop:"bakery"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},countryCodes:["de"],terms:["k&u"],matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",imageURL:"https://graph.facebook.com/417008548362119/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1723381",shop:"bakery"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",imageURL:"https://graph.facebook.com/lamiecalinefrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3210704",shop:"bakery"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",imageURL:"https://graph.facebook.com/lecrobag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1558025",shop:"bakery"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},countryCodes:["at","de","pl","ru"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1145260042/logo_up_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57516591",shop:"bakery"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Löwenbäcker Schaper":{name:"Löwenbäcker Schaper",icon:"maki-bakery",imageURL:"https://graph.facebook.com/LoewenbaeckerSchaper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075965",shop:"bakery"},addTags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"},countryCodes:["de"],terms:["schaper"],matchScore:2,suggestion:true},"shop/bakery/Marie Blachère":{name:"Marie Blachère",icon:"maki-bakery",imageURL:"https://graph.facebook.com/marieblachereusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082410",shop:"bakery"},addTags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Mlinar":{name:"Mlinar",icon:"maki-bakery",imageURL:"https://graph.facebook.com/MlinarHrvatska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082464",shop:"bakery"},addTags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"},countryCodes:["ba","hr","sl"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q19382082",shop:"bakery"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Nothing Bundt Cakes":{name:"Nothing Bundt Cakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/nothingbundtcakes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082526",shop:"bakery"},addTags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Paris Baguette (worldwide)":{name:"Paris Baguette (worldwide)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{brand:"Paris Baguette","brand:wikidata":"Q62605260",name:"Paris Baguette",shop:"bakery"},countryCodes:["sg","us","vn"],terms:["paris baguette cafe"],matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",imageURL:"https://pbs.twimg.com/profile_images/1104154254699364353/69J1OrZ1_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3370417",shop:"bakery"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},terms:[],matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",imageURL:"https://graph.facebook.com/redribbonbakeshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304789",shop:"bakery"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},countryCodes:["ph","us"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q3441707",shop:"bakery"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Schäfer's":{name:"Schäfer's",icon:"maki-bakery",imageURL:"https://graph.facebook.com/149823855088841/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1464562",shop:"bakery"},addTags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"},countryCodes:["de"],terms:["schäfer"],matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",imageURL:"https://graph.facebook.com/150057125031868/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1314761",shop:"bakery"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",imageURL:"https://graph.facebook.com/brotmeisterei.steinecke/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57516278",shop:"bakery"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Sternenbäck":{name:"Sternenbäck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/sternenbaeck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62595021",shop:"bakery"},addTags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Ströck":{name:"Ströck",icon:"maki-bakery",imageURL:"https://graph.facebook.com/Stroeck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2357607",shop:"bakery"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",imageURL:"https://graph.facebook.com/248217405252147/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15854357",shop:"bakery"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",imageURL:"https://graph.facebook.com/allwoerden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60411349",shop:"bakery"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/サンジェルマン":{name:"サンジェルマン",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q11305612",shop:"bakery"},addTags:{brand:"サンジェルマン","brand:en":"Saint-Germain","brand:ja":"サンジェルマン","brand:wikidata":"Q11305612","brand:wikipedia":"ja:サンジェルマン (製パン)",name:"サンジェルマン","name:en":"Saint-Germain","name:ja":"サンジェルマン",shop:"bakery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bakery/ヴィ・ド・フランス":{name:"ヴィ・ド・フランス",icon:"maki-bakery",geometry:["point","area"],tags:{"brand:wikidata":"Q7928249",shop:"bakery"},addTags:{brand:"ヴィ・ド・フランス","brand:en":"Vie de France","brand:ja":"ヴィ・ド・フランス","brand:wikidata":"Q7928249","brand:wikipedia":"ja:ヴィ・ド・フランス",name:"ヴィ・ド・フランス","name:en":"Vie de France","name:ja":"ヴィ・ド・フランス",shop:"bakery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bakery/巴黎贝甜 (China)":{name:"巴黎贝甜 (China)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{brand:"巴黎贝甜","brand:en":"Paris Baguette","brand:wikidata":"Q62605260","brand:zh":"巴黎贝甜",name:"巴黎贝甜","name:en":"Paris Baguette","name:zh":"巴黎贝甜",shop:"bakery"},countryCodes:["cn"],terms:["paris baguette","paris baguette cafe","巴黎貝甜"],matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",imageURL:"https://graph.facebook.com/TousLesJoursUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3535609",shop:"bakery"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"},countryCodes:["kr"],terms:["뚜레주르"],matchScore:2,suggestion:true},"shop/bakery/파리바게뜨 (South Korea)":{name:"파리바게뜨 (South Korea)",icon:"maki-bakery",imageURL:"https://graph.facebook.com/parisbaguetteus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62605260",shop:"bakery"},addTags:{"alt_name:ko":"파리바게트",brand:"파리바게뜨","brand:en":"Paris Baguette","brand:ko":"파리바게뜨","brand:wikidata":"Q62605260",name:"파리바게뜨","name:en":"Paris Baguette","name:ko":"파리바게뜨",shop:"bakery"},countryCodes:["kr"],terms:["paris baguette","paris baguette cafe","파리바게트"],matchScore:2,suggestion:true},"shop/beauty/Benefit Brow Bar":{name:"Benefit Brow Bar",icon:"maki-shop",imageURL:"https://graph.facebook.com/benefitcosmetics/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2895769",shop:"beauty"},addTags:{beauty:"eyebrow;eyelash;waxing",brand:"Benefit","brand:wikidata":"Q2895769","brand:wikipedia":"en:Benefit Cosmetics",name:"Benefit Brow Bar",shop:"beauty"},countryCodes:["us"],terms:["benefit","ulta brow bar"],matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",imageURL:"https://graph.facebook.com/EuropeanWax/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5413426",shop:"beauty"},addTags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Indigo Sun":{name:"Indigo Sun",icon:"maki-shop",imageURL:"https://graph.facebook.com/indigosunretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63436906",shop:"beauty"},addTags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Sola Salons":{name:"Sola Salons",icon:"maki-shop",imageURL:"https://graph.facebook.com/solasalons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64337426",shop:"beauty"},addTags:{beauty:"hair;nails;skin_care;massage",brand:"Sola Salons","brand:wikidata":"Q64337426",name:"Sola Salons",shop:"beauty"},countryCodes:["us"],terms:["sola","sola salon studios"],matchScore:2,suggestion:true},"shop/beauty/The Skin Bar at Ulta Beauty":{name:"The Skin Bar at Ulta Beauty",icon:"maki-shop",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"beauty"},addTags:{alt_name:"Ulta Skin Bar",beauty:"skin_care",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Skin Bar at Ulta Beauty",shop:"beauty"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",imageURL:"https://graph.facebook.com/YvesRocherUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28496595",shop:"beauty"},addTags:{beauty:"cosmetics",brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"},terms:[],matchScore:2,suggestion:true},"shop/bed/Casper":{name:"Casper",icon:"maki-lodging",imageURL:"https://graph.facebook.com/224110981099062/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20539294",shop:"bed"},addTags:{brand:"Casper","brand:wikidata":"Q20539294","brand:wikipedia":"en:Casper Sleep",name:"Casper",shop:"bed"},terms:[],matchScore:2,suggestion:true},"shop/bed/Dreams":{name:"Dreams",icon:"maki-lodging",imageURL:"https://graph.facebook.com/dreamsbeds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5306688",shop:"bed"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MatratzenConcord/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18629057",shop:"bed"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",imageURL:"https://graph.facebook.com/MattressFirm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6791878",shop:"bed"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},countryCodes:["us"],terms:["sleepys"],matchScore:2,suggestion:true},"shop/bed/Mattress Warehouse":{name:"Mattress Warehouse",icon:"maki-lodging",imageURL:"https://graph.facebook.com/mattresswhse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61995079",shop:"bed"},addTags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/bed/Sleep Country":{name:"Sleep Country",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepCountryCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7539684",shop:"bed"},addTags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"},countryCodes:["ca"],terms:["Sleep Country Canada"],matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",imageURL:"https://graph.facebook.com/SleepNumber/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7447640",shop:"bed"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Dursty":{name:"Dursty",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDursty%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1267518",shop:"beverages"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57450576",shop:"beverages"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Fristo":{name:"Fristo",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q1465151",shop:"beverages"},addTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},countryCodes:["at","de"],terms:["fristo getränkemarkt"],matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",imageURL:"https://graph.facebook.com/getraenkehoffmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19284021",shop:"beverages"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Getränkeland":{name:"Getränkeland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Getraenkeland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62594849",shop:"beverages"},addTags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20hol%20ab.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q57557270",shop:"beverages"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q23787118",shop:"beverages"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q57519344",shop:"beverages"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/339373337/twitter_icon_trinkgut_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2453627",shop:"beverages"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",imageURL:"https://graph.facebook.com/chingshin1987/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10391229",shop:"beverages"},addTags:{brand:"清心福全","brand:en":"Ching Shin","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站","brand:zh":"清心福全",name:"清心福全","name:en":"Ching Shin","name:zh":"清心福全",shop:"beverages"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/evanscycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5415901",shop:"bicycle"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/Cykelbutikken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26721030",shop:"bicycle"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/bicycle/Giant":{name:"Giant",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/giantbicycles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q703557",shop:"bicycle"},addTags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"},terms:[],matchScore:2,suggestion:true},"shop/bicycle/Trek":{name:"Trek",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/TrekBicycle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1067617",shop:"bicycle"},addTags:{alt_name:"Trek Bicycle Store",brand:"Trek","brand:wikidata":"Q1067617","brand:wikipedia":"en:Trek Bicycle Corporation",name:"Trek",shop:"bicycle"},terms:["treck","trek bicycle"],matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",imageURL:"https://graph.facebook.com/cbasahi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11257202",shop:"bicycle"},addTags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1034363254758359041/dxetDfNN_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4897425",shop:"bookmaker"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1000461740772134913/T9-zMXmF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q54621344",shop:"bookmaker"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Fortuna":{name:"Fortuna",icon:"maki-shop",imageURL:"https://graph.facebook.com/703606549739592/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25857973",shop:"bookmaker"},addTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},countryCodes:["cz","hr","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1148531433947967488/3zGk1STM_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1799875",shop:"bookmaker"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",imageURL:"https://graph.facebook.com/2039606582931195/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3888718",shop:"bookmaker"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTipico%20Unternehmenslogo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q15851003",shop:"bookmaker"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},countryCodes:["at","co","de","gi","hr","mt"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/797028677733253120/bW9oFXT-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4053147",shop:"bookmaker"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1024247841135452160/UlceXxkv_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2007823",shop:"bookmaker"},addTags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Лига ставок":{name:"Лига ставок",icon:"maki-shop",imageURL:"https://graph.facebook.com/ligastavok05/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6545804",shop:"bookmaker"},addTags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",imageURL:"https://graph.facebook.com/fonbetrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q49137910",shop:"bookmaker"},addTags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"fas-book",imageURL:"https://graph.facebook.com/Akademibokhandeln/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10403918",shop:"books"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/books/Akateeminen Kirjakauppa":{name:"Akateeminen Kirjakauppa",icon:"fas-book",imageURL:"https://graph.facebook.com/AkateeminenCOM/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10403942",shop:"books"},addTags:{brand:"Akateeminen Kirjakauppa","brand:wikidata":"Q10403942","brand:wikipedia":"fi:Akateeminen Kirjakauppa",name:"Akateeminen Kirjakauppa",shop:"books"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"fas-book",imageURL:"https://graph.facebook.com/barnesandnoble/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q795454",shop:"books"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Books-A-Million":{name:"Books-A-Million",icon:"fas-book",imageURL:"https://graph.facebook.com/booksamillion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943266",shop:"books"},addTags:{brand:"Books-A-Million","brand:wikidata":"Q4943266","brand:wikipedia":"en:Books-A-Million",name:"Books-A-Million",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Bruna":{name:"Bruna",icon:"fas-book",imageURL:"https://graph.facebook.com/Brunawinkels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317555",shop:"books"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"fas-book",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChapters%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5073540",shop:"books"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/books/Cultura":{name:"Cultura",icon:"fas-book",imageURL:"https://graph.facebook.com/culturafr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007154",shop:"books"},addTags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"fas-book",imageURL:"https://graph.facebook.com/empikcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3045978",shop:"books"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"fas-book",imageURL:"https://graph.facebook.com/Fnac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q676585",shop:"books"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},countryCodes:["be","ch","es","fr","nl","pt"],terms:[],matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"fas-book",imageURL:"https://graph.facebook.com/halfpricebooks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5641744",shop:"books"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"fas-book",imageURL:"https://graph.facebook.com/hugendubelbuchhandlungen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1634142",shop:"books"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Indigo":{name:"Indigo",icon:"fas-book",imageURL:"https://graph.facebook.com/ChaptersIndigo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2477358",shop:"books"},addTags:{alt_name:"!ndigo",brand:"Indigo","brand:wikidata":"Q2477358","brand:wikipedia":"en:Indigo Books and Music",name:"Indigo",shop:"books"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/books/Mondadori":{name:"Mondadori",icon:"fas-book",imageURL:"https://graph.facebook.com/GruppoMondadori/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q85355",shop:"books"},addTags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"fas-book",imageURL:"https://graph.facebook.com/nbsalert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6971094",shop:"books"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/books/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"fas-book",imageURL:"https://graph.facebook.com/standaardboekhandel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3496554",shop:"books"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/books/Suomalainen Kirjakauppa":{name:"Suomalainen Kirjakauppa",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q7641808",shop:"books"},addTags:{brand:"Suomalainen Kirjakauppa","brand:wikidata":"Q7641808","brand:wikipedia":"fi:Suomalainen Kirjakauppa",name:"Suomalainen Kirjakauppa",shop:"books"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"fas-book",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"books"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"fas-book",imageURL:"https://graph.facebook.com/thalia.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408854",shop:"books"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/books/The Works":{name:"The Works",icon:"fas-book",imageURL:"https://graph.facebook.com/TheWorksStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7775853",shop:"books"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"fas-book",imageURL:"https://graph.facebook.com/waterstones/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151779",shop:"books"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},countryCodes:["be","gb","ie","je","nl"],terms:[],matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"fas-book",imageURL:"https://graph.facebook.com/weltbild/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883522",shop:"books"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/books/Буквоед":{name:"Буквоед",icon:"fas-book",imageURL:"https://graph.facebook.com/SuperBookvoed/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4098549",shop:"books"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Дом книги":{name:"Дом книги",icon:"fas-book",imageURL:"https://graph.facebook.com/spbdk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48950742",shop:"books"},addTags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"fas-book",imageURL:"https://graph.facebook.com/chitaigorod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4516645",shop:"books"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/books/סטימצקי":{name:"סטימצקי",icon:"fas-book",imageURL:"https://graph.facebook.com/SteimatzkyMadaf.HaSfarim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2903995",shop:"books"},addTags:{brand:"סטימצקי","brand:en":"Steimatzky","brand:he":"סטימצקי","brand:wikidata":"Q2903995","brand:wikipedia":"he:סטימצקי",name:"סטימצקי","name:en":"Steimatzky","name:he":"סטימצקי",shop:"books"},countryCodes:["il"],terms:[],matchScore:2,suggestion:true},"shop/books/צומת ספרים":{name:"צומת ספרים",icon:"fas-book",imageURL:"https://graph.facebook.com/tzometsfarim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6743833",shop:"books"},addTags:{brand:"צומת ספרים","brand:en":"Tzomet Sfarim","brand:he":"צומת ספרים","brand:wikidata":"Q6743833","brand:wikipedia":"he:צומת ספרים",name:"צומת ספרים","name:en":"Tzomet Sfarm","name:he":"צומת ספרים",shop:"books"},countryCodes:["il"],terms:["Zomet Sfarim"],matchScore:2,suggestion:true},"shop/books/あおい書店":{name:"あおい書店",icon:"fas-book",imageURL:"https://graph.facebook.com/aoi.bookstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11256783",shop:"books"},addTags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"fas-book",imageURL:"https://graph.facebook.com/bookoffcorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q893011",shop:"books"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/メロンブックス":{name:"メロンブックス",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/877364475304714240/Ael4G2BP_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q10851653",shop:"books"},addTags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/リブロ":{name:"リブロ",icon:"fas-book",imageURL:"https://graph.facebook.com/libroryubo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6542768",shop:"books"},addTags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/三省堂書店":{name:"三省堂書店",icon:"fas-book",imageURL:"https://graph.facebook.com/books.sanseido/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10866539",shop:"books"},addTags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/文教堂":{name:"文教堂",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q11499974",shop:"books"},addTags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"fas-book",geometry:["point","area"],tags:{"brand:wikidata":"Q6124193",shop:"books"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/books/未来屋書店":{name:"未来屋書店",icon:"fas-book",imageURL:"https://graph.facebook.com/miraiyashoten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11519563",shop:"books"},addTags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Coqivoire":{name:"Coqivoire",icon:"fas-bacon",imageURL:"https://graph.facebook.com/COQIVOIRE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60183284",shop:"butcher"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"fas-bacon",imageURL:"https://graph.facebook.com/foaniservices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60183335",shop:"butcher"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},countryCodes:["ci"],terms:[],matchScore:2,suggestion:true},"shop/butcher/M&M Food Market":{name:"M&M Food Market",icon:"fas-bacon",imageURL:"https://pbs.twimg.com/profile_images/705793072836288513/-hlwSo1Q_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6711827",shop:"butcher"},addTags:{brand:"M&M Food Market","brand:wikidata":"Q6711827","brand:wikipedia":"en:M&M Food Market",name:"M&M Food Market",shop:"butcher"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"fas-bacon",imageURL:"https://graph.facebook.com/vinzenzmurrtraditionsmetzgerei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2527361",shop:"butcher"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"fas-bacon",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%BB%D1%83%D0%BA%D1%81%D0%BA%D0%B8%D0%B9%20%D0%BC%D1%8F%D1%81%D0%BE%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18401767",shop:"butcher"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"fas-bacon",imageURL:"https://graph.facebook.com/rodunnakovbaska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30969660",shop:"butcher"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/butcher/肉のハナマサ":{name:"肉のハナマサ",icon:"fas-bacon",imageURL:"https://graph.facebook.com/hanamasaresto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11326564",shop:"butcher"},addTags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"},countryCodes:["jp"],terms:["ハナマサ"],matchScore:2,suggestion:true},"shop/candles/Yankee Candle":{name:"Yankee Candle",icon:"fas-burn",imageURL:"https://graph.facebook.com/Yankeecandle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8048733",shop:"candles"},addTags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/advanceautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4686051",shop:"car_parts"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},countryCodes:["ca","us","vi"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Auto Plus":{name:"Auto Plus",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/AutoPlusUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65121114",shop:"car_parts"},addTags:{brand:"Auto Plus","brand:wikidata":"Q65121114",name:"Auto Plus",official_name:"Auto Plus Auto Parts",shop:"car_parts"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autozone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4826087",shop:"car_parts"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},countryCodes:["br","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/HalfordsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3398786",shop:"car_parts"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/KOI Auto Parts":{name:"KOI Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/KOIAutoParts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6334934",shop:"car_parts"},addTags:{brand:"KOI Auto Parts","brand:wikidata":"Q6334934","brand:wikipedia":"en:KOI Auto Parts",name:"KOI Auto Parts",shop:"car_parts",short_name:"KOI"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/NAPAAUTOPARTS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6970842",shop:"car_parts"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},countryCodes:["ca","mx","us"],terms:["napa"],matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/oreillyautoparts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7071951",shop:"car_parts"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},countryCodes:["us"],terms:["o'reilly"],matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/RepcoAusCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q173425",shop:"car_parts"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/scauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643119",shop:"car_parts"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/Автомир":{name:"Автомир",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/avtomir.cars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4056321",shop:"car_parts"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/YellowHatUAE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11285915",shop:"car_parts"},addTags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/autobacs.seven/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7886426",shop:"car_parts"},addTags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"fas-car-battery",imageURL:"https://graph.facebook.com/1627235540828842/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11315808",shop:"car_parts"},addTags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q784721",shop:"car_repair"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},countryCodes:["at","de"],terms:["auto-teile-unger"],matchScore:2,suggestion:true},"shop/car_repair/AAMCO":{name:"AAMCO",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/AAMCO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4649902",shop:"car_repair"},addTags:{brand:"AAMCO","brand:wikidata":"Q4649902","brand:wikipedia":"en:AAMCO Transmissions",name:"AAMCO","service:vehicle:transmission":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["aamco transmissions","aamco transmissions and total car care"],matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATSEUROMASTER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4654920",shop:"car_repair"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/BestDrive":{name:"BestDrive",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BestDriveFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63057183",shop:"car_repair"},addTags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"},countryCodes:["cz","fr","sk"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/BoschGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q234021",shop:"car_repair"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},terms:["bosch service"],matchScore:2,suggestion:true},"shop/car_repair/Brakes Plus":{name:"Brakes Plus",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/1152245094897950720/l4DNap9o_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q62075246",shop:"car_repair"},addTags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Car-X":{name:"Car-X",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CarxAuto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859189",shop:"car_repair"},addTags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CarglassSweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1035997",shop:"car_repair"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Carstar":{name:"Carstar",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/CARSTAR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64187891",shop:"car_repair"},addTags:{brand:"Carstar","brand:wikidata":"Q64187891",name:"Carstar","service:vehicle:body_repair":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["carstar auto body repair experts"],matchScore:2,suggestion:true},"shop/car_repair/Citroën":{name:"Citroën",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car_repair"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Euromaster":{name:"Euromaster",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ATSEUROMASTER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3060668",shop:"car_repair"},addTags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"},countryCodes:["ch","de","es","fi","fr","nl","pt"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/FeuVert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3070922",shop:"car_repair"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/FirestoneTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420837",shop:"car_repair"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"},countryCodes:["ca","cl","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car_repair"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/GoodyearNorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q620875",shop:"car_repair"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},countryCodes:["au","ca","cl","pe","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/greasemonkeyintl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598563",shop:"car_repair"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},countryCodes:["cn","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/HalfordsAutocentres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5641894",shop:"car_repair"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},countryCodes:["gb"],terms:["halfords"],matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/jiffylube/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6192247",shop:"car_repair"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/KwikFit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q958053",shop:"car_repair"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/MAACO":{name:"MAACO",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MAACOUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6714015",shop:"car_repair"},addTags:{brand:"MAACO","brand:wikidata":"Q6714015","brand:wikipedia":"en:MAACO",name:"MAACO","service:vehicle:body_repair":"yes","service:vehicle:painting":"yes",shop:"car_repair"},countryCodes:["ca","us"],terms:["maaco collision repair & auto painting"],matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/meinekecarcareusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6810159",shop:"car_repair"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",official_name:"Meineke Car Care Center",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MekonomenSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10580079",shop:"car_repair"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},countryCodes:["dk","no","se"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Midas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312613",shop:"car_repair"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Monro Muffler Brake":{name:"Monro Muffler Brake",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MonroAutoServiceTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6902090",shop:"car_repair"},addTags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"},countryCodes:["us"],terms:["monro"],matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/MrLubeCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17104067",shop:"car_repair"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Norautofr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317698",shop:"car_repair"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/pepboysauto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375007",shop:"car_repair"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car_repair"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Point S":{name:"Point S",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/points.france/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3393358",shop:"car_repair"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car_repair"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},terms:["garage renault"],matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/RoadyFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3434112",shop:"car_repair"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/safelite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28797369",shop:"car_repair"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Sears Auto Center":{name:"Sears Auto Center",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/sears/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6499202",shop:"car_repair"},addTags:{brand:"Sears Auto Center","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears Auto Center",shop:"car_repair"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy":{name:"Speedy",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/vadoncchezSpeedy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3492969",shop:"car_repair"},addTags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Speedy Auto Service":{name:"Speedy Auto Service",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/SpeedyAutoServiceCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22318193",shop:"car_repair"},addTags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car_repair"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Tuffy":{name:"Tuffy",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/Tuffy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17125314",shop:"car_repair"},addTags:{brand:"Tuffy","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy",shop:"car_repair"},countryCodes:["us"],terms:["tuffy auto service","tuffy auto service center","tuffy auto service centers","tuffy service","tuffy service center","tuffy service centers","tuffy tire and auto service","tuffy tire and auto service center","tuffy tire and auto service centers"],matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/viocofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7912852",shop:"car_repair"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",official_name:"Valvoline Instant Oil Change",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/ÖAMTC":{name:"ÖAMTC",icon:"maki-car-repair",imageURL:"https://graph.facebook.com/OEAMTC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306057",shop:"car_repair"},addTags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",imageURL:"https://graph.facebook.com/audi.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23317",shop:"car"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",imageURL:"https://graph.facebook.com/BMWGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26678",shop:"car"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Cadillac":{name:"Cadillac",icon:"maki-car",imageURL:"https://graph.facebook.com/cadillac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27436",shop:"car"},addTags:{brand:"Cadillac","brand:wikidata":"Q27436","brand:wikipedia":"en:Cadillac",name:"Cadillac",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/CarMax":{name:"CarMax",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/458970501172301826/63JNVTLh_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5037190",shop:"car"},addTags:{brand:"CarMax","brand:wikidata":"Q5037190","brand:wikipedia":"en:CarMax",name:"CarMax",second_hand:"only",shop:"car"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",imageURL:"https://graph.facebook.com/chevrolet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29570",shop:"car"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Citroën":{name:"Citroën",icon:"maki-car",imageURL:"https://graph.facebook.com/Citroen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6746",shop:"car"},addTags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",imageURL:"https://graph.facebook.com/Dacia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27460",shop:"car"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",imageURL:"https://graph.facebook.com/Fiat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q27597",shop:"car"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",imageURL:"https://graph.facebook.com/ford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44294",shop:"car"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},terms:["honda cars"],matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",imageURL:"https://graph.facebook.com/Hyundai/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55931",shop:"car"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",imageURL:"https://graph.facebook.com/isuzumex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29803",shop:"car"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Jaguar":{name:"Jaguar",icon:"maki-car",imageURL:"https://graph.facebook.com/landroverusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26742231",shop:"car"},addTags:{brand:"Jaguar","brand:wikidata":"Q26742231",name:"Jaguar",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",imageURL:"https://graph.facebook.com/Kiamotorsworldwide/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35349",shop:"car"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},terms:["kia motors"],matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20Land%20Rover%2C%20a%20British%20marque.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q35907",shop:"car"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",imageURL:"https://graph.facebook.com/lexus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35919",shop:"car"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Lincoln":{name:"Lincoln",icon:"maki-car",imageURL:"https://graph.facebook.com/Lincoln/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q216796",shop:"car"},addTags:{brand:"Lincoln","brand:wikidata":"Q216796","brand:wikipedia":"en:Lincoln Motor Company",name:"Lincoln",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",imageURL:"https://graph.facebook.com/Mazda.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35996",shop:"car"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",imageURL:"https://graph.facebook.com/MercedesBenz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36008",shop:"car"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},terms:["mercedes"],matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",imageURL:"https://graph.facebook.com/MitsubishiMotors.en/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q36033",shop:"car"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},terms:["mitsubishi motors"],matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FToyota-Dealer-Netz.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11325416",shop:"car"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",imageURL:"https://graph.facebook.com/NissanJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20165",shop:"car"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",imageURL:"https://graph.facebook.com/Opel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40966",shop:"car"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",imageURL:"https://graph.facebook.com/Peugeot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6742",shop:"car"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",imageURL:"https://graph.facebook.com/porsche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40993",shop:"car"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",imageURL:"https://graph.facebook.com/Renault/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6686",shop:"car"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",imageURL:"https://graph.facebook.com/SEAT.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188217",shop:"car"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",imageURL:"https://graph.facebook.com/skoda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29637",shop:"car"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",imageURL:"https://graph.facebook.com/SUBARU.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q172741",shop:"car"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"car"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",imageURL:"https://pbs.twimg.com/profile_images/489192650474414080/4RxZxsud_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q478214",shop:"car"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},terms:["tesla motors"],matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",imageURL:"https://graph.facebook.com/toyota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q53268",shop:"car"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",imageURL:"https://graph.facebook.com/VW/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q246",shop:"car"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},terms:["vw"],matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",imageURL:"https://graph.facebook.com/volvocars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q215293",shop:"car"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/Автомир":{name:"Автомир",icon:"maki-car",imageURL:"https://graph.facebook.com/avtomir.cars/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4056321",shop:"car"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир","name:en":"Autoworld","name:ru":"Автомир",shop:"car"},terms:[],matchScore:2,suggestion:true},"shop/car/ダイハツ":{name:"ダイハツ",icon:"maki-car",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDaihatsu%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q27511",shop:"car"},addTags:{brand:"ダイハツ","brand:en":"Daihatsu","brand:ja":"ダイハツ","brand:wikidata":"Q27511","brand:wikipedia":"ja:ダイハツ工業",name:"ダイハツ","name:en":"Daihatsu","name:ja":"ダイハツ",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"car"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",imageURL:"https://graph.facebook.com/carpetright/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5045782",shop:"carpet"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},countryCodes:["be","gb","ie","nl"],terms:[],matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",imageURL:"https://graph.facebook.com/argos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4789707",shop:"catalogue"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/ageuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4691850",shop:"charity"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",imageURL:"https://graph.facebook.com/barnardos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2884670",shop:"charity"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",imageURL:"https://graph.facebook.com/bhf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970039",shop:"charity"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",imageURL:"https://graph.facebook.com/britishredcross/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4970966",shop:"charity"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},countryCodes:["gb","gg","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",imageURL:"https://graph.facebook.com/cancerresearchuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326079",shop:"charity"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},countryCodes:["gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",imageURL:"https://graph.facebook.com/GoodwillIntl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5583655",shop:"charity"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",imageURL:"https://graph.facebook.com/mindforbettermentalhealth/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3314763",shop:"charity"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",imageURL:"https://graph.facebook.com/Myrorna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10592609",shop:"charity"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",imageURL:"https://graph.facebook.com/oxfamGB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q267941",shop:"charity"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},countryCodes:["be","de","gb","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",imageURL:"https://graph.facebook.com/RSPCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q584819",shop:"charity"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",imageURL:"https://graph.facebook.com/Scope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7434435",shop:"charity"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",imageURL:"https://graph.facebook.com/SueRyderNational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7634271",shop:"charity"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",imageURL:"https://graph.facebook.com/SalvationArmyUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188307",shop:"charity"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},countryCodes:["au","ca","gb","us"],terms:["salvation army"],matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBipa%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q864933",shop:"chemist"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},countryCodes:["at","hr"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Boots":{name:"Boots",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bootsuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6123139",shop:"chemist"},addTags:{brand:"Boots","brand:wikidata":"Q6123139",name:"Boots",shop:"chemist"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/BUDNI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1001516",shop:"chemist"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/chemist/CVS Pharmacy":{name:"CVS Pharmacy",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CVS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2078880",shop:"chemist"},addTags:{brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",name:"CVS Pharmacy",shop:"chemist",short_name:"CVS"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/707518851785871360/aCEmonjR_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q9212032",shop:"chemist"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Etos":{name:"Etos",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEtos%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2609459",shop:"chemist"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKruidvat%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2226366",shop:"chemist"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},countryCodes:["be","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q6786143",shop:"chemist"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Müller":{name:"Müller",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Drogerie%20Mueller.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1958759",shop:"chemist"},addTags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"},countryCodes:["at","ch","de","es","hr","hu"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Rite Aid":{name:"Rite Aid",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/riteaid/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433273",shop:"chemist"},addTags:{brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",name:"Rite Aid",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/rossmann.gmbh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q316004",shop:"chemist"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},countryCodes:["cz","de","hu","pl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Savers":{name:"Savers",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SaversHB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7428189",shop:"chemist"},addTags:{brand:"Savers","brand:wikidata":"Q7428189",name:"Savers",official_name:"Savers Health & Beauty",shop:"chemist"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Superdrug":{name:"Superdrug",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Superdrug/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643261",shop:"chemist"},addTags:{brand:"Superdrug","brand:wikidata":"Q7643261",name:"Superdrug",shop:"chemist"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Teta":{name:"Teta",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q20860823",shop:"chemist"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/1141970592448602112/ubBPZHWI_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q2551576",shop:"chemist"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/chemist/Walgreens":{name:"Walgreens",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/walgreens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1591889",shop:"chemist"},addTags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"},countryCodes:["us"],terms:["walgreens pharmacy"],matchScore:2,suggestion:true},"shop/chemist/Watsons":{name:"Watsons",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",shop:"chemist"},addTags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",shop:"chemist"},terms:[],matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/dm.Deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q266572",shop:"chemist"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],terms:["dm drogerie markt"],matchScore:2,suggestion:true},"shop/chemist/屈臣氏":{name:"屈臣氏",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/WatsonsPH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7974785",shop:"chemist"},addTags:{brand:"屈臣氏","brand:wikidata":"Q7974785","brand:wikipedia":"zh:屈臣氏",name:"屈臣氏",shop:"chemist"},countryCodes:["cn","hk","tw"],terms:[],matchScore:2,suggestion:true},"shop/chemist/康是美":{name:"康是美",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11063876",shop:"chemist"},addTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",imageURL:"https://graph.facebook.com/CacauShow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9671713",shop:"chocolate"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Gertrude Hawk Chocolates":{name:"Gertrude Hawk Chocolates",icon:"maki-shop",imageURL:"https://graph.facebook.com/gertrudehawkchocolates/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5553326",shop:"chocolate"},addTags:{brand:"Gertrude Hawk Chocolates","brand:wikidata":"Q5553326","brand:wikipedia":"en:Gertrude Hawk Chocolates",name:"Gertrude Hawk Chocolates",shop:"chocolate",short_name:"Gertrude Hawk"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Godiva Chocolatier":{name:"Godiva Chocolatier",icon:"maki-shop",imageURL:"https://graph.facebook.com/Godiva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q931084",shop:"chocolate"},addTags:{brand:"Godiva Chocolatier","brand:wikidata":"Q931084","brand:wikipedia":"en:Godiva Chocolatier",name:"Godiva Chocolatier",shop:"chocolate",short_name:"Godiva"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Jeff de Bruges":{name:"Jeff de Bruges",icon:"maki-shop",imageURL:"https://graph.facebook.com/JeffdeBrugesofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3176626",shop:"chocolate"},addTags:{brand:"Jeff de Bruges","brand:wikidata":"Q3176626","brand:wikipedia":"fr:Jeff de Bruges",name:"Jeff de Bruges",shop:"chocolate"},countryCodes:["ca","cz","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Laura Secord":{name:"Laura Secord",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/771761705336639488/0S9UP_QL_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6499418",shop:"chocolate"},addTags:{brand:"Laura Secord","brand:wikidata":"Q6499418","brand:wikipedia":"en:Laura Secord Chocolates",name:"Laura Secord",shop:"chocolate"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",imageURL:"https://graph.facebook.com/Leonidas.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q80335",shop:"chocolate"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},countryCodes:["be","cz","fr","gb","gr","nl"],terms:[],matchScore:2,suggestion:true},"shop/chocolate/Lindt":{name:"Lindt",icon:"maki-shop",imageURL:"https://graph.facebook.com/lindtchocolateusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152822",shop:"chocolate"},addTags:{brand:"Lindt","brand:wikidata":"Q152822","brand:wikipedia":"en:Lindt & Sprüngli",name:"Lindt",shop:"chocolate"},terms:[],matchScore:2,suggestion:true},"shop/chocolate/Purdys Chocolatier":{name:"Purdys Chocolatier",icon:"maki-shop",imageURL:"https://graph.facebook.com/PurdysChocolatier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7261007",shop:"chocolate"},addTags:{brand:"Purdys Chocolatier","brand:wikidata":"Q7261007","brand:wikipedia":"en:Purdy's Chocolates",name:"Purdys Chocolatier",shop:"chocolate"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/AOKI":{name:"AOKI",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/aokistyle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11189480",shop:"clothes"},addTags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/abercrombieofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319344",shop:"clothes"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AccessorizeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65007482",shop:"clothes"},addTags:{brand:"Accessorize","brand:wikidata":"Q65007482",name:"Accessorize",shop:"clothes"},countryCodes:["gb","it","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AckermansSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4674255",shop:"clothes"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Aeropostale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q794565",shop:"clothes"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/AllSaints":{name:"AllSaints",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/926445027907293185/xgAk5nhG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4728473",shop:"clothes"},addTags:{brand:"AllSaints","brand:wikidata":"Q4728473","brand:wikipedia":"en:AllSaints",name:"AllSaints",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/americaneagle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2842931",shop:"clothes"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes",short_name:"American Eagle"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AnnTaylor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4766699",shop:"clothes"},addTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Anthropologie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4773903",shop:"clothes"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Arc'teryx":{name:"Arc'teryx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/arcteryx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3271455",shop:"clothes"},addTags:{brand:"Arc'teryx","brand:wikidata":"Q3271455","brand:wikipedia":"en:Arc'teryx",clothes:"men;women",name:"Arc'teryx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Ardene/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2860764",shop:"clothes"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},countryCodes:["ca","sn"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Aritzia":{name:"Aritzia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/aritzia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4791147",shop:"clothes"},addTags:{brand:"Aritzia","brand:wikidata":"Q4791147","brand:wikipedia":"en:Aritzia",clothes:"women",name:"Aritzia",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ARMANDTHIERY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2861975",shop:"clothes"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Armani Exchange":{name:"Armani Exchange",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/armaniexchange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56045740",shop:"clothes"},addTags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Baby Gap":{name:"Baby Gap",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Baby Gap",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BananaRepublic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q806085",shop:"clothes"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bershka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q827258",shop:"clothes"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Barclay.Betty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q850250",shop:"clothes"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bigstareurope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9171569",shop:"clothes"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},countryCodes:["by","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Billabong":{name:"Billabong",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/993897138152091648/RkssuGQ7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q862718",shop:"clothes"},addTags:{brand:"Billabong","brand:wikidata":"Q862718","brand:wikipedia":"en:Billabong (clothing)",clothes:"men;women",name:"Billabong",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Bluenotes":{name:"Bluenotes",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1148268137449775111/rhL9wC1e_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q4930395",shop:"clothes"},addTags:{brand:"Bluenotes","brand:wikidata":"Q4930395","brand:wikipedia":"en:Bluenotes",name:"Bluenotes",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BONITAfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q892598",shop:"clothes"},addTags:{brand:"Bonita","brand:wikidata":"Q892598","brand:wikipedia":"de:Bonita (Unternehmen)",name:"Bonita",shop:"clothes"},countryCodes:["at","ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bonoboplanet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63682093",shop:"clothes"},addTags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobos":{name:"Bonobos",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bonobos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4942546",shop:"clothes"},addTags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brice":{name:"Brice",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/833583108603658240/v7HkRIsd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2925067",shop:"clothes"},addTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BrooksBrothers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q929722",shop:"clothes"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Brunello Cucinelli":{name:"Brunello Cucinelli",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BrunelloCucinelli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3645582",shop:"clothes"},addTags:{brand:"Brunello Cucinelli","brand:wikidata":"Q3645582","brand:wikipedia":"en:Brunello Cucinelli",name:"Brunello Cucinelli",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Buckle":{name:"Buckle",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bucklestore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4983306",shop:"clothes"},addTags:{brand:"Buckle","brand:wikidata":"Q4983306","brand:wikipedia":"en:Buckle (clothing retailer)",clothes:"men;women",name:"Buckle",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Buffalo Exchange":{name:"Buffalo Exchange",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/buffaloexchange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985721",shop:"clothes"},addTags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Burberry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q390107",shop:"clothes"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",clothes:"men;women",name:"Burberry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BurlingtonStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4999220",shop:"clothes"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BurtonMenswear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5000795",shop:"clothes"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},countryCodes:["fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701338",shop:"clothes"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/COS":{name:"COS",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/cos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60772401",shop:"clothes"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cache Cache":{name:"Cache Cache",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CacheCacheFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63064086",shop:"clothes"},addTags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CalvinKlein/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1068628",shop:"clothes"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/calzedonia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1027874",shop:"clothes"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/camaieu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2934647",shop:"clothes"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},countryCodes:["be","cz","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CAMPDAVID.OFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50540636",shop:"clothes"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},countryCodes:["at","de","ee","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Canada Goose":{name:"Canada Goose",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/canadagoose/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2988422",shop:"clothes"},addTags:{brand:"Canada Goose","brand:wikidata":"Q2988422","brand:wikipedia":"en:Canada Goose",name:"Canada Goose",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Carhartt":{name:"Carhartt",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Carhartt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q527877",shop:"clothes"},addTags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",clothes:"workwear",name:"Carhartt",shop:"clothes"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Caroll":{name:"Caroll",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/carollparis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63063871",shop:"clothes"},addTags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/carters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5047083",shop:"clothes"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",clothes:"children",name:"Carter's",shop:"clothes"},terms:["carters babies and kids"],matchScore:2,suggestion:true},"shop/clothes/Catherines":{name:"Catherines",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CatherinesPlusSizes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026208",shop:"clothes"},addTags:{brand:"Catherines","brand:wikidata":"Q64026208",clothes:"oversize;women",name:"Catherines",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CatoFashions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16956136",shop:"clothes"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",clothes:"women",name:"Cato",official_name:"Cato Fashions",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/celioOFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2672003",shop:"clothes"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Chanel":{name:"Chanel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/chanel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q218115",shop:"clothes"},addTags:{brand:"Chanel","brand:wikidata":"Q218115","brand:wikipedia":"en:Chanel",name:"Chanel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCharles%20Voegele%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1066326",shop:"clothes"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes",short_name:"Vögele"},countryCodes:["at","be","ch","de","hu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CharlotteRusse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5086126",shop:"clothes"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Charming Charlie":{name:"Charming Charlie",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q16829286",shop:"clothes"},addTags:{brand:"Charming Charlie","brand:wikidata":"Q16829286","brand:wikipedia":"en:Charming Charlie",clothes:"women",name:"Charming Charlie",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LoveChicos/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5096393",shop:"clothes"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},countryCodes:["ar","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ChristopherandBanks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5111816",shop:"clothes"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Club Monaco":{name:"Club Monaco",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/clubmonaco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2979949",shop:"clothes"},addTags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Colin's":{name:"Colin's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ColinsLook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28729658",shop:"clothes"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ColumbiaSportswear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1112588",shop:"clothes"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",official_name:"Columbia Sportswear",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cropp":{name:"Cropp",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/CroppGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9196793",shop:"clothes"},addTags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"},countryCodes:["cs","hu","pl","ro","ru","sk","ua"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/cubusnorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3439593",shop:"clothes"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},countryCodes:["de","fi","lv","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/DXL Men's Apparel":{name:"DXL Men's Apparel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DestinationXL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61981830",shop:"clothes"},addTags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel",shop:"clothes",short_name:"DXL"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Damart":{name:"Damart",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/damartbelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3012602",shop:"clothes"},addTags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/davidsbridal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5230388",shop:"clothes"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",clothes:"wedding",name:"David's Bridal",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/desigual6/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q83750",shop:"clothes"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Devred":{name:"Devred",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Devred1902.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3025542",shop:"clothes"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},countryCodes:["be","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Diesel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q158285",shop:"clothes"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Dior":{name:"Dior",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Dior/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q542767",shop:"clothes"},addTags:{brand:"Dior","brand:wikidata":"Q542767","brand:wikipedia":"en:Christian Dior (fashion house)",name:"Dior",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Diverse":{name:"Diverse",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DiverseSystem/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11694298",shop:"clothes"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dolce & Gabbana":{name:"Dolce & Gabbana",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/DolceGabbana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q214480",shop:"clothes"},addTags:{brand:"Dolce & Gabbana","brand:wikidata":"Q214480","brand:wikipedia":"en:Dolce & Gabbana",name:"Dolce & Gabbana",shop:"clothes"},terms:["d and g","dg","dolce and gabana","dolce and gabanna","dolce and gabbanna","dolce y gabana","dolce y gabanna","dolce y gabbana","dolce y gabbanna"],matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dorothyperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5298588",shop:"clothes"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},countryCodes:["gb","gg","ie","im"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dressbarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5307031",shop:"clothes"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/dressmann.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3357081",shop:"clothes"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},countryCodes:["at","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Dynamite":{name:"Dynamite",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q3117385",shop:"clothes"},addTags:{brand:"Dynamite","brand:wikidata":"Q3117385","brand:wikipedia":"en:Groupe Dynamite",clothes:"women",name:"Dynamite",shop:"clothes"},countryCodes:["ca","jo","ku","sa","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/EddieBauer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q842174",shop:"clothes"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},countryCodes:["ca","jp","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Edinburgh Woollen Mill":{name:"Edinburgh Woollen Mill",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/edinburghwoollenmill/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16834657",shop:"clothes"},addTags:{brand:"Edinburgh Woollen Mill","brand:wikidata":"Q16834657",name:"Edinburgh Woollen Mill",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/engbers.maennermode/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1290088",shop:"clothes"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ermenegildo Zegna":{name:"Ermenegildo Zegna",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ermenegildozegna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1355904",shop:"clothes"},addTags:{brand:"Ermenegildo Zegna","brand:wikidata":"Q1355904","brand:wikipedia":"en:Ermenegildo Zegna",clothes:"men",name:"Ermenegildo Zegna",shop:"clothes",short_name:"Zegna"},countryCodes:["ch","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Ernstingsfamily/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1361016",shop:"clothes"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/esprit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q532746",shop:"clothes"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/etam/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3059202",shop:"clothes"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Express":{name:"Express",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/express/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1384784",shop:"clothes"},addTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Fairweather":{name:"Fairweather",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/870307662935805961/8fyPNSUX_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64861806",shop:"clothes"},addTags:{brand:"Fairweather","brand:wikidata":"Q64861806",clothes:"women",name:"Fairweather",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/fatfaceusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5437186",shop:"clothes"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Fendi":{name:"Fendi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Fendi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q926575",shop:"clothes"},addTags:{brand:"Fendi","brand:wikidata":"Q926575","brand:wikipedia":"en:Fendi",name:"Fendi",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Forever21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1060537",shop:"clothes"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Free People":{name:"Free People",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/FreePeople/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5499945",shop:"clothes"},addTags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/GU":{name:"GU",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/g.u.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5512642",shop:"clothes"},addTags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"},countryCodes:["cl","jp","tw"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gabe's":{name:"Gabe's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GabesStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5515554",shop:"clothes"},addTags:{brand:"Gabe's","brand:wikidata":"Q5515554","brand:wikipedia":"en:Gabe's",name:"Gabe's",shop:"clothes"},countryCodes:["us"],terms:["gabriel brothers"],matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1493667",shop:"clothes"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},terms:["the gap"],matchScore:2,suggestion:true},"shop/clothes/Gap Kids":{name:"Gap Kids",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GapJapan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420822",shop:"clothes"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap Kids",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Garage":{name:"Garage",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1146854016837722112/LnnLsWgk_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5521860",shop:"clothes"},addTags:{brand:"Garage","brand:wikidata":"Q5521860","brand:wikipedia":"en:Garage (clothing retailer)",clothes:"women",name:"Garage",shop:"clothes"},countryCodes:["am","ca","jo","om","qa","sa","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gerryweber.global/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q873447",shop:"clothes"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ginalaura.mode/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2700576",shop:"clothes"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gloria Jeans":{name:"Gloria Jeans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/gloriajeanscorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4139985",shop:"clothes"},addTags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GUCCI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q178516",shop:"clothes"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/GUESS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2470307",shop:"clothes"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Gymboree/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4039771",shop:"clothes"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Gémo":{name:"Gémo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Gemo.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3122954",shop:"clothes"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},countryCodes:["be","ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hmhongkong/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q188326",shop:"clothes"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Haggar":{name:"Haggar",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1013286424693518336/6XVpnzF7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5638669",shop:"clothes"},addTags:{alt_name:"Haggar Clothing Co.",brand:"Haggar","brand:wikidata":"Q5638669","brand:wikipedia":"en:Haggar Clothing",name:"Haggar",shop:"clothes"},countryCodes:["us"],terms:["haggar clothing"],matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hallhuberfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571714",shop:"clothes"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},countryCodes:["at","ch","de","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hanna Andersson":{name:"Hanna Andersson",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ShopHannaAndersson/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17460802",shop:"clothes"},addTags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"},countryCodes:["us"],terms:["hanna anderssen"],matchScore:2,suggestion:true},"shop/clothes/Hermès":{name:"Hermès",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hermesusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q843887",shop:"clothes"},addTags:{brand:"Hermès","brand:wikidata":"Q843887","brand:wikipedia":"en:Hermès",name:"Hermès",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hollister/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1257477",shop:"clothes"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",official_name:"Hollister Co.",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hottopic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9294032",shop:"clothes"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hugoboss/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q491627",shop:"clothes"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes",short_name:"Boss"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/hunkemoller/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2604175",shop:"clothes"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},countryCodes:["at","be","de","dk","es","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Indochino":{name:"Indochino",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/indochino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64448127",shop:"clothes"},addTags:{brand:"Indochino","brand:wikidata":"Q64448127","brand:wikipedia":"en:Indochino",clothes:"suits",name:"Indochino",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/intimissimi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q305404",shop:"clothes"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/J.Crew":{name:"J.Crew",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jcrew/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5370765",shop:"clothes"},addTags:{brand:"J.Crew","brand:wikidata":"Q5370765","brand:wikipedia":"en:J.Crew",clothes:"men;women;children",name:"J.Crew",shop:"clothes"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/J.Jill":{name:"J.Jill",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JJillStyle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64448268",shop:"clothes"},addTags:{brand:"J.Jill","brand:wikidata":"Q64448268","brand:wikipedia":"en:J.Jill",clothes:"women",name:"J.Jill",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/JBC":{name:"JBC",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jbcfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2671470",shop:"clothes"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jackandjonesUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6077665",shop:"clothes"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/jackwills/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6115814",shop:"clothes"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Janie & Jack":{name:"Janie & Jack",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/janieandjack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64449634",shop:"clothes"},addTags:{brand:"Janie & Jack","brand:wikidata":"Q64449634","brand:wikipedia":"en:Janie & Jack",clothes:"children",name:"Janie & Jack",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JeansFritz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1686071",shop:"clothes"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/brand.jennyfer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3177174",shop:"clothes"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},countryCodes:["fr","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jet":{name:"Jet",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/JetGoodForLife/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61995123",shop:"clothes"},addTags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/InsideJigsaw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6192383",shop:"clothes"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},countryCodes:["au","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/JoS. A. Bank":{name:"JoS. A. Bank",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Jos.A.Bank.Clothiers.Inc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6204078",shop:"clothes"},addTags:{brand:"JoS. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"JoS. A. Bank",official_name:"Jos. A. Bank Clothiers",shop:"clothes"},countryCodes:["us"],terms:["joseph a bank"],matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Joules/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25351738",shop:"clothes"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Jules":{name:"Jules",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Julescom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3188386",shop:"clothes"},addTags:{brand:"Jules","brand:wikidata":"Q3188386","brand:wikipedia":"fr:Jules (enseigne)",clothes:"men",name:"Jules",shop:"clothes"},countryCodes:["be","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Justice":{name:"Justice",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Justice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7857512",shop:"clothes"},addTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/kappahl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4349016",shop:"clothes"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},countryCodes:["fi","no","pl","se"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Kate Spade New York":{name:"Kate Spade New York",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/katespadeny/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6375797",shop:"clothes"},addTags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes",short_name:"Kate Spade"},countryCodes:["ca","us"],terms:["kate spade ny"],matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/kik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883965",shop:"clothes"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Kiabi.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3196299",shop:"clothes"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lcwaikiki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3205965",shop:"clothes"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lasenza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3212802",shop:"clothes"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},countryCodes:["ca","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/La Vie en Rose":{name:"La Vie en Rose",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/540241105199980544/QfhC9PHl_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4950452",shop:"clothes"},addTags:{brand:"La Vie en Rose","brand:wikidata":"Q4950452","brand:wikipedia":"en:Boutique La Vie en Rose",clothes:"underwear;women",name:"La Vie en Rose",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lacoste/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309031",shop:"clothes"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LaneBryant/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6485350",shop:"clothes"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Laura":{name:"Laura",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q6498590",shop:"clothes"},addTags:{brand:"Laura","brand:wikidata":"Q6498590","brand:wikipedia":"en:Laura (clothing retailer)",clothes:"women",name:"Laura",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Le Château":{name:"Le Château",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/984791052736434176/OKpgwHyj_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6506731",shop:"clothes"},addTags:{brand:"Le Château","brand:wikidata":"Q6506731","brand:wikipedia":"en:Le Château",name:"Le Château",shop:"clothes"},countryCodes:["ae","ca","sa"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Levis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127962",shop:"clothes"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lids":{name:"Lids",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Lids/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19841609",shop:"clothes"},addTags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lindex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1786717",shop:"clothes"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},countryCodes:["cz","ee","fi","no","se","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Loft":{name:"Loft",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LOFT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075137",shop:"clothes"},addTags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",shop:"clothes"},terms:["ann taylor loft"],matchScore:2,suggestion:true},"shop/clothes/Loro Piana":{name:"Loro Piana",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LoroPiana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1686544",shop:"clothes"},addTags:{brand:"Loro Piana","brand:wikidata":"Q1686544","brand:wikipedia":"en:Loro Piana",name:"Loro Piana",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/LouisVuitton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q191485",shop:"clothes"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Lowes":{name:"Lowes",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/842174325243305984/dylLS9xr_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6693996",shop:"clothes"},addTags:{brand:"Lowes","brand:wikidata":"Q6693996","brand:wikipedia":"en:Lowes Menswear",name:"Lowes",shop:"clothes"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Lucky Brand":{name:"Lucky Brand",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/luckybrand/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6697865",shop:"clothes"},addTags:{brand:"Lucky Brand","brand:wikidata":"Q6697865","brand:wikipedia":"en:Lucky Brand Jeans",name:"Lucky Brand",shop:"clothes"},countryCodes:["ca","us"],terms:["lucky brand jeans"],matchScore:2,suggestion:true},"shop/clothes/Lululemon":{name:"Lululemon",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/lululemon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6702957",shop:"clothes"},addTags:{brand:"Lululemon","brand:wikidata":"Q6702957","brand:wikipedia":"en:Lululemon Athletica",clothes:"men;women",name:"Lululemon",official_name:"Lululemon Athletica",shop:"clothes"},countryCodes:["au","ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/mandcofashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711808",shop:"clothes"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Madewell":{name:"Madewell",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/madewell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026213",shop:"clothes"},addTags:{brand:"Madewell","brand:wikidata":"Q64026213",clothes:"men;women",name:"Madewell",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/mango.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136503",shop:"clothes"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marcopoloru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1892752",shop:"clothes"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},countryCodes:["at","be","ch","de","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Marimekko":{name:"Marimekko",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marimekkodesignhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q534903",shop:"clothes"},addTags:{brand:"Marimekko","brand:wikidata":"Q534903","brand:wikipedia":"fi:Marimekko",name:"Marimekko",shop:"clothes"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MarksClothing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6766373",shop:"clothes"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MassimoDuttiOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q788231",shop:"clothes"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/shopmatalan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12061509",shop:"clothes"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},countryCodes:["ae","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/maurices/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6793571",shop:"clothes"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},countryCodes:["ca","fr","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/maxmara/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1151774",shop:"clothes"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Melanie Lyne":{name:"Melanie Lyne",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q64861470",shop:"clothes"},addTags:{brand:"Melanie Lyne","brand:wikidata":"Q64861470",clothes:"women",name:"Melanie Lyne",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MensWearhouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57405513",shop:"clothes"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513","brand:wikipedia":"en:Men's Wearhouse",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"},countryCodes:["us"],terms:["mens warehouse"],matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Mexx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1837290",shop:"clothes"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MichaelKors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19572998",shop:"clothes"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MonsoonUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65007501",shop:"clothes"},addTags:{brand:"Monsoon","brand:wikidata":"Q65007501",name:"Monsoon",shop:"clothes"},countryCodes:["gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Moores":{name:"Moores",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/471700618038345729/gZ8q6UVv_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q6908309",shop:"clothes"},addTags:{brand:"Moores","brand:wikidata":"Q6908309","brand:wikipedia":"en:Moores",clothes:"men",name:"Moores",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MRPFASHION/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6929120",shop:"clothes"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nkd.friends/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q927272",shop:"clothes"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},countryCodes:["at","de","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nafnaf.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3334188",shop:"clothes"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Nautica":{name:"Nautica",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Nautica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6981479",shop:"clothes"},addTags:{brand:"Nautica","brand:wikidata":"Q6981479","brand:wikipedia":"en:Nautica (clothing company)",name:"Nautica",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/newlook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12063852",shop:"clothes"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},countryCodes:["be","de","fr","gb","ie","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/New York & Company":{name:"New York & Company",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NewYorkandCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7012977",shop:"clothes"},addTags:{brand:"New York & Company","brand:wikidata":"Q7012977","brand:wikipedia":"en:New York & Company",name:"New York & Company",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NewYorker.Fashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706421",shop:"clothes"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nextofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q246655",shop:"clothes"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/nike/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483915",shop:"clothes"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/NordstromRack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21463374",shop:"clothes"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OVSGlobalPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2042514",shop:"clothes"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},countryCodes:["at","ch","fr","it","si"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Oasis":{name:"Oasis",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/oasisfashions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64532852",shop:"clothes"},addTags:{brand:"Oasis","brand:wikidata":"Q64532852",name:"Oasis",shop:"clothes"},countryCodes:["es","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OkaidiWorld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3350027",shop:"clothes"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},countryCodes:["be","ch","es","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/oldnavy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2735242",shop:"clothes"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Only":{name:"Only",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ONLY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61799370",shop:"clothes"},addTags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/orchestraUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28042940",shop:"clothes"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/orsay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q883245",shop:"clothes"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OutfitFashionUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7112061",shop:"clothes"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},countryCodes:["de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/OYSHO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3327046",shop:"clothes"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/PacSun":{name:"PacSun",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/pacsun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7121857",shop:"clothes"},addTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Palmers":{name:"Palmers",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/palmers.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1509985",shop:"clothes"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/peacocksclothing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7157762",shop:"clothes"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},countryCodes:["cy","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/peekcloppenburg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2066959",shop:"clothes"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},countryCodes:["at","be","de","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PEPSocial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7166182",shop:"clothes"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20Potomac%20Electric%20Power%20Company.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11815580",shop:"clothes"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},countryCodes:["cz","hu","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/petitbateauus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3377090",shop:"clothes"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},countryCodes:["be","de","fr","gb","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/phaseeight/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17020730",shop:"clothes"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},countryCodes:["ch","de","gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pierre Cardin":{name:"Pierre Cardin",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PIERRECARDINOFFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22921009",shop:"clothes"},addTags:{brand:"Pierre Cardin","brand:wikidata":"Q22921009",name:"Pierre Cardin",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Pimkie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1758066",shop:"clothes"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},countryCodes:["at","be","de","es","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Pink":{name:"Pink",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/vspink/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20716793",shop:"clothes"},addTags:{brand:"Pink","brand:wikidata":"Q20716793","brand:wikipedia":"en:Pink (Victoria's Secret)",clothes:"underwear;women",name:"Pink",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Plato's Closet":{name:"Plato's Closet",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/platoscloset/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61779112",shop:"clothes"},addTags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",second_hand:"only",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Polo Ralph Lauren":{name:"Polo Ralph Lauren",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RalphLauren/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1641437",shop:"clothes"},addTags:{brand:"Polo Ralph Lauren","brand:wikidata":"Q1641437","brand:wikipedia":"en:Ralph Lauren Corporation",name:"Polo Ralph Lauren",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Primark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q137023",shop:"clothes"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Promod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3407429",shop:"clothes"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/pullandbear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q691029",shop:"clothes"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Puma":{name:"Puma",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/PUMA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q157064",shop:"clothes"},addTags:{brand:"Puma","brand:wikidata":"Q157064","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RainbowApparel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7284708",shop:"clothes"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Reebok":{name:"Reebok",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ReebokUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q466183",shop:"clothes"},addTags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/reitmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7310506",shop:"clothes"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Reserved/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21809354",shop:"clothes"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/riverisland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2670328",shop:"clothes"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},countryCodes:["gb","ie","im","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Robert Graham":{name:"Robert Graham",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/robertgrahamnyc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18390679",shop:"clothes"},addTags:{brand:"Robert Graham","brand:wikidata":"Q18390679","brand:wikipedia":"en:Robert Graham (fashion brand)",clothes:"men",name:"Robert Graham",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/RossDressforLess/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3442791",shop:"clothes"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Saint Laurent":{name:"Saint Laurent",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ysl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2282172",shop:"clothes"},addTags:{alt_name:"Yves Saint Laurent",brand:"Saint Laurent","brand:wikidata":"Q2282172","brand:wikipedia":"en:Yves Saint Laurent (brand)",name:"Saint Laurent",shop:"clothes",short_name:"YSL"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Sela":{name:"Sela",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sela.shop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075111",shop:"clothes"},addTags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"},countryCodes:["kg","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Sergent Major":{name:"Sergent Major",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/sergent.major.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62521738",shop:"clothes"},addTags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"},countryCodes:["be","de","es","fr","gb","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Sisley":{name:"Sisley",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Sisley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12054325",shop:"clothes"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"},countryCodes:["at","ch","de","hr","it","ru"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Slaters":{name:"Slaters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Slaters1973/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7538912",shop:"clothes"},addTags:{brand:"Slaters","brand:wikidata":"Q7538912",clothes:"suits",name:"Slaters",shop:"clothes"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Spanx":{name:"Spanx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/SPANX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1932886",shop:"clothes"},addTags:{brand:"Spanx","brand:wikidata":"Q1932886","brand:wikipedia":"en:Spanx",clothes:"underwear",name:"Spanx",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Springfield/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q958209",shop:"clothes"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Stefanel.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2338087",shop:"clothes"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},countryCodes:["at","de","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Stitches":{name:"Stitches",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/659104617792434176/FTrSM8oi_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7617652",shop:"clothes"},addTags:{brand:"Stitches","brand:wikidata":"Q7617652","brand:wikipedia":"en:Stitches (store)",name:"Stitches",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/stradivas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3322945",shop:"clothes"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Street One":{name:"Street One",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/MyStreetOne/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61997265",shop:"clothes"},addTags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",shop:"clothes"},countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/moda.suburbia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6134992",shop:"clothes"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/SuperdryUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1684445",shop:"clothes"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Suzy Shier":{name:"Suzy Shier",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/743172502814285828/rKuPz3Ms_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q65464976",shop:"clothes"},addTags:{brand:"Suzy Shier","brand:wikidata":"Q65464976",clothes:"women",name:"Suzy Shier",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tjmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10860683",shop:"clothes"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tkmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23823668",shop:"clothes"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TakkoFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1371302",shop:"clothes"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},countryCodes:["at","cz","de","hu","nl"],terms:["takko fashion"],matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TALBOTS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7679064",shop:"clothes"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TALLYWEiJL.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q689695",shop:"clothes"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tati":{name:"Tati",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Tati/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3516026",shop:"clothes"},addTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},countryCodes:["dz","fr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tezenis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28056374",shop:"clothes"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/childrensplace/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3520257",shop:"clothes"},addTags:{alt_name:"Children's Place",brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/thenorthface/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152784",shop:"clothes"},addTags:{alt_name:"North Face",brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/The Sting":{name:"The Sting",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/thesting.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2518794",shop:"clothes"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},countryCodes:["be","de","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/The Walking Company":{name:"The Walking Company",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TheWalkingCompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30716262",shop:"clothes"},addTags:{alt_name:"Walking Company",brand:"The Walking Company","brand:wikidata":"Q30716262","brand:wikipedia":"en:The Walking Company",name:"The Walking Company",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tillys":{name:"Tillys",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/780828141644230657/2yanagO1_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7802889",shop:"clothes"},addTags:{brand:"Tillys","brand:wikidata":"Q7802889","brand:wikipedia":"en:Tillys",clothes:"children;men;women",name:"Tillys",shop:"clothes"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/timberland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1539185",shop:"clothes"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tip Top Tailors":{name:"Tip Top Tailors",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1092442171238699013/-Zx_BPzB_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7808781",shop:"clothes"},addTags:{brand:"Tip Top Tailors","brand:wikidata":"Q7808781","brand:wikipedia":"en:Tip Top Tailors",clothes:"men",name:"Tip Top Tailors",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tomtailor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q571206",shop:"clothes"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Bahama":{name:"Tommy Bahama",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tommybahama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3531299",shop:"clothes"},addTags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/tommyhilfiger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634881",shop:"clothes"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/227518370711659/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1893576",shop:"clothes"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Torrid/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7827120",shop:"clothes"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Tory Burch":{name:"Tory Burch",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/toryburch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19988222",shop:"clothes"},addTags:{brand:"Tory Burch","brand:wikidata":"Q19988222","brand:wikipedia":"en:Tory Burch (company)",name:"Tory Burch",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Triumph":{name:"Triumph",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TriumphInternationalUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q671216",shop:"clothes"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/TruworthsFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24233998",shop:"clothes"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/UNTUCKit":{name:"UNTUCKit",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/UNTUCKit/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28207006",shop:"clothes"},addTags:{brand:"UNTUCKit","brand:wikidata":"Q28207006","brand:wikipedia":"en:Untuckit",name:"UNTUCKit",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/USC":{name:"USC",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uscfashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7866331",shop:"clothes"},addTags:{brand:"USC","brand:wikidata":"Q7866331","brand:wikipedia":"en:USC (clothing retailer)",name:"USC",shop:"clothes"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/ulla.popken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2475146",shop:"clothes"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},countryCodes:["at","be","ch","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Under Armour":{name:"Under Armour",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/UnderArmour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2031485",shop:"clothes"},addTags:{brand:"Under Armour","brand:wikidata":"Q2031485","brand:wikipedia":"en:Under Armour",clothes:"men;women",name:"Under Armour",shop:"clothes"},terms:["under armor"],matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/BenettonUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q817139",shop:"clothes"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes",short_name:"Benetton"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/urbanoutfitters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3552193",shop:"clothes"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/bestsellercom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q594721",shop:"clothes"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/victoriassecret/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q332477",shop:"clothes"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Vilebrequin":{name:"Vilebrequin",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/VILEBREQUIN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3558391",shop:"clothes"},addTags:{brand:"Vilebrequin","brand:wikidata":"Q3558391","brand:wikipedia":"en:Vilebrequin",clothes:"swimwear",name:"Vilebrequin",shop:"clothes"},countryCodes:["fr","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Vineyard Vines":{name:"Vineyard Vines",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/vineyardvines/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7932495",shop:"clothes"},addTags:{brand:"Vineyard Vines","brand:wikidata":"Q7932495","brand:wikipedia":"en:Vineyard Vines",name:"Vineyard Vines",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Volcom":{name:"Volcom",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Volcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2021416",shop:"clothes"},addTags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/weeurope/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1987861",shop:"clothes"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},countryCodes:["be","ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wacoal":{name:"Wacoal",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/wacoal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q909522",shop:"clothes"},addTags:{brand:"Wacoal","brand:wikidata":"Q909522","brand:wikipedia":"en:Wacoal",clothes:"underwear",name:"Wacoal",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/West 49":{name:"West 49",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/925811570889842689/M0Y4yIjA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7984218",shop:"clothes"},addTags:{brand:"West 49","brand:wikidata":"Q7984218","brand:wikipedia":"en:West 49",name:"West 49",shop:"clothes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WhiteHouseBlackMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7994858",shop:"clothes"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},countryCodes:["ca","us"],terms:["white house | black market"],matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WhiteStuffUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7995442",shop:"clothes"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},countryCodes:["de","dk","gb","gg"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WibraBelgie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q943405",shop:"clothes"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wilsons Leather":{name:"Wilsons Leather",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/wilsonsleather/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023296",shop:"clothes"},addTags:{brand:"Wilsons Leather","brand:wikidata":"Q8023296","brand:wikipedia":"en:Wilsons Leather",clothes:"men;women",name:"Wilsons Leather",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Winners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845257",shop:"clothes"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},countryCodes:["ca","es"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Wolford":{name:"Wolford",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WolfordFashion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q431607",shop:"clothes"},addTags:{brand:"Wolford","brand:wikidata":"Q431607","brand:wikipedia":"en:Wolford",name:"Wolford",shop:"clothes"},countryCodes:["at","de","fr","gb","it","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/WoolworthsSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8033997",shop:"clothes"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"},countryCodes:["za"],terms:[],matchScore:2,suggestion:true},"shop/clothes/XXI Forever":{name:"XXI Forever",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/Forever21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1060537",shop:"clothes"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"XXI Forever",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/YamamayOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2599214",shop:"clothes"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},countryCodes:["es","it"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zara/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q147662",shop:"clothes"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zeemantextielsupers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184399",shop:"clothes"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},countryCodes:["be","de","fr","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/zumiez/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8075252",shop:"clothes"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/misterlady.community/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18640136",shop:"clothes"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/rue21/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7377762",shop:"clothes"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/s.OliverGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q265056",shop:"clothes"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},countryCodes:["at","be","de","fr","hr"],terms:[],matchScore:2,suggestion:true},"shop/clothes/しまむら":{name:"しまむら",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/shimamuragroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7758173",shop:"clothes"},addTags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/はるやま":{name:"はるやま",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/haruyama.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11275918",shop:"clothes"},addTags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/uniqlo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26070",shop:"clothes"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ライトオン":{name:"ライトオン",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/righton.co.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346416",shop:"clothes"},addTags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/306869439836144/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11351660",shop:"clothes"},addTags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/AoyamaOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11661241",shop:"clothes"},addTags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",imageURL:"https://graph.facebook.com/nespresso/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301301",shop:"coffee"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},terms:[],matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",imageURL:"https://graph.facebook.com/tchibo.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q564213",shop:"coffee"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},countryCodes:["at","ch","cz","de","pl","sk"],terms:[],matchScore:2,suggestion:true},"shop/computer/DNS":{name:"DNS",icon:"fas-laptop",imageURL:"https://graph.facebook.com/dnsshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036922",shop:"computer"},addTags:{alt_name:"ДНС",brand:"DNS","brand:en":"DNS","brand:ru":"ДНС","brand:wikidata":"Q4036922","brand:wikipedia":"ru:DNS (компания)",name:"DNS","name:en":"DNS","name:ru":"ДНС",shop:"computer"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"fas-laptop",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"computer"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/a2b.officialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15178238",shop:"confectionery"},addTags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hemmakvall":{name:"Hemmakvall",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/hemmakvall/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521791",shop:"confectionery"},addTags:{brand:"Hemmakväll","brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hotel Chocolat":{name:"Hotel Chocolat",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/HotelChocolat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5911369",shop:"confectionery"},addTags:{brand:"Hotel Chocolat","brand:wikidata":"Q5911369",name:"Hotel Chocolat",shop:"confectionery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Hussel":{name:"Hussel",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/HusselConfiserie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17123688",shop:"confectionery"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/jaminonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2291848",shop:"confectionery"},addTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Kilwins":{name:"Kilwins",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/KilwinsChocolatesFudgeandIceCream/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38250832",shop:"confectionery"},addTags:{brand:"Kilwins","brand:wikidata":"Q38250832","brand:wikipedia":"en:Kilwins",cuisine:"chocolate;ice_cream;popcorn",name:"Kilwins",shop:"confectionery"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Rocky Mountain Chocolate Factory":{name:"Rocky Mountain Chocolate Factory",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/myrmcf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7355878",shop:"confectionery"},addTags:{brand:"Rocky Mountain Chocolate Factory","brand:wikidata":"Q7355878","brand:wikipedia":"en:Rocky Mountain Chocolate Factory",name:"Rocky Mountain Chocolate Factory",shop:"confectionery"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/See's Candies":{name:"See's Candies",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Sees.Candies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2103510",shop:"confectionery"},addTags:{brand:"See's Candies","brand:wikidata":"Q2103510","brand:wikipedia":"en:See's Candies",name:"See's Candies",shop:"confectionery"},countryCodes:["us"],terms:["sees candy"],matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Thorntons.Official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q683102",shop:"confectionery"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/Vatsak.KD/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30966576",shop:"confectionery"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",imageURL:"https://graph.facebook.com/chateraise.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11307696",shop:"confectionery"},addTags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/1st Stop":{name:"1st Stop",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q65706152",shop:"convenience"},addTags:{brand:"1st Stop","brand:wikidata":"Q65706152",name:"1st Stop",shop:"convenience"},countryCodes:["us"],terms:["first stop"],matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},terms:["7-11","seven eleven"],matchScore:2,suggestion:true},"shop/convenience/76":{name:"76",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/76gas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1658320",shop:"convenience"},addTags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/fashion8a8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"convenience"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/99 Speedmart":{name:"99 Speedmart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/99speedmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62075061",shop:"convenience"},addTags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"},countryCodes:["br","my","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ABC (Hawaii)":{name:"ABC (Hawaii)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/abcstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4650251",shop:"convenience"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},countryCodes:["us"],terms:["abc stores"],matchScore:2,suggestion:true},"shop/convenience/Aibė":{name:"Aibė",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1022952",shop:"convenience"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"convenience"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alepa":{name:"Alepa",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q4716167",shop:"convenience"},addTags:{brand:"Alepa","brand:wikidata":"Q4716167","brand:wikipedia":"fi:Alepa",name:"Alepa",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alfamart":{name:"Alfamart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/alfamartku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23745600",shop:"convenience"},addTags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"id:Alfamart",name:"Alfamart",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/alfamidiku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12471462",shop:"convenience"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Aral":{name:"Aral",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/araldeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q565734",shop:"convenience"},addTags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"},countryCodes:["de"],terms:["aral tankstelle"],matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152057",shop:"convenience"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},countryCodes:["au","ch","fr","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Best-one":{name:"Best-one",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q4896532",shop:"convenience"},addTags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Buc-ee's":{name:"Buc-ee's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/bucees/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4982335",shop:"convenience"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Budgens":{name:"Budgens",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/DiscoverBudgens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"convenience"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/CBA":{name:"CBA",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"convenience"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"convenience"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/convenience/Carrefour Express":{name:"Carrefour Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/expresshoria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940190",shop:"convenience"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Casey's General Store":{name:"Casey's General Store",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/caseys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940968",shop:"convenience"},addTags:{brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Centra":{name:"Centra",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CentraIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q747678",shop:"convenience"},addTags:{brand:"Centra","brand:wikidata":"Q747678","brand:wikipedia":"en:Centra",name:"Centra",shop:"convenience"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Chata Polska":{name:"Chata Polska",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/chatapolskasklepy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"convenience"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Cheers":{name:"Cheers",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q64154066",shop:"convenience"},addTags:{brand:"Cheers","brand:wikidata":"Q64154066",name:"Cheers",opening_hours:"24/7",shop:"convenience"},countryCodes:["sg","vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Chevron":{name:"Chevron",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Chevron/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319642",shop:"convenience"},addTags:{brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Circle K":{name:"Circle K",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},terms:["ok","ok-mart"],matchScore:2,suggestion:true},"shop/convenience/Citgo":{name:"Citgo",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CITGOPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974437",shop:"convenience"},addTags:{brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Clark's Pump-N-Shop":{name:"Clark's Pump-N-Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/clarkspumpnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65118218",shop:"convenience"},addTags:{brand:"Clark's Pump-N-Shop","brand:wikidata":"Q65118218",name:"Clark's Pump-N-Shop",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Co-op (Canada)":{name:"Co-op (Canada)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"convenience"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coles Express":{name:"Coles Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ColesExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5144653",shop:"convenience"},addTags:{brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop Pronto":{name:"Coop Pronto",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/209094172456220/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1129777",shop:"convenience"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/coop.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"convenience"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Costcutter":{name:"Costcutter",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"convenience"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Couche-Tard":{name:"Couche-Tard",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CoucheTardQc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2836957",shop:"convenience"},addTags:{brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Cumberland Farms":{name:"Cumberland Farms",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/CumberlandFarms/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143685",shop:"convenience"},addTags:{brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Daisy Mart":{name:"Daisy Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/DaisyMart.Kamel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994934",shop:"convenience"},addTags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Delikatesypl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"convenience"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ExtraMile":{name:"ExtraMile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ExtraMileExtras/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64224605",shop:"convenience"},addTags:{brand:"ExtraMile","brand:wikidata":"Q64224605",name:"ExtraMile",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Four Square":{name:"Four Square",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/FourSquareNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5475558",shop:"convenience"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Franprix":{name:"Franprix",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/franprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2420096",shop:"convenience"},addTags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Freshmarket":{name:"Freshmarket",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sklepyfreshmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16546326",shop:"convenience"},addTags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/GS25":{name:"GS25",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/funGS25/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q624041",shop:"convenience"},addTags:{brand:"GS25","brand:wikidata":"Q624041","brand:wikipedia":"ko:GS25",name:"GS25",shop:"convenience"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Groszek":{name:"Groszek",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"convenience"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/607684929288087/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58022603",shop:"convenience"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Hudson":{name:"Hudson",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q5928787",shop:"convenience"},addTags:{brand:"Hudson","brand:wikidata":"Q5928787","brand:wikipedia":"en:Hudson Group",name:"Hudson",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Husky":{name:"Husky",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/huskyenergy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q702049",shop:"convenience"},addTags:{brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky",shop:"convenience"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Indomaret":{name:"Indomaret",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/IndomaretMudahdanHemat/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4262825",shop:"convenience"},addTags:{brand:"Indomaret","brand:wikidata":"Q4262825","brand:wikipedia":"en:Indomaret",name:"Indomaret",shop:"convenience"},countryCodes:["id"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"convenience"},addTags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Jacksons":{name:"Jacksons",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/JacksonsFoodStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64617393",shop:"convenience"},addTags:{brand:"Jacksons","brand:wikidata":"Q64617393",name:"Jacksons",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Joker":{name:"Joker",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/JokerNorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q716328",shop:"convenience"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"convenience"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KMarketSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11868562",shop:"convenience"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kangaroo Express":{name:"Kangaroo Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KangarooExpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61747408",shop:"convenience"},addTags:{brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",shop:"convenience",short_name:"Kangaroo"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Konzum (Balkans)":{name:"Konzum (Balkans)",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKonzum%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q518563",shop:"convenience"},addTags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"convenience"},countryCodes:["ba","hr","rs"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kum & Go":{name:"Kum & Go",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/kumandgo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6443340",shop:"convenience"},addTags:{brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Kwik Shop":{name:"Kwik Shop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/kwikshopstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450417",shop:"convenience"},addTags:{brand:"Kwik Shop","brand:wikidata":"Q6450417","brand:wikipedia":"en:Kwik Shop",name:"Kwik Shop",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/KwikTrip/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6450420",shop:"convenience"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Lewiatan":{name:"Lewiatan",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"convenience"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Lifestyle Express":{name:"Lifestyle Express",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994869",shop:"convenience"},addTags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Loaf 'N Jug":{name:"Loaf 'N Jug",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/loafnjugstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6663398",shop:"convenience"},addTags:{brand:"Loaf 'N Jug","brand:wikidata":"Q6663398","brand:wikipedia":"en:Loaf 'N Jug",name:"Loaf 'N Jug",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Mace":{name:"Mace",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/maces.stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17089386",shop:"convenience"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",shop:"convenience"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/malpkaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18431946",shop:"convenience"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"convenience"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/migrolino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56745088",shop:"convenience"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Minit Mart":{name:"Minit Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MinitMartOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18154470",shop:"convenience"},addTags:{brand:"Minit Mart","brand:wikidata":"Q18154470","brand:wikipedia":"en:Minit Mart Foods Inc.",name:"Minit Mart",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ExxonandMobilStations/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088656",shop:"convenience"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Nasz Sklep":{name:"Nasz Sklep",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q62070369",shop:"convenience"},addTags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Neste K":{name:"Neste K",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q42901270",shop:"convenience"},addTags:{brand:"Neste K","brand:wikidata":"Q42901270","brand:wikipedia":"fi:Neste K",name:"Neste K",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/NewDays":{name:"NewDays",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11234763",shop:"convenience"},addTags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"},countryCodes:["jp"],terms:["newdays ミニ"],matchScore:2,suggestion:true},"shop/convenience/Nisa":{name:"Nisa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/nisalocally/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16999069",shop:"convenience"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},countryCodes:["cn","tw"],terms:["ok便利店 circle k"],matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OntheRunUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16931259",shop:"convenience"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/OXXOTiendas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1342538",shop:"convenience"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Petro-Canada":{name:"Petro-Canada",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/petrocanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1208279",shop:"convenience"},addTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/plaidpantryOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7200591",shop:"convenience"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Premier":{name:"Premier",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/552086468839997441/Ok2vWsQl_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q7240340",shop:"convenience"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Proxi":{name:"Proxi",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q3408522",shop:"convenience"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/RaceTrac":{name:"RaceTrac",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/RaceTrac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735942",shop:"convenience"},addTags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Royal Farms":{name:"Royal Farms",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Royalfarmsstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7374169",shop:"convenience"},addTags:{brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Rutter's":{name:"Rutter's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/rutters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7383544",shop:"convenience"},addTags:{brand:"Rutter's","brand:wikidata":"Q7383544","brand:wikipedia":"en:Rutter's",name:"Rutter's",shop:"convenience"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13218434",shop:"convenience"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sale":{name:"Sale",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11892046",shop:"convenience"},addTags:{brand:"Sale","brand:wikidata":"Q11892046","brand:wikipedia":"fi:Sale",name:"Sale",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sheetz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7492551",shop:"convenience"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Shell":{name:"Shell",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",shop:"convenience"},addTags:{brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Shell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q154950",shop:"convenience"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Siwa":{name:"Siwa",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11893827",shop:"convenience"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar":{name:"Spar",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Spar Express":{name:"Spar Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"convenience"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpeedwayStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7575683",shop:"convenience"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Społem":{name:"Społem",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"convenience"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Star Mart":{name:"Star Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q61994857",shop:"convenience"},addTags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Stripes":{name:"Stripes",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/stripesstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7624135",shop:"convenience"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},countryCodes:["cl","us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco":{name:"Tesco",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Tesco Express":{name:"Tesco Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"convenience"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"convenience"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q57643977",shop:"convenience"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Turkey Hill":{name:"Turkey Hill",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/turkeyhillmm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q42376970",shop:"convenience"},addTags:{brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/UnitedDairyFarmers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7887677",shop:"convenience"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"convenience"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"convenience"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Vival":{name:"Vival",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q7937525",shop:"convenience"},addTags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"},countryCodes:["fr","pe"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",shop:"convenience"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1640782",shop:"convenience"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",shop:"convenience"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/convenience/abc (Poland)":{name:"abc (Poland)",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11683985",shop:"convenience"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ampm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306960",shop:"convenience"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/miniピアゴ":{name:"miniピアゴ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11188499",shop:"convenience"},addTags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"},countryCodes:["jp"],terms:["ミニピアゴ"],matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/zabkapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589061",shop:"convenience"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/vkusvill.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57271676",shop:"convenience"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Гроздь":{name:"Гроздь",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/grozdmag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"convenience"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Доброном":{name:"Доброном",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"convenience"},addTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Евроопт Market":{name:"Евроопт Market",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q65455869",shop:"convenience"},addTags:{brand:"Евроопт Market","brand:wikidata":"Q65455869",name:"Евроопт Market",shop:"convenience"},countryCodes:["by"],terms:["Евроопт Маркет"],matchScore:2,suggestion:true},"shop/convenience/Евроопт Минимаркет":{name:"Евроопт Минимаркет",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q65455911",shop:"convenience"},addTags:{brand:"Евроопт Минимаркет","brand:wikidata":"Q65455911",name:"Евроопт Минимаркет",shop:"convenience"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1783878",shop:"convenience"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"convenience"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},terms:["магнит у дома"],matchScore:2,suggestion:true},"shop/convenience/Мария-Ра":{name:"Мария-Ра",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/mariarashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4281631",shop:"convenience"},addTags:{brand:"Мария-Ра","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Сельпо":{name:"Сельпо",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/silpo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"convenience"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/アンスリー":{name:"アンスリー",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q17192555",shop:"convenience"},addTags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q16141064",shop:"convenience"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/circlekireland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3268010",shop:"convenience"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/スリーエフ":{name:"スリーエフ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/875645560073539585/X1oFVQef_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11313419",shop:"convenience"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/1019751731402379264/OudcSFFt_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11314123",shop:"convenience"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",shop:"convenience"},countryCodes:["jp"],terms:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11314868",shop:"convenience"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q5209392",shop:"convenience"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ナチュラルローソン":{name:"ナチュラルローソン",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11323850",shop:"convenience"},addTags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"fas-shopping-basket",imageURL:"https://pbs.twimg.com/profile_images/826586791058644992/chXkmxnQ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7229380",shop:"convenience"},addTags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11345131",shop:"convenience"},addTags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"},countryCodes:["jp"],terms:["ローソン"],matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11350960",shop:"convenience"},addTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン・スリーエフ":{name:"ローソン・スリーエフ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q24866804",shop:"convenience"},addTags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",shop:"convenience"},countryCodes:["jp"],terms:["lawson+スリーエフ","ローソン・スリーエフ"],matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/familymart.japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191685",shop:"convenience"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},countryCodes:["cn","tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/全家便利商店":{name:"全家便利商店",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q10891564",shop:"convenience"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11326216",shop:"convenience"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/7ElevenMexico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q259340",shop:"convenience"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/copyshop/FedEx Office":{name:"FedEx Office",icon:"fas-print",imageURL:"https://graph.facebook.com/FedExOffice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q474379",shop:"copyshop"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},countryCodes:["us"],terms:["fedex office print and ship center"],matchScore:2,suggestion:true},"shop/copyshop/Minuteman Press":{name:"Minuteman Press",icon:"fas-print",imageURL:"https://graph.facebook.com/MinutemanPressFranchise/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64866081",shop:"copyshop"},addTags:{brand:"Minuteman Press","brand:wikidata":"Q64866081",name:"Minuteman Press",shop:"copyshop"},terms:[],matchScore:2,suggestion:true},"shop/copyshop/Sir Speedy":{name:"Sir Speedy",icon:"fas-print",imageURL:"https://graph.facebook.com/SirSpeedyCorporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17088225",shop:"copyshop"},addTags:{brand:"Sir Speedy","brand:wikidata":"Q17088225","brand:wikipedia":"en:Sir Speedy",name:"Sir Speedy",shop:"copyshop"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Aveda":{name:"Aveda",icon:"maki-shop",imageURL:"https://graph.facebook.com/Aveda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4827965",shop:"cosmetics"},addTags:{brand:"Aveda","brand:wikidata":"Q4827965","brand:wikipedia":"en:Aveda",name:"Aveda",shop:"cosmetics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",imageURL:"https://graph.facebook.com/bathandbodyworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q810773",shop:"cosmetics"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",imageURL:"https://graph.facebook.com/KikoMilanoGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3812045",shop:"cosmetics"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},countryCodes:["be","fr","gb","nl"],terms:["kiko"],matchScore:2,suggestion:true},"shop/cosmetics/Kiehl's":{name:"Kiehl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/KiehlsUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3196447",shop:"cosmetics"},addTags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"},countryCodes:["ca","us"],terms:["kiehl's since 1851"],matchScore:2,suggestion:true},"shop/cosmetics/L'Occitane":{name:"L'Occitane",icon:"maki-shop",imageURL:"https://graph.facebook.com/loccitaneusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1880676",shop:"cosmetics"},addTags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"},terms:["l'occitane en provence"],matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",imageURL:"https://graph.facebook.com/LUSHJAPAN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1585448",shop:"cosmetics"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/MAC Cosmetics":{name:"MAC Cosmetics",icon:"maki-shop",imageURL:"https://graph.facebook.com/MACcosmetics/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2624442",shop:"cosmetics"},addTags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"},countryCodes:["ca","de","us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Nocibé":{name:"Nocibé",icon:"maki-shop",imageURL:"https://graph.facebook.com/nocibe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3342592",shop:"cosmetics"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Origins":{name:"Origins",icon:"maki-shop",imageURL:"https://graph.facebook.com/Origins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6643229",shop:"cosmetics"},addTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Saje":{name:"Saje",icon:"maki-shop",imageURL:"https://graph.facebook.com/SajeWellness/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q44631749",shop:"cosmetics"},addTags:{brand:"Saje","brand:wikidata":"Q44631749","brand:wikipedia":"en:Saje Natural Wellness",name:"Saje",shop:"cosmetics"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",imageURL:"https://graph.facebook.com/sephora/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2408041",shop:"cosmetics"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheBodyShopUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q837851",shop:"cosmetics"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"cosmetics"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"cosmetics"},countryCodes:["us"],terms:["ulta"],matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",imageURL:"https://graph.facebook.com/letoile.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18400706",shop:"cosmetics"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"cosmetics"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Atwoods":{name:"Atwoods",icon:"maki-shop",imageURL:"https://graph.facebook.com/Atwoods.Ranch.and.Home.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4818874",shop:"country_store"},addTags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Blain's Farm & Fleet":{name:"Blain's Farm & Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/BlainsFarmandFleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4923906",shop:"country_store"},addTags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Bomgaars":{name:"Bomgaars",icon:"maki-shop",imageURL:"https://graph.facebook.com/BomgaarsSupply.Corporate/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22059070",shop:"country_store"},addTags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Fleet Farm":{name:"Fleet Farm",icon:"maki-shop",imageURL:"https://graph.facebook.com/fleetfarm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6859973",shop:"country_store"},addTags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"},countryCodes:["us"],terms:["mills fleet farm"],matchScore:2,suggestion:true},"shop/country_store/Grange Co-op":{name:"Grange Co-op",icon:"maki-shop",imageURL:"https://graph.facebook.com/grangecoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5595639",shop:"country_store"},addTags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Home of Economy":{name:"Home of Economy",icon:"maki-shop",imageURL:"https://graph.facebook.com/Homeofeconomy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5889100",shop:"country_store"},addTags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Norbys Farm Fleet":{name:"Norbys Farm Fleet",icon:"maki-shop",imageURL:"https://graph.facebook.com/norbysfarmfleet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7050461",shop:"country_store"},addTags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Orscheln Farm & Home":{name:"Orscheln Farm & Home",icon:"maki-shop",imageURL:"https://graph.facebook.com/orschelnfarmandhome/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22060331",shop:"country_store"},addTags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Peavey Mart":{name:"Peavey Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/PeaveyMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7158483",shop:"country_store"},addTags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",imageURL:"https://graph.facebook.com/RuralKing/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7380525",shop:"country_store"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/TSC Stores":{name:"TSC Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/TSCStoresCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62720230",shop:"country_store"},addTags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Theisen's":{name:"Theisen's",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/743446346414227456/6V3KBxMe_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7777850",shop:"country_store"},addTags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",imageURL:"https://graph.facebook.com/TractorSupplyCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15109925",shop:"country_store"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/country_store/Wynnstay":{name:"Wynnstay",icon:"maki-shop",imageURL:"https://graph.facebook.com/WynnstayCountryStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63016351",shop:"country_store"},addTags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/A.C. Moore":{name:"A.C. Moore",icon:"fas-palette",imageURL:"https://graph.facebook.com/acmoore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4647066",shop:"craft"},addTags:{brand:"A.C. Moore","brand:wikidata":"Q4647066","brand:wikipedia":"en:A.C. Moore",name:"A.C. Moore",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbyLobby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5874938",shop:"craft"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},countryCodes:["in","us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Hobbycraft":{name:"Hobbycraft",icon:"fas-palette",imageURL:"https://graph.facebook.com/HobbycraftUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16984508",shop:"craft"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"fas-palette",imageURL:"https://graph.facebook.com/JoAnn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6203968",shop:"craft"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"fas-palette",imageURL:"https://graph.facebook.com/Michaels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6835667",shop:"craft"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667",name:"Michaels",shop:"craft"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/craft/Woodcraft":{name:"Woodcraft",icon:"fas-palette",imageURL:"https://graph.facebook.com/WoodcraftWoodworking/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22026341",shop:"craft"},addTags:{brand:"Woodcraft","brand:wikidata":"Q22026341","brand:wikipedia":"en:Woodcraft Supply",name:"Woodcraft",shop:"craft"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/deli/ほっともっと":{name:"ほっともっと",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/hottomotto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10850949",shop:"deli"},addTags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/deli/京樽":{name:"京樽",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/kyotaru.sushi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11374503",shop:"deli"},addTags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Barneys New York":{name:"Barneys New York",icon:"maki-shop",imageURL:"https://graph.facebook.com/BarneysNY/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q59465",shop:"department_store"},addTags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"},countryCodes:["us"],terms:["barneys"],matchScore:2,suggestion:true},"shop/department_store/Bealls (Florida-based)":{name:"Bealls (Florida-based)",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBealls%20inc%20logob.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4876153",shop:"department_store"},addTags:{brand:"Bealls","brand:wikidata":"Q4876153","brand:wikipedia":"en:Bealls (Florida)",name:"Bealls",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bealls (Texas-based )":{name:"Bealls (Texas-based )",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q4876156",shop:"department_store"},addTags:{brand:"Bealls","brand:wikidata":"Q4876156","brand:wikipedia":"en:Bealls (Texas)",name:"Bealls",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",imageURL:"https://graph.facebook.com/Belk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q127428",shop:"department_store"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bi-Mart":{name:"Bi-Mart",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBi-Mart.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4902331",shop:"department_store"},addTags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",imageURL:"https://graph.facebook.com/biglots/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4905973",shop:"department_store"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",imageURL:"https://graph.facebook.com/BIGWaustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906646",shop:"department_store"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Bloomingdale's":{name:"Bloomingdale's",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBloomingdale's%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q283383",shop:"department_store"},addTags:{brand:"Bloomingdale's","brand:wikidata":"Q283383","brand:wikipedia":"en:Bloomingdale's",name:"Bloomingdale's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/Canadiantire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032400",shop:"department_store"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Casas Bahia":{name:"Casas Bahia",icon:"maki-shop",imageURL:"https://graph.facebook.com/CasasBahia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048048",shop:"department_store"},addTags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Century 21":{name:"Century 21",icon:"maki-shop",imageURL:"https://graph.facebook.com/century21stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5063125",shop:"department_store"},addTags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"},countryCodes:["us"],terms:["c21"],matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendascoppel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2497795",shop:"department_store"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/David Jones":{name:"David Jones",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDavid%20Jones%20Limited%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5235753",shop:"department_store"},addTags:{brand:"David Jones","brand:wikidata":"Q5235753","brand:wikipedia":"en:David Jones Limited",name:"David Jones",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",imageURL:"https://graph.facebook.com/Debenhams/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1181484",shop:"department_store"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Dillards/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q844805",shop:"department_store"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",imageURL:"https://graph.facebook.com/elcorteingles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q623133",shop:"department_store"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Falabella":{name:"Falabella",icon:"maki-shop",imageURL:"https://graph.facebook.com/falabellachile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5135229",shop:"department_store"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},terms:["saga falabella"],matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",imageURL:"https://graph.facebook.com/GaleriaKarstadtKaufhof/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q322598",shop:"department_store"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiantTiger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558429",shop:"department_store"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Gordmans":{name:"Gordmans",icon:"maki-shop",imageURL:"https://graph.facebook.com/gordmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5584725",shop:"department_store"},addTags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",imageURL:"https://graph.facebook.com/hema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q903805",shop:"department_store"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},countryCodes:["be","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",imageURL:"https://graph.facebook.com/HarveyNormanAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4040441",shop:"department_store"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Havan":{name:"Havan",icon:"maki-shop",imageURL:"https://graph.facebook.com/Havanoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968827",shop:"department_store"},addTags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Hudson's Bay":{name:"Hudson's Bay",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1101488235371479041/QIHGzj4I_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q641129",shop:"department_store"},addTags:{alt_name:"The Bay",brand:"Hudson's Bay","brand:wikidata":"Q641129","brand:wikipedia":"en:Hudson's Bay (retailer)",name:"Hudson's Bay",shop:"department_store"},countryCodes:["ca","nl"],terms:[],matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",imageURL:"https://graph.facebook.com/jcp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920037",shop:"department_store"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/John Lewis":{name:"John Lewis",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1148531679776202752/7LP87JDn_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1918981",shop:"department_store"},addTags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",imageURL:"https://graph.facebook.com/karstadt1881/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q182910",shop:"department_store"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/KmartAustralia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6421682",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/kmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1753080",shop:"department_store"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},countryCodes:["us"],terms:["k-mart"],matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",imageURL:"https://graph.facebook.com/kohls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967265",shop:"department_store"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",imageURL:"https://graph.facebook.com/lojasamericanas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3064093",shop:"department_store"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lord & Taylor":{name:"Lord & Taylor",icon:"maki-shop",imageURL:"https://graph.facebook.com/lordandtaylor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2749082",shop:"department_store"},addTags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Lotte Department Store":{name:"Lotte Department Store",icon:"maki-shop",imageURL:"https://graph.facebook.com/LOTTEshopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"},terms:["lotte"],matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Macys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q629269",shop:"department_store"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",imageURL:"https://graph.facebook.com/marksandspencerrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714491",shop:"department_store"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},countryCodes:["gb","gr","ie"],terms:["m and s"],matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marshalls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15903261",shop:"department_store"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Muji":{name:"Muji",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/2779266335/6fbe4ceb685984dbe3a149bd94043e80_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q708789",shop:"department_store"},addTags:{brand:"Muji","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"en:Muji",name:"Muji","name:en":"Muji","name:ja":"無印良品",shop:"department_store"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",imageURL:"https://graph.facebook.com/myer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1110323",shop:"department_store"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",imageURL:"https://graph.facebook.com/neimanmarcus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q743497",shop:"department_store"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",imageURL:"https://graph.facebook.com/Nordstrom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q174310",shop:"department_store"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Oechsle":{name:"Oechsle",icon:"maki-shop",imageURL:"https://graph.facebook.com/tiendasoechsle/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6049096",shop:"department_store"},addTags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/París":{name:"París",icon:"maki-shop",imageURL:"https://graph.facebook.com/TiendasParis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20812805",shop:"department_store"},addTags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Printemps":{name:"Printemps",icon:"maki-shop",imageURL:"https://graph.facebook.com/Printemps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1535260",shop:"department_store"},addTags:{brand:"Printemps","brand:wikidata":"Q1535260","brand:wikipedia":"fr:Printemps (grands magasins)",name:"Printemps",shop:"department_store"},countryCodes:["ad","cn","fr","jp","sa"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Ripley":{name:"Ripley",icon:"maki-shop",imageURL:"https://graph.facebook.com/ripleychile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3433040",shop:"department_store"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",imageURL:"https://graph.facebook.com/saks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2723882",shop:"department_store"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",imageURL:"https://graph.facebook.com/sears/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6499202",shop:"department_store"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",imageURL:"https://graph.facebook.com/ShopkoOptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501155",shop:"department_store"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Stein Mart":{name:"Stein Mart",icon:"maki-shop",imageURL:"https://graph.facebook.com/SteinMart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7606770",shop:"department_store"},addTags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Stockmann":{name:"Stockmann",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FStockmann%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1543093",shop:"department_store"},addTags:{brand:"Stockmann","brand:wikidata":"Q1543093","brand:wikipedia":"fi:Stockmann",name:"Stockmann",shop:"department_store"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",imageURL:"https://graph.facebook.com/targetaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7685854",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",imageURL:"https://graph.facebook.com/target/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1046951",shop:"department_store"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},countryCodes:["us"],terms:["Super Target"],matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",imageURL:"https://graph.facebook.com/TheWarehouseNZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3566291",shop:"department_store"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"department_store"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",shop:"department_store"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",imageURL:"https://graph.facebook.com/WoolworthDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q183538",shop:"department_store"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",imageURL:"https://graph.facebook.com/ahlens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q270851",shop:"department_store"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/department_store/東急ハンズ":{name:"東急ハンズ",icon:"maki-shop",imageURL:"https://graph.facebook.com/TokyuHandsInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q859212",shop:"department_store"},addTags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/department_store/無印良品":{name:"無印良品",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/2779266335/6fbe4ceb685984dbe3a149bd94043e80_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q708789",shop:"department_store"},addTags:{brand:"無印良品","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"ja:無印良品",name:"無印良品","name:en":"Muji","name:ja":"無印良品",shop:"department_store"},countryCodes:["jp","tw"],terms:[],matchScore:2,suggestion:true},"shop/department_store/롯데백화점":{name:"롯데백화점",icon:"maki-shop",imageURL:"https://graph.facebook.com/LOTTEshopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q489905",shop:"department_store"},addTags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/acehardware/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4672981",shop:"doityourself"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",imageURL:"https://graph.facebook.com/bandq/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q707602",shop:"doityourself"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",imageURL:"https://graph.facebook.com/137379942944322/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672043",shop:"doityourself"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BiltemaSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3355552",shop:"doityourself"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},countryCodes:["dk","fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",imageURL:"https://graph.facebook.com/brico.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2510786",shop:"doityourself"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},countryCodes:["be","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoDepotFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2889702",shop:"doityourself"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},countryCodes:["fr","ro"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricoman":{name:"Bricoman",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricomanFrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925142",shop:"doityourself"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},countryCodes:["fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Bricomarche/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925147",shop:"doityourself"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},countryCodes:["fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/BricoramaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2925146",shop:"doityourself"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},countryCodes:["es","fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",imageURL:"https://pbs.twimg.com/profile_images/1405732718/hammer_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q4997829",shop:"doityourself"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",imageURL:"https://graph.facebook.com/castorama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q966971",shop:"doityourself"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/clasohlsonsverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3356220",shop:"doityourself"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Easy":{name:"Easy",icon:"temaki-tools",imageURL:"https://graph.facebook.com/EasyHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5331091",shop:"doityourself"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",imageURL:"https://graph.facebook.com/gamma.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2294120",shop:"doityourself"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"doityourself"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},countryCodes:["de","lu"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hagebau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1568279",shop:"doityourself"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},countryCodes:["at","be","ch","de","es","fr","lu","nl"],terms:["hagebau"],matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hammerzuhause/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q52159668",shop:"doityourself"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Hellweg.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1603084",shop:"doityourself"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Building Centre (Canada)":{name:"Home Building Centre (Canada)",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre (Canada)":{name:"Home Hardware Building Centre (Canada)",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"doityourself"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},countryCodes:["ca"],terms:["home hardware"],matchScore:2,suggestion:true},"shop/doityourself/Home Timber & Hardware (Australia)":{name:"Home Timber & Hardware (Australia)",icon:"temaki-tools",geometry:["point","area"],tags:{"brand:wikidata":"Q17006984",shop:"doityourself"},addTags:{alt_name:"Home Hardware",brand:"Home Timber & Hardware","brand:wikidata":"Q17006984","brand:wikipedia":"en:Home Timber & Hardware",name:"Home Timber & Hardware",shop:"doityourself",short_name:"Home"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homebase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9293447",shop:"doityourself"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hornbach.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685926",shop:"doityourself"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",imageURL:"https://graph.facebook.com/hubo.be/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3142153",shop:"doityourself"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jewsonuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6190226",shop:"doityourself"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",imageURL:"https://graph.facebook.com/karwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2097480",shop:"doityourself"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",imageURL:"https://graph.facebook.com/lowes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1373493",shop:"doityourself"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},countryCodes:["ca","mx","us"],terms:["lowes home improvement"],matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MenardsHomeImprovement/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639897",shop:"doityourself"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Mitre 10":{name:"Mitre 10",icon:"temaki-tools",imageURL:"https://graph.facebook.com/224109081130110/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6882393",shop:"doityourself"},addTags:{brand:"Mitre 10","brand:wikidata":"Q6882393","brand:wikipedia":"en:Mitre 10",name:"Mitre 10",shop:"doityourself"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",imageURL:"https://graph.facebook.com/mr.bricolagefrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3141657",shop:"doityourself"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",imageURL:"https://graph.facebook.com/obirussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q300518",shop:"doityourself"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",imageURL:"https://graph.facebook.com/984505914908905/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680214",shop:"doityourself"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},countryCodes:["bg","gr","hu","ro"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Praxis":{name:"Praxis",icon:"temaki-tools",imageURL:"https://graph.facebook.com/praxis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2741995",shop:"doityourself"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Promart":{name:"Promart",icon:"temaki-tools",imageURL:"https://graph.facebook.com/PROMARTHomecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17626095",shop:"doityourself"},addTags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",imageURL:"https://graph.facebook.com/ronainc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3415283",shop:"doityourself"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Screwfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7439115",shop:"doityourself"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},countryCodes:["de","gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Sodimac":{name:"Sodimac",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homecenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553274",shop:"doityourself"},addTags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"},terms:["sodimac constructor"],matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",imageURL:"https://graph.facebook.com/tekzenturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25475379",shop:"doityourself"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/The Home Depot":{name:"The Home Depot",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homedepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864407",shop:"doityourself"},addTags:{alt_name:"Home Depot",brand:"The Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"The Home Depot",shop:"doityourself"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Toolstation":{name:"Toolstation",icon:"temaki-tools",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FToolstation-Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7824103",shop:"doityourself"},addTags:{brand:"Toolstation","brand:wikidata":"Q7824103","brand:wikipedia":"en:Toolstation",name:"Toolstation",shop:"doityourself"},countryCodes:["fr","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",imageURL:"https://graph.facebook.com/192246064148765/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2442970",shop:"doityourself"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},countryCodes:["de"],terms:["toom"],matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TravisPerkinsPlcUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2450664",shop:"doityourself"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Weldom":{name:"Weldom",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Weldom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16683226",shop:"doityourself"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Wickes.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7998350",shop:"doityourself"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/jem & fix":{name:"jem & fix",icon:"temaki-tools",imageURL:"https://graph.facebook.com/jemogfix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12319200",shop:"doityourself"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",imageURL:"https://graph.facebook.com/leroymerlin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q889624",shop:"doityourself"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/カインズホーム":{name:"カインズホーム",icon:"temaki-tools",imageURL:"https://graph.facebook.com/cainzfun/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11293852",shop:"doityourself"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",imageURL:"https://graph.facebook.com/saiengardenclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302690",shop:"doityourself"},addTags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",imageURL:"https://graph.facebook.com/kohnan.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11303403",shop:"doityourself"},addTags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/5àsec":{name:"5àsec",icon:"temaki-clothes_hanger",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%205%C3%A0sec.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2817899",shop:"dry_cleaning"},addTags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Martinizing Dry Cleaning":{name:"Martinizing Dry Cleaning",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/MartinizingDryClean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6777169",shop:"dry_cleaning"},addTags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"},terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/Диана":{name:"Диана",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/diana.dryclean/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62105088",shop:"dry_cleaning"},addTags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/タカケンサンシャイン":{name:"タカケンサンシャイン",icon:"temaki-clothes_hanger",geometry:["point","area"],tags:{"brand:wikidata":"Q11315914",shop:"dry_cleaning"},addTags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"},countryCodes:["jp"],terms:["タカケンクリーング"],matchScore:2,suggestion:true},"shop/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/974471789387794/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11505557",shop:"dry_cleaning"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"temaki-clothes_hanger",imageURL:"https://graph.facebook.com/hakuyosha.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11579995",shop:"dry_cleaning"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"fas-plug",imageURL:"https://graph.facebook.com/apple/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q421253",shop:"electronics"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},terms:["apple"],matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"fas-plug",imageURL:"https://graph.facebook.com/BatteriesPlus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17005157",shop:"electronics"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"},countryCodes:["us"],terms:["batteries plus"],matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"fas-plug",imageURL:"https://graph.facebook.com/bestbuy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q533415",shop:"electronics"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"fas-plug",imageURL:"https://graph.facebook.com/Boulanger.Electromenager.Multimedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2921695",shop:"electronics"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/electronics/CeX":{name:"CeX",icon:"fas-plug",imageURL:"https://graph.facebook.com/CeX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5055676",shop:"electronics"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3246464",shop:"electronics"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"fas-plug",imageURL:"https://graph.facebook.com/curryspcworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7118727",shop:"electronics"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"fas-plug",imageURL:"https://graph.facebook.com/darty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3117381",shop:"electronics"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Elektra":{name:"Elektra",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMural%20Elektra.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1142753",shop:"electronics"},addTags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"},countryCodes:["gt","hn","pa","pe","sv"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"fas-plug",imageURL:"https://graph.facebook.com/elgiganten.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17050121",shop:"electronics"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},countryCodes:["dk","se"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"fas-plug",imageURL:"https://graph.facebook.com/EuronicsItalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q184860",shop:"electronics"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/expert.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680990",shop:"electronics"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Gigantti":{name:"Gigantti",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q42512186",shop:"electronics"},addTags:{brand:"Gigantti","brand:wikidata":"Q42512186","brand:wikipedia":"fi:Gigantti (tavarataloketju)",name:"Gigantti",shop:"electronics"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"fas-plug",imageURL:"https://graph.facebook.com/loewennews/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1587223",shop:"electronics"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"fas-plug",imageURL:"https://graph.facebook.com/interdiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1665980",shop:"electronics"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/electronics/JB Hi-Fi":{name:"JB Hi-Fi",icon:"fas-plug",imageURL:"https://graph.facebook.com/JBHiFi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3310113",shop:"electronics"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Jaycar":{name:"Jaycar",icon:"fas-plug",geometry:["point","area"],tags:{"brand:wikidata":"Q6167713",shop:"electronics"},addTags:{brand:"Jaycar","brand:wikidata":"Q6167713","brand:wikipedia":"en:Jaycar",name:"Jaycar",shop:"electronics"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"fas-plug",imageURL:"https://graph.facebook.com/kjellcoSverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6419332",shop:"electronics"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},countryCodes:["no","se"],terms:["kjell och company"],matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"fas-plug",imageURL:"https://graph.facebook.com/komputronik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11742085",shop:"electronics"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/La Curacao":{name:"La Curacao",icon:"fas-plug",imageURL:"https://graph.facebook.com/CuracaoUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5194599",shop:"electronics"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"fas-plug",imageURL:"https://graph.facebook.com/Maplin/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6754124",shop:"electronics"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Expert":{name:"Media Expert",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediaexpert/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11776794",shop:"electronics"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"fas-plug",imageURL:"https://graph.facebook.com/mediamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2381223",shop:"electronics"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Medimax":{name:"Medimax",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMEDIMAX%20Logo-cmyk%20mit%20Claim.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q62872450",shop:"electronics"},addTags:{brand:"Medimax","brand:wikidata":"Q62872450",name:"Medimax",shop:"electronics"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"fas-plug",imageURL:"https://graph.facebook.com/musimundo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6034719",shop:"electronics"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"fas-plug",imageURL:"https://graph.facebook.com/Neonetpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11790622",shop:"electronics"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"fas-plug",imageURL:"https://graph.facebook.com/rtveuroagd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7277895",shop:"electronics"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/RadioShack":{name:"RadioShack",icon:"fas-plug",imageURL:"https://graph.facebook.com/RadioShack/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1195490",shop:"electronics"},addTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"fas-plug",imageURL:"https://graph.facebook.com/SamsungNewsroom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20718",shop:"electronics"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"fas-plug",imageURL:"https://graph.facebook.com/SaturnDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2543504",shop:"electronics"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},countryCodes:["at","de","lu","pl"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"fas-plug",imageURL:"https://graph.facebook.com/sony.jpn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41187",shop:"electronics"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},terms:[],matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"fas-plug",imageURL:"https://graph.facebook.com/TeknikmagasinetNorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3357520",shop:"electronics"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/electronics/The Good Guys":{name:"The Good Guys",icon:"fas-plug",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Good%20Guys%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7737217",shop:"electronics"},addTags:{brand:"The Good Guys","brand:wikidata":"Q7737217","brand:wikipedia":"en:The Good Guys (Australian company)",name:"The Good Guys",shop:"electronics"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/electronics/The Source":{name:"The Source",icon:"fas-plug",imageURL:"https://graph.facebook.com/thesourcecanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3212934",shop:"electronics"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"fas-plug",imageURL:"https://graph.facebook.com/unieuro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4004687",shop:"electronics"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"fas-plug",imageURL:"https://graph.facebook.com/WortenES/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10394039",shop:"electronics"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/electronics/b8ta":{name:"b8ta",icon:"fas-plug",imageURL:"https://graph.facebook.com/b8ta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55604609",shop:"electronics"},addTags:{brand:"b8ta","brand:wikidata":"Q55604609","brand:wikipedia":"en:B8ta",name:"b8ta",shop:"electronics"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"fas-plug",imageURL:"https://graph.facebook.com/mvideo.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6558800",shop:"electronics"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Фокстрот":{name:"Фокстрот",icon:"fas-plug",imageURL:"https://graph.facebook.com/foxtrotinfo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16721578",shop:"electronics"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"fas-plug",imageURL:"https://graph.facebook.com/Eldorado.Stores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4531492",shop:"electronics"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"fas-plug",imageURL:"https://graph.facebook.com/edion.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11290252",shop:"electronics"},addTags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"fas-plug",imageURL:"https://graph.facebook.com/ksdenki20180125/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6322472",shop:"electronics"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"fas-plug",imageURL:"https://graph.facebook.com/kojima.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11302052",shop:"electronics"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ソフマップ":{name:"ソフマップ",icon:"fas-plug",imageURL:"https://pbs.twimg.com/profile_images/1073173217404043266/fIyrfOW-_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7553789",shop:"electronics"},addTags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ビックカメラ":{name:"ビックカメラ",icon:"fas-plug",imageURL:"https://graph.facebook.com/biccamera.page/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4903531",shop:"electronics"},addTags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"fas-plug",imageURL:"https://graph.facebook.com/YAMADA.DENKI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1096390",shop:"electronics"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/ヨドバシカメラ":{name:"ヨドバシカメラ",icon:"fas-plug",imageURL:"https://pbs.twimg.com/profile_images/875976284915892225/JAIY0yvm_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q168467",shop:"electronics"},addTags:{brand:"ヨドバシカメラ","brand:en":"Yodobashi Camera","brand:ja":"ヨドバシカメラ","brand:wikidata":"Q168467","brand:wikipedia":"ja:ヨドバシカメラ",name:"ヨドバシカメラ","name:en":"Yodobashi Camera","name:ja":"ヨドバシカメラ",shop:"electronics"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"fas-plug",imageURL:"https://graph.facebook.com/elifemall.com.tw/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10891540",shop:"electronics"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"fas-plug",imageURL:"https://graph.facebook.com/tkec520/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11569285",shop:"electronics"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Ann Summers":{name:"Ann Summers",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1104069397008789504/jN1FCnL5_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q579524",shop:"erotic"},addTags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/807193082244505600/DWoJxqGu_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q1609577",shop:"erotic"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"fas-tape",imageURL:"https://graph.facebook.com/MondialTissus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17635288",shop:"fabric"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Brighton Collectibles":{name:"Brighton Collectibles",icon:"maki-shop",imageURL:"https://graph.facebook.com/BrightonCollectibles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4967623",shop:"fashion_accessories"},addTags:{brand:"Brighton Collectibles","brand:wikidata":"Q4967623","brand:wikipedia":"en:Brighton Collectibles",name:"Brighton Collectibles",shop:"fashion_accessories"},countryCodes:["us"],terms:["brighton"],matchScore:2,suggestion:true},"shop/fashion_accessories/Bvlgari":{name:"Bvlgari",icon:"maki-shop",imageURL:"https://graph.facebook.com/Bulgari/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q752515",shop:"fashion_accessories"},addTags:{brand:"Bulgari","brand:wikidata":"Q752515","brand:wikipedia":"en:Bulgari",name:"Bvlgari",shop:"fashion_accessories"},terms:["bulgari"],matchScore:2,suggestion:true},"shop/fashion_accessories/Claire's":{name:"Claire's",icon:"maki-shop",imageURL:"https://graph.facebook.com/claires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2974996",shop:"fashion_accessories"},addTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Jimmy Choo":{name:"Jimmy Choo",icon:"maki-shop",imageURL:"https://graph.facebook.com/JimmyChoo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5213855",shop:"fashion_accessories"},addTags:{brand:"Jimmy Choo","brand:wikidata":"Q5213855","brand:wikipedia":"en:Jimmy Choo Ltd",name:"Jimmy Choo",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Prada":{name:"Prada",icon:"maki-shop",imageURL:"https://graph.facebook.com/Prada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q193136",shop:"fashion_accessories"},addTags:{brand:"Prada","brand:wikidata":"Q193136","brand:wikipedia":"en:Prada",name:"Prada",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Salvatore Ferragamo":{name:"Salvatore Ferragamo",icon:"maki-shop",imageURL:"https://graph.facebook.com/SalvatoreFerragamo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3946053",shop:"fashion_accessories"},addTags:{brand:"Salvatore Ferragamo","brand:wikidata":"Q3946053","brand:wikipedia":"en:Salvatore Ferragamo S.p.A.",name:"Salvatore Ferragamo",shop:"fashion_accessories"},terms:[],matchScore:2,suggestion:true},"shop/fashion_accessories/Van Cleef & Arpels":{name:"Van Cleef & Arpels",icon:"maki-shop",imageURL:"https://graph.facebook.com/vancleef.arpels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2708181",shop:"fashion_accessories"},addTags:{brand:"Van Cleef & Arpels","brand:wikidata":"Q2708181","brand:wikipedia":"en:Van Cleef & Arpels",name:"Van Cleef & Arpels",shop:"fashion_accessories"},terms:["van cleef & arples"],matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",imageURL:"https://graph.facebook.com/Blume2000.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886166",shop:"florist"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",imageURL:"https://graph.facebook.com/BlumenRisse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q886177",shop:"florist"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",imageURL:"https://graph.facebook.com/Interflora.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q692179",shop:"florist"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},countryCodes:["fr","gb","no","se"],terms:[],matchScore:2,suggestion:true},"shop/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",imageURL:"https://graph.facebook.com/Monceau.Fleurs.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17629431",shop:"florist"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/frame/Aaron Brothers":{name:"Aaron Brothers",icon:"fas-vector-square",geometry:["point","area"],tags:{"brand:wikidata":"Q64979251",shop:"frame"},addTags:{brand:"Aaron Brothers","brand:wikidata":"Q64979251",name:"Aaron Brothers",shop:"frame"},countryCodes:["us"],terms:["aaron brothers art & framing","aaron brothers custom framing"],matchScore:2,suggestion:true},"shop/frozen_food/Dream Dinners":{name:"Dream Dinners",icon:"maki-shop",imageURL:"https://graph.facebook.com/DreamDinners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5306355",shop:"frozen_food"},addTags:{brand:"Dream Dinners","brand:wikidata":"Q5306355","brand:wikipedia":"en:Dream Dinners",name:"Dream Dinners",opening_hours:"\"by appointment\"",shop:"frozen_food"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/frozen_food/Iceland":{name:"Iceland",icon:"maki-shop",imageURL:"https://graph.facebook.com/icelandfoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721810",shop:"frozen_food"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"frozen_food"},terms:[],matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",imageURL:"https://graph.facebook.com/picardsurgeles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3382454",shop:"frozen_food"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/PFG":{name:"PFG",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q3396087",shop:"funeral_directors"},addTags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/Roblot":{name:"Roblot",icon:"maki-cemetery",geometry:["point","area"],tags:{"brand:wikidata":"Q63247414",shop:"funeral_directors"},addTags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/Roc-Eclerc":{name:"Roc-Eclerc",icon:"maki-cemetery",imageURL:"https://graph.facebook.com/grouperoceclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62558102",shop:"funeral_directors"},addTags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",imageURL:"https://pbs.twimg.com/profile_images/1034361261193134080/1PfqKyVV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7726521",shop:"funeral_directors"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Aaron's":{name:"Aaron's",icon:"fas-couch",imageURL:"https://graph.facebook.com/aaronsinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10397787",shop:"furniture"},addTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/American Signature Furniture":{name:"American Signature Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/AmericanSignatureFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859411",shop:"furniture"},addTags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Arhaus":{name:"Arhaus",icon:"fas-couch",imageURL:"https://graph.facebook.com/44947264751/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q35689887",shop:"furniture"},addTags:{brand:"Arhaus","brand:wikidata":"Q35689887","brand:wikipedia":"en:Arhaus",name:"Arhaus",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",imageURL:"https://graph.facebook.com/AshleyHomeStore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4805437",shop:"furniture"},addTags:{alt_name:"Ashley Furniture",brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley HomeStore",shop:"furniture"},countryCodes:["ca","us"],terms:["ashley furniture homestore"],matchScore:2,suggestion:true},"shop/furniture/Asko":{name:"Asko",icon:"fas-couch",geometry:["point","area"],tags:{"brand:wikidata":"Q11853132",shop:"furniture"},addTags:{brand:"Asko","brand:wikidata":"Q11853132","brand:wikipedia":"fi:Asko",name:"Asko",shop:"furniture"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Askona":{name:"Askona",icon:"fas-couch",imageURL:"https://graph.facebook.com/AskonaRu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4071319",shop:"furniture"},addTags:{brand:"Askona","brand:wikidata":"Q4071319","brand:wikipedia":"ru:Аскона (компания)",name:"Askona",shop:"furniture"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",imageURL:"https://graph.facebook.com/BlackRedWhitePL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4921546",shop:"furniture"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/BoConcept":{name:"BoConcept",icon:"fas-couch",imageURL:"https://graph.facebook.com/boconceptusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11338915",shop:"furniture"},addTags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Bob's Discount Furniture":{name:"Bob's Discount Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/mybobs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4931582",shop:"furniture"},addTags:{brand:"Bob's Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob's Discount Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",imageURL:"https://graph.facebook.com/FabrykaMebliBodzio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20034845",shop:"furniture"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",imageURL:"https://graph.facebook.com/but/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18720442",shop:"furniture"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Cabinets To Go":{name:"Cabinets To Go",icon:"fas-couch",imageURL:"https://graph.facebook.com/CabinetsToGo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25245346",shop:"furniture"},addTags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",imageURL:"https://graph.facebook.com/Conforama/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q541134",shop:"furniture"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},countryCodes:["ch","es","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",imageURL:"https://graph.facebook.com/crateandbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5182604",shop:"furniture"},addTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",imageURL:"https://graph.facebook.com/DFSUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5204927",shop:"furniture"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",imageURL:"https://graph.facebook.com/JYSK.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",imageURL:"https://graph.facebook.com/ethanallendesign/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5402870",shop:"furniture"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Fly":{name:"Fly",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFly-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1389184",shop:"furniture"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Freedom":{name:"Freedom",icon:"fas-couch",imageURL:"https://graph.facebook.com/freedomAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5500546",shop:"furniture"},addTags:{brand:"Freedom","brand:wikidata":"Q5500546","brand:wikipedia":"en:Freedom Furniture",name:"Freedom",shop:"furniture"},countryCodes:["au"],terms:["freedom furniture"],matchScore:2,suggestion:true},"shop/furniture/HSL":{name:"HSL",icon:"fas-couch",imageURL:"https://graph.facebook.com/hslchairs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64284324",shop:"furniture"},addTags:{brand:"HSL","brand:wikidata":"Q64284324",name:"HSL",official_name:"High Seat Limited",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",imageURL:"https://graph.facebook.com/harveysfurniture/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5677754",shop:"furniture"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Havertys":{name:"Havertys",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/672434576397062144/tX39o3Bz_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5683881",shop:"furniture"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",imageURL:"https://graph.facebook.com/IKEA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54078",shop:"furniture"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Isku":{name:"Isku",icon:"fas-couch",imageURL:"https://graph.facebook.com/iskuinteriorofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11865127",shop:"furniture"},addTags:{brand:"Isku","brand:wikidata":"Q11865127","brand:wikipedia":"fi:Isku (yritys)",name:"Isku",shop:"furniture"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",imageURL:"https://graph.facebook.com/JYSK.dk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q138913",shop:"furniture"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Jerome’s Furniture":{name:"Jerome’s Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/JeromesFurniture/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997693",shop:"furniture"},addTags:{brand:"Jerome’s Furniture","brand:wikidata":"Q16997693","brand:wikipedia":"en:Jerome's",name:"Jerome’s Furniture",shop:"furniture",short_name:"Jerome’s"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Kwantum":{name:"Kwantum",icon:"fas-couch",imageURL:"https://graph.facebook.com/KwantumNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2262591",shop:"furniture"},addTags:{brand:"Kwantum","brand:wikidata":"Q2262591","brand:wikipedia":"nl:Kwantum (winkelketen)",name:"Kwantum",shop:"furniture"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",imageURL:"https://graph.facebook.com/lazboy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6391583",shop:"furniture"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Leen Bakker":{name:"Leen Bakker",icon:"fas-couch",imageURL:"https://graph.facebook.com/leenbakker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3333662",shop:"furniture"},addTags:{brand:"Leen Bakker","brand:wikidata":"Q3333662","brand:wikipedia":"nl:Leen Bakker",name:"Leen Bakker",shop:"furniture"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/furniture/LoveSac":{name:"LoveSac",icon:"fas-couch",imageURL:"https://graph.facebook.com/LoveSac/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6690181",shop:"furniture"},addTags:{brand:"LoveSac","brand:wikidata":"Q6690181","brand:wikipedia":"en:LoveSac",name:"LoveSac",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Maisons du Monde":{name:"Maisons du Monde",icon:"fas-couch",imageURL:"https://graph.facebook.com/maisonsdumondeus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3280364",shop:"furniture"},addTags:{brand:"Maisons du Monde","brand:wikidata":"Q3280364","brand:wikipedia":"fr:Maisons du Monde",name:"Maisons du Monde",shop:"furniture"},countryCodes:["be","ch","de","es","fr","gb","it","lu"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Möbelix":{name:"Möbelix",icon:"fas-couch",imageURL:"https://graph.facebook.com/moebelix.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q877547",shop:"furniture"},addTags:{brand:"Möbelix","brand:wikidata":"Q877547","brand:wikipedia":"hu:Möbelix",name:"Möbelix",shop:"furniture"},countryCodes:["at","cz","hu","sk"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Pottery Barn":{name:"Pottery Barn",icon:"fas-couch",imageURL:"https://graph.facebook.com/potterybarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3400126",shop:"furniture"},addTags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"},countryCodes:["au","ca","mx","ph","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Raymour & Flanigan":{name:"Raymour & Flanigan",icon:"fas-couch",imageURL:"https://graph.facebook.com/raymourandflanigan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7299290",shop:"furniture"},addTags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",imageURL:"https://graph.facebook.com/RentACenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7313497",shop:"furniture"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",imageURL:"https://graph.facebook.com/791504884230356/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7316207",shop:"furniture"},addTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",imageURL:"https://graph.facebook.com/ROLLER.Clever.einrichten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1621286",shop:"furniture"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",imageURL:"https://graph.facebook.com/roomstogo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7366329",shop:"furniture"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",imageURL:"https://graph.facebook.com/scssofas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19654399",shop:"furniture"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",imageURL:"https://graph.facebook.com/TheBrick/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7720000",shop:"furniture"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Urban Barn":{name:"Urban Barn",icon:"fas-couch",imageURL:"https://graph.facebook.com/urbanbarn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62515207",shop:"furniture"},addTags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Value City Furniture":{name:"Value City Furniture",icon:"fas-couch",imageURL:"https://graph.facebook.com/ValueCityFurnitureUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63859417",shop:"furniture"},addTags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/İstikbal":{name:"İstikbal",icon:"fas-couch",imageURL:"https://graph.facebook.com/istikbal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6031999",shop:"furniture"},addTags:{brand:"İstikbal","brand:wikidata":"Q6031999","brand:wikipedia":"tr:İstikbal",name:"İstikbal",shop:"furniture"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",imageURL:"https://graph.facebook.com/nitori.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10801453",shop:"furniture"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/games/Games Workshop":{name:"Games Workshop",icon:"fas-dice",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGames%20Workshop%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q587270",shop:"games"},addTags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"},countryCodes:["de","fr","gb","nl","us"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Dehner":{name:"Dehner",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/dehner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1183029",shop:"garden_centre"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/gammvert.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3095006",shop:"garden_centre"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/Jardiland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3162276",shop:"garden_centre"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/444739795728913/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16661975",shop:"garden_centre"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/garden_centre/Truffaut":{name:"Truffaut",icon:"maki-garden-centre",imageURL:"https://graph.facebook.com/truffautfr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3162640",shop:"garden_centre"},addTags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/gas/Airgas":{name:"Airgas",icon:"maki-shop",imageURL:"https://graph.facebook.com/airgasusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q80635",shop:"gas"},addTags:{brand:"Airgas","brand:wikidata":"Q80635","brand:wikipedia":"en:Airgas",name:"Airgas",shop:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gas/AmeriGas":{name:"AmeriGas",icon:"maki-shop",imageURL:"https://graph.facebook.com/AmeriGas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23130318",shop:"gas"},addTags:{brand:"AmeriGas","brand:wikidata":"Q23130318","fuel:lpg":"yes",name:"AmeriGas",shop:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gas/Ferrellgas":{name:"Ferrellgas",icon:"maki-shop",imageURL:"https://graph.facebook.com/Ferrellgas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5445299",shop:"gas"},addTags:{brand:"Ferrellgas","brand:wikidata":"Q5445299","fuel:lpg":"yes",name:"Ferrellgas",shop:"gas"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/American Greetings":{name:"American Greetings",icon:"maki-gift",imageURL:"https://graph.facebook.com/AmericanGreetings/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q464767",shop:"gift"},addTags:{brand:"American Greetings","brand:wikidata":"Q464767","brand:wikipedia":"en:American Greetings",name:"American Greetings",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",imageURL:"https://graph.facebook.com/cardfactoryplc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5038192",shop:"gift"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},countryCodes:["gb","im"],terms:[],matchScore:2,suggestion:true},"shop/gift/Carlton Cards":{name:"Carlton Cards",icon:"maki-gift",imageURL:"https://graph.facebook.com/Carltoncards.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5042968",shop:"gift"},addTags:{brand:"Carlton Cards","brand:wikidata":"Q5042968","brand:wikipedia":"en:Carlton Cards",name:"Carlton Cards",shop:"gift"},countryCodes:["ca"],terms:["carlton"],matchScore:2,suggestion:true},"shop/gift/Clintons":{name:"Clintons",icon:"maki-gift",imageURL:"https://graph.facebook.com/ClintonsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5134299",shop:"gift"},addTags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/gift/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-gift",imageURL:"https://graph.facebook.com/crackerbarrel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4492609",shop:"gift"},addTags:{brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Disney Store":{name:"Disney Store",icon:"maki-gift",imageURL:"https://graph.facebook.com/shopdisney/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1047009",shop:"gift"},addTags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",shop:"gift"},countryCodes:["ca","fr","us"],terms:["the disney store"],matchScore:2,suggestion:true},"shop/gift/Edible Arrangements":{name:"Edible Arrangements",icon:"maki-gift",imageURL:"https://graph.facebook.com/ediblearrangements/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5337996",shop:"gift"},addTags:{brand:"Edible Arrangements","brand:wikidata":"Q5337996","brand:wikipedia":"en:Edible Arrangements",name:"Edible Arrangements",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",imageURL:"https://graph.facebook.com/Hallmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1521910",shop:"gift"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},countryCodes:["ca","gb","us"],terms:["hallmark gold crown"],matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",imageURL:"https://graph.facebook.com/NanuNanaDE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1720245",shop:"gift"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/gift/Papyrus":{name:"Papyrus",icon:"maki-gift",imageURL:"https://graph.facebook.com/papyrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28222692",shop:"gift"},addTags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",shop:"gift"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Showcase":{name:"Showcase",icon:"maki-gift",geometry:["point","area"],tags:{"brand:wikidata":"Q7503163",shop:"gift"},addTags:{brand:"Showcase","brand:wikidata":"Q7503163","brand:wikipedia":"en:Showcase (retailer)",name:"Showcase",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Spencer's":{name:"Spencer's",icon:"maki-gift",imageURL:"https://graph.facebook.com/spencers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7576055",shop:"gift"},addTags:{brand:"Spencer Gifts","brand:wikidata":"Q7576055","brand:wikipedia":"en:Spencer Gifts",name:"Spencer's",official_name:"Spencer Gifts",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/gift/Things Remembered":{name:"Things Remembered",icon:"maki-gift",imageURL:"https://graph.facebook.com/thingsremembered/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54958287",shop:"gift"},addTags:{brand:"Things Remembered","brand:wikidata":"Q54958287","brand:wikipedia":"en:Things Remembered",name:"Things Remembered",shop:"gift"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/greengrocer/Produce Junction":{name:"Produce Junction",icon:"fas-carrot",imageURL:"https://graph.facebook.com/ProduceJunction/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60583541",shop:"greengrocer"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",imageURL:"https://graph.facebook.com/sallybeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7405065",shop:"hairdresser_supply"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Camille Albane":{name:"Camille Albane",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CamilleAlbane.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62965183",shop:"hairdresser"},addTags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Cost Cutters":{name:"Cost Cutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/CostCutters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029366",shop:"hairdresser"},addTags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Dessange":{name:"Dessange",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/DESSANGE.Paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62979914",shop:"hairdresser"},addTags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/fantasticsamscutandcolor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5434222",shop:"hairdresser"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/SignatureStyleSalons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5452622",shop:"hairdresser"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Franck Provost":{name:"Franck Provost",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/franck.provost.paris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62805922",shop:"hairdresser"},addTags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"},countryCodes:["be","fr","pl"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/GreatClips/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5598967",shop:"hairdresser"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/haircuttery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5639484",shop:"hairdresser"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairexpressfriseur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550814",shop:"hairdresser"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/hairkillerDetmold/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58305998",shop:"hairdresser"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},countryCodes:["at","de","lu"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Jean Louis David":{name:"Jean Louis David",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/jean.louis.david.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64445174",shop:"hairdresser"},addTags:{brand:"Jean Louis David","brand:wikidata":"Q64445174",name:"Jean Louis David",shop:"hairdresser"},countryCodes:["es","fr","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/frisoerklier/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1465159",shop:"hairdresser"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},countryCodes:["at","cz","de","sk"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/klipp.frisoer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1737304",shop:"hairdresser"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Mastercuts":{name:"Mastercuts",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/MasterCuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64026258",shop:"hairdresser"},addTags:{brand:"Mastercuts","brand:wikidata":"Q64026258",name:"Mastercuts",shop:"hairdresser"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Saint Algue":{name:"Saint Algue",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/saint.algue.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62973210",shop:"hairdresser"},addTags:{brand:"Saint Algue","brand:wikidata":"Q62973210",name:"Saint Algue",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/SportClipsHaircuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579310",shop:"hairdresser"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},countryCodes:["ca","us"],terms:["sport clips haircuts","sports clips"],matchScore:2,suggestion:true},"shop/hairdresser/Super Cut":{name:"Super Cut",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/supercut.friseur/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64139077",shop:"hairdresser"},addTags:{brand:"Super Cut","brand:wikidata":"Q64139077",name:"Super Cut",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Supercuts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7643239",shop:"hairdresser"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Tchip":{name:"Tchip",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/TCHIP.Coiffure.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62871250",shop:"hairdresser"},addTags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/The Salon at Ulta Beauty":{name:"The Salon at Ulta Beauty",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/UltaBeauty/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7880076",shop:"hairdresser"},addTags:{alt_name:"Ulta Salon",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Salon at Ulta Beauty",shop:"hairdresser"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/toniandguyworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q324784",shop:"hairdresser"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Top Hair":{name:"Top Hair",icon:"temaki-beauty_salon",imageURL:"https://graph.facebook.com/Mein.Friseur.Top.Hair/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62523343",shop:"hairdresser"},addTags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/hardware/220 вольт":{name:"220 вольт",icon:"temaki-tools",imageURL:"https://graph.facebook.com/likevolt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18635304",shop:"hardware"},addTags:{brand:"220 вольт","brand:en":"220 Volt","brand:ru":"220 вольт","brand:wikidata":"Q18635304","brand:wikipedia":"ru:220 Вольт (компания)",name:"220 вольт","name:en":"220 Volt","name:ru":"220 вольт",shop:"hardware"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",imageURL:"https://pbs.twimg.com/profile_images/1145780174190858241/HTbFX01b_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5654601",shop:"hardware"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Home Hardware":{name:"Home Hardware",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homehardwarestores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3139611",shop:"hardware"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/hardware/K-Rauta":{name:"K-Rauta",icon:"temaki-tools",imageURL:"https://graph.facebook.com/KRautaSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4206187",shop:"hardware"},addTags:{brand:"K-Rauta","brand:wikidata":"Q4206187","brand:wikipedia":"fi:K-Rauta",name:"K-Rauta",shop:"hardware"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Kodin Terra":{name:"Kodin Terra",icon:"temaki-tools",imageURL:"https://graph.facebook.com/KodinTerraPori/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11872038",shop:"hardware"},addTags:{brand:"Kodin Terra","brand:wikidata":"Q11872038","brand:wikipedia":"fi:Kodin Terra",name:"Kodin Terra",shop:"hardware"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",imageURL:"https://graph.facebook.com/TrueValue/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7847545",shop:"hardware"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Würth":{name:"Würth",icon:"temaki-tools",imageURL:"https://graph.facebook.com/Wuerth.Group/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q679750",shop:"hardware"},addTags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"},countryCodes:["be","de","fi","fr","it","no"],terms:[],matchScore:2,suggestion:true},"shop/hardware/Мосхозторг":{name:"Мосхозторг",icon:"temaki-tools",imageURL:"https://graph.facebook.com/MosHozTorg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62499092",shop:"hardware"},addTags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1146032750463504384/jGVlI8rw_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5880870",shop:"health_food"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},countryCodes:["gb","ie","nl"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",imageURL:"https://graph.facebook.com/AmplifonGroupCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q477222",shop:"hearing_aids"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",imageURL:"https://graph.facebook.com/audikafrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2870745",shop:"hearing_aids"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",imageURL:"https://graph.facebook.com/geers.hoerakustik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1497707",shop:"hearing_aids"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},countryCodes:["de","pl"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",imageURL:"https://graph.facebook.com/kindhoergeraete/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43598590",shop:"hearing_aids"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},countryCodes:["de"],terms:["kind"],matchScore:2,suggestion:true},"shop/hearing_aids/Miracle-Ear":{name:"Miracle-Ear",icon:"maki-shop",imageURL:"https://graph.facebook.com/miracleear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17108572",shop:"hearing_aids"},addTags:{brand:"Miracle-Ear","brand:wikidata":"Q17108572","brand:wikipedia":"en:Miracle-Ear",name:"Miracle-Ear",shop:"hearing_aids"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",imageURL:"https://graph.facebook.com/NeurothAG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15836645",shop:"hearing_aids"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"temaki-speaker",imageURL:"https://graph.facebook.com/bangolufsenusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q790020",shop:"hifi"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},terms:[],matchScore:2,suggestion:true},"shop/hifi/Bose":{name:"Bose",icon:"temaki-speaker",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBose%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q328568",shop:"hifi"},addTags:{brand:"Bose","brand:wikidata":"Q328568","brand:wikipedia":"en:Bose Corporation",name:"Bose",shop:"hifi"},terms:[],matchScore:2,suggestion:true},"shop/hobby/アニメイト":{name:"アニメイト",icon:"fas-dragon",imageURL:"https://pbs.twimg.com/profile_images/1098862296787382272/pLo1nSbN_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1041890",shop:"hobby"},addTags:{brand:"アニメイト","brand:en":"Animate","brand:ja":"アニメイト","brand:wikidata":"Q1041890","brand:wikipedia":"ja:アニメイト",name:"アニメイト","name:en":"Animate","name:ja":"アニメイト",shop:"hobby"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/houseware/At Home":{name:"At Home",icon:"fas-blender",imageURL:"https://graph.facebook.com/AtHomeStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5522290",shop:"houseware"},addTags:{brand:"At Home (store)","brand:wikidata":"Q5522290",name:"At Home",shop:"houseware"},countryCodes:["us"],terms:["garden ridge"],matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",imageURL:"https://graph.facebook.com/BedBathAndBeyond/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q813782",shop:"houseware"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},countryCodes:["ca","mx","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",imageURL:"https://graph.facebook.com/BlokkerNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q884934",shop:"houseware"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",imageURL:"https://graph.facebook.com/CerveraAB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10447179",shop:"houseware"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",imageURL:"https://graph.facebook.com/Homegoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5887941",shop:"houseware"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Kitchen Collection":{name:"Kitchen Collection",icon:"fas-blender",imageURL:"https://graph.facebook.com/KitchenCollectionStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149036",shop:"houseware"},addTags:{brand:"Kitchen Collection","brand:wikidata":"Q64149036",name:"Kitchen Collection",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Lagerhaus":{name:"Lagerhaus",icon:"fas-blender",imageURL:"https://graph.facebook.com/lagerhaus.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10553211",shop:"houseware"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Le Creuset":{name:"Le Creuset",icon:"fas-blender",imageURL:"https://graph.facebook.com/lecreuset/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q555861",shop:"houseware"},addTags:{brand:"Le Creuset","brand:wikidata":"Q555861","brand:wikipedia":"en:Le Creuset",name:"Le Creuset",shop:"houseware"},terms:[],matchScore:2,suggestion:true},"shop/houseware/Marskramer":{name:"Marskramer",icon:"fas-blender",imageURL:"https://graph.facebook.com/marskramer.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2305917",shop:"houseware"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Old Time Pottery":{name:"Old Time Pottery",icon:"fas-blender",imageURL:"https://graph.facebook.com/oldtimepottery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7085222",shop:"houseware"},addTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Sur La Table":{name:"Sur La Table",icon:"fas-blender",imageURL:"https://graph.facebook.com/SurLaTable/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7645220",shop:"houseware"},addTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/The Container Store":{name:"The Container Store",icon:"fas-blender",imageURL:"https://graph.facebook.com/containerstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7727445",shop:"houseware"},addTags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Tuesday Morning":{name:"Tuesday Morning",icon:"fas-blender",imageURL:"https://graph.facebook.com/TuesdayMorning/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7851426",shop:"houseware"},addTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",imageURL:"https://graph.facebook.com/WMF/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q451423",shop:"houseware"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/houseware/Williams-Sonoma":{name:"Williams-Sonoma",icon:"fas-blender",imageURL:"https://graph.facebook.com/WilliamsSonoma/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2581220",shop:"houseware"},addTags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"houseware"},countryCodes:["ca","us"],terms:["william sonoma"],matchScore:2,suggestion:true},"shop/houseware/World Market":{name:"World Market",icon:"fas-blender",imageURL:"https://graph.facebook.com/worldmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5174750",shop:"interior_decoration"},addTags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"},countryCodes:["us"],terms:["cost plus"],matchScore:2,suggestion:true},"shop/houseware/Xenos":{name:"Xenos",icon:"fas-blender",imageURL:"https://graph.facebook.com/XenosNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16547960",shop:"houseware"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Centrakor":{name:"Centrakor",icon:"maki-shop",imageURL:"https://graph.facebook.com/Centrakor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64079345",shop:"interior_decoration"},addTags:{brand:"Centrakor","brand:wikidata":"Q64079345",name:"Centrakor",shop:"interior_decoration"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",imageURL:"https://graph.facebook.com/DEPOTonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1191740",shop:"interior_decoration"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Fired Earth":{name:"Fired Earth",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/895948506082537472/9N7fI-vd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q20594569",shop:"interior_decoration"},addTags:{brand:"Fired Earth","brand:wikidata":"Q20594569",name:"Fired Earth",shop:"interior_decoration"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",imageURL:"https://graph.facebook.com/hemtex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521868",shop:"interior_decoration"},addTags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"},countryCodes:["ee","fi","se"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/HomeSense":{name:"HomeSense",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHomeSense%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q16844433",shop:"interior_decoration"},addTags:{brand:"HomeSense","brand:wikidata":"Q16844433","brand:wikipedia":"en:HomeSense",name:"HomeSense",shop:"interior_decoration"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Kirkland's":{name:"Kirkland's",icon:"maki-shop",imageURL:"https://graph.facebook.com/Kirklands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6415714",shop:"interior_decoration"},addTags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",imageURL:"https://graph.facebook.com/pier1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7191691",shop:"interior_decoration"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/interior_decoration/Ten Thousand Villages":{name:"Ten Thousand Villages",icon:"maki-shop",imageURL:"https://graph.facebook.com/TenThousandVillages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2403252",shop:"interior_decoration"},addTags:{brand:"Ten Thousand Villages","brand:wikidata":"Q2403252","brand:wikipedia":"en:Ten Thousand Villages",fair_trade:"only",name:"Ten Thousand Villages",shop:"interior_decoration"},countryCodes:["ca","us"],terms:["10 thousand villages","10,000 villages"],matchScore:2,suggestion:true},"shop/jewelry/Alex and Ani":{name:"Alex and Ani",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/alexandaniusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16198810",shop:"jewelry"},addTags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/BizuteriaApart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11686561",shop:"jewelry"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/bijoubrigitte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q599545",shop:"jewelry"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/cartier.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q538587",shop:"jewelry"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Christ":{name:"Christ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juwelierchrist/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1077957",shop:"jewelry"},addTags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"},countryCodes:["ch","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/David Yurman":{name:"David Yurman",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/DavidYurman/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5241390",shop:"jewelry"},addTags:{brand:"David Yurman","brand:wikidata":"Q5241390","brand:wikipedia":"en:David Yurman",name:"David Yurman",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/ernestjonesjewellers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5393358",shop:"jewelry"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Guldfynd/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q49099223",shop:"jewelry"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/H.Samuel":{name:"H.Samuel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HSamuelTheJeweller/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5628558",shop:"jewelry"},addTags:{brand:"H.Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H.Samuel",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Histoire d'Or":{name:"Histoire d'Or",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/HistoiredOr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62529245",shop:"jewelry"},addTags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"},countryCodes:["be","fr","it","nl"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JamesAvery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6129024",shop:"jewelry"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Jared":{name:"Jared",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/JaredTheGalleriaOfJewelry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029282",shop:"jewelry"},addTags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Julien d'Orcel":{name:"Julien d'Orcel",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/juliendorcel.bijouteries/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62497463",shop:"jewelry"},addTags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/KayJewelers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62029290",shop:"jewelry"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Michael Hill":{name:"Michael Hill",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/MichaelHillJ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3308250",shop:"jewelry"},addTags:{brand:"Michael Hill","brand:wikidata":"Q3308250","brand:wikipedia":"en:Michael Hill Jeweller",name:"Michael Hill",shop:"jewelry"},countryCodes:["au","ca","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/PNJ":{name:"PNJ",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PNJ.COM.VN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61129183",shop:"jewelry"},addTags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/PANDORA.Japan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2241604",shop:"jewelry"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Peoples Jewellers":{name:"Peoples Jewellers",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Peoples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64995558",shop:"jewelry"},addTags:{brand:"Peoples Jewellers","brand:wikidata":"Q64995558",name:"Peoples Jewellers",shop:"jewelry"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/SWAROVSKI.NorthAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q611115",shop:"jewelry"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},terms:[],matchScore:2,suggestion:true},"shop/jewelry/Tiffany & Company":{name:"Tiffany & Company",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Tiffany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1066858",shop:"jewelry"},addTags:{brand:"Tiffany & Company","brand:wikidata":"Q1066858","brand:wikipedia":"en:Tiffany & Co.",name:"Tiffany & Company",official_name:"Tiffany & Co.",shop:"jewelry"},countryCodes:["us"],terms:["tiffany","tiffany's"],matchScore:2,suggestion:true},"shop/jewelry/Warren James":{name:"Warren James",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/warrenjamesjewellers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19604616",shop:"jewelry"},addTags:{brand:"Warren James","brand:wikidata":"Q19604616","brand:wikipedia":"en:Warren James Jewellers",name:"Warren James",shop:"jewelry"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Zales":{name:"Zales",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/Zales/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8065305",shop:"jewelry"},addTags:{brand:"Zales","brand:wikidata":"Q8065305","brand:wikipedia":"en:Zale Corporation",name:"Zales",shop:"jewelry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/jewelry/Адамас":{name:"Адамас",icon:"maki-jewelry-store",imageURL:"https://graph.facebook.com/adamas.club/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393709",shop:"jewelry"},addTags:{brand:"Адамас","brand:en":"Adamas","brand:ru":"Адамас","brand:wikidata":"Q62393709",name:"Адамас","name:en":"Adamas","name:ru":"Адамас",shop:"jewelry"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",imageURL:"https://graph.facebook.com/narvesen.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6514414",shop:"kiosk"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},countryCodes:["lt","lv","no"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",imageURL:"https://graph.facebook.com/Pressbyran/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2489072",shop:"kiosk"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",imageURL:"https://graph.facebook.com/rkioski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1571400",shop:"kiosk"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",imageURL:"https://graph.facebook.com/ruch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1260314",shop:"kiosk"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/Tisak":{name:"Tisak",icon:"maki-shop",imageURL:"https://graph.facebook.com/tisakmedia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12643627",shop:"kiosk"},addTags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"kiosk"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/kiosk/キヨスク":{name:"キヨスク",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q1334796",shop:"kiosk"},addTags:{brand:"キヨスク","brand:en":"KIOSK","brand:ja":"キヨスク","brand:wikidata":"Q1334796","brand:wikipedia":"ja:キヨスク",name:"キヨスク","name:en":"KIOSK","name:ja":"キヨスク",shop:"kiosk"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",imageURL:"https://graph.facebook.com/CuisinellaFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3007012",shop:"kitchen"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},countryCodes:["fr","tn"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Magnet":{name:"Magnet",icon:"maki-shop",imageURL:"https://graph.facebook.com/MagnetKitchens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6731427",shop:"kitchen"},addTags:{brand:"Magnet","brand:wikidata":"Q6731427",name:"Magnet",shop:"kitchen"},countryCodes:["gb"],terms:["magnet kitchens"],matchScore:2,suggestion:true},"shop/kitchen/Mobalpa":{name:"Mobalpa",icon:"maki-shop",imageURL:"https://graph.facebook.com/Mobalpa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317571",shop:"kitchen"},addTags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"},countryCodes:["be","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",imageURL:"https://graph.facebook.com/Schmidt.HomeDesign/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3487620",shop:"kitchen"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},countryCodes:["be","es","fr","gb"],terms:[],matchScore:2,suggestion:true},"shop/kitchen/SoCoo'c":{name:"SoCoo'c",icon:"maki-shop",imageURL:"https://graph.facebook.com/SoCooc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62783840",shop:"kitchen"},addTags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",imageURL:"https://graph.facebook.com/MassageEnvy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q22922899",shop:"massage"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},countryCodes:["us"],terms:["massage envy spa"],matchScore:2,suggestion:true},"shop/massage/Massage Heights":{name:"Massage Heights",icon:"temaki-spa",imageURL:"https://graph.facebook.com/MassageHeights/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64573956",shop:"massage"},addTags:{brand:"Massage Heights","brand:wikidata":"Q64573956",name:"Massage Heights",shop:"massage"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Pofam-Poznań":{name:"Pofam-Poznań",icon:"maki-shop",imageURL:"https://graph.facebook.com/381601628634155/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62057457",shop:"medical_supply"},addTags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/medical_supply/Ортека":{name:"Ортека",icon:"maki-shop",imageURL:"https://graph.facebook.com/orteka.rus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393660",shop:"medical_supply"},addTags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/3 Store":{name:"3 Store",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ThreeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q407009",shop:"mobile_phone"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},countryCodes:["gb","it"],terms:["3","three","three store"],matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ATT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q298594",shop:"mobile_phone"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},countryCodes:["mx","us"],terms:["att mobile","att mobility","att wireless"],matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/BellCanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2894594",shop:"mobile_phone"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},countryCodes:["ca"],terms:["bell mobile","bell mobility","bell wireless"],matchScore:2,suggestion:true},"shop/mobile_phone/Best Buy Mobile":{name:"Best Buy Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/bestbuy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q533415",shop:"mobile_phone"},addTags:{brand:"Best Buy Mobile","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Bitė":{name:"Bitė",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/bitelietuva/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q796010",shop:"mobile_phone"},addTags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/boostmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4943790",shop:"mobile_phone"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},countryCodes:["us"],terms:["boost"],matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},countryCodes:["by","gb","ie"],terms:["the carphone warehouse"],matchScore:2,suggestion:true},"shop/mobile_phone/Chatr":{name:"Chatr",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/705052150091681792/Rt-nwXo7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5087766",shop:"mobile_phone"},addTags:{brand:"Chatr","brand:wikidata":"Q5087766","brand:wikipedia":"en:Chatr",name:"Chatr",shop:"mobile_phone"},countryCodes:["ca"],terms:["Chatr Mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/Claro":{name:"Claro",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ClaroCol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1770208",shop:"mobile_phone"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/cricketwireless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5184987",shop:"mobile_phone"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["cricket"],matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/digicel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2117506",shop:"mobile_phone"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/ee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5322942",shop:"mobile_phone"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/entelsa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q450420",shop:"mobile_phone"},addTags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Fido":{name:"Fido",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q3071471",shop:"mobile_phone"},addTags:{brand:"Fido","brand:wikidata":"Q3071471","brand:wikipedia":"en:Fido Solutions",name:"Fido",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Freedom Mobile":{name:"Freedom Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/frdmmobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023931",shop:"mobile_phone"},addTags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:["freedom","wind mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/Koodo":{name:"Koodo",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Koodo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6430529",shop:"mobile_phone"},addTags:{brand:"Koodo","brand:wikidata":"Q6430529","brand:wikipedia":"en:Koodo Mobile",name:"Koodo",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MTN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1813361",shop:"mobile_phone"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},terms:["agence mtn"],matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MetroByTMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1925685",shop:"mobile_phone"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q344744",shop:"mobile_phone"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},countryCodes:["de","ir"],terms:["debitel"],matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/moovcotedivoire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3323637",shop:"mobile_phone"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},countryCodes:["ci","tg"],terms:["agence moov"],matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/movistar.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967735",shop:"mobile_phone"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FO2.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1759255",shop:"mobile_phone"},addTags:{brand:"O2","brand:wikidata":"Q1759255","brand:wikipedia":"en:Telefónica Europe",name:"O2",shop:"mobile_phone"},countryCodes:["cz","de","gb","ie","sk"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Optie1":{name:"Optie1",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Optie1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62393564",shop:"mobile_phone"},addTags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Orange":{name:"Orange",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/orange/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1431486",shop:"mobile_phone"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"},terms:["agence orange"],matchScore:2,suggestion:true},"shop/mobile_phone/Personal":{name:"Personal",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/personalargentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10933021",shop:"mobile_phone"},addTags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"},countryCodes:["ar","py"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/carphonewarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q118046",shop:"mobile_phone"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},countryCodes:["de","es","fr","nl","pt"],terms:["the phone house"],matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Play/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7202998",shop:"mobile_phone"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/plus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7205598",shop:"mobile_phone"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Rogers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3439663",shop:"mobile_phone"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SFR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q218765",shop:"mobile_phone"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},countryCodes:["fr","lu"],terms:["espace sfr"],matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/sprint/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q301965",shop:"mobile_phone"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q327634",shop:"mobile_phone"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/TimOfficialPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q144617",shop:"mobile_phone"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},countryCodes:["br","it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Tbooth Wireless":{name:"Tbooth Wireless",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/910995518846672896/-zraayKF_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7690597",shop:"mobile_phone"},addTags:{brand:"Tbooth Wireless","brand:wikidata":"Q7690597",name:"Tbooth Wireless",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telcel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3517255",shop:"mobile_phone"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},countryCodes:["cu","mx"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/deutschetelekom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9396",shop:"mobile_phone"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},countryCodes:["de","hu","ro","si","sk"],terms:["telekom shop"],matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telenorgroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q845632",shop:"mobile_phone"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telstra":{name:"Telstra",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Telstra/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q721162",shop:"mobile_phone"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/telus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q165858",shop:"mobile_phone"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Turkcell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q283852",shop:"mobile_phone"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},countryCodes:["cy","tr"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/U.S. Cellular":{name:"U.S. Cellular",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/USCellular/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2466256",shop:"mobile_phone"},addTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/verizon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q919641",shop:"mobile_phone"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},countryCodes:["us"],terms:["verizon"],matchScore:2,suggestion:true},"shop/mobile_phone/Vidéotron":{name:"Vidéotron",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/885158241101127683/Fy8FCpmg_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2396830",shop:"mobile_phone"},addTags:{brand:"Vidéotron","brand:wikidata":"Q2396830","brand:wikipedia":"en:Vidéotron",name:"Vidéotron",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Virgin Mobile (Canada)":{name:"Virgin Mobile (Canada)",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/764098127641149440/uYi5SNMU_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3560641",shop:"mobile_phone"},addTags:{brand:"Virgin Mobile","brand:wikidata":"Q3560641","brand:wikipedia":"en:Virgin Mobile Canada",name:"Virgin Mobile",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/vodafoneUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q122141",shop:"mobile_phone"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},terms:["vodafone shop"],matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/etecsa.cu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q490323",shop:"mobile_phone"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},countryCodes:["cu"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/WOW! Mobile Boutique":{name:"WOW! Mobile Boutique",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/860473723475906561/A2bVMfab_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q64847598",shop:"mobile_phone"},addTags:{brand:"WOW! Mobile Boutique","brand:wikidata":"Q64847598",name:"WOW! Mobile Boutique",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Wind":{name:"Wind",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Wind/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q650467",shop:"mobile_phone"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/WirelessWave":{name:"WirelessWave",icon:"fas-mobile-alt",imageURL:"https://pbs.twimg.com/profile_images/565650686931529728/xv5f4DIL_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q8026815",shop:"mobile_phone"},addTags:{brand:"WirelessWave","brand:wikidata":"Q8026815",name:"WirelessWave",shop:"mobile_phone"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Yoigo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2630989",shop:"mobile_phone"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/aubyKDDI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q307110",shop:"mobile_phone"},addTags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:["au"],matchScore:2,suggestion:true},"shop/mobile_phone/Алло":{name:"Алло",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/allo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18683057",shop:"mobile_phone"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},countryCodes:["md","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/Beelinerus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q402880",shop:"mobile_phone"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},countryCodes:["kg","kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEuroset.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q65310",shop:"mobile_phone"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/kyivstar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2288463",shop:"mobile_phone"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/mts/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1368919",shop:"mobile_phone"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MegaFon.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1720713",shop:"mobile_phone"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},countryCodes:["ru","tj"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/svyaznoy.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65371",shop:"mobile_phone"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},countryCodes:["by","ru","uz"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/WeAreTele2/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q309865",shop:"mobile_phone"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7553832",shop:"mobile_phone"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/SoftBank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11315281",shop:"mobile_phone"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/docomo.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q853958",shop:"mobile_phone"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/ACE Cash Express":{name:"ACE Cash Express",icon:"maki-bank",imageURL:"https://graph.facebook.com/acecashexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24260962",shop:"money_lender"},addTags:{brand:"ACE Cash Express","brand:wikidata":"Q24260962",name:"ACE Cash Express",shop:"money_lender"},countryCodes:["us"],terms:["ace"],matchScore:2,suggestion:true},"shop/money_lender/Advance America":{name:"Advance America",icon:"maki-bank",imageURL:"https://graph.facebook.com/AdvanceAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4686044",shop:"money_lender"},addTags:{brand:"Advance America","brand:wikidata":"Q4686044",name:"Advance America",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/California Check Cashing Stores":{name:"California Check Cashing Stores",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q64390932",shop:"money_lender"},addTags:{brand:"California Check Cashing Stores","brand:wikidata":"Q64390932",name:"California Check Cashing Stores",shop:"money_lender"},countryCodes:["us"],terms:["california check cashing"],matchScore:2,suggestion:true},"shop/money_lender/Cash Store":{name:"Cash Store",icon:"maki-bank",imageURL:"https://graph.facebook.com/cashstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61943411",shop:"money_lender"},addTags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/Check Into Cash":{name:"Check Into Cash",icon:"maki-bank",imageURL:"https://graph.facebook.com/checkintocash/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16961246",shop:"money_lender"},addTags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/CheckSmart":{name:"CheckSmart",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCheckSmart%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q65640213",shop:"money_lender"},addTags:{alt_name:"Check$mart",brand:"CheckSmart","brand:wikidata":"Q65640213",name:"CheckSmart",shop:"money_lender"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/money_lender/First Virginia":{name:"First Virginia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFirst%20Virginia%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q65640051",shop:"money_lender"},addTags:{brand:"First Virginia","brand:wikidata":"Q65640051",name:"First Virginia",shop:"money_lender"},countryCodes:["us"],terms:["1st virginia"],matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",imageURL:"https://graph.facebook.com/moneymartusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6899166",shop:"money_lender"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Harley-Davidson":{name:"Harley-Davidson",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/harley-davidson/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q192814",shop:"motorcycle"},addTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/HondaJP/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9584",shop:"motorcycle"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/kawasaki/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6379855",shop:"motorcycle"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/MotortradePh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48803162",shop:"motorcycle"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/SuzukiGlobalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q181642",shop:"motorcycle"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",imageURL:"https://graph.facebook.com/yamahamotorusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q158888",shop:"motorcycle"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},terms:[],matchScore:2,suggestion:true},"shop/music/FYE":{name:"FYE",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/FYE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5424141",shop:"music"},addTags:{brand:"FYE","brand:wikidata":"Q5424141","brand:wikipedia":"en:FYE (retailer)",name:"FYE",shop:"music"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/hmv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10854572",shop:"music"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},countryCodes:["ca","gb"],terms:[],matchScore:2,suggestion:true},"shop/music/Sunrise Records":{name:"Sunrise Records",icon:"fas-compact-disc",imageURL:"https://pbs.twimg.com/profile_images/1058023773964824576/fkO9j6IA_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q30600373",shop:"music"},addTags:{brand:"Sunrise Records","brand:wikidata":"Q30600373","brand:wikipedia":"en:Sunrise Records (retailer)",name:"Sunrise Records",shop:"music"},countryCodes:["ca","gb"],terms:[],matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"fas-compact-disc",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"music"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},terms:[],matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"fas-guitar",imageURL:"https://graph.facebook.com/GuitarCenter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3622794",shop:"musical_instrument"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/musical_instrument/Long & McQuade":{name:"Long & McQuade",icon:"fas-guitar",imageURL:"https://pbs.twimg.com/profile_images/1073318422383980546/VOZePCnz_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6672180",shop:"musical_instrument"},addTags:{brand:"Long & McQuade","brand:wikidata":"Q6672180","brand:wikipedia":"en:Long & McQuade",name:"Long & McQuade",shop:"musical_instrument"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Cigo":{name:"Cigo",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/cigo.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391977",shop:"newsagent"},addTags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"},countryCodes:["de","nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Kolporter":{name:"Kolporter",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/kolporterpl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6427874",shop:"kiosk"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Maison de la Presse":{name:"Maison de la Presse",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/260230084083052/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62085960",shop:"newsagent"},addTags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Martin's":{name:"Martin's",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"newsagent"},addTags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Primera":{name:"Primera",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/Primera.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2176149",shop:"newsagent"},addTags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Relay":{name:"Relay",icon:"fas-newspaper",imageURL:"https://pbs.twimg.com/profile_images/1024284754911416320/NcQ5ml-K_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3424298",shop:"newsagent"},addTags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"},terms:[],matchScore:2,suggestion:true},"shop/newsagent/WHSmith":{name:"WHSmith",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/WHSmithuk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1548712",shop:"newsagent"},addTags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/k kiosk":{name:"k kiosk",icon:"fas-newspaper",imageURL:"https://graph.facebook.com/kkiosk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60381703",shop:"newsagent"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Белсоюзпечать":{name:"Белсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{name:"Витебскоблсоюзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Первая полоса":{name:"Первая полоса",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q62736412",shop:"newsagent"},addTags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/Союзпечать":{name:"Союзпечать",icon:"fas-newspaper",geometry:["point","area"],tags:{"brand:wikidata":"Q4430611",shop:"newsagent"},addTags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"},countryCodes:["by","kz","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"fas-newspaper",imageURL:"https://pbs.twimg.com/profile_images/1091035339232227328/elp0X_L6_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q645218",shop:"newsagent"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",imageURL:"https://graph.facebook.com/GNCLiveWell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4808595",shop:"nutrition_supplements"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},terms:["gnc live well"],matchScore:2,suggestion:true},"shop/nutrition_supplements/The Vitamin Shoppe":{name:"The Vitamin Shoppe",icon:"maki-shop",imageURL:"https://graph.facebook.com/THEVITAMINSHOPPE/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7772938",shop:"nutrition_supplements"},addTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/nutrition_supplements/Vitamin World":{name:"Vitamin World",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1083747378878914561/lXRtQg0T_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7936979",shop:"nutrition_supplements"},addTags:{brand:"Vitamin World","brand:wikidata":"Q7936979","brand:wikipedia":"en:Vitamin World",name:"Vitamin World",shop:"nutrition_supplements"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",imageURL:"https://graph.facebook.com/AlainAfflelouOptico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2829511",shop:"optician"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},countryCodes:["be","ch","es","fr","pt"],terms:[],matchScore:2,suggestion:true},"shop/optician/America's Best Contacts & Eyeglasses":{name:"America's Best Contacts & Eyeglasses",icon:"maki-optician",imageURL:"https://graph.facebook.com/AmericasBestContactsandEyeglasses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4742504",shop:"optician"},addTags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician",short_name:"America's Best"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Apollo-Optik":{name:"Apollo-Optik",icon:"maki-optician",imageURL:"https://graph.facebook.com/ApolloOptik/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q618940",shop:"optician"},addTags:{brand:"Apollo-Optik","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo-Optik",shop:"optician",short_name:"Apollo"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",imageURL:"https://graph.facebook.com/opticiensatol/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2869542",shop:"optician"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",imageURL:"https://graph.facebook.com/BootsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4944037",shop:"optician"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician",short_name:"Boots"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/optician/Clarkson Eyecare":{name:"Clarkson Eyecare",icon:"maki-optician",geometry:["point","area"],tags:{"brand:wikidata":"Q64027001",shop:"optician"},addTags:{brand:"Clarkson Eyecare","brand:wikidata":"Q64027001",healthcare:"optometrist",name:"Clarkson Eyecare",shop:"optician",short_name:"Clarkson"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Cohen's Fashion Optical":{name:"Cohen's Fashion Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/cohensoptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5141313",shop:"optician"},addTags:{brand:"Cohen's Fashion Optical","brand:wikidata":"Q5141313","brand:wikipedia":"en:Cohen's Fashion Optical",healthcare:"optometrist",name:"Cohen's Fashion Optical",shop:"optician",short_name:"Cohen's"},countryCodes:["us"],terms:["cohen's optical"],matchScore:2,suggestion:true},"shop/optician/Eye Wish":{name:"Eye Wish",icon:"maki-optician",imageURL:"https://graph.facebook.com/EyeWishOpticiens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391641",shop:"optician"},addTags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",shop:"optician"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F160506%20Fielmann%20LogoNEU%20pos%20wiki.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q457822",shop:"optician"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/General Óptica":{name:"General Óptica",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaloptica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391672",shop:"optician"},addTags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Grand Optical":{name:"Grand Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/grandoptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3113677",shop:"optician"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Générale d'Optique":{name:"Générale d'Optique",icon:"maki-optician",imageURL:"https://graph.facebook.com/generaledoptique/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391701",shop:"optician"},addTags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",imageURL:"https://graph.facebook.com/HakimOptical/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28232761",shop:"optician"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/optician/Hans Anders":{name:"Hans Anders",icon:"maki-optician",imageURL:"https://graph.facebook.com/hansanders.nl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1884976",shop:"optician"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},countryCodes:["be","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/optician/Instrumentarium":{name:"Instrumentarium",icon:"maki-optician",imageURL:"https://graph.facebook.com/instru.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11864937",shop:"optician"},addTags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",imageURL:"https://graph.facebook.com/Krys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3119538",shop:"optician"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",imageURL:"https://graph.facebook.com/LensCrafters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6523209",shop:"optician"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",imageURL:"https://graph.facebook.com/lesopticiensmutualistes.officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18414551",shop:"optician"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Lissac":{name:"Lissac",icon:"maki-optician",imageURL:"https://graph.facebook.com/lissac.opticien/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63102559",shop:"optician"},addTags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Portugal)":{name:"Multiópticas (Portugal)",icon:"maki-optician",imageURL:"https://graph.facebook.com/MultiOpticasPortugal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391722",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/optician/Multiópticas (Spain)":{name:"Multiópticas (Spain)",icon:"maki-optician",imageURL:"https://graph.facebook.com/Multiopticas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391719",shop:"optician"},addTags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/optician/Oakley":{name:"Oakley",icon:"maki-optician",imageURL:"https://graph.facebook.com/Oakley/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q161906",shop:"optician"},addTags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Oliver Peoples":{name:"Oliver Peoples",icon:"maki-optician",imageURL:"https://graph.facebook.com/oliverpeoples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7087746",shop:"optician"},addTags:{brand:"Oliver Peoples","brand:wikidata":"Q7087746","brand:wikipedia":"en:Oliver Peoples",name:"Oliver Peoples",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",imageURL:"https://graph.facebook.com/optic2000/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3354445",shop:"optician"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/optician/Optical Center":{name:"Optical Center",icon:"maki-optician",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20opticalcenter.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3354448",shop:"optician"},addTags:{brand:"Optical Center","brand:wikidata":"Q3354448","brand:wikipedia":"fr:Optical Center",name:"Optical Center",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Opticalia":{name:"Opticalia",icon:"maki-optician",imageURL:"https://graph.facebook.com/OPTICALIAGRUPO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082114",shop:"optician"},addTags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",imageURL:"https://graph.facebook.com/pearlevision/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2231148",shop:"optician"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician",short_name:"Pearle"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Silmäasema":{name:"Silmäasema",icon:"maki-optician",imageURL:"https://graph.facebook.com/silmaasema/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15994200",shop:"optician"},addTags:{brand:"Silmäasema","brand:wikidata":"Q15994200","brand:wikipedia":"fi:Silmäasema",name:"Silmäasema",shop:"optician"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",imageURL:"https://graph.facebook.com/Specsavers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2000610",shop:"optician"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",imageURL:"https://graph.facebook.com/SunglassHut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136311",shop:"optician"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",imageURL:"https://graph.facebook.com/synoptiksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10687541",shop:"optician"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",imageURL:"https://graph.facebook.com/synsam.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12004589",shop:"optician"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Target Optical":{name:"Target Optical",icon:"maki-optician",geometry:["point","area"],tags:{"brand:wikidata":"Q19903688",shop:"optician"},addTags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",imageURL:"https://graph.facebook.com/visionexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7936150",shop:"optician"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",imageURL:"https://graph.facebook.com/Visionworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422607",shop:"optician"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Warby Parker":{name:"Warby Parker",icon:"maki-optician",imageURL:"https://graph.facebook.com/warbyparker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7968882",shop:"optician"},addTags:{brand:"Warby Parker","brand:wikidata":"Q7968882","brand:wikipedia":"en:Warby Parker",name:"Warby Parker",shop:"optician"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/optician/แว่นท็อปเจริญ":{name:"แว่นท็อปเจริญ",icon:"maki-optician",imageURL:"https://graph.facebook.com/TopCharoenOpticalOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391732",shop:"optician"},addTags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"},countryCodes:["th"],terms:[],matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganesuper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343504",shop:"optician"},addTags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/optician/寶島眼鏡":{name:"寶島眼鏡",icon:"maki-optician",imageURL:"https://graph.facebook.com/formosafans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391741",shop:"optician"},addTags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"},countryCodes:["zh"],terms:[],matchScore:2,suggestion:true},"shop/optician/眼鏡市場":{name:"眼鏡市場",icon:"maki-optician",imageURL:"https://graph.facebook.com/meganeichiba.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11343506",shop:"optician"},addTags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Bass Pro Shops":{name:"Bass Pro Shops",icon:"temaki-compass",imageURL:"https://graph.facebook.com/bassproshops/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4867953",shop:"outdoor"},addTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Blacks":{name:"Blacks",icon:"temaki-compass",imageURL:"https://graph.facebook.com/blacksonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64822933",shop:"outdoor"},addTags:{brand:"Blacks","brand:wikidata":"Q64822933",name:"Blacks",shop:"outdoor"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Cabela's":{name:"Cabela's",icon:"temaki-compass",imageURL:"https://graph.facebook.com/Cabelas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2793714",shop:"outdoor"},addTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Gander Outdoors":{name:"Gander Outdoors",icon:"temaki-compass",imageURL:"https://graph.facebook.com/GanderOutdoors/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64357426",shop:"outdoor"},addTags:{brand:"Gander Outdoors","brand:wikidata":"Q64357426","brand:wikipedia":"en:Gander Outdoors",name:"Gander Outdoors",shop:"outdoor"},countryCodes:["us"],terms:["gander mountain"],matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"temaki-compass",imageURL:"https://graph.facebook.com/JACKWOLFSKINofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q536133",shop:"outdoor"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},countryCodes:["ch","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",imageURL:"https://graph.facebook.com/kathmandu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1736294",shop:"outdoor"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Millets":{name:"Millets",icon:"temaki-compass",imageURL:"https://graph.facebook.com/milletsonlinefans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64822903",shop:"outdoor"},addTags:{brand:"Millets","brand:wikidata":"Q64822903",name:"Millets",shop:"outdoor"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/MountainWarehouse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6925414",shop:"outdoor"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},countryCodes:["gb","pl"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"temaki-compass",imageURL:"https://graph.facebook.com/9062006483/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3414933",shop:"outdoor"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",official_name:"Recreational Equipment, Inc.",shop:"outdoor"},countryCodes:["id","us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Sportsman's Warehouse":{name:"Sportsman's Warehouse",icon:"temaki-compass",imageURL:"https://graph.facebook.com/sportsmanswh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579979",shop:"outdoor"},addTags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"temaki-compass",imageURL:"https://graph.facebook.com/trespass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17035733",shop:"outdoor"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},countryCodes:["fr","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/outpost/Wildberries":{name:"Wildberries",icon:"maki-shop",imageURL:"https://graph.facebook.com/wildberries.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24933714",shop:"outpost"},addTags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/benjaminmoorepaints/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4889038",shop:"paint"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/Comex/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5151654",shop:"paint"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/JotunGroup/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1778870",shop:"paint"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},terms:[],matchScore:2,suggestion:true},"shop/paint/National Paints":{name:"National Paints",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/NationalPaints/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073521",shop:"paint"},addTags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"},countryCodes:["ae","qa"],terms:[],matchScore:2,suggestion:true},"shop/paint/Sherwin-Williams":{name:"Sherwin-Williams",icon:"fas-paint-roller",imageURL:"https://graph.facebook.com/SherwinWilliamsforYourHome/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48881",shop:"paint"},addTags:{brand:"Sherwin-Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin-Williams",shop:"paint"},terms:["sherwin williams paint store","sherwin williams paints"],matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"temaki-balloon",imageURL:"https://graph.facebook.com/PartyCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7140896",shop:"party"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pastry/Cookies by Design":{name:"Cookies by Design",icon:"maki-bakery",imageURL:"https://graph.facebook.com/CookiesbyDesignHQ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5167112",shop:"pastry"},addTags:{brand:"Cookies by Design","brand:wikidata":"Q5167112",craft:"bakery",name:"Cookies by Design",shop:"pastry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pastry/Smallcakes":{name:"Smallcakes",icon:"maki-bakery",imageURL:"https://graph.facebook.com/SmallcakesKC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62384749",shop:"pastry"},addTags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",imageURL:"https://graph.facebook.com/CashConvertersUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5048645",shop:"pawnbroker"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",imageURL:"https://graph.facebook.com/cebuanalhuillierpawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17064661",shop:"pawnbroker"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker",short_name:"Cebuana"},countryCodes:["ph"],terms:["agencia cebuana","m lhuillier"],matchScore:2,suggestion:true},"shop/pawnbroker/Palawan Pawnshop":{name:"Palawan Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/palawan.pawnshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391488",shop:"pawnbroker"},addTags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/pawnbroker/Villarica Pawnshop":{name:"Villarica Pawnshop",icon:"maki-shop",imageURL:"https://graph.facebook.com/155765647803482/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391438",shop:"pawnbroker"},addTags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",imageURL:"https://graph.facebook.com/DouglasDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2052213",shop:"perfumery"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},countryCodes:["at","ch","de","es","it","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/FAnn":{name:"FAnn",icon:"maki-shop",imageURL:"https://graph.facebook.com/FAnn.cz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62391353",shop:"perfumery"},addTags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",imageURL:"https://graph.facebook.com/iciparisxlbe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q769749",shop:"perfumery"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},countryCodes:["be","lu","nl"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",imageURL:"https://graph.facebook.com/Marionnaud.France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1129073",shop:"perfumery"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"},countryCodes:["at","ch","es","fr","it","sk"],terms:[],matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",imageURL:"https://graph.facebook.com/oboticario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7073219",shop:"perfumery"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/futterhaus.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1167914",shop:"pet"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/pet/Faunatar":{name:"Faunatar",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Faunatar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11859415",shop:"pet"},addTags:{brand:"Faunatar","brand:wikidata":"Q11859415","brand:wikipedia":"fi:Faunatar",name:"Faunatar",shop:"pet"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},countryCodes:["at","ch","de","hu","lu"],terms:[],matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",imageURL:"https://pbs.twimg.com/profile_images/879147372143661056/QsqRYNnI_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q57985699",shop:"pet"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Fressnapf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q875796",shop:"pet"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},countryCodes:["be","ch","dk","fr","ie","it","pl"],terms:[],matchScore:2,suggestion:true},"shop/pet/Mud Bay":{name:"Mud Bay",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/mudbay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30324179",shop:"pet"},addTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Musti ja Mirri":{name:"Musti ja Mirri",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/mustijamirri/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11883558",shop:"pet"},addTags:{brand:"Musti ja Mirri","brand:wikidata":"Q11883558","brand:wikipedia":"fi:Musti ja Mirri",name:"Musti ja Mirri",shop:"pet"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Food Express":{name:"Pet Food Express",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petfoodexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171541",shop:"pet"},addTags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supermarket":{name:"Pet Supermarket",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSupermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61968363",shop:"pet"},addTags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsuppliesplus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171563",shop:"pet"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetValuUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58009635",shop:"pet"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetSmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3307147",shop:"pet"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7171798",shop:"pet"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland":{name:"Petland",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/PetlandUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17111474",shop:"pet"},addTags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Petland Discounts":{name:"Petland Discounts",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petlanddiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7178463",shop:"pet"},addTags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/petsathomeUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7179258",shop:"pet"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/pet/Unleashed":{name:"Unleashed",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/Petco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62122874",shop:"pet"},addTags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Wild Birds Unlimited":{name:"Wild Birds Unlimited",icon:"maki-dog-park",imageURL:"https://pbs.twimg.com/profile_images/466209950788636672/DHjpTthh_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q8000542",shop:"pet"},addTags:{brand:"Wild Birds Unlimited","brand:wikidata":"Q8000542","brand:wikipedia":"en:Wild Birds Unlimited",name:"Wild Birds Unlimited",shop:"pet"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/pet/Бетховен":{name:"Бетховен",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/zoobethowenclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390798",shop:"pet"},addTags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/pet/Четыре лапы":{name:"Четыре лапы",icon:"maki-dog-park",imageURL:"https://graph.facebook.com/4laps/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390783",shop:"pet"},addTags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"fas-camera-retro",imageURL:"https://graph.facebook.com/kodakexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6425126",shop:"photo"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},terms:["kodak"],matchScore:2,suggestion:true},"shop/printer_ink/Cartridge World":{name:"Cartridge World",icon:"maki-shop",imageURL:"https://graph.facebook.com/CartridgeWorldNewsUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5047439",shop:"printer_ink"},addTags:{brand:"Cartridge World","brand:wikidata":"Q5047439",name:"Cartridge World",shop:"printer_ink"},terms:[],matchScore:2,suggestion:true},"shop/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",imageURL:"https://graph.facebook.com/savers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7428188",shop:"second_hand"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ABCマート":{name:"ABCマート",icon:"maki-shoe",imageURL:"https://graph.facebook.com/172547912801644/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11188787",shop:"shoes"},addTags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ALDO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2832297",shop:"shoes"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Allen Edmonds":{name:"Allen Edmonds",icon:"maki-shoe",imageURL:"https://graph.facebook.com/allenedmonds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4731627",shop:"shoes"},addTags:{brand:"Allen Edmonds","brand:wikidata":"Q4731627","brand:wikipedia":"en:Allen Edmonds",name:"Allen Edmonds",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",imageURL:"https://graph.facebook.com/AndreChaussures/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2847114",shop:"shoes"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Bata/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q688082",shop:"shoes"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/besson.chaussures/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2899930",shop:"shoes"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",imageURL:"https://graph.facebook.com/birkenstock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q648458",shop:"shoes"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",imageURL:"https://graph.facebook.com/brantano.belgie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4957616",shop:"shoes"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},countryCodes:["be","gb","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Browns":{name:"Browns",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Brownsshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16954153",shop:"shoes"},addTags:{brand:"Browns","brand:wikidata":"Q16954153","brand:wikipedia":"en:Browns Shoes",name:"Browns",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",imageURL:"https://graph.facebook.com/CCC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11788344",shop:"shoes"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Call It Spring":{name:"Call It Spring",icon:"maki-shoe",imageURL:"https://graph.facebook.com/CallItSpring/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7580363",shop:"shoes"},addTags:{brand:"Call It Spring","brand:wikidata":"Q7580363","brand:wikipedia":"en:Call It Spring",name:"Call It Spring",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Camper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1030922",shop:"shoes"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Chaussea":{name:"Chaussea",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chaussea.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62082044",shop:"shoes"},addTags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"},countryCodes:["be","es","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ClarksShoesUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1095857",shop:"shoes"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Cole Haan":{name:"Cole Haan",icon:"maki-shoe",imageURL:"https://graph.facebook.com/colehaan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4356504",shop:"shoes"},addTags:{brand:"Cole Haan","brand:wikidata":"Q4356504","brand:wikipedia":"en:Cole Haan",name:"Cole Haan",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",imageURL:"https://graph.facebook.com/converse/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q319515",shop:"shoes"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Crocs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q926699",shop:"shoes"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",imageURL:"https://graph.facebook.com/designerbrands/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5206207",shop:"shoes"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"},countryCodes:["ca","us"],terms:["designer shoe warehouse","dsw shoes"],matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Deichmann/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q664543",shop:"shoes"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",imageURL:"https://graph.facebook.com/dinsko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10472869",shop:"shoes"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Dosenbach.CH/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2677329",shop:"shoes"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Dune London":{name:"Dune London",icon:"maki-shoe",imageURL:"https://graph.facebook.com/DuneLondon/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65557112",shop:"shoes"},addTags:{brand:"Dune London","brand:wikidata":"Q65557112",name:"Dune London",shop:"shoes",short_name:"Dune"},countryCodes:["ch","de","fr","gb","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Ecco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1280255",shop:"shoes"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/FLO":{name:"FLO",icon:"maki-shoe",imageURL:"https://graph.facebook.com/FLOShoesGlobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994802",shop:"shoes"},addTags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"},countryCodes:["al","tr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",imageURL:"https://graph.facebook.com/famousfootwear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433457",shop:"shoes"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/G.H. Bass & Co.":{name:"G.H. Bass & Co.",icon:"maki-shoe",imageURL:"https://graph.facebook.com/G.H.Bass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16993893",shop:"shoes"},addTags:{brand:"G.H. Bass & Co.","brand:wikidata":"Q16993893","brand:wikipedia":"en:G.H. Bass & Co.",name:"G.H. Bass & Co.",shop:"shoes"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Gabor":{name:"Gabor",icon:"maki-shoe",imageURL:"https://graph.facebook.com/gaborshoesag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1488760",shop:"shoes"},addTags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",imageURL:"https://graph.facebook.com/GEOX/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q588001",shop:"shoes"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Görtz":{name:"Görtz",icon:"maki-shoe",imageURL:"https://graph.facebook.com/goertz/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1559593",shop:"shoes"},addTags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Humanic/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1636668",shop:"shoes"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},countryCodes:["at","cz","de","hu","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Hush Puppies":{name:"Hush Puppies",icon:"maki-shoe",imageURL:"https://graph.facebook.com/hushpuppiesglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1828588",shop:"shoes"},addTags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Johnston & Murphy":{name:"Johnston & Murphy",icon:"maki-shoe",imageURL:"https://graph.facebook.com/johnstonmurphy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6268615",shop:"shoes"},addTags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Jones Bootmaker":{name:"Jones Bootmaker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/JonesBootmaker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6275139",shop:"shoes"},addTags:{brand:"Jones Bootmaker","brand:wikidata":"Q6275139",name:"Jones Bootmaker",shop:"shoes",short_name:"Jones"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Journeys":{name:"Journeys",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Journeys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994838",shop:"shoes"},addTags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Kari":{name:"Kari",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shopkari/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q47155680",shop:"shoes"},addTags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Kids Foot Locker":{name:"Kids Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Kids Foot Locker",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/La Halle aux Chaussures":{name:"La Halle aux Chaussures",icon:"maki-shoe",imageURL:"https://graph.facebook.com/lahalle.com/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390731",shop:"shoes"},addTags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Lady Foot Locker":{name:"Lady Foot Locker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/footlocker/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63335",shop:"shoes"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Lady Foot Locker",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",imageURL:"https://graph.facebook.com/mephisto.usa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q822975",shop:"shoes"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Merrell":{name:"Merrell",icon:"maki-shoe",imageURL:"https://graph.facebook.com/merrell/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1921997",shop:"shoes"},addTags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Minelli":{name:"Minelli",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Minelli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994831",shop:"shoes"},addTags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Naturalizer":{name:"Naturalizer",icon:"maki-shoe",imageURL:"https://graph.facebook.com/naturalizer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65012038",shop:"shoes"},addTags:{brand:"Naturalizer","brand:wikidata":"Q65012038",name:"Naturalizer",shop:"shoes"},countryCodes:["ca","cn","gu","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",imageURL:"https://graph.facebook.com/newbalanceusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q742988",shop:"shoes"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Office":{name:"Office",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Officeshoes1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079121",shop:"shoes"},addTags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"},countryCodes:["de","gb","ie","ro"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",imageURL:"https://graph.facebook.com/payless/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7156755",shop:"shoes"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},terms:["payless"],matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/quick.schuh/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2123069",shop:"shoes"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",imageURL:"https://graph.facebook.com/myrackroomshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17109937",shop:"shoes"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Red Wing":{name:"Red Wing",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RedWingShoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q934096",shop:"shoes"},addTags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"},countryCodes:["de","gb","nl","us"],terms:["red wing shoes"],matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",imageURL:"https://graph.facebook.com/RENO/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2144204",shop:"shoes"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},countryCodes:["at","ch","de","hu","sk"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",imageURL:"https://graph.facebook.com/riekerofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2152193",shop:"shoes"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Rockport":{name:"Rockport",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Rockport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4048384",shop:"shoes"},addTags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SalamanderCzech/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q878354",shop:"shoes"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/San Marina":{name:"San Marina",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sanmarina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3471558",shop:"shoes"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ScapinoNL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2298792",shop:"shoes"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",imageURL:"https://graph.facebook.com/schuhshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7432952",shop:"shoes"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},countryCodes:["de","gb","gg","ie"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",imageURL:"https://graph.facebook.com/ShoeCarnival/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500007",shop:"shoes"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",imageURL:"https://graph.facebook.com/shoezone/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7500016",shop:"shoes"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Schuhcenter.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2800720",shop:"shoes"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SKECHERS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2945643",shop:"shoes"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},terms:["sketchers"],matchScore:2,suggestion:true},"shop/shoes/Soft Moc":{name:"Soft Moc",icon:"maki-shoe",imageURL:"https://graph.facebook.com/softmocshoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65012391",shop:"shoes"},addTags:{brand:"Soft Moc","brand:wikidata":"Q65012391",name:"Soft Moc",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Sperry":{name:"Sperry",icon:"maki-shoe",imageURL:"https://graph.facebook.com/sperry/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7576421",shop:"shoes"},addTags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"},countryCodes:["us"],terms:["sperry top sider"],matchScore:2,suggestion:true},"shop/shoes/Steve Madden":{name:"Steve Madden",icon:"maki-shoe",imageURL:"https://graph.facebook.com/SteveMaddenShoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25352034",shop:"shoes"},addTags:{brand:"Steve Madden","brand:wikidata":"Q25352034","brand:wikipedia":"en:Steve Madden (company)",name:"Steve Madden",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Stride Rite":{name:"Stride Rite",icon:"maki-shoe",imageURL:"https://graph.facebook.com/striderite/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2356171",shop:"shoes"},addTags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Tamaris":{name:"Tamaris",icon:"maki-shoe",imageURL:"https://graph.facebook.com/tamarisinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994827",shop:"shoes"},addTags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",shop:"shoes"},countryCodes:["at","be","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/The Shoe Company":{name:"The Shoe Company",icon:"maki-shoe",imageURL:"https://graph.facebook.com/theshoeco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7763892",shop:"shoes"},addTags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/UGG":{name:"UGG",icon:"maki-shoe",imageURL:"https://graph.facebook.com/UGG/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1138480",shop:"shoes"},addTags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",imageURL:"https://graph.facebook.com/VANS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1135366",shop:"shoes"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Walking on a Cloud":{name:"Walking on a Cloud",icon:"maki-shoe",imageURL:"https://graph.facebook.com/walkingonacloud/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q65012662",shop:"shoes"},addTags:{brand:"Walking on a Cloud","brand:wikidata":"Q65012662",name:"Walking on a Cloud",shop:"shoes"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/shoes/vanHaren":{name:"vanHaren",icon:"maki-shoe",imageURL:"https://graph.facebook.com/vanharenschoenen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390668",shop:"shoes"},addTags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Éram":{name:"Éram",icon:"maki-shoe",imageURL:"https://graph.facebook.com/eram.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16684192",shop:"shoes"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",imageURL:"https://graph.facebook.com/Centrobuv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4504072",shop:"shoes"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},countryCodes:["by","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/shoes/Юничел":{name:"Юничел",icon:"maki-shoe",imageURL:"https://graph.facebook.com/unichel.shoes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390569",shop:"shoes"},addTags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"},countryCodes:["kz","ru"],terms:[],matchScore:2,suggestion:true},"shop/shoes/つるや":{name:"つるや",icon:"maki-shoe",imageURL:"https://graph.facebook.com/tsuruya.jp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11272578",shop:"shoes"},addTags:{brand:"つるや","brand:en":"Tsuruya","brand:ja":"つるや","brand:wikidata":"Q11272578","brand:wikipedia":"ja:つるや (靴屋)",name:"つるや","name:en":"Tsuruya","name:ja":"つるや",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",imageURL:"https://graph.facebook.com/chiyodafanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11318515",shop:"shoes"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/sports/Academy Sports + Outdoors":{name:"Academy Sports + Outdoors",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Academy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4671380",shop:"sports"},addTags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"},countryCodes:["us"],terms:["academy","academy sports and outdoors"],matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"fas-futbol",imageURL:"https://graph.facebook.com/adidasUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3895",shop:"sports"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/aktiesport/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57546889",shop:"sports"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/American Golf":{name:"American Golf",icon:"fas-futbol",imageURL:"https://graph.facebook.com/americangolf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62657494",shop:"sports"},addTags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/Big5SportingGoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4904902",shop:"sports"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["big 5"],matchScore:2,suggestion:true},"shop/sports/Centauro":{name:"Centauro",icon:"fas-futbol",imageURL:"https://graph.facebook.com/centauroesporte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28679561",shop:"sports"},addTags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"fas-futbol",imageURL:"https://graph.facebook.com/DecathlonUSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q509349",shop:"sports"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/dickssportinggoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5272601",shop:"sports"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["dicks"],matchScore:2,suggestion:true},"shop/sports/Finish Line":{name:"Finish Line",icon:"fas-futbol",imageURL:"https://graph.facebook.com/finishline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5450341",shop:"sports"},addTags:{brand:"Finish Line","brand:wikidata":"Q5450341","brand:wikipedia":"en:Finish Line, Inc.",name:"Finish Line",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"fas-futbol",imageURL:"https://graph.facebook.com/hervissports.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1614816",shop:"sports"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},countryCodes:["at","cz","de","hr","hu","ro","si"],terms:["hervis sport","hervis sports"],matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/HibbettSports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5750671",shop:"sports"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/intersportAT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q666888",shop:"sports"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/JDSportsOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6108019",shop:"sports"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},countryCodes:["de","es","fr","gb","ie","nl"],terms:["JD"],matchScore:2,suggestion:true},"shop/sports/Marathon Sports":{name:"Marathon Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/marathonsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3027516",shop:"sports"},addTags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"},countryCodes:["bo","ec","pe"],terms:[],matchScore:2,suggestion:true},"shop/sports/Martes Sport":{name:"Martes Sport",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sklepmartes/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073490",shop:"sports"},addTags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Modell's Sporting Goods":{name:"Modell's Sporting Goods",icon:"fas-futbol",imageURL:"https://graph.facebook.com/modells/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3317844",shop:"sports"},addTags:{brand:"Modell's Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell's Sporting Goods",shop:"sports"},countryCodes:["us"],terms:["modells"],matchScore:2,suggestion:true},"shop/sports/Peloton":{name:"Peloton",icon:"fas-futbol",imageURL:"https://graph.facebook.com/onepeloton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56276186",shop:"sports"},addTags:{brand:"Peloton","brand:wikidata":"Q56276186","brand:wikipedia":"en:Peloton (company)",name:"Peloton",shop:"sports"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"fas-futbol",imageURL:"https://graph.facebook.com/playitagainsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203029",shop:"sports"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/sports/Rebel":{name:"Rebel",icon:"fas-futbol",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRebel%20sport%20logo%202012.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q18636397",shop:"sports"},addTags:{brand:"Rebel","brand:wikidata":"Q18636397","brand:wikipedia":"en:Rebel (company)",name:"Rebel",shop:"sports"},countryCodes:["au","nz"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SPORT2000France/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q262394",shop:"sports"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},countryCodes:["at","de","fr","nl"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sport Chek":{name:"Sport Chek",icon:"fas-futbol",imageURL:"https://pbs.twimg.com/profile_images/1072276948317986817/J6YF-QLZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3494037",shop:"sports"},addTags:{brand:"Sport Chek","brand:wikidata":"Q3494037","brand:wikipedia":"en:Sport Chek",name:"Sport Chek",shop:"sports"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sporting Life":{name:"Sporting Life",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SportingLifeCan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7579583",shop:"sports"},addTags:{brand:"Sporting Life","brand:wikidata":"Q7579583","brand:wikipedia":"en:Sporting Life (retailer)",name:"Sporting Life",shop:"sports"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"fas-futbol",imageURL:"https://graph.facebook.com/1463426373966592/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q54974273",shop:"sports"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"fas-futbol",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSports%20Authority%20logo2011.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7579688",shop:"sports"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},terms:[],matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"fas-futbol",imageURL:"https://graph.facebook.com/SportsDirect/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2913554",shop:"sports"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},terms:["SportsDirect.com"],matchScore:2,suggestion:true},"shop/sports/Stadium":{name:"Stadium",icon:"fas-futbol",imageURL:"https://graph.facebook.com/stadium.finland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4993863",shop:"sports"},addTags:{brand:"Stadium","brand:wikidata":"Q4993863","brand:wikipedia":"sv:Stadium (detaljhandelskedja)",name:"Stadium",shop:"sports"},countryCodes:["de","dk","fi","se"],terms:[],matchScore:2,suggestion:true},"shop/sports/XXL":{name:"XXL",icon:"fas-futbol",imageURL:"https://graph.facebook.com/xxlnorge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12010840",shop:"sports"},addTags:{brand:"XXL","brand:wikidata":"Q12010840","brand:wikipedia":"no:XXL",name:"XXL",shop:"sports"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/sports/Спортмастер":{name:"Спортмастер",icon:"fas-futbol",imageURL:"https://graph.facebook.com/sportmaster.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4438176",shop:"sports"},addTags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"},countryCodes:["by","kz","ru","ua"],terms:["спортмастер гипер"],matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/BureauVallee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18385014",shop:"stationery"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"fas-paperclip",geometry:["point","area"],tags:{"brand:wikidata":"Q1915329",shop:"stationery"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1337797",shop:"stationery"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/OfficeDepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079111",shop:"stationery"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},countryCodes:["mx","nz","us"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/officeworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7079486",shop:"stationery"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/pagro.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57550022",shop:"stationery"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paper Source":{name:"Paper Source",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/PaperSource/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25000269",shop:"stationery"},addTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/paperchase/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7132739",shop:"stationery"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/ryman/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7385188",shop:"stationery"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/staples/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q785943",shop:"stationery"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},terms:[],matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"fas-paperclip",imageURL:"https://graph.facebook.com/komusclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4230314",shop:"stationery"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/extraspace/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422162",shop:"storage_rental"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",imageURL:"https://graph.facebook.com/PublicStorage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1156045",shop:"storage_rental"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/8 à Huit":{name:"8 à Huit",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fashion8a8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2818601",shop:"supermarket"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/99 Ranch Market":{name:"99 Ranch Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/99RanchMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4646307",shop:"supermarket"},addTags:{brand:"99 Ranch Market","brand:wikidata":"Q4646307","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"},countryCodes:["us"],terms:["99 ranch","ranch 99"],matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",imageURL:"https://graph.facebook.com/www.aeo.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3600279",shop:"supermarket"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",imageURL:"https://graph.facebook.com/a101iletisim/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6034496",shop:"supermarket"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/AD Delhaize":{name:"AD Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mein.adeg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q290211",shop:"supermarket"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Acme":{name:"Acme",icon:"maki-grocery",imageURL:"https://graph.facebook.com/acmemarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q341975",shop:"supermarket"},addTags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ahorramas/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58221883",shop:"supermarket"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",imageURL:"https://graph.facebook.com/albertceskarepublika/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9144241",shop:"supermarket"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},countryCodes:["cz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",imageURL:"https://graph.facebook.com/albertheijn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1653985",shop:"supermarket"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Albertsons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4712282",shop:"supermarket"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},countryCodes:["us"],terms:["albertsons supermarket"],matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ALDI.USA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q125054",shop:"supermarket"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",imageURL:"https://graph.facebook.com/154533341244676/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41171373",shop:"supermarket"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ALDI.SUED/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41171672",shop:"supermarket"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alfamart":{name:"Alfamart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/alfamartku/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23745600",shop:"supermarket"},addTags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/alimerka.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16482738",shop:"supermarket"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Alnatura/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q876811",shop:"supermarket"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"},countryCodes:["ch","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Amigo":{name:"Amigo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/amigopuertorico/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4746234",shop:"supermarket"},addTags:{alt_name:"Supermercados Amigo",brand:"Amigo","brand:wikidata":"Q4746234","brand:wikipedia":"en:Amigo Supermarkets",name:"Amigo",shop:"supermarket"},countryCodes:["us"],terms:["amigo puerto rico","amigo supermarket","supermercado amigo"],matchScore:2,suggestion:true},"shop/supermarket/Asda":{name:"Asda",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Asda/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q297410",shop:"supermarket"},addTags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Atacadaosa.Oficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2868739",shop:"supermarket"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/BI-LO":{name:"BI-LO",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BILOSuperSaver/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835620",shop:"supermarket"},addTags:{brand:"BI-LO","brand:wikidata":"Q4835620","brand:wikipedia":"en:BI-LO (United States)",name:"BI-LO",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/BM":{name:"BM",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BMSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073462",shop:"supermarket"},addTags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BiedronkaCodziennie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q857182",shop:"supermarket"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big Bazaar":{name:"Big Bazaar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BigBazaar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3631008",shop:"supermarket"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BigCBigService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q858665",shop:"supermarket"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},countryCodes:["th","vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BILLA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q537781",shop:"supermarket"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bim":{name:"Bim",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bimturkiye/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1022075",shop:"supermarket"},addTags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"},countryCodes:["ma","tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bingotuzla/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16842066",shop:"supermarket"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},countryCodes:["ba"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bio Company":{name:"Bio Company",icon:"maki-grocery",imageURL:"https://graph.facebook.com/biocompany.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864179",shop:"supermarket"},addTags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Biocoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2904039",shop:"supermarket"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bodega Aurrera":{name:"Bodega Aurrera",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BodegaAurrera/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3365858",shop:"supermarket"},addTags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bravo":{name:"Bravo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bravo.supermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16985159",shop:"supermarket"},addTags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BrookshireBros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975084",shop:"supermarket"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Brookshires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4975085",shop:"supermarket"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DiscoverBudgens/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4985016",shop:"supermarket"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BulkBarnFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4996466",shop:"supermarket"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",imageURL:"https://graph.facebook.com/bunnpris.no/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1774634",shop:"supermarket"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/C-Town Supermarkets":{name:"C-Town Supermarkets",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ctown.supermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5005929",shop:"supermarket"},addTags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/CBA":{name:"CBA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/cbaboltok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q779845",shop:"supermarket"},addTags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",imageURL:"https://graph.facebook.com/COOPJednota/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q41629254",shop:"supermarket"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},countryCodes:["cz","sk"],terms:["jednota"],matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Caprabo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1980781",shop:"supermarket"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},countryCodes:["ad","es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cardenas":{name:"Cardenas",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CardenasMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64149543",shop:"supermarket"},addTags:{brand:"Cardenas","brand:wikidata":"Q64149543","brand:wikipedia":"en:Cardenas (supermarket)",cuisine:"latin_american",name:"Cardenas",shop:"supermarket"},countryCodes:["us"],terms:["mi pueblo","mi pueblo food center"],matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City (Sri Lanka)":{name:"Cargills Food City (Sri Lanka)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/cargillsfoodcity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58353955",shop:"supermarket"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City",shop:"supermarket"},countryCodes:["lk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CarrefourCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940187",shop:"supermarket"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",shop:"supermarket"},countryCodes:["be","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vieuxberquin59232/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2940188",shop:"supermarket"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefourmarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2689639",shop:"supermarket"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermercadosCarulla/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5047480",shop:"supermarket"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Centre Commercial E. Leclerc":{name:"Centre Commercial E. Leclerc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"},countryCodes:["fr","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chata Polska":{name:"Chata Polska",icon:"maki-grocery",imageURL:"https://graph.facebook.com/chatapolskasklepy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994406",shop:"supermarket"},addTags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/checkerssa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5089126",shop:"supermarket"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},countryCodes:["bw","na","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CHEDRAUIOFICIAL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2961952",shop:"supermarket"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CityMarketGrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5123299",shop:"supermarket"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/CoopCRS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5440676",shop:"supermarket"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coles":{name:"Coles",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coles/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1108172",shop:"supermarket"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},countryCodes:["au","gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Colruyt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2363991",shop:"supermarket"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},countryCodes:["be","fr","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Combi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1113618",shop:"supermarket"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",imageURL:"https://graph.facebook.com/209308192464395/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2985173",shop:"supermarket"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"es:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Conad/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q639075",shop:"supermarket"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},countryCodes:["al","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ConadCityQualiano/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57543102",shop:"supermarket"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Condislife/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57417581",shop:"supermarket"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermercadosconsum/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8350308",shop:"supermarket"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",imageURL:"https://graph.facebook.com/continenteoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2995683",shop:"supermarket"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coopprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5167705",shop:"supermarket"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coop (Schweiz)":{name:"Coop (Schweiz)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coop.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q432564",shop:"supermarket"},addTags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coraBelgium/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q686643",shop:"supermarket"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},countryCodes:["be","fr","lu","ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/costcutter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175072",shop:"supermarket"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coto/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5175411",shop:"supermarket"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",imageURL:"https://graph.facebook.com/countdown/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5176845",shop:"supermarket"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Cub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5191916",shop:"supermarket"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D'Agostino":{name:"D'Agostino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yourdagnyc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20656844",shop:"supermarket"},addTags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",imageURL:"https://graph.facebook.com/427264640797493/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q43403418",shop:"supermarket"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DagliBrugsen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12307017",shop:"supermarket"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DEENSupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13571727",shop:"supermarket"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1184173",shop:"supermarket"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delikatesypl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11693824",shop:"supermarket"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",imageURL:"https://graph.facebook.com/denner.ch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q379911",shop:"supermarket"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despar":{name:"Despar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Despensa Familiar":{name:"Despensa Familiar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DespensaFamiliarGuatemala/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994849",shop:"supermarket"},addTags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"},countryCodes:["gt","hn","sv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"},terms:["supermercado dia"],matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/marketdinobieniewice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11694239",shop:"supermarket"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Dirksupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17502722",shop:"supermarket"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Argentina)":{name:"Disco (Argentina)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DiscoArgentina/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135978",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Disco (Uruguay)":{name:"Disco (Uruguay)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/discouruguay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16636819",shop:"supermarket"},addTags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Diska":{name:"Diska",icon:"maki-grocery",imageURL:"https://graph.facebook.com/diskamarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62390177",shop:"supermarket"},addTags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DunnesStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1266203",shop:"supermarket"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E-Center":{name:"E-Center",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},countryCodes:["es","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",imageURL:"https://graph.facebook.com/E.Leclerc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1273376",shop:"supermarket"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEmte%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3119122",shop:"supermarket"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},countryCodes:["de"],terms:["edeka neukauf"],matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q9251859",shop:"supermarket"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekom":{name:"Ekom",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1013432382051351/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073442",shop:"supermarket"},addTags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Ekono.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2842729",shop:"supermarket"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Eroski/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1361349",shop:"supermarket"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},countryCodes:["es","gi"],terms:["charter","eroski center"],matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Esselunga/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1059636",shop:"supermarket"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EurospinItaliaSpa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1374674",shop:"supermarket"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"},countryCodes:["it","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EurosparIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12309283",shop:"supermarket"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",imageURL:"https://graph.facebook.com/extramorkved/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11964085",shop:"supermarket"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},terms:["coop extra"],matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1674632829509874/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1395108",shop:"supermarket"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},countryCodes:["de","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",imageURL:"https://graph.facebook.com/farewaystores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5434998",shop:"supermarket"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farm Boy":{name:"Farm Boy",icon:"maki-grocery",imageURL:"https://graph.facebook.com/farmboy.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435469",shop:"supermarket"},addTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/147382588630890/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5435841",shop:"supermarket"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},countryCodes:["gb","sk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FenebergLebensmittel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5345378",shop:"supermarket"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",imageURL:"https://graph.facebook.com/myfood4less/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465282",shop:"supermarket"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodbasics.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465300",shop:"supermarket"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food City (USA)":{name:"Food City (USA)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodCity/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16981107",shop:"supermarket"},addTags:{brand:"Food City","brand:wikidata":"Q16981107","brand:wikipedia":"en:Food City (K-VA-T)",name:"Food City",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodlion/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1435950",shop:"supermarket"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},countryCodes:["es","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodLand (USA)":{name:"FoodLand (USA)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465271",shop:"supermarket"},addTags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/FoodMaxx":{name:"FoodMaxx",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Foodmaxx/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61894844",shop:"supermarket"},addTags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Australia)":{name:"Foodland (Australia)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodlandSupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465555",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Canada)":{name:"Foodland (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/dansFoodland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465554",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodland (Hawaii)":{name:"Foodland (Hawaii)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FoodlandHawaii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465560",shop:"supermarket"},addTags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foodworksaus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5465579",shop:"supermarket"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fortinos":{name:"Fortinos",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fortinosgrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5472662",shop:"supermarket"},addTags:{brand:"Fortinos","brand:wikidata":"Q5472662","brand:wikipedia":"en:Fortinos",name:"Fortinos",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fredmeyer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5495932",shop:"supermarket"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fresh":{name:"Fresh",icon:"maki-grocery",imageURL:"https://graph.facebook.com/freshobchod/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q50737403",shop:"supermarket"},addTags:{brand:"Fresh","brand:wikidata":"Q50737403","brand:wikipedia":"sk:Fresh",name:"Fresh",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Fresh Thyme":{name:"Fresh Thyme",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FreshThymeFarmersMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q64132791",shop:"supermarket"},addTags:{brand:"Fresh Thyme","brand:wikidata":"Q64132791",name:"Fresh Thyme",shop:"supermarket"},countryCodes:["us"],terms:["fresh thyme farmers market"],matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/FreshCo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5502915",shop:"supermarket"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",imageURL:"https://graph.facebook.com/158051157541336/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17070775",shop:"supermarket"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",imageURL:"https://graph.facebook.com/foetexdk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1480395",shop:"supermarket"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermarchesg20/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3504731",shop:"supermarket"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/GBarbosa":{name:"GBarbosa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/oficialgbarbosa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10287817",shop:"supermarket"},addTags:{brand:"GBarbosa","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gadis":{name:"Gadis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Gadis.supermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12389151",shop:"supermarket"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gianteagleinc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1522721",shop:"supermarket"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant (Carlisle)":{name:"Giant (Carlisle)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/giantfoodstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558332",shop:"supermarket"},addTags:{brand:"Giant","brand:wikidata":"Q5558332","brand:wikipedia":"en:Giant Food Stores",name:"Giant",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Giant (Landover)":{name:"Giant (Landover)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GiantFood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5558336",shop:"supermarket"},addTags:{brand:"Giant","brand:wikidata":"Q5558336","brand:wikipedia":"en:Giant Food (Landover)",name:"Giant",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Globus.de/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q457503",shop:"supermarket"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Gordon Food Service":{name:"Gordon Food Service",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GordonFoodService/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1538006",shop:"supermarket"},addTags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GrandFrais/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3114675",shop:"supermarket"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",imageURL:"https://graph.facebook.com/GroceryOutletInc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5609934",shop:"supermarket"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",official_name:"Grocery Outlet Bargain Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Groszek":{name:"Groszek",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Sklepy.Groszek/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9280965",shop:"supermarket"},addTags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",imageURL:"https://graph.facebook.com/geantcasino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1380537",shop:"supermarket"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},countryCodes:["cg","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H Mart":{name:"H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/H-E-B":{name:"H-E-B",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HEB/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830621",shop:"supermarket"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",imageURL:"https://graph.facebook.com/151789788189446/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1548713",shop:"supermarket"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/HalpaHalli":{name:"HalpaHalli",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HalpaHalli/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11861256",shop:"supermarket"},addTags:{brand:"HalpaHalli","brand:wikidata":"Q11861256","brand:wikipedia":"fi:HalpaHalli",name:"HalpaHalli",shop:"supermarket"},countryCodes:["ee","fi","ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hannaford/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5648760",shop:"supermarket"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/harristeeter/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5665067",shop:"supermarket"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hemkop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10521746",shop:"supermarket"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/heronfoodslimited/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5743472",shop:"supermarket"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HOFER.AT/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15815751",shop:"supermarket"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},countryCodes:["at","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Hoogvliet.supermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2770647",shop:"supermarket"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",imageURL:"https://graph.facebook.com/HyVee/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1639719",shop:"supermarket"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},countryCodes:["no","se"],terms:["ica supermarket"],matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ICA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1663776",shop:"supermarket"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},countryCodes:["no","se"],terms:["maxi"],matchScore:2,suggestion:true},"shop/supermarket/IDEA":{name:"IDEA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IDEASrbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q23461622",shop:"supermarket"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IGACorp/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3146662",shop:"supermarket"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},countryCodes:["au","ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",imageURL:"https://graph.facebook.com/inglesmarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6032595",shop:"supermarket"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tousuniscontrelaviechere/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3153200",shop:"supermarket"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},countryCodes:["be","fr","pl","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Interspar":{name:"Interspar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/INTERSPAR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15820339",shop:"supermarket"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/IrmaDanmark/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q797150",shop:"supermarket"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jan Linders":{name:"Jan Linders",icon:"maki-grocery",imageURL:"https://graph.facebook.com/JanLindersSupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2200982",shop:"supermarket"},addTags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",imageURL:"https://graph.facebook.com/JewelOsco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3178470",shop:"supermarket"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/jumbosupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2262314",shop:"supermarket"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/K+K":{name:"K+K",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KlaasundKock/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1718009",shop:"supermarket"},addTags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/K-Citymarket":{name:"K-Citymarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/citymarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11868561",shop:"supermarket"},addTags:{brand:"K-Citymarket","brand:wikidata":"Q11868561","brand:wikipedia":"fi:K-Citymarket",name:"K-Citymarket",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/K-Supermarket":{name:"K-Supermarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KSupermarketketju/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5408668",shop:"supermarket"},addTags:{brand:"K-Supermarket","brand:wikidata":"Q5408668","brand:wikipedia":"fi:K-Supermarket",name:"K-Supermarket",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",imageURL:"https://graph.facebook.com/132476996783723/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q685967",shop:"supermarket"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},countryCodes:["bg","cz","de","hr","pl","ro","sk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kingsoopers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6412065",shop:"supermarket"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kings":{name:"Kings",icon:"maki-grocery",imageURL:"https://graph.facebook.com/KingsFoodMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6412914",shop:"supermarket"},addTags:{brand:"Kings","brand:wikidata":"Q6412914","brand:wikipedia":"en:Kings Food Markets",name:"Kings",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kiwiminipris/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1613639",shop:"supermarket"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Konzum (Balkans)":{name:"Konzum (Balkans)",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKonzum%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q518563",shop:"supermarket"},addTags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"supermarket"},countryCodes:["ba","hr","rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",shop:"supermarket"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},terms:["krogers"],matchScore:2,suggestion:true},"shop/supermarket/Kroger Marketplace":{name:"Kroger Marketplace",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kroger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q153417",shop:"supermarket"},addTags:{brand:"Kroger Marketplace","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger Marketplace",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kvickly/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7061148",shop:"supermarket"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Anónima":{name:"La Anónima",icon:"maki-grocery",imageURL:"https://graph.facebook.com/laanonimaoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135985",shop:"supermarket"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Comer":{name:"La Comer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LaComerOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q26765126",shop:"supermarket"},addTags:{brand:"La Comer","brand:wikidata":"Q26765126","brand:wikipedia":"es:La Comer",name:"La Comer",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Michoacana Meat Market":{name:"La Michoacana Meat Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lamichoacanameatmarket.officialpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6463872",shop:"supermarket"},addTags:{brand:"La Michoacana Meat Market","brand:en":"La Michoacana Meat Market","brand:es":"La Michoacana","brand:wikidata":"Q6463872","brand:wikipedia":"en:La Michoacana Meat Market",cuisine:"latin_american",name:"La Michoacana Meat Market","name:en":"La Michoacana Meat Market","name:es":"La Michoacana",shop:"supermarket"},countryCodes:["us"],terms:["la michoacana"],matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LaPlazadeDIA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58904673",shop:"supermarket"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Lavieclaire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3213589",shop:"supermarket"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Landi":{name:"Landi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/landivechigen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1803010",shop:"supermarket"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",imageURL:"https://graph.facebook.com/leaderpriceofficiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2181426",shop:"supermarket"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lewiatan":{name:"Lewiatan",icon:"maki-grocery",imageURL:"https://graph.facebook.com/psh.lewiatan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11755396",shop:"supermarket"},addTags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidercl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidercl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6711261",shop:"supermarket"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lidl/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151954",shop:"supermarket"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lincolnshire Co-op":{name:"Lincolnshire Co-op",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lincolnshirecoop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6551231",shop:"supermarket"},addTags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Linella":{name:"Linella",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61085990",shop:"supermarket"},addTags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"},countryCodes:["md"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Loblaws":{name:"Loblaws",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LoblawsON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3257626",shop:"supermarket"},addTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"},countryCodes:["ca"],terms:["loblaws great food"],matchScore:2,suggestion:true},"shop/supermarket/Lotte Mart":{name:"Lotte Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"},countryCodes:["id","kr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LowesSupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6693107",shop:"supermarket"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LowesFoodsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6693991",shop:"supermarket"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Lucky":{name:"Lucky",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LuckySupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6698032",shop:"supermarket"},addTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},countryCodes:["us"],terms:["luckys"],matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",imageURL:"https://graph.facebook.com/LupaSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58044048",shop:"supermarket"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mdspa.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3841263",shop:"supermarket"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},countryCodes:["it"],terms:["md discount"],matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MPREIS.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q873491",shop:"supermarket"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},countryCodes:["at","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marc's":{name:"Marc's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MarcsStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17080259",shop:"supermarket"},addTags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57523365",shop:"supermarket"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/marketbasket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2079198",shop:"supermarket"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",imageURL:"https://graph.facebook.com/119240581466268/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1533254",shop:"supermarket"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",imageURL:"https://graph.facebook.com/martinssupermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6774803",shop:"supermarket"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermarchesMatch/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q513977",shop:"supermarket"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},countryCodes:["be","fr","hu","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/DIAEspana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q925132",shop:"supermarket"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},countryCodes:["bg","ee","lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MaximaLV/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1881222",shop:"supermarket"},addTags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"},countryCodes:["bg","ee","lt","lv","pl"],terms:["maxima"],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/maxi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3302441",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Maxi.Srbija/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6795490",shop:"supermarket"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"},countryCodes:["rs"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MegaImageRomania/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6808085",shop:"supermarket"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mego.lv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16363314",shop:"supermarket"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},countryCodes:["lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/meijer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1917753",shop:"supermarket"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",imageURL:"https://graph.facebook.com/meny/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10581720",shop:"supermarket"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mercadona/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q377705",shop:"supermarket"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mercator":{name:"Mercator",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q738412",shop:"supermarket"},addTags:{brand:"Mercator","brand:wikidata":"Q738412","brand:wikipedia":"en:Mercator (retail)",name:"Mercator",shop:"supermarket"},countryCodes:["ba","hz","me","rs","si"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",imageURL:"https://graph.facebook.com/merkurmarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1921857",shop:"supermarket"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Canada)":{name:"Metro (Canada)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/metro.ontario/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1145669",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Metro (Peru)":{name:"Metro (Peru)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/metroperu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16640217",shop:"supermarket"},addTags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",shop:"supermarket"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",imageURL:"https://graph.facebook.com/migros/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q680727",shop:"supermarket"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",imageURL:"https://graph.facebook.com/MilaDruciarniaSklep/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48844636",shop:"supermarket"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",imageURL:"https://graph.facebook.com/minipreco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3042224",shop:"supermarket"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mixmarkt.eu/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q327854",shop:"supermarket"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Monoprix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3321241",shop:"supermarket"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/More":{name:"More",icon:"maki-grocery",imageURL:"https://graph.facebook.com/morestore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6910891",shop:"supermarket"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Morrisons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q922344",shop:"supermarket"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nahundfrisch.at/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1963643",shop:"supermarket"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},countryCodes:["at","de"],terms:["nah und frisch"],matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nahkauf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57515238",shop:"supermarket"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Naturaliamagasinsbio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3337081",shop:"supermarket"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nettodk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q552652",shop:"supermarket"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nettomarkendiscount/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q879858",shop:"supermarket"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",imageURL:"https://graph.facebook.com/newworld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7012488",shop:"supermarket"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},countryCodes:["nz"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",imageURL:"https://graph.facebook.com/nofrillsCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3342407",shop:"supermarket"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Norfalt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1998983",shop:"supermarket"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},countryCodes:["lt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNorma%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q450180",shop:"supermarket"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},countryCodes:["at","cz","de","fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Northern Store":{name:"Northern Store",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7754361",shop:"supermarket"},addTags:{brand:"Northern Store","brand:wikidata":"Q7754361","brand:wikipedia":"en:The North West Company",name:"Northern Store",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",imageURL:"https://graph.facebook.com/okaycompact/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2159701",shop:"supermarket"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},countryCodes:["be"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupertiendaOlimpica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q24749847",shop:"supermarket"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PLUSsupermarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1978981",shop:"supermarket"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/polomarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11821937",shop:"supermarket"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PaliCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1064887",shop:"supermarket"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},countryCodes:["cr","ni"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pam":{name:"Pam",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pampanoramaufficiale/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3777398",shop:"supermarket"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},countryCodes:["ch","it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Patel Brothers":{name:"Patel Brothers",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pbrosfan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q55641396",shop:"supermarket"},addTags:{brand:"Patel Brothers","brand:wikidata":"Q55641396","brand:wikipedia":"en:Patel Brothers",cuisine:"indian",name:"Patel Brothers",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pavilions/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7155886",shop:"supermarket"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pennyoesterreich/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q284688",shop:"supermarket"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},countryCodes:["at","cz","de","hu","it","ro"],terms:["penny market","penny markt"],matchScore:2,suggestion:true},"shop/supermarket/Pick 'n Save":{name:"Pick 'n Save",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PickNSaveStores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7371288",shop:"supermarket"},addTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},countryCodes:["us","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Picknpay/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7190735",shop:"supermarket"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pigglywigglystores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3388303",shop:"supermarket"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},countryCodes:["gb","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pingodoce/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1575057",shop:"supermarket"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},countryCodes:["pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",imageURL:"https://graph.facebook.com/piotripawelstronaoficjalna/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2096356",shop:"supermarket"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PlazaVeaOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203672",shop:"supermarket"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PlodineHrvatska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58040098",shop:"supermarket"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",imageURL:"https://graph.facebook.com/poieszsupermarkten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2521700",shop:"supermarket"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mypricechopper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242572",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/PriceChopper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7242574",shop:"supermarket"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Prisma":{name:"Prisma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prisma.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12047031",shop:"supermarket"},addTags:{brand:"Prisma","brand:wikidata":"Q12047031","brand:wikipedia":"fi:Prisma (kauppaketju)",name:"Prisma",shop:"supermarket"},countryCodes:["ee","fi","ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Prix":{name:"Prix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prixqualitaitaliana/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61994819",shop:"supermarket"},addTags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"},countryCodes:["it"],terms:["prix quality"],matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Profi.ro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q956664",shop:"supermarket"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},countryCodes:["be","hu","ro"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ProvigoleMarcheTroisRivieres/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3408306",shop:"supermarket"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Delhaize/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q14903417",shop:"supermarket"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},countryCodes:["be","lu"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",imageURL:"https://graph.facebook.com/publix/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q672170",shop:"supermarket"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},countryCodes:["br","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pueblo":{name:"Pueblo",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermercadospueblo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7258464",shop:"supermarket"},addTags:{brand:"Pueblo","brand:wikidata":"Q7258464","brand:wikipedia":"en:Pueblo Supermarkets",name:"Pueblo",official_name:"Supermercados Pueblo","official_name:en":"Pueblo Supermarkets","official_name:es":"Supermercados Pueblo",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SDASUPERMERCATI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",imageURL:"https://graph.facebook.com/puregold.shopping/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7261170",shop:"supermarket"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},countryCodes:["ph"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/paodeacucar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3411543",shop:"supermarket"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},countryCodes:["br","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",imageURL:"https://graph.facebook.com/QFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7265425",shop:"supermarket"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Raley's":{name:"Raley's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/raleys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7286970",shop:"supermarket"},addTags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Ralphs/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3929820",shop:"supermarket"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",imageURL:"https://graph.facebook.com/real/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q698473",shop:"supermarket"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",imageURL:"https://graph.facebook.com/RealCanadianSuperstore/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7300856",shop:"supermarket"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Redner's":{name:"Redner's",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7306166",shop:"supermarket"},addTags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"},countryCodes:["us"],terms:["redners warehouse market"],matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",imageURL:"https://graph.facebook.com/RelianceFreshOfficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7311014",shop:"supermarket"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},countryCodes:["in"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",imageURL:"https://graph.facebook.com/REMA1000/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q28459",shop:"supermarket"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},countryCodes:["dk","no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Rewe/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16968817",shop:"supermarket"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRimi%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7334456",shop:"supermarket"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},countryCodes:["ee","lt","lv"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/S-market":{name:"S-market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/smarketkemio/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11891613",shop:"supermarket"},addTags:{brand:"S-market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-market",shop:"supermarket"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Safeway/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1508234",shop:"supermarket"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sainsburys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q152096",shop:"supermarket"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SantaIsabelChile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7419620",shop:"supermarket"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",imageURL:"https://graph.facebook.com/savealot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7427972",shop:"supermarket"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-On-Foods":{name:"Save-On-Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SaveOnFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7427974",shop:"supermarket"},addTags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Schnucks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7431920",shop:"supermarket"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Shaws/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q578387",shop:"supermarket"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ShopRite (USA)":{name:"ShopRite (USA)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/shoprite.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501097",shop:"supermarket"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Africa)":{name:"Shoprite (Africa)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ShopriteSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1857639",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"},countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Shoprite (Isle of Man)":{name:"Shoprite (Isle of Man)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7501242",shop:"supermarket"},addTags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"},countryCodes:["im"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/supermercatisigmaitalia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3977979",shop:"supermarket"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SDASUPERMERCATI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3484790",shop:"supermarket"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},terms:["simply"],matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop%20Deutschland%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1129779",shop:"supermarket"},addTags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"},countryCodes:["de","lv","nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSmithsFoodDrug-logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7544856",shop:"supermarket"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Sobeys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1143340",shop:"supermarket"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sorianacom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q735562",shop:"supermarket"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Spar":{name:"Spar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Społem":{name:"Społem",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SpolemSpoldzielczoscSpozywcow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11826043",shop:"supermarket"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SproutsFarmersMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7581369",shop:"supermarket"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",imageURL:"https://graph.facebook.com/StaterBrosMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7604016",shop:"supermarket"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sklepy.stokrotka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9345945",shop:"supermarket"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",imageURL:"https://graph.facebook.com/StopandShop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3658429",shop:"supermarket"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",imageURL:"https://graph.facebook.com/265671900499370/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58012362",shop:"supermarket"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",imageURL:"https://graph.facebook.com/superc.ca/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3504127",shop:"supermarket"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super H Mart":{name:"Super H Mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/hmartofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5636306",shop:"supermarket"},addTags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super One Foods":{name:"Super One Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperOneGrocery/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17108733",shop:"supermarket"},addTags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperBrugsen/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12337746",shop:"supermarket"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SuperValuIreland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7642081",shop:"supermarket"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1145720603724455942/zkMvSg5e_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q6135762",shop:"supermarket"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supercor":{name:"Supercor",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tusupercor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6135841",shop:"supermarket"},addTags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"},countryCodes:["es","pt"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Supersol":{name:"Supersol",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupersolSupermercados/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073427",shop:"supermarket"},addTags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"},countryCodes:["ar","es","ma","uy"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SPARintheUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q610492",shop:"supermarket"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},countryCodes:["es","za"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/T&T Supermarket":{name:"T&T Supermarket",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TTSupermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q837893",shop:"supermarket"},addTags:{brand:"T&T Supermarket","brand:wikidata":"Q837893","brand:wikipedia":"en:T & T Supermarket",name:"T&T Supermarket",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tegut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1547993",shop:"supermarket"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q487494",shop:"supermarket"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25172225",shop:"supermarket"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tesco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57551648",shop:"supermarket"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food (UK)":{name:"The Co-operative Food (UK)",icon:"maki-grocery",imageURL:"https://graph.facebook.com/coopukfood/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3277439",shop:"supermarket"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},countryCodes:["gb"],terms:["coop","coop food","cooperative food","the cooperative"],matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TheFreshMarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7735265",shop:"supermarket"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},countryCodes:["us"],terms:["fresh market"],matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/todisbuongiornoconvenienza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3992174",shop:"supermarket"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tommyprodavaonice/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12643718",shop:"supermarket"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},countryCodes:["hr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Top Market":{name:"Top Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/topmarketpolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q9360044",shop:"supermarket"},addTags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",imageURL:"https://graph.facebook.com/topsfriendlymarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7825137",shop:"supermarket"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",official_name:"Tops Friendly Markets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TottusPeru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7828510",shop:"supermarket"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},countryCodes:["cl","pe"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",imageURL:"https://graph.facebook.com/156443021054392/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q688825",shop:"supermarket"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",imageURL:"https://graph.facebook.com/EDEKA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q701755",shop:"supermarket"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tuodì":{name:"Tuodì",icon:"maki-grocery",imageURL:"https://graph.facebook.com/TUODI.it/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3706995",shop:"supermarket"},addTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},countryCodes:["it"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"supermarket"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",imageURL:"https://graph.facebook.com/unimarc/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6156244",shop:"supermarket"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Unimarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1169599",shop:"supermarket"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},countryCodes:["at"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vallarta":{name:"Vallarta",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vallarta.supermarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7911833",shop:"supermarket"},addTags:{brand:"Vallarta","brand:wikidata":"Q7911833","brand:wikipedia":"en:Vallarta Supermarkets",cuisine:"latin_american",name:"Vallarta","name:es":"Vallarta",official_name:"Vallarta Supermarkets",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Valu-mart":{name:"Valu-mart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/valumartCA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7912687",shop:"supermarket"},addTags:{brand:"Valu-mart","brand:wikidata":"Q7912687","brand:wikipedia":"en:Valu-mart",name:"Valu-mart",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/760081378868391936/qPOPFsTZ_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5858167",shop:"supermarket"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/VinMart":{name:"VinMart",icon:"maki-grocery",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"supermarket"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Volg":{name:"Volg",icon:"maki-grocery",imageURL:"https://graph.facebook.com/1953378021650189/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2530746",shop:"supermarket"},addTags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"},countryCodes:["ch","li"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vomar":{name:"Vomar",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vomarvoordeelmarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3202837",shop:"supermarket"},addTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vons/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7941609",shop:"supermarket"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",imageURL:"https://graph.facebook.com/waitroseandpartners/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q771734",shop:"supermarket"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",shop:"supermarket"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",shop:"supermarket"},terms:["walmart supercentre"],matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wasgau/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2536857",shop:"supermarket"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Wegmans/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11288478",shop:"supermarket"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",imageURL:"https://graph.facebook.com/WeisMarkets/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7980370",shop:"supermarket"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",imageURL:"https://graph.facebook.com/WholeFoods/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1809448",shop:"supermarket"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},countryCodes:["ca","gb","us"],terms:["whole foods"],matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Willys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10720214",shop:"supermarket"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",imageURL:"https://graph.facebook.com/winco.official.page/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8023592",shop:"supermarket"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Winn-Dixie":{name:"Winn-Dixie",icon:"maki-grocery",imageURL:"https://graph.facebook.com/winndixie/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1264366",shop:"supermarket"},addTags:{brand:"Winn-Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn-Dixie",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3249145",shop:"supermarket"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Your Independent Grocer":{name:"Your Independent Grocer",icon:"maki-grocery",imageURL:"https://graph.facebook.com/YourIndependentGrocer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8058833",shop:"supermarket"},addTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},countryCodes:["ca"],terms:["independent"],matchScore:2,suggestion:true},"shop/supermarket/Zehrs":{name:"Zehrs",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ZehrsON/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8068546",shop:"supermarket"},addTags:{brand:"Zehrs","brand:wikidata":"Q8068546","brand:wikipedia":"en:Zehrs Markets",name:"Zehrs",shop:"supermarket"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/basic":{name:"basic",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBasic%20logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q809994",shop:"supermarket"},addTags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",imageURL:"https://graph.facebook.com/dennsBiomarkt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48883773",shop:"supermarket"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"},countryCodes:["at","de"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fakta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3172238",shop:"supermarket"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},countryCodes:["dk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SokMarketler/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q19613992",shop:"supermarket"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},countryCodes:["tr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ab.vassilopoulos.sa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4721807",shop:"supermarket"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:el":"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:el":"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",imageURL:"https://graph.facebook.com/galaxias.sm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5518063",shop:"supermarket"},addTags:{brand:"Γαλαξίας","brand:el":"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:el":"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",imageURL:"https://graph.facebook.com/masoutis/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6783887",shop:"supermarket"},addTags:{brand:"Μασούτης","brand:el":"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:el":"Μασούτης","name:en":"Masoutis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q7536037",shop:"supermarket"},addTags:{brand:"Σκλαβενίτης","brand:el":"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:el":"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Russia)":{name:"Абсолют (Russia)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389597",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Абсолют (Ukraine)":{name:"Абсолют (Ukraine)",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q62389546",shop:"supermarket"},addTags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",imageURL:"https://graph.facebook.com/azbukavkusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4058209",shop:"supermarket"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/1565040269/logo_schiever_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2868738",shop:"supermarket"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",imageURL:"https://graph.facebook.com/auchan/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q758603",shop:"supermarket"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},countryCodes:["ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/freshmarket.brusnichka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21656645",shop:"supermarket"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",imageURL:"https://graph.facebook.com/SupermarketVictoria/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4111046",shop:"supermarket"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Виталюр":{name:"Виталюр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q55663075",shop:"supermarket"},addTags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",imageURL:"https://graph.facebook.com/vopak.com.ua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q30966107",shop:"supermarket"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гроздь":{name:"Гроздь",icon:"maki-grocery",imageURL:"https://graph.facebook.com/grozdmag/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q21638412",shop:"supermarket"},addTags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gullivermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58003470",shop:"supermarket"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Десяточка":{name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q61876182",shop:"supermarket"},addTags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Dixyclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4161561",shop:"supermarket"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Евроопт":{name:"Евроопт",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Eurooptby/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2565040",shop:"supermarket"},addTags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"},countryCodes:["by"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Евроопт Hyper":{name:"Евроопт Hyper",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q65455975",shop:"supermarket"},addTags:{brand:"Евроопт Hyper","brand:wikidata":"Q65455975",name:"Евроопт Hyper",shop:"supermarket"},countryCodes:["by"],terms:["евроопт Гипер"],matchScore:2,suggestion:true},"shop/supermarket/Евроопт Super":{name:"Евроопт Super",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q65455960",shop:"supermarket"},addTags:{brand:"Евроопт Super","brand:wikidata":"Q65455960",name:"Евроопт Super",shop:"supermarket"},countryCodes:["by"],terms:["евроопт Супер"],matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",imageURL:"https://graph.facebook.com/karuselgiper/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4216307",shop:"supermarket"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Кировский":{name:"Кировский",icon:"maki-grocery",imageURL:"https://graph.facebook.com/Kirovskii/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63301903",shop:"supermarket"},addTags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Командор":{name:"Командор",icon:"maki-grocery",imageURL:"https://graph.facebook.com/prkomandor/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61876152",shop:"supermarket"},addTags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Красный Яр":{name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q1786753",shop:"supermarket"},addTags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lentacom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4258608",shop:"supermarket"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",imageURL:"https://graph.facebook.com/magnitretail/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q940518",shop:"supermarket"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mariarashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4281631",shop:"supermarket"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4301704",shop:"supermarket"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F7Family.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4032436",shop:"supermarket"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},countryCodes:["ru"],terms:["семья"],matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",imageURL:"https://graph.facebook.com/perekrestok/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1684639",shop:"supermarket"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},countryCodes:["ru"],terms:["перекресток"],matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/121978851838251/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58003270",shop:"supermarket"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q4371080",shop:"supermarket"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pyaterochka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1768969",shop:"supermarket"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},countryCodes:["ru"],terms:["пятерочка"],matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",imageURL:"https://graph.facebook.com/radezhshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4387165",shop:"supermarket"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",imageURL:"https://graph.facebook.com/rukavychka.ua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q20092568",shop:"supermarket"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Светофор":{name:"Светофор",icon:"maki-grocery",imageURL:"https://graph.facebook.com/svetoforkryj/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61875920",shop:"supermarket"},addTags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q58003374",shop:"supermarket"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",imageURL:"https://graph.facebook.com/silpo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4419434",shop:"supermarket"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Таврия В":{name:"Таврия В",icon:"maki-grocery",imageURL:"https://graph.facebook.com/tavriavonline/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q61823146",shop:"supermarket"},addTags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",imageURL:"https://graph.facebook.com/fora.ukraine/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12165977",shop:"supermarket"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",imageURL:"https://graph.facebook.com/furshetcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4493564",shop:"supermarket"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q57979368",shop:"supermarket"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",imageURL:"https://graph.facebook.com/151131734909829/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17193392",shop:"supermarket"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",imageURL:"https://graph.facebook.com/mybasket.official/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11278154",shop:"supermarket"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",imageURL:"https://graph.facebook.com/aeonretail.english/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11285951",shop:"supermarket"},addTags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/itoyokado/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3088746",shop:"supermarket"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"},countryCodes:["jp"],terms:["イトーヨーカ堂"],matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/kasumi.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11294160",shop:"supermarket"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/138259402886129/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11328346",shop:"supermarket"},addTags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/158243057524643/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1960109",shop:"supermarket"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/maruetsu.rakuten/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11341197",shop:"supermarket"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yaokococoro/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11344967",shop:"supermarket"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",imageURL:"https://graph.facebook.com/ybfan89/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346199",shop:"supermarket"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ヨークマート":{name:"ヨークマート",icon:"maki-grocery",imageURL:"https://graph.facebook.com/137658762945673/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346201",shop:"supermarket"},addTags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lifecorp428/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11346476",shop:"supermarket"},addTags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pxmartchannel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",imageURL:"https://graph.facebook.com/pxmartchannel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7262792",shop:"supermarket"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/家乐福":{name:"家乐福",icon:"maki-grocery",imageURL:"https://graph.facebook.com/carrefour/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q217599",shop:"supermarket"},addTags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},countryCodes:["hk"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",imageURL:"https://graph.facebook.com/gsjdf/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11590183",shop:"supermarket"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/沃尔玛":{name:"沃尔玛",icon:"maki-grocery",imageURL:"https://graph.facebook.com/walmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q483551",shop:"supermarket"},addTags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"},countryCodes:["cn"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",imageURL:"https://graph.facebook.com/simplemart1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15914017",shop:"supermarket"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",imageURL:"https://graph.facebook.com/yourrepo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3108542",shop:"supermarket"},addTags:{brand:"西友","brand:en":"Seiyu","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu",shop:"supermarket"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",imageURL:"https://graph.facebook.com/wellcome.supermarket/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q706247",shop:"supermarket"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},countryCodes:["tw"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/롯데마트":{name:"롯데마트",icon:"maki-grocery",imageURL:"https://graph.facebook.com/lottemart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q326715",shop:"supermarket"},addTags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q12590611",shop:"supermarket"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"},countryCodes:["kr"],terms:[],matchScore:2,suggestion:true},"shop/swimming_pool/Leslie's Pool Supplies":{name:"Leslie's Pool Supplies",icon:"fas-swimmer",imageURL:"https://graph.facebook.com/LesliesPoolSupplies/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6530568",shop:"swimming_pool"},addTags:{brand:"Leslie's Pool Supplies","brand:wikidata":"Q6530568","brand:wikipedia":"en:Leslie's Poolmart",name:"Leslie's Pool Supplies",official_name:"Leslie's Pool Supplies Service & Repair",shop:"swimming_pool"},countryCodes:["us"],terms:["leslie's swimming pool supplies"],matchScore:2,suggestion:true},"shop/tea/DavidsTea":{name:"DavidsTea",icon:"maki-teahouse",imageURL:"https://pbs.twimg.com/profile_images/1134536272062685184/YvIzsQOi_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q3019129",shop:"tea"},addTags:{brand:"DavidsTea","brand:wikidata":"Q3019129","brand:wikipedia":"en:DavidsTea",name:"DavidsTea",shop:"tea"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/tea/T2":{name:"T2",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/T2Tea/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q48802134",shop:"tea"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/tea/TeeGschwendner":{name:"TeeGschwendner",icon:"maki-teahouse",imageURL:"https://graph.facebook.com/TeeGschwendner/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2399969",shop:"tea"},addTags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/SNCFOFFICIEL/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13646",shop:"ticket"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/ticket/DB Reisezentrum":{name:"DB Reisezentrum",icon:"fas-ticket-alt",imageURL:"https://graph.facebook.com/348950735250586/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15842100",shop:"ticket"},addTags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"},countryCodes:["de"],terms:["reisezentrum"],matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"fas-ticket-alt",imageURL:"https://pbs.twimg.com/profile_images/776102546045865984/-NPGF3eG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q389554",shop:"ticket"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/tobacco/Nemzeti Dohánybolt":{name:"Nemzeti Dohánybolt",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q20639040",shop:"tobacco"},addTags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"},countryCodes:["hu"],terms:["dohánybolt"],matchScore:2,suggestion:true},"shop/toys/Build-A-Bear Workshop":{name:"Build-A-Bear Workshop",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Buildabear/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1002992",shop:"toys"},addTags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"},countryCodes:["ca","gb","us"],terms:["build a bear"],matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/2185187834828492/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57653669",shop:"toys"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},countryCodes:["cz","sk"],terms:[],matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/Intertoys/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1891407",shop:"toys"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},countryCodes:["be","de","nl"],terms:[],matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/JoueClubFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3187152",shop:"toys"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},countryCodes:["ad","fr","it","lb","ma","qa"],terms:[],matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/KingJouet/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3197009",shop:"toys"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lagranderecre/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3209556",shop:"toys"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},countryCodes:["be","ci","es","fr","ma"],terms:[],matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lego/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1063455",shop:"toys"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},terms:["lego store"],matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/lekiasweden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56303274",shop:"toys"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},countryCodes:["no","se"],terms:[],matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/MaxiToys.FR/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16663879",shop:"toys"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},countryCodes:["be","de","fr","it"],terms:[],matchScore:2,suggestion:true},"shop/toys/Smyths":{name:"Smyths",icon:"fas-space-shuttle",imageURL:"https://pbs.twimg.com/profile_images/1067119121245048834/S_SSe3Yd_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7546779",shop:"toys"},addTags:{brand:"Smyths","brand:wikidata":"Q7546779","brand:wikipedia":"en:Smyths",name:"Smyths",shop:"toys"},countryCodes:["at","ch","de","gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/TheEntertainerToyShop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7732289",shop:"toys"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},countryCodes:["gb","je"],terms:[],matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/toysrus/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q696334",shop:"toys"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},terms:[],matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/detmir/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16643324",shop:"toys"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},countryCodes:["by","kg","kz","ru","ua","uz"],terms:[],matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"fas-space-shuttle",imageURL:"https://graph.facebook.com/korablik.ru/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57653416",shop:"toys"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/trade/84 Lumber":{name:"84 Lumber",icon:"maki-shop",imageURL:"https://graph.facebook.com/84lumber/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4644779",shop:"trade"},addTags:{brand:"84 Lumber","brand:wikidata":"Q4644779","brand:wikipedia":"en:84 Lumber",name:"84 Lumber",shop:"trade",trade:"building_supplies"},countryCodes:["us"],terms:["84","eighty-four lumber"],matchScore:2,suggestion:true},"shop/trade/Fastenal":{name:"Fastenal",icon:"maki-shop",imageURL:"https://graph.facebook.com/fastenalcompany/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3067119",shop:"trade"},addTags:{brand:"Fastenal","brand:wikidata":"Q3067119","brand:wikipedia":"en:Fastenal",name:"Fastenal",shop:"trade"},countryCodes:["ca","pa","us"],terms:[],matchScore:2,suggestion:true},"shop/trade/Grainger":{name:"Grainger",icon:"maki-shop",imageURL:"https://graph.facebook.com/grainger/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1627894",shop:"trade"},addTags:{brand:"Grainger","brand:wikidata":"Q1627894","brand:wikipedia":"en:W. W. Grainger",name:"Grainger",shop:"trade"},countryCodes:["ca","us"],terms:["granger","w. w. grainger"],matchScore:2,suggestion:true},"shop/travel_agency/American Automobile Association":{name:"American Automobile Association",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/AAAFanPage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q463436",shop:"travel_agency"},addTags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"American Automobile Association",shop:"travel_agency",short_name:"AAA"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/coraltravelofficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q58011479",shop:"travel_agency"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},countryCodes:["pl","ru","ua"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/dreizenvakanties/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2445498",shop:"travel_agency"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},countryCodes:["nl"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/DER/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56729186",shop:"travel_agency"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Expedia CruiseShipCenters":{name:"Expedia CruiseShipCenters",icon:"fas-suitcase",imageURL:"https://pbs.twimg.com/profile_images/476431342729588736/6JpT6tus_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q5189985",shop:"travel_agency"},addTags:{brand:"Expedia CruiseShipCenters","brand:wikidata":"Q5189985","brand:wikipedia":"en:Expedia CruiseShipCenters",name:"Expedia CruiseShipCenters",shop:"travel_agency"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/flightcentreAU/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5459202",shop:"travel_agency"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/halconviajes.oficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57591939",shop:"travel_agency"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},countryCodes:["es"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/havas.voyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57628091",shop:"travel_agency"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Liberty Travel":{name:"Liberty Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/LibertyTravel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17031665",shop:"travel_agency"},addTags:{brand:"Liberty Travel","brand:wikidata":"Q17031665","brand:wikipedia":"en:Liberty Travel",name:"Liberty Travel",shop:"travel_agency"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/reiseland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q40387610",shop:"travel_agency"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Selectour":{name:"Selectour",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/SelectourVoyages/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3478073",shop:"travel_agency"},addTags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/TUI (Group)":{name:"TUI (Group)",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/TUIDeutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573103",shop:"travel_agency"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},terms:["tui reisecenter"],matchScore:2,suggestion:true},"shop/travel_agency/TUI (UK)":{name:"TUI (UK)",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/worldofTUI/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7795876",shop:"travel_agency"},addTags:{brand:"TUI","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"TUI",shop:"travel_agency"},countryCodes:["gb"],terms:["thomson"],matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/cooperativetraveluk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7726526",shop:"travel_agency"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/thomascook/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2141800",shop:"travel_agency"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},terms:[],matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"fas-suitcase",imageURL:"https://graph.facebook.com/PoehaliSNamiua/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q25439141",shop:"travel_agency"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},countryCodes:["ua"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",imageURL:"https://graph.facebook.com/BigOTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4906085",shop:"tyres"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",imageURL:"https://graph.facebook.com/BridgestoneTires/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q179433",shop:"tyres"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",imageURL:"https://graph.facebook.com/DiscountTire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5281735",shop:"tyres"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",imageURL:"https://graph.facebook.com/expressoil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q39057654",shop:"tyres"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",imageURL:"https://graph.facebook.com/lesschwab/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6529977",shop:"tyres"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",imageURL:"https://graph.facebook.com/MichelinSustainableMobility/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q151107",shop:"tyres"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/tyres/Tire Discounters":{name:"Tire Discounters",icon:"maki-shop",imageURL:"https://graph.facebook.com/TireDiscounters/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q29093639",shop:"tyres"},addTags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Tires Plus":{name:"Tires Plus",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/378800000821067695/d59e0a647859aabacc690ebb962670aa_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q64015091",shop:"tyres"},addTags:{brand:"Tires Plus","brand:wikidata":"Q64015091",name:"Tires Plus",shop:"tyres"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",imageURL:"https://graph.facebook.com/VianorSuomi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10714920",shop:"tyres"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},terms:[],matchScore:2,suggestion:true},"shop/vacuum_cleaner/Oreck":{name:"Oreck",icon:"maki-shop",imageURL:"https://graph.facebook.com/oreck/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57273844",shop:"vacuum_cleaner"},addTags:{brand:"Oreck","brand:wikidata":"Q57273844",name:"Oreck",shop:"vacuum_cleaner"},countryCodes:["us"],terms:["oreck vacuums"],matchScore:2,suggestion:true},"shop/variety_store/99 Cents Only Stores":{name:"99 Cents Only Stores",icon:"maki-shop",imageURL:"https://graph.facebook.com/99CentsOnly/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4646294",shop:"variety_store"},addTags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"},countryCodes:["us"],terms:["99 cent only stores","99 cents only"],matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",imageURL:"https://graph.facebook.com/actiondotcom/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2634111",shop:"variety_store"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},countryCodes:["at","be","de","fr","nl","pl"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/B&M Bargains":{name:"B&M Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/bmstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4836931",shop:"variety_store"},addTags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",imageURL:"https://graph.facebook.com/bigbazarbv/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15873104",shop:"variety_store"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},countryCodes:["be","nl"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Daiso Japan":{name:"Daiso Japan",icon:"maki-shop",imageURL:"https://graph.facebook.com/daisojapanusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q866991",shop:"variety_store"},addTags:{brand:"Daiso","brand:wikidata":"Q866991",name:"Daiso Japan",shop:"variety_store",short_name:"Daiso"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",imageURL:"https://graph.facebook.com/dollargeneral/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q145168",shop:"variety_store"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/509405558898561024/27hmihjq_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q5289230",shop:"variety_store"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",imageURL:"https://graph.facebook.com/415845051799232/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3033947",shop:"variety_store"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/EuroShop":{name:"EuroShop",icon:"maki-shop",imageURL:"https://graph.facebook.com/schumeuroshop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q15846763",shop:"variety_store"},addTags:{brand:"EuroShop","brand:wikidata":"Q15846763","brand:wikipedia":"de:Schum EuroShop",name:"EuroShop",shop:"variety_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",imageURL:"https://graph.facebook.com/familydollar/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433101",shop:"variety_store"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",imageURL:"https://graph.facebook.com/FiveBelow/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5455836",shop:"variety_store"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",imageURL:"https://graph.facebook.com/fixprice.russia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4038791",shop:"variety_store"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},countryCodes:["by","ru"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Flying Tiger Copenhagen":{name:"Flying Tiger Copenhagen",icon:"maki-shop",imageURL:"https://graph.facebook.com/flyingtigercph/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2786319",shop:"variety_store"},addTags:{brand:"Flying Tiger Copenhagen","brand:wikidata":"Q2786319","brand:wikipedia":"en:Flying Tiger Copenhagen",name:"Flying Tiger Copenhagen",shop:"variety_store",short_name:"Flying Tiger"},terms:["tgr","tiger"],matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",imageURL:"https://graph.facebook.com/GiFi.Officiel/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3105439",shop:"variety_store"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",imageURL:"https://graph.facebook.com/homebargains/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5888229",shop:"variety_store"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Miniso":{name:"Miniso",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMiniso%20international%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q20732498",shop:"variety_store"},addTags:{brand:"Miniso","brand:wikidata":"Q20732498","brand:wikipedia":"en:Miniso",name:"Miniso",shop:"variety_store"},terms:[],matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",imageURL:"https://graph.facebook.com/1652809328274529/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1957126",shop:"variety_store"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",imageURL:"https://graph.facebook.com/UniversNOZ/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3345688",shop:"variety_store"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1434528",shop:"variety_store"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",imageURL:"https://graph.facebook.com/Poundstretcher/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7235675",shop:"variety_store"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",imageURL:"https://graph.facebook.com/PoundWorld/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16967516",shop:"variety_store"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},countryCodes:["gb","ie"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Roses":{name:"Roses",icon:"maki-shop",imageURL:"https://graph.facebook.com/rosesdiscountstores/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7368644",shop:"variety_store"},addTags:{brand:"Roses","brand:wikidata":"Q7368644","brand:wikipedia":"en:Roses (store)",name:"Roses",shop:"variety_store"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTEDi-Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1364603",shop:"variety_store"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},countryCodes:["at","de","es","hr","si","sk"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Tokmanni":{name:"Tokmanni",icon:"maki-shop",imageURL:"https://graph.facebook.com/Tokmanni.fi/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13423470",shop:"variety_store"},addTags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"},countryCodes:["fi"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",imageURL:"https://graph.facebook.com/LoveWilko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q8002536",shop:"variety_store"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/986887047209091072/PPjs7xOK_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11297367",shop:"variety_store"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSeria%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q11314509",shop:"variety_store"},addTags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",imageURL:"https://graph.facebook.com/daisojapanusa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q866991",shop:"variety_store"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"},countryCodes:["jp"],terms:["ザ・ダイソー"],matchScore:2,suggestion:true},"shop/variety_store/ダイレックス":{name:"ダイレックス",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11317051",shop:"variety_store"},addTags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/トライアル":{name:"トライアル",icon:"maki-shop",geometry:["point","area"],tags:{"brand:wikidata":"Q11321723",shop:"variety_store"},addTags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/variety_store/ドン・キホーテ":{name:"ドン・キホーテ",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1098907826305421312/KCKaI33I_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1185381",shop:"variety_store"},addTags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",imageURL:"https://graph.facebook.com/ebgamescanada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4993686",shop:"video_games"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},countryCodes:["au","ca","nz"],terms:[],matchScore:2,suggestion:true},"shop/video_games/Game":{name:"Game",icon:"maki-gaming",imageURL:"https://pbs.twimg.com/profile_images/925661697230163968/GTdV1FP7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5519813",shop:"video_games"},addTags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",imageURL:"https://graph.facebook.com/GameStop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q202210",shop:"video_games"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},terms:[],matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",imageURL:"https://graph.facebook.com/MicromaniaFr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3312221",shop:"video_games"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"temaki-movie_rental",imageURL:"https://pbs.twimg.com/profile_images/378800000679852472/9ee706eca6f5d0b9fbc3a57d014ec807_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q884711",shop:"video"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/FamilyVideo/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5433297",shop:"video"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/TSUTAYA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5193457",shop:"video"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},terms:[],matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"temaki-movie_rental",imageURL:"https://graph.facebook.com/geomediashop/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5533938",shop:"video"},addTags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"},countryCodes:["jp"],terms:["geo"],matchScore:2,suggestion:true},"shop/watches/Fossil":{name:"Fossil",icon:"maki-watch",imageURL:"https://graph.facebook.com/Fossil/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q356212",shop:"watches"},addTags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"},countryCodes:["de","us"],terms:[],matchScore:2,suggestion:true},"shop/watches/Omega":{name:"Omega",icon:"maki-watch",imageURL:"https://graph.facebook.com/omega/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q659224",shop:"watches"},addTags:{brand:"Omega","brand:wikidata":"Q659224","brand:wikipedia":"en:Omega SA",name:"Omega",shop:"watches"},countryCodes:["ch","fr"],terms:[],matchScore:2,suggestion:true},"shop/watches/Rolex":{name:"Rolex",icon:"maki-watch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRolex%20Bienne%2004.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q62288",shop:"watches"},addTags:{brand:"Rolex","brand:wikidata":"Q62288","brand:wikipedia":"en:Rolex",name:"Rolex",shop:"watches"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",imageURL:"https://graph.facebook.com/SwatchUS/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q573422",shop:"watches"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/BJ's Wholesale Club":{name:"BJ's Wholesale Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/bjswholesaleclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835754",shop:"wholesale"},addTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale"},terms:["costco wholesale"],matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/makrohipermayorista/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q704606",shop:"wholesale"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Metro":{name:"Metro",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/metro.deutschland/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q13610282",shop:"wholesale"},addTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/samsclub/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1972120",shop:"wholesale"},addTags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",shop:"wholesale"},terms:[],matchScore:2,suggestion:true},"shop/wholesale/コストコ":{name:"コストコ",icon:"maki-warehouse",imageURL:"https://graph.facebook.com/Costco/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q715583",shop:"wholesale"},addTags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",shop:"wholesale"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/bbhotels.france/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q794939",tourism:"hotel"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/BestWestern/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q830334",tourism:"hotel"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/campanile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2412064",tourism:"hotel"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/CandlewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5032010",tourism:"hotel"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/countryinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5177332",tourism:"hotel"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/courtyard/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1053170",tourism:"hotel"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},countryCodes:["ca","us"],terms:["courtyard","courtyard marriott"],matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/crowneplaza/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2746220",tourism:"hotel"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/DaysInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1047239",tourism:"hotel"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/EmbassySuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5369524",tourism:"hotel"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ExtendedStayAmerica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5421850",tourism:"hotel"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/fairfieldbymarriott/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5430314",tourism:"hotel"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},countryCodes:["ca","us"],terms:["fairfield inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HotelF1/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1630895",tourism:"hotel"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Grand Hyatt":{name:"Grand Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hampton":{name:"Hampton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hamptonbyhilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5646230",tourism:"hotel"},addTags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"},countryCodes:["us"],terms:["hampton inn and suites"],matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hilton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q598884",tourism:"hotel"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HiltonGardenInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1162859",tourism:"hotel"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HolidayInn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2717882",tourism:"hotel"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/holidayinnexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5880423",tourism:"hotel"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Home2 Suites":{name:"Home2 Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Home2Suites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5887912",tourism:"hotel"},addTags:{brand:"Home2 Suites","brand:wikidata":"Q5887912","brand:wikipedia":"en:Home2 Suites by Hilton",name:"Home2 Suites",official_name:"Home2 Suites by Hilton",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:["home2"],matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/HomewoodSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5890701",tourism:"hotel"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt":{name:"Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Centric":{name:"Hyatt Centric",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt House":{name:"Hyatt House",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Place":{name:"Hyatt Place",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Hyatt Regency":{name:"Hyatt Regency",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibishotels.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q920166",tourism:"hotel"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},terms:["hotel ibis","ibis hotel"],matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisbudget.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1458135",tourism:"hotel"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ibisstyles.fr/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3147425",tourism:"hotel"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/kyriadindia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q11751808",tourism:"hotel"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/laquinta/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6464734",tourism:"hotel"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},countryCodes:["us"],terms:["la quinta inn and suites","la quinta inns and suites"],matchScore:2,suggestion:true},"tourism/hotel/Le Méridien":{name:"Le Méridien",icon:"fas-concierge-bell",imageURL:"https://pbs.twimg.com/profile_images/444194265032163329/ioAHiave_bigger.jpeg",geometry:["point","area"],tags:{"brand:wikidata":"Q261077",tourism:"hotel"},addTags:{brand:"Le Méridien","brand:wikidata":"Q261077","brand:wikipedia":"en:Le Méridien",name:"Le Méridien",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/marriottinternational/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1141173",tourism:"hotel"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/MercureHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1709809",tourism:"hotel"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Novotelhotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q420545",tourism:"hotel"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Park Hyatt":{name:"Park Hyatt",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/hyatt/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1425063",tourism:"hotel"},addTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/premierinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2108626",tourism:"hotel"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/PremiereClasseHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5964551",tourism:"hotel"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},countryCodes:["ca","mx","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/ramada/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1502859",tourism:"hotel"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/redroofinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7304949",tourism:"hotel"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Renaissance Hotel":{name:"Renaissance Hotel",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/RenaissanceHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2143252",tourism:"hotel"},addTags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/residenceinn/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7315394",tourism:"hotel"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Sheraton/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q634831",tourism:"hotel"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1075788",tourism:"hotel"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/StaybridgeSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7605116",tourism:"hotel"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},countryCodes:["ca","gb","us"],terms:[],matchScore:2,suggestion:true},"tourism/hotel/TownePlace Suites":{name:"TownePlace Suites",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/TownePlaceSuites/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7830092",tourism:"hotel"},addTags:{brand:"TownePlace Suites","brand:wikidata":"Q7830092","brand:wikipedia":"en:TownePlace Suites",name:"TownePlace Suites",official_name:"TownePlace Suites by Marriott",tourism:"hotel"},countryCodes:["ca","us"],terms:["TownePlace Marriott","TownePlace Suites Marriott"],matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/Travelodge/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7836087",tourism:"hotel"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/W Hotels":{name:"W Hotels",icon:"fas-concierge-bell",imageURL:"https://graph.facebook.com/WHotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7958488",tourism:"hotel"},addTags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"},terms:[],matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"fas-concierge-bell",geometry:["point","area"],tags:{"brand:wikidata":"Q1320541",tourism:"hotel"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5333330",tourism:"motel"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},terms:[],matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",imageURL:"https://graph.facebook.com/motel6/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2188884",tourism:"motel"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",imageURL:"https://graph.facebook.com/choicehotels/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7356709",tourism:"motel"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",imageURL:"https://graph.facebook.com/Super8/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5364003",tourism:"motel"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true}};
24879
24880         var defaults = {area:["category-landuse","category-building","category-water","category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road_major","category-road_minor","category-rail","category-path","category-waterway","category-barrier","category-natural","category-utility","line"],point:["category-natural","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crossing/marked","highway/crossing/unmarked","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","point"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/enforcement","type/site","relation"]};
24881
24882         var categories = {"category-barrier":{icon:"maki-roadblock",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",name:"Building Features",members:["building","building/house","building/apartments","building/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard","golf/rough","golf/bunker","golf/tee","golf/water_hazard","golf/driving_range","golf/hole","golf/cartpath","golf/path"]},"category-landuse":{icon:"maki-landuse",name:"Land Use Features",members:["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural":{icon:"maki-natural",name:"Natural Features",members:["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier","natural/coastline","natural/tree_row","natural/peak","natural/cliff","natural/beach"]},"category-path":{icon:"temaki-pedestrian",name:"Paths",members:["highway/path","highway/footway","highway/footway/marked","highway/footway/sidewalk","highway/steps","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-railway-rail",name:"Rails",members:["railway/rail","railway/disused","railway/tram","railway/subway","railway/narrow_gauge","railway/light_rail","railway/monorail","railway/funicular"]},"category-restriction":{icon:"iD-restriction",name:"Restriction Features",members:["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction/only_u_turn","type/restriction"]},"category-road_major":{icon:"iD-highway-unclassified",name:"Major Roads",members:["highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link"]},"category-road_minor":{icon:"iD-highway-unclassified",name:"Minor Roads",members:["highway/unclassified","highway/residential","highway/living_street","highway/service","highway/track"]},"category-road_service":{icon:"iD-highway-service",name:"Service Roads",members:["highway/service","highway/service/parking_aisle","highway/service/driveway","highway/service/alley","highway/service/emergency_access","highway/service/drive-through"]},"category-route":{icon:"iD-route",name:"Route Features",members:["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-utility":{icon:"iD-power-line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"category-water":{icon:"maki-water",name:"Water Bodies",members:["natural/water","natural/water/pond","natural/water/basin","natural/water/lake","natural/water/reservoir"]},"category-waterway":{icon:"iD-waterway-stream",name:"Waterways",members:["waterway/stream","waterway/drain","waterway/river","waterway/canal","waterway/ditch","natural/water/stream","natural/water/river","natural/water/canal"]}};
24883
24884         var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","no"]},access:{keys:["access","foot","motor_vehicle","bicycle","horse"],reference:{key:"access"},type:"access",label:"Allowed Access",placeholder:"Not Specified",strings:{types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},"addr/interpolation":{key:"addr:interpolation",type:"combo",label:"Type",strings:{options:{all:"All",even:"Even",odd:"Odd",alphabetic:"Alphabetic"}}},address:{type:"address",keys:["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],reference:{key:"addr"},icon:"address",label:"Address",strings:{placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}}},admin_level:{key:"admin_level",type:"number",minValue:1,label:"Admin Level"},aerialway:{key:"aerialway",type:"typeCombo",label:"Type"},"aerialway/access":{key:"aerialway:access",type:"combo",label:"Access",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},"aerialway/bubble":{key:"aerialway:bubble",type:"check",label:"Bubble"},"aerialway/capacity":{key:"aerialway:capacity",type:"number",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{key:"aerialway:summer:access",type:"combo",label:"Access (summer)",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},aeroway:{key:"aeroway",type:"typeCombo",label:"Type"},agrarian:{key:"agrarian",type:"semiCombo",label:"Products"},air_conditioning:{key:"air_conditioning",type:"check",label:"Air Conditioning"},amenity:{key:"amenity",type:"typeCombo",label:"Type"},animal_boarding:{key:"animal_boarding",type:"semiCombo",label:"For Animals"},animal_breeding:{key:"animal_breeding",type:"semiCombo",label:"For Animals"},animal_shelter:{key:"animal_shelter",type:"semiCombo",label:"For Animals"},architect:{key:"architect",type:"text",label:"Architect"},"area/highway":{key:"area:highway",type:"typeCombo",label:"Type"},artist:{key:"artist_name",type:"text",label:"Artist"},artwork_type:{key:"artwork_type",type:"combo",label:"Type"},atm:{key:"atm",type:"check",label:"ATM"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},bar:{key:"bar",type:"check",label:"Bar"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",label:"Type"},"bath/open_air":{key:"bath:open_air",label:"Open Air",type:"check"},"bath/sand_bath":{key:"bath:sand_bath",label:"Sand Bath",type:"check"},"bath/type":{key:"bath:type",type:"combo",label:"Specialty",strings:{options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}}},beauty:{key:"beauty",type:"combo",label:"Beauty Specialty"},bench:{key:"bench",type:"check",label:"Bench"},bicycle_parking:{key:"bicycle_parking",type:"combo",label:"Type"},bin:{key:"bin",type:"check",label:"Waste Bin"},blood_components:{key:"blood:",type:"multiCombo",label:"Blood Components",strings:{options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}}},board_type:{key:"board_type",type:"typeCombo",label:"Type"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},boules:{key:"boules",type:"typeCombo",label:"Type"},boundary:{key:"boundary",type:"combo",label:"Type"},brand:{key:"brand",type:"text",label:"Brand"},brewery:{key:"brewery",type:"semiCombo",label:"Draft Beers"},bridge:{key:"bridge",type:"typeCombo",label:"Type",placeholder:"Default"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},"building/levels_building":{key:"building:levels",type:"number",minValue:0,label:"Building Levels",placeholder:"2, 4, 6...",prerequisiteTag:{key:"building",valueNot:"no"}},"building/levels/underground":{key:"building:levels:underground",type:"number",minValue:0,label:"Underground Levels",placeholder:"2, 4, 6..."},"building/material":{key:"building:material",type:"combo",label:"Material"},bunker_type:{key:"bunker_type",type:"combo",label:"Type"},cables:{key:"cables",type:"number",minValue:1,label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{key:"camera:direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{key:"camera:mount",type:"combo",label:"Camera Mount"},"camera/type":{key:"camera:type",type:"combo",label:"Camera Type",strings:{options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}}},capacity:{key:"capacity",type:"number",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},comment:{key:"comment",type:"textarea",label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{key:"communication:",type:"multiCombo",label:"Communication Types"},construction:{key:"construction",type:"combo",label:"Type"},consulate:{key:"consulate",type:"combo",label:"Type"},"contact/webcam":{key:"contact:webcam",type:"url",icon:"website",label:"Webcam URL",placeholder:"http://example.com/"},content:{key:"content",type:"combo",label:"Content",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},covered:{key:"covered",type:"check",label:"Covered"},craft:{key:"craft",type:"typeCombo",label:"Type"},"crane/type":{key:"crane:type",type:"combo",label:"Crane Type",strings:{options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}}},crop:{key:"crop",type:"semiCombo",label:"Crops"},crossing:{key:"crossing",type:"combo",label:"Type"},cuisine:{key:"cuisine",type:"semiCombo",label:"Cuisines"},currency_multi:{key:"currency:",type:"multiCombo",label:"Currency Types"},cutting:{key:"cutting",type:"typeCombo",label:"Type",placeholder:"Default"},cycle_network:{key:"cycle_network",type:"networkCombo",label:"Network"},cycleway:{keys:["cycleway","cycleway:left","cycleway:right"],reference:{key:"cycleway"},type:"cycleway",label:"Bike Lanes",placeholder:"none",strings:{types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{key:"dance:style",type:"semiCombo",label:"Dance Styles"},date:{key:"date",type:"check",label:"Date"},delivery:{key:"delivery",type:"check",label:"Delivery"},denomination:{key:"denomination",type:"combo",label:"Denomination",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},departures_board:{key:"departures_board",type:"combo",label:"Departures Board",strings:{options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}}},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diameter:{key:"diameter",type:"combo",label:"Diameter",snake_case:false,placeholder:"5 mm, 10 cm, 15 in…"},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},diplomatic:{key:"diplomatic",type:"combo",label:"Type"},"diplomatic/services":{key:"diplomatic:services:",type:"multiCombo",label:"Services"},direction_cardinal:{key:"direction",type:"combo",label:"Direction",strings:{options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}}},direction_clock:{key:"direction",type:"combo",label:"Direction",strings:{options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}}},direction_vertex:{key:"direction",type:"combo",label:"Direction Affected",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},direction:{key:"direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{key:"dispensing",type:"check",label:"Dispenses Prescriptions","default":"yes"},display:{key:"display",type:"combo",label:"Display",options:["analog","digital","sundial","unorthodox"]},distance:{key:"distance",type:"text",label:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},door_type:{key:"door",type:"typeCombo",label:"Type"},door:{key:"door",type:"combo",label:"Door"},drive_through:{key:"drive_through",type:"check",label:"Drive-Through"},duration:{key:"duration",type:"text",label:"Duration",placeholder:"00:00"},electrified:{key:"electrified",type:"combo",label:"Electrification",placeholder:"Contact Line, Electrified Rail...",strings:{options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}}},elevation:{key:"ele",type:"number",icon:"elevation",universal:true,label:"Elevation"},email:{key:"email",type:"email",placeholder:"example@example.com",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},embassy:{key:"embassy",type:"combo",label:"Type"},emergency_combo:{key:"emergency",type:"combo",label:"Type"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},entrance:{key:"entrance",type:"typeCombo",label:"Type"},except:{key:"except",type:"combo",label:"Exceptions"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},fax:{key:"fax",type:"tel",label:"Fax",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fishing:{key:"fishing",type:"combo",label:"Fishing"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},floating:{key:"floating",type:"check",label:"Floating"},flood_prone:{key:"flood_prone",type:"check",label:"Flood Prone"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},fuel_multi:{key:"fuel:",type:"multiCombo",label:"Fuel Types"},fuel:{key:"fuel",type:"combo",label:"Fuel"},gauge:{key:"gauge",type:"combo",label:"Gauge"},gender:{type:"radio",keys:["male","female","unisex"],label:"Gender",placeholder:"Unknown",strings:{options:{male:"Male",female:"Female",unisex:"Unisex"}}},"generator/method":{key:"generator:method",type:"combo",label:"Method"},"generator/output/electricity":{key:"generator:output:electricity",type:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"generator/source":{key:"generator:source",type:"combo",label:"Source"},"generator/type":{key:"generator:type",type:"combo",label:"Type"},government:{key:"government",type:"typeCombo",label:"Type"},grape_variety:{key:"grape_variety",type:"semiCombo",label:"Grape Varieties"},guest_house:{key:"guest_house",type:"combo",label:"Type"},handicap:{key:"handicap",type:"number",label:"Handicap",placeholder:"1-18"},handrail:{key:"handrail",type:"check",label:"Handrail"},hashtags:{key:"hashtags",type:"semiCombo",label:"Suggested Hashtags",placeholder:"#example"},healthcare:{key:"healthcare",type:"typeCombo",label:"Type"},"healthcare/speciality":{key:"healthcare:speciality",type:"semiCombo",reference:{key:"healthcare"},label:"Specialties"},height_building:{key:"height",minValue:0,type:"number",label:"Building Height (Meters)",prerequisiteTag:{key:"building",valueNot:"no"}},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highspeed:{key:"highspeed",type:"check",label:"High-Speed"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},hoops:{key:"hoops",type:"number",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},iata:{key:"iata",type:"text",label:"IATA Airport Code"},icao:{key:"icao",type:"text",label:"ICAO Airport Code"},incline_steps:{key:"incline",type:"combo",label:"Incline",strings:{options:{up:"Up",down:"Down"}}},incline:{key:"incline",type:"combo",label:"Incline"},indoor_type:{key:"indoor",type:"typeCombo",label:"Type"},indoor:{key:"indoor",type:"check",label:"Indoor"},industrial:{key:"industrial",type:"combo",label:"Type"},information:{key:"information",type:"typeCombo",label:"Type"},inscription:{key:"inscription",type:"textarea",label:"Inscription"},intermittent_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},intermittent:{key:"intermittent",type:"check",label:"Intermittent"},internet_access:{key:"internet_access",type:"combo",label:"Internet Access",strings:{options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}}},"internet_access/fee":{key:"internet_access:fee",type:"check",label:"Internet Access Fee",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"Wifi Network Name",prerequisiteTag:{key:"internet_access",valueNot:"no"}},interval:{key:"interval",type:"text",label:"Interval"},junction_line:{key:"junction",type:"combo",label:"Junction",strings:{options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},kerb:{key:"kerb",type:"combo",label:"Curb"},"kerb/height":{key:"kerb:height",type:"combo",snake_case:false,label:"Height"},label:{key:"label",type:"textarea",label:"Label"},lamp_type:{key:"lamp_type",type:"combo",label:"Type"},landuse:{key:"landuse",type:"typeCombo",label:"Type"},lanes:{key:"lanes",type:"number",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},layer:{key:"layer",type:"number",label:"Layer",placeholder:"0"},leaf_cycle_singular:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}}},leaf_cycle:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}}},leaf_type_singular:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}}},leaf_type:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}}},leisure:{key:"leisure",type:"typeCombo",label:"Type"},length:{key:"length",type:"number",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},liaison:{key:"liaison",type:"combo",label:"Type"},lit:{key:"lit",type:"check",label:"Lit"},location_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},location:{key:"location",type:"combo",label:"Location"},lock:{key:"lock",type:"check",label:"Lock"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},manufacturer:{key:"manufacturer",type:"combo",snake_case:false,caseSensitive:true,label:"Manufacturer"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},material:{key:"material",type:"combo",label:"Material"},maxheight:{key:"maxheight",type:"combo",label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\"",snake_case:false},maxspeed:{key:"maxspeed",type:"maxspeed",label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{key:"maxstay",type:"combo",label:"Max Stay",options:["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],snake_case:false},maxweight_bridge:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false,prerequisiteTag:{key:"bridge",valueNot:"no"}},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},microbrewery:{key:"microbrewery",type:"check",label:"Microbrewery"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},monitoring_multi:{key:"monitoring:",type:"multiCombo",label:"Monitoring"},"mtb/scale":{key:"mtb:scale",type:"combo",label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{key:"mtb:scale:imba",type:"combo",label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",strings:{options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{key:"mtb:scale:uphill",type:"combo",label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},name:{key:"name",type:"localized",label:"Name",universal:true,placeholder:"Common name (if any)"},natural:{key:"natural",type:"typeCombo",label:"Natural"},network_bicycle:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}}},network_foot:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}}},network_horse:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}}},network_road:{key:"network",type:"networkCombo",label:"Network"},network:{key:"network",type:"text",label:"Network"},note:{key:"note",type:"textarea",universal:true,icon:"note",label:"Note"},office:{key:"office",type:"typeCombo",label:"Type"},oneway_yes:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},oneway:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",placeholder:"Unknown",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},"operator/type":{key:"operator:type",type:"combo",label:"Operator Type",prerequisiteTag:{key:"operator"}},outdoor_seating:{key:"outdoor_seating",type:"check",label:"Outdoor Seating"},par:{key:"par",type:"number",minValue:1,label:"Par",placeholder:"3, 4, 5..."},park_ride:{key:"park_ride",type:"check",label:"Park and Ride"},parking:{key:"parking",type:"combo",label:"Type",strings:{options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}}},payment_multi_fee:{key:"payment:",type:"multiCombo",label:"Payment Types",prerequisiteTag:{key:"fee",valueNot:"no"}},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}}},"piste/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/grooming":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/type":{key:"piste:type",type:"typeCombo",label:"Type",strings:{options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground",connection:"Connection"}}},place:{key:"place",type:"typeCombo",label:"Type"},plant:{key:"plant",type:"combo",label:"Plant"},"plant/output/electricity":{key:"plant:output:electricity",type:"text",label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},playground:{key:"playground",type:"combo",label:"Type"},"playground/baby":{key:"baby",type:"check",label:"Baby Seat"},"playground/max_age":{key:"max_age",type:"number",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,label:"Minimum Age"},polling_station:{key:"polling_station",type:"check",label:"Polling Place"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},preschool:{key:"preschool",type:"check",label:"Preschool"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},"public_bookcase/type":{key:"public_bookcase:type",type:"combo",label:"Type"},railway:{key:"railway",type:"typeCombo",label:"Type"},"railway/position":{key:"railway:position",type:"text",placeholder:"Distance to one decimal (123.4)",label:"Milestone Position"},"railway/signal/direction":{key:"railway:signal:direction",type:"combo",label:"Direction Affected",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},rating:{key:"rating",type:"combo",label:"Power Rating",snake_case:false},recycling_accepts:{key:"recycling:",type:"multiCombo",label:"Accepts"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_room_number:{key:"ref",type:"text",label:"Room Number"},ref_route:{key:"ref",type:"text",label:"Route Number"},ref_runway:{key:"ref",type:"text",label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{key:"ref",type:"text",label:"Stop Number"},ref_taxiway:{key:"ref",type:"text",label:"Taxiway Name",placeholder:"e.g. A5"},ref:{key:"ref",type:"text",label:"Reference Code"},"ref/isil":{key:"ref:isil",type:"text",label:"ISIL Code"},relation:{key:"type",type:"combo",label:"Type"},religion:{key:"religion",type:"combo",label:"Religion"},reservation:{key:"reservation",type:"combo",label:"Reservations",strings:{options:{yes:"Accepted",no:"Not Accepted",required:"Required",recommended:"Recommended"}}},resort:{key:"resort",type:"combo",label:"Type"},resource:{key:"resource",type:"semiCombo",label:"Resources"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},room:{key:"room",type:"combo",label:"Type"},rooms:{key:"rooms",type:"number",minValue:0,label:"Rooms"},route_master:{key:"route_master",type:"combo",label:"Type"},route:{key:"route",type:"combo",label:"Type"},sac_scale:{key:"sac_scale",type:"combo",label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",strings:{options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}}},salt:{key:"salt",type:"check",label:"Salt"},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},screen:{key:"screen",type:"number",label:"Screens",placeholder:"1, 4, 8…",minValue:0},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},self_service:{key:"self_service",type:"check",label:"Self-Service"},service_rail:{key:"service",type:"combo",label:"Service Type",strings:{options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}}},service_times:{key:"service_times",type:"text",label:"Service Times"},service:{key:"service",type:"combo",label:"Type",options:["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{key:"service:bicycle:",type:"multiCombo",label:"Services"},"service/vehicle":{key:"service:vehicle:",type:"multiCombo",label:"Services"},shelter_type:{key:"shelter_type",type:"combo",label:"Type"},shelter:{key:"shelter",type:"check",label:"Shelter"},shop:{key:"shop",type:"typeCombo",label:"Type"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["ice_skating","ice_hockey","multi","curling","ice_stock"]},sport_racing_motor:{key:"sport",type:"semiCombo",label:"Sports",options:["motor","karting","motocross"]},sport_racing_nonmotor:{key:"sport",type:"semiCombo",label:"Sports",options:["bmx","cycling","dog_racing","horse_racing","running"]},sport:{key:"sport",type:"semiCombo",label:"Sports"},stars:{key:"stars",type:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,label:"Number of Steps"},stop:{key:"stop",type:"combo",label:"Stop Type",strings:{options:{all:"All Ways",minor:"Minor Road"}}},street_cabinet:{key:"street_cabinet",type:"combo",label:"Type"},structure_waterway:{type:"structureRadio",keys:["tunnel"],label:"Structure",placeholder:"Unknown",strings:{options:{tunnel:"Tunnel"}}},structure:{type:"structureRadio",keys:["bridge","tunnel","embankment","cutting","ford"],label:"Structure",placeholder:"Unknown",strings:{options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}}},studio:{key:"studio",type:"combo",label:"Type"},substance:{key:"substance",type:"combo",label:"Substance"},substation:{key:"substation",type:"typeCombo",label:"Type"},supervised:{key:"supervised",type:"check",label:"Supervised"},support:{key:"support",type:"combo",label:"Support"},surface:{key:"surface",type:"combo",label:"Surface"},surveillance:{key:"surveillance",type:"combo",label:"Surveillance Kind"},"surveillance/type":{key:"surveillance:type",type:"combo",label:"Surveillance Type",strings:{options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}}},"surveillance/zone":{key:"surveillance:zone",type:"combo",label:"Surveillance Zone"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"switch":{key:"switch",type:"combo",label:"Type",strings:{options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}}},tactile_paving:{key:"tactile_paving",type:"check",label:"Tactile Paving"},takeaway:{key:"takeaway",type:"combo",label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",strings:{options:{yes:"Yes",no:"No",only:"Takeaway Only"}}},target:{key:"target",type:"combo",label:"Target"},tidal:{key:"tidal",type:"check",label:"Tidal"},to:{key:"to",type:"text",label:"To"},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit Latrine",chemical:"Chemical",bucket:"Bucket"}}},"toilets/handwashing":{key:"toilets:handwashing",type:"check",label:"Handwashing"},"toilets/position":{key:"toilets:position",type:"semiCombo",label:"Positions"},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},tourism:{key:"tourism",type:"typeCombo",label:"Type"},"tower/construction":{key:"tower:construction",type:"combo",label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{key:"tower:type",type:"combo",label:"Type"},tracktype:{key:"tracktype",type:"combo",label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",strings:{options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}}},trade:{key:"trade",type:"typeCombo",label:"Type"},traffic_calming:{key:"traffic_calming",type:"typeCombo",label:"Type"},traffic_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction Affected",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction Affected",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},trail_visibility:{key:"trail_visibility",type:"combo",label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",strings:{options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}}},transformer:{key:"transformer",type:"combo",label:"Type",strings:{options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}}},trees:{key:"trees",type:"semiCombo",label:"Trees"},trench:{key:"trench",type:"combo",label:"Type"},trolley_wire:{key:"trolley_wire",type:"check",label:"Overhead Trolley Wires"},tunnel:{key:"tunnel",type:"typeCombo",label:"Type",placeholder:"Default"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},valve:{key:"valve",type:"combo",label:"Type"},vending:{key:"vending",type:"semiCombo",label:"Types of Goods"},visibility:{key:"visibility",type:"combo",label:"Visibility",strings:{options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}}},"volcano/status":{key:"volcano:status",type:"combo",label:"Volcano Status",strings:{options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}}},"volcano/type":{key:"volcano:type",type:"combo",label:"Volcano Type",strings:{options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}}},voltage_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},voltage:{key:"voltage",type:"combo",label:"Voltage"},"voltage/primary":{key:"voltage:primary",type:"combo",label:"Primary Voltage"},"voltage/secondary":{key:"voltage:secondary",type:"combo",label:"Secondary Voltage"},"voltage/tertiary":{key:"voltage:tertiary",type:"combo",label:"Tertiary Voltage"},wall:{key:"wall",type:"combo",label:"Type"},water_point:{key:"water_point",type:"check",label:"Water Point"},water_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"https://example.com",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",keys:["wikidata","wikipedia"],type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{key:"windings:configuration",type:"combo",label:"Windings Configuration",strings:{options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}}};
24885
24886         var quickselect = createCommonjsModule(function (module, exports) {
24887         (function (global, factory) {
24888                  module.exports = factory() ;
24889         }(commonjsGlobal, (function () {
24890         function quickselect(arr, k, left, right, compare) {
24891             quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
24892         }
24893
24894         function quickselectStep(arr, k, left, right, compare) {
24895
24896             while (right > left) {
24897                 if (right - left > 600) {
24898                     var n = right - left + 1;
24899                     var m = k - left + 1;
24900                     var z = Math.log(n);
24901                     var s = 0.5 * Math.exp(2 * z / 3);
24902                     var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24903                     var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24904                     var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24905                     quickselectStep(arr, k, newLeft, newRight, compare);
24906                 }
24907
24908                 var t = arr[k];
24909                 var i = left;
24910                 var j = right;
24911
24912                 swap(arr, left, k);
24913                 if (compare(arr[right], t) > 0) swap(arr, left, right);
24914
24915                 while (i < j) {
24916                     swap(arr, i, j);
24917                     i++;
24918                     j--;
24919                     while (compare(arr[i], t) < 0) i++;
24920                     while (compare(arr[j], t) > 0) j--;
24921                 }
24922
24923                 if (compare(arr[left], t) === 0) swap(arr, left, j);
24924                 else {
24925                     j++;
24926                     swap(arr, j, right);
24927                 }
24928
24929                 if (j <= k) left = j + 1;
24930                 if (k <= j) right = j - 1;
24931             }
24932         }
24933
24934         function swap(arr, i, j) {
24935             var tmp = arr[i];
24936             arr[i] = arr[j];
24937             arr[j] = tmp;
24938         }
24939
24940         function defaultCompare(a, b) {
24941             return a < b ? -1 : a > b ? 1 : 0;
24942         }
24943
24944         return quickselect;
24945
24946         })));
24947         });
24948
24949         var rbush_1 = rbush;
24950         var default_1 = rbush;
24951
24952
24953
24954         function rbush(maxEntries, format) {
24955             if (!(this instanceof rbush)) return new rbush(maxEntries, format);
24956
24957             // max entries in a node is 9 by default; min node fill is 40% for best performance
24958             this._maxEntries = Math.max(4, maxEntries || 9);
24959             this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
24960
24961             if (format) {
24962                 this._initFormat(format);
24963             }
24964
24965             this.clear();
24966         }
24967
24968         rbush.prototype = {
24969
24970             all: function () {
24971                 return this._all(this.data, []);
24972             },
24973
24974             search: function (bbox) {
24975
24976                 var node = this.data,
24977                     result = [],
24978                     toBBox = this.toBBox;
24979
24980                 if (!intersects$1(bbox, node)) return result;
24981
24982                 var nodesToSearch = [],
24983                     i, len, child, childBBox;
24984
24985                 while (node) {
24986                     for (i = 0, len = node.children.length; i < len; i++) {
24987
24988                         child = node.children[i];
24989                         childBBox = node.leaf ? toBBox(child) : child;
24990
24991                         if (intersects$1(bbox, childBBox)) {
24992                             if (node.leaf) result.push(child);
24993                             else if (contains$4(bbox, childBBox)) this._all(child, result);
24994                             else nodesToSearch.push(child);
24995                         }
24996                     }
24997                     node = nodesToSearch.pop();
24998                 }
24999
25000                 return result;
25001             },
25002
25003             collides: function (bbox) {
25004
25005                 var node = this.data,
25006                     toBBox = this.toBBox;
25007
25008                 if (!intersects$1(bbox, node)) return false;
25009
25010                 var nodesToSearch = [],
25011                     i, len, child, childBBox;
25012
25013                 while (node) {
25014                     for (i = 0, len = node.children.length; i < len; i++) {
25015
25016                         child = node.children[i];
25017                         childBBox = node.leaf ? toBBox(child) : child;
25018
25019                         if (intersects$1(bbox, childBBox)) {
25020                             if (node.leaf || contains$4(bbox, childBBox)) return true;
25021                             nodesToSearch.push(child);
25022                         }
25023                     }
25024                     node = nodesToSearch.pop();
25025                 }
25026
25027                 return false;
25028             },
25029
25030             load: function (data) {
25031                 if (!(data && data.length)) return this;
25032
25033                 if (data.length < this._minEntries) {
25034                     for (var i = 0, len = data.length; i < len; i++) {
25035                         this.insert(data[i]);
25036                     }
25037                     return this;
25038                 }
25039
25040                 // recursively build the tree with the given data from scratch using OMT algorithm
25041                 var node = this._build(data.slice(), 0, data.length - 1, 0);
25042
25043                 if (!this.data.children.length) {
25044                     // save as is if tree is empty
25045                     this.data = node;
25046
25047                 } else if (this.data.height === node.height) {
25048                     // split root if trees have the same height
25049                     this._splitRoot(this.data, node);
25050
25051                 } else {
25052                     if (this.data.height < node.height) {
25053                         // swap trees if inserted one is bigger
25054                         var tmpNode = this.data;
25055                         this.data = node;
25056                         node = tmpNode;
25057                     }
25058
25059                     // insert the small tree into the large tree at appropriate level
25060                     this._insert(node, this.data.height - node.height - 1, true);
25061                 }
25062
25063                 return this;
25064             },
25065
25066             insert: function (item) {
25067                 if (item) this._insert(item, this.data.height - 1);
25068                 return this;
25069             },
25070
25071             clear: function () {
25072                 this.data = createNode([]);
25073                 return this;
25074             },
25075
25076             remove: function (item, equalsFn) {
25077                 if (!item) return this;
25078
25079                 var node = this.data,
25080                     bbox = this.toBBox(item),
25081                     path = [],
25082                     indexes = [],
25083                     i, parent, index, goingUp;
25084
25085                 // depth-first iterative tree traversal
25086                 while (node || path.length) {
25087
25088                     if (!node) { // go up
25089                         node = path.pop();
25090                         parent = path[path.length - 1];
25091                         i = indexes.pop();
25092                         goingUp = true;
25093                     }
25094
25095                     if (node.leaf) { // check current node
25096                         index = findItem(item, node.children, equalsFn);
25097
25098                         if (index !== -1) {
25099                             // item found, remove the item and condense tree upwards
25100                             node.children.splice(index, 1);
25101                             path.push(node);
25102                             this._condense(path);
25103                             return this;
25104                         }
25105                     }
25106
25107                     if (!goingUp && !node.leaf && contains$4(node, bbox)) { // go down
25108                         path.push(node);
25109                         indexes.push(i);
25110                         i = 0;
25111                         parent = node;
25112                         node = node.children[0];
25113
25114                     } else if (parent) { // go right
25115                         i++;
25116                         node = parent.children[i];
25117                         goingUp = false;
25118
25119                     } else node = null; // nothing found
25120                 }
25121
25122                 return this;
25123             },
25124
25125             toBBox: function (item) { return item; },
25126
25127             compareMinX: compareNodeMinX,
25128             compareMinY: compareNodeMinY,
25129
25130             toJSON: function () { return this.data; },
25131
25132             fromJSON: function (data) {
25133                 this.data = data;
25134                 return this;
25135             },
25136
25137             _all: function (node, result) {
25138                 var nodesToSearch = [];
25139                 while (node) {
25140                     if (node.leaf) result.push.apply(result, node.children);
25141                     else nodesToSearch.push.apply(nodesToSearch, node.children);
25142
25143                     node = nodesToSearch.pop();
25144                 }
25145                 return result;
25146             },
25147
25148             _build: function (items, left, right, height) {
25149
25150                 var N = right - left + 1,
25151                     M = this._maxEntries,
25152                     node;
25153
25154                 if (N <= M) {
25155                     // reached leaf level; return leaf
25156                     node = createNode(items.slice(left, right + 1));
25157                     calcBBox(node, this.toBBox);
25158                     return node;
25159                 }
25160
25161                 if (!height) {
25162                     // target height of the bulk-loaded tree
25163                     height = Math.ceil(Math.log(N) / Math.log(M));
25164
25165                     // target number of root entries to maximize storage utilization
25166                     M = Math.ceil(N / Math.pow(M, height - 1));
25167                 }
25168
25169                 node = createNode([]);
25170                 node.leaf = false;
25171                 node.height = height;
25172
25173                 // split the items into M mostly square tiles
25174
25175                 var N2 = Math.ceil(N / M),
25176                     N1 = N2 * Math.ceil(Math.sqrt(M)),
25177                     i, j, right2, right3;
25178
25179                 multiSelect(items, left, right, N1, this.compareMinX);
25180
25181                 for (i = left; i <= right; i += N1) {
25182
25183                     right2 = Math.min(i + N1 - 1, right);
25184
25185                     multiSelect(items, i, right2, N2, this.compareMinY);
25186
25187                     for (j = i; j <= right2; j += N2) {
25188
25189                         right3 = Math.min(j + N2 - 1, right2);
25190
25191                         // pack each entry recursively
25192                         node.children.push(this._build(items, j, right3, height - 1));
25193                     }
25194                 }
25195
25196                 calcBBox(node, this.toBBox);
25197
25198                 return node;
25199             },
25200
25201             _chooseSubtree: function (bbox, node, level, path) {
25202
25203                 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
25204
25205                 while (true) {
25206                     path.push(node);
25207
25208                     if (node.leaf || path.length - 1 === level) break;
25209
25210                     minArea = minEnlargement = Infinity;
25211
25212                     for (i = 0, len = node.children.length; i < len; i++) {
25213                         child = node.children[i];
25214                         area = bboxArea(child);
25215                         enlargement = enlargedArea(bbox, child) - area;
25216
25217                         // choose entry with the least area enlargement
25218                         if (enlargement < minEnlargement) {
25219                             minEnlargement = enlargement;
25220                             minArea = area < minArea ? area : minArea;
25221                             targetNode = child;
25222
25223                         } else if (enlargement === minEnlargement) {
25224                             // otherwise choose one with the smallest area
25225                             if (area < minArea) {
25226                                 minArea = area;
25227                                 targetNode = child;
25228                             }
25229                         }
25230                     }
25231
25232                     node = targetNode || node.children[0];
25233                 }
25234
25235                 return node;
25236             },
25237
25238             _insert: function (item, level, isNode) {
25239
25240                 var toBBox = this.toBBox,
25241                     bbox = isNode ? item : toBBox(item),
25242                     insertPath = [];
25243
25244                 // find the best node for accommodating the item, saving all nodes along the path too
25245                 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
25246
25247                 // put the item into the node
25248                 node.children.push(item);
25249                 extend$1(node, bbox);
25250
25251                 // split on node overflow; propagate upwards if necessary
25252                 while (level >= 0) {
25253                     if (insertPath[level].children.length > this._maxEntries) {
25254                         this._split(insertPath, level);
25255                         level--;
25256                     } else break;
25257                 }
25258
25259                 // adjust bboxes along the insertion path
25260                 this._adjustParentBBoxes(bbox, insertPath, level);
25261             },
25262
25263             // split overflowed node into two
25264             _split: function (insertPath, level) {
25265
25266                 var node = insertPath[level],
25267                     M = node.children.length,
25268                     m = this._minEntries;
25269
25270                 this._chooseSplitAxis(node, m, M);
25271
25272                 var splitIndex = this._chooseSplitIndex(node, m, M);
25273
25274                 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
25275                 newNode.height = node.height;
25276                 newNode.leaf = node.leaf;
25277
25278                 calcBBox(node, this.toBBox);
25279                 calcBBox(newNode, this.toBBox);
25280
25281                 if (level) insertPath[level - 1].children.push(newNode);
25282                 else this._splitRoot(node, newNode);
25283             },
25284
25285             _splitRoot: function (node, newNode) {
25286                 // split root node
25287                 this.data = createNode([node, newNode]);
25288                 this.data.height = node.height + 1;
25289                 this.data.leaf = false;
25290                 calcBBox(this.data, this.toBBox);
25291             },
25292
25293             _chooseSplitIndex: function (node, m, M) {
25294
25295                 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
25296
25297                 minOverlap = minArea = Infinity;
25298
25299                 for (i = m; i <= M - m; i++) {
25300                     bbox1 = distBBox(node, 0, i, this.toBBox);
25301                     bbox2 = distBBox(node, i, M, this.toBBox);
25302
25303                     overlap = intersectionArea(bbox1, bbox2);
25304                     area = bboxArea(bbox1) + bboxArea(bbox2);
25305
25306                     // choose distribution with minimum overlap
25307                     if (overlap < minOverlap) {
25308                         minOverlap = overlap;
25309                         index = i;
25310
25311                         minArea = area < minArea ? area : minArea;
25312
25313                     } else if (overlap === minOverlap) {
25314                         // otherwise choose distribution with minimum area
25315                         if (area < minArea) {
25316                             minArea = area;
25317                             index = i;
25318                         }
25319                     }
25320                 }
25321
25322                 return index;
25323             },
25324
25325             // sorts node children by the best axis for split
25326             _chooseSplitAxis: function (node, m, M) {
25327
25328                 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
25329                     compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
25330                     xMargin = this._allDistMargin(node, m, M, compareMinX),
25331                     yMargin = this._allDistMargin(node, m, M, compareMinY);
25332
25333                 // if total distributions margin value is minimal for x, sort by minX,
25334                 // otherwise it's already sorted by minY
25335                 if (xMargin < yMargin) node.children.sort(compareMinX);
25336             },
25337
25338             // total margin of all possible split distributions where each node is at least m full
25339             _allDistMargin: function (node, m, M, compare) {
25340
25341                 node.children.sort(compare);
25342
25343                 var toBBox = this.toBBox,
25344                     leftBBox = distBBox(node, 0, m, toBBox),
25345                     rightBBox = distBBox(node, M - m, M, toBBox),
25346                     margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
25347                     i, child;
25348
25349                 for (i = m; i < M - m; i++) {
25350                     child = node.children[i];
25351                     extend$1(leftBBox, node.leaf ? toBBox(child) : child);
25352                     margin += bboxMargin(leftBBox);
25353                 }
25354
25355                 for (i = M - m - 1; i >= m; i--) {
25356                     child = node.children[i];
25357                     extend$1(rightBBox, node.leaf ? toBBox(child) : child);
25358                     margin += bboxMargin(rightBBox);
25359                 }
25360
25361                 return margin;
25362             },
25363
25364             _adjustParentBBoxes: function (bbox, path, level) {
25365                 // adjust bboxes along the given tree path
25366                 for (var i = level; i >= 0; i--) {
25367                     extend$1(path[i], bbox);
25368                 }
25369             },
25370
25371             _condense: function (path) {
25372                 // go through the path, removing empty nodes and updating bboxes
25373                 for (var i = path.length - 1, siblings; i >= 0; i--) {
25374                     if (path[i].children.length === 0) {
25375                         if (i > 0) {
25376                             siblings = path[i - 1].children;
25377                             siblings.splice(siblings.indexOf(path[i]), 1);
25378
25379                         } else this.clear();
25380
25381                     } else calcBBox(path[i], this.toBBox);
25382                 }
25383             },
25384
25385             _initFormat: function (format) {
25386                 // data format (minX, minY, maxX, maxY accessors)
25387
25388                 // uses eval-type function compilation instead of just accepting a toBBox function
25389                 // because the algorithms are very sensitive to sorting functions performance,
25390                 // so they should be dead simple and without inner calls
25391
25392                 var compareArr = ['return a', ' - b', ';'];
25393
25394                 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
25395                 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
25396
25397                 this.toBBox = new Function('a',
25398                     'return {minX: a' + format[0] +
25399                     ', minY: a' + format[1] +
25400                     ', maxX: a' + format[2] +
25401                     ', maxY: a' + format[3] + '};');
25402             }
25403         };
25404
25405         function findItem(item, items, equalsFn) {
25406             if (!equalsFn) return items.indexOf(item);
25407
25408             for (var i = 0; i < items.length; i++) {
25409                 if (equalsFn(item, items[i])) return i;
25410             }
25411             return -1;
25412         }
25413
25414         // calculate node's bbox from bboxes of its children
25415         function calcBBox(node, toBBox) {
25416             distBBox(node, 0, node.children.length, toBBox, node);
25417         }
25418
25419         // min bounding rectangle of node children from k to p-1
25420         function distBBox(node, k, p, toBBox, destNode) {
25421             if (!destNode) destNode = createNode(null);
25422             destNode.minX = Infinity;
25423             destNode.minY = Infinity;
25424             destNode.maxX = -Infinity;
25425             destNode.maxY = -Infinity;
25426
25427             for (var i = k, child; i < p; i++) {
25428                 child = node.children[i];
25429                 extend$1(destNode, node.leaf ? toBBox(child) : child);
25430             }
25431
25432             return destNode;
25433         }
25434
25435         function extend$1(a, b) {
25436             a.minX = Math.min(a.minX, b.minX);
25437             a.minY = Math.min(a.minY, b.minY);
25438             a.maxX = Math.max(a.maxX, b.maxX);
25439             a.maxY = Math.max(a.maxY, b.maxY);
25440             return a;
25441         }
25442
25443         function compareNodeMinX(a, b) { return a.minX - b.minX; }
25444         function compareNodeMinY(a, b) { return a.minY - b.minY; }
25445
25446         function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
25447         function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
25448
25449         function enlargedArea(a, b) {
25450             return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
25451                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
25452         }
25453
25454         function intersectionArea(a, b) {
25455             var minX = Math.max(a.minX, b.minX),
25456                 minY = Math.max(a.minY, b.minY),
25457                 maxX = Math.min(a.maxX, b.maxX),
25458                 maxY = Math.min(a.maxY, b.maxY);
25459
25460             return Math.max(0, maxX - minX) *
25461                    Math.max(0, maxY - minY);
25462         }
25463
25464         function contains$4(a, b) {
25465             return a.minX <= b.minX &&
25466                    a.minY <= b.minY &&
25467                    b.maxX <= a.maxX &&
25468                    b.maxY <= a.maxY;
25469         }
25470
25471         function intersects$1(a, b) {
25472             return b.minX <= a.maxX &&
25473                    b.minY <= a.maxY &&
25474                    b.maxX >= a.minX &&
25475                    b.maxY >= a.minY;
25476         }
25477
25478         function createNode(children) {
25479             return {
25480                 children: children,
25481                 height: 1,
25482                 leaf: true,
25483                 minX: Infinity,
25484                 minY: Infinity,
25485                 maxX: -Infinity,
25486                 maxY: -Infinity
25487             };
25488         }
25489
25490         // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
25491         // combines selection algorithm with binary divide & conquer approach
25492
25493         function multiSelect(arr, left, right, n, compare) {
25494             var stack = [left, right],
25495                 mid;
25496
25497             while (stack.length) {
25498                 right = stack.pop();
25499                 left = stack.pop();
25500
25501                 if (right - left <= n) continue;
25502
25503                 mid = left + Math.ceil((right - left) / n / 2) * n;
25504                 quickselect(arr, mid, left, right, compare);
25505
25506                 stack.push(left, mid, mid, right);
25507             }
25508         }
25509         rbush_1.default = default_1;
25510
25511         var lineclip_1 = lineclip;
25512
25513         lineclip.polyline = lineclip;
25514         lineclip.polygon = polygonclip;
25515
25516
25517         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
25518         // handle polylines rather than just segments
25519
25520         function lineclip(points, bbox, result) {
25521
25522             var len = points.length,
25523                 codeA = bitCode(points[0], bbox),
25524                 part = [],
25525                 i, a, b, codeB, lastCode;
25526
25527             if (!result) result = [];
25528
25529             for (i = 1; i < len; i++) {
25530                 a = points[i - 1];
25531                 b = points[i];
25532                 codeB = lastCode = bitCode(b, bbox);
25533
25534                 while (true) {
25535
25536                     if (!(codeA | codeB)) { // accept
25537                         part.push(a);
25538
25539                         if (codeB !== lastCode) { // segment went outside
25540                             part.push(b);
25541
25542                             if (i < len - 1) { // start a new line
25543                                 result.push(part);
25544                                 part = [];
25545                             }
25546                         } else if (i === len - 1) {
25547                             part.push(b);
25548                         }
25549                         break;
25550
25551                     } else if (codeA & codeB) { // trivial reject
25552                         break;
25553
25554                     } else if (codeA) { // a outside, intersect with clip edge
25555                         a = intersect$1(a, b, codeA, bbox);
25556                         codeA = bitCode(a, bbox);
25557
25558                     } else { // b outside
25559                         b = intersect$1(a, b, codeB, bbox);
25560                         codeB = bitCode(b, bbox);
25561                     }
25562                 }
25563
25564                 codeA = lastCode;
25565             }
25566
25567             if (part.length) result.push(part);
25568
25569             return result;
25570         }
25571
25572         // Sutherland-Hodgeman polygon clipping algorithm
25573
25574         function polygonclip(points, bbox) {
25575
25576             var result, edge, prev, prevInside, i, p, inside;
25577
25578             // clip against each side of the clip rectangle
25579             for (edge = 1; edge <= 8; edge *= 2) {
25580                 result = [];
25581                 prev = points[points.length - 1];
25582                 prevInside = !(bitCode(prev, bbox) & edge);
25583
25584                 for (i = 0; i < points.length; i++) {
25585                     p = points[i];
25586                     inside = !(bitCode(p, bbox) & edge);
25587
25588                     // if segment goes through the clip window, add an intersection
25589                     if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
25590
25591                     if (inside) result.push(p); // add a point if it's inside
25592
25593                     prev = p;
25594                     prevInside = inside;
25595                 }
25596
25597                 points = result;
25598
25599                 if (!points.length) break;
25600             }
25601
25602             return result;
25603         }
25604
25605         // intersect a segment against one of the 4 lines that make up the bbox
25606
25607         function intersect$1(a, b, edge, bbox) {
25608             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
25609                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
25610                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
25611                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
25612                    null;
25613         }
25614
25615         // bit code reflects the point position relative to the bbox:
25616
25617         //         left  mid  right
25618         //    top  1001  1000  1010
25619         //    mid  0001  0000  0010
25620         // bottom  0101  0100  0110
25621
25622         function bitCode(p, bbox) {
25623             var code = 0;
25624
25625             if (p[0] < bbox[0]) code |= 1; // left
25626             else if (p[0] > bbox[2]) code |= 2; // right
25627
25628             if (p[1] < bbox[1]) code |= 4; // bottom
25629             else if (p[1] > bbox[3]) code |= 8; // top
25630
25631             return code;
25632         }
25633
25634         var whichPolygon_1 = whichPolygon;
25635
25636         function whichPolygon(data) {
25637             var bboxes = [];
25638             for (var i = 0; i < data.features.length; i++) {
25639                 var feature = data.features[i];
25640                 var coords = feature.geometry.coordinates;
25641
25642                 if (feature.geometry.type === 'Polygon') {
25643                     bboxes.push(treeItem(coords, feature.properties));
25644
25645                 } else if (feature.geometry.type === 'MultiPolygon') {
25646                     for (var j = 0; j < coords.length; j++) {
25647                         bboxes.push(treeItem(coords[j], feature.properties));
25648                     }
25649                 }
25650             }
25651
25652             var tree = rbush_1().load(bboxes);
25653
25654             function query(p, multi) {
25655                 var output = [],
25656                     result = tree.search({
25657                         minX: p[0],
25658                         minY: p[1],
25659                         maxX: p[0],
25660                         maxY: p[1]
25661                     });
25662                 for (var i = 0; i < result.length; i++) {
25663                     if (insidePolygon(result[i].coords, p)) {
25664                         if (multi)
25665                             output.push(result[i].props);
25666                         else
25667                             return result[i].props;
25668                     }
25669                 }
25670                 return multi && output.length ? output : null;
25671             }
25672
25673             query.tree = tree;
25674             query.bbox = function queryBBox(bbox) {
25675                 var output = [];
25676                 var result = tree.search({
25677                     minX: bbox[0],
25678                     minY: bbox[1],
25679                     maxX: bbox[2],
25680                     maxY: bbox[3]
25681                 });
25682                 for (var i = 0; i < result.length; i++) {
25683                     if (polygonIntersectsBBox(result[i].coords, bbox)) {
25684                         output.push(result[i].props);
25685                     }
25686                 }
25687                 return output;
25688             };
25689
25690             return query;
25691         }
25692
25693         function polygonIntersectsBBox(polygon, bbox) {
25694             var bboxCenter = [
25695                 (bbox[0] + bbox[2]) / 2,
25696                 (bbox[1] + bbox[3]) / 2
25697             ];
25698             if (insidePolygon(polygon, bboxCenter)) return true;
25699             for (var i = 0; i < polygon.length; i++) {
25700                 if (lineclip_1(polygon[i], bbox).length > 0) return true;
25701             }
25702             return false;
25703         }
25704
25705         // ray casting algorithm for detecting if point is in polygon
25706         function insidePolygon(rings, p) {
25707             var inside = false;
25708             for (var i = 0, len = rings.length; i < len; i++) {
25709                 var ring = rings[i];
25710                 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
25711                     if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
25712                 }
25713             }
25714             return inside;
25715         }
25716
25717         function rayIntersect(p, p1, p2) {
25718             return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
25719         }
25720
25721         function treeItem(coords, props) {
25722             var item = {
25723                 minX: Infinity,
25724                 minY: Infinity,
25725                 maxX: -Infinity,
25726                 maxY: -Infinity,
25727                 coords: coords,
25728                 props: props
25729             };
25730
25731             for (var i = 0; i < coords[0].length; i++) {
25732                 var p = coords[0][i];
25733                 item.minX = Math.min(item.minX, p[0]);
25734                 item.minY = Math.min(item.minY, p[1]);
25735                 item.maxX = Math.max(item.maxX, p[0]);
25736                 item.maxY = Math.max(item.maxY, p[1]);
25737             }
25738             return item;
25739         }
25740
25741         // index the osm-community-index
25742         var ociFeatureCollection = Object.values(features$3).map(function(feature) {
25743             // workaround for which-polygon: only supports `properties`, not `id`
25744             // https://github.com/mapbox/which-polygon/pull/6
25745             feature.properties = {
25746                 id: feature.id,
25747                 area: d3_geoArea(feature)   // also precompute areas
25748             };
25749             return feature;
25750         });
25751
25752
25753         var data = {
25754             community: {
25755                 features: features$3,
25756                 resources: resources,
25757                 query: whichPolygon_1({
25758                     type: 'FeatureCollection',
25759                     features: ociFeatureCollection
25760                 })
25761             },
25762             imagery: dataImagery,  //legacy
25763             presets: {
25764                 presets: presets,
25765                 defaults: defaults,
25766                 categories: categories,
25767                 fields: fields
25768             }
25769         };
25770
25771         // http://2ality.com/2015/01/es6-set-operations.html
25772
25773         // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
25774         // This operation is also sometimes called minus (-).
25775         // var a = [1,2,3];
25776         // var b = [4,3,2];
25777         // utilArrayDifference(a, b)
25778         //   [1]
25779         // utilArrayDifference(b, a)
25780         //   [4]
25781         function utilArrayDifference(a, b) {
25782             var other = new Set(b);
25783             return Array.from(new Set(a))
25784                 .filter(function(v) { return !other.has(v); });
25785         }
25786
25787         // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
25788         // var a = [1,2,3];
25789         // var b = [4,3,2];
25790         // utilArrayIntersection(a, b)
25791         //   [2,3]
25792         function utilArrayIntersection(a, b) {
25793             var other = new Set(b);
25794             return Array.from(new Set(a))
25795                 .filter(function(v) { return other.has(v); });
25796         }
25797
25798         // Union (a ∪ b): create a set that contains the elements of both set a and set b.
25799         // var a = [1,2,3];
25800         // var b = [4,3,2];
25801         // utilArrayUnion(a, b)
25802         //   [1,2,3,4]
25803         function utilArrayUnion(a, b) {
25804             var result = new Set(a);
25805             b.forEach(function(v) { result.add(v); });
25806             return Array.from(result);
25807         }
25808
25809         // Returns an Array with all the duplicates removed
25810         // var a = [1,1,2,3,3];
25811         // utilArrayUniq(a)
25812         //   [1,2,3]
25813         function utilArrayUniq(a) {
25814             return Array.from(new Set(a));
25815         }
25816
25817
25818         // Splits array into chunks of given chunk size
25819         // var a = [1,2,3,4,5,6,7];
25820         // utilArrayChunk(a, 3);
25821         //   [[1,2,3],[4,5,6],[7]];
25822         function utilArrayChunk(a, chunkSize) {
25823             if (!chunkSize || chunkSize < 0) return [a.slice()];
25824
25825             var result = new Array(Math.ceil(a.length / chunkSize));
25826             return Array.from(result, function(item, i) {
25827                 return a.slice(i * chunkSize, i * chunkSize + chunkSize);
25828             });
25829         }
25830
25831
25832         // Flattens two level array into a single level
25833         // var a = [[1,2,3],[4,5,6],[7]];
25834         // utilArrayFlatten(a);
25835         //   [1,2,3,4,5,6,7];
25836         function utilArrayFlatten(a) {
25837             return a.reduce(function(acc, val) {
25838                 return acc.concat(val);
25839             }, []);
25840         }
25841
25842
25843         // Groups the items of the Array according to the given key
25844         // `key` can be passed as a property or as a key function
25845         //
25846         // var pets = [
25847         //     { type: 'Dog', name: 'Spot' },
25848         //     { type: 'Cat', name: 'Tiger' },
25849         //     { type: 'Dog', name: 'Rover' },
25850         //     { type: 'Cat', name: 'Leo' }
25851         // ];
25852         //
25853         // utilArrayGroupBy(pets, 'type')
25854         //   {
25855         //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
25856         //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
25857         //   }
25858         //
25859         // utilArrayGroupBy(pets, function(item) { return item.name.length; })
25860         //   {
25861         //     3: [{type: 'Cat', name: 'Leo'}],
25862         //     4: [{type: 'Dog', name: 'Spot'}],
25863         //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
25864         //   }
25865         function utilArrayGroupBy(a, key) {
25866             return a.reduce(function(acc, item) {
25867                 var group = (typeof key === 'function') ? key(item) : item[key];
25868                 (acc[group] = acc[group] || []).push(item);
25869                 return acc;
25870             }, {});
25871         }
25872
25873
25874         // Returns an Array with all the duplicates removed
25875         // where uniqueness determined by the given key
25876         // `key` can be passed as a property or as a key function
25877         //
25878         // var pets = [
25879         //     { type: 'Dog', name: 'Spot' },
25880         //     { type: 'Cat', name: 'Tiger' },
25881         //     { type: 'Dog', name: 'Rover' },
25882         //     { type: 'Cat', name: 'Leo' }
25883         // ];
25884         //
25885         // utilArrayUniqBy(pets, 'type')
25886         //   [
25887         //     { type: 'Dog', name: 'Spot' },
25888         //     { type: 'Cat', name: 'Tiger' }
25889         //   ]
25890         //
25891         // utilArrayUniqBy(pets, function(item) { return item.name.length; })
25892         //   [
25893         //     { type: 'Dog', name: 'Spot' },
25894         //     { type: 'Cat', name: 'Tiger' },
25895         //     { type: 'Cat', name: 'Leo' }
25896         //   }
25897         function utilArrayUniqBy(a, key) {
25898             var seen = new Set();
25899             return a.reduce(function(acc, item) {
25900                 var val = (typeof key === 'function') ? key(item) : item[key];
25901                 if (val && !seen.has(val)) {
25902                     seen.add(val);
25903                     acc.push(item);
25904                 }
25905                 return acc;
25906             }, []);
25907         }
25908
25909         var remove$1 = removeDiacritics;
25910
25911         var replacementList = [
25912           {
25913             base: ' ',
25914             chars: "\u00A0",
25915           }, {
25916             base: '0',
25917             chars: "\u07C0",
25918           }, {
25919             base: 'A',
25920             chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
25921           }, {
25922             base: 'AA',
25923             chars: "\uA732",
25924           }, {
25925             base: 'AE',
25926             chars: "\u00C6\u01FC\u01E2",
25927           }, {
25928             base: 'AO',
25929             chars: "\uA734",
25930           }, {
25931             base: 'AU',
25932             chars: "\uA736",
25933           }, {
25934             base: 'AV',
25935             chars: "\uA738\uA73A",
25936           }, {
25937             base: 'AY',
25938             chars: "\uA73C",
25939           }, {
25940             base: 'B',
25941             chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
25942           }, {
25943             base: 'C',
25944             chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
25945           }, {
25946             base: 'D',
25947             chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
25948           }, {
25949             base: 'Dh',
25950             chars: "\u00D0",
25951           }, {
25952             base: 'DZ',
25953             chars: "\u01F1\u01C4",
25954           }, {
25955             base: 'Dz',
25956             chars: "\u01F2\u01C5",
25957           }, {
25958             base: 'E',
25959             chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
25960           }, {
25961             base: 'F',
25962             chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
25963           }, {
25964             base: 'G',
25965             chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
25966           }, {
25967             base: 'H',
25968             chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
25969           }, {
25970             base: 'I',
25971             chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
25972           }, {
25973             base: 'J',
25974             chars: "\u24BF\uFF2A\u0134\u0248\u0237",
25975           }, {
25976             base: 'K',
25977             chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
25978           }, {
25979             base: 'L',
25980             chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
25981           }, {
25982             base: 'LJ',
25983             chars: "\u01C7",
25984           }, {
25985             base: 'Lj',
25986             chars: "\u01C8",
25987           }, {
25988             base: 'M',
25989             chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
25990           }, {
25991             base: 'N',
25992             chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
25993           }, {
25994             base: 'NJ',
25995             chars: "\u01CA",
25996           }, {
25997             base: 'Nj',
25998             chars: "\u01CB",
25999           }, {
26000             base: 'O',
26001             chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
26002           }, {
26003             base: 'OE',
26004             chars: "\u0152",
26005           }, {
26006             base: 'OI',
26007             chars: "\u01A2",
26008           }, {
26009             base: 'OO',
26010             chars: "\uA74E",
26011           }, {
26012             base: 'OU',
26013             chars: "\u0222",
26014           }, {
26015             base: 'P',
26016             chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
26017           }, {
26018             base: 'Q',
26019             chars: "\u24C6\uFF31\uA756\uA758\u024A",
26020           }, {
26021             base: 'R',
26022             chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
26023           }, {
26024             base: 'S',
26025             chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
26026           }, {
26027             base: 'T',
26028             chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
26029           }, {
26030             base: 'Th',
26031             chars: "\u00DE",
26032           }, {
26033             base: 'TZ',
26034             chars: "\uA728",
26035           }, {
26036             base: 'U',
26037             chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
26038           }, {
26039             base: 'V',
26040             chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
26041           }, {
26042             base: 'VY',
26043             chars: "\uA760",
26044           }, {
26045             base: 'W',
26046             chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
26047           }, {
26048             base: 'X',
26049             chars: "\u24CD\uFF38\u1E8A\u1E8C",
26050           }, {
26051             base: 'Y',
26052             chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
26053           }, {
26054             base: 'Z',
26055             chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
26056           }, {
26057             base: 'a',
26058             chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
26059           }, {
26060             base: 'aa',
26061             chars: "\uA733",
26062           }, {
26063             base: 'ae',
26064             chars: "\u00E6\u01FD\u01E3",
26065           }, {
26066             base: 'ao',
26067             chars: "\uA735",
26068           }, {
26069             base: 'au',
26070             chars: "\uA737",
26071           }, {
26072             base: 'av',
26073             chars: "\uA739\uA73B",
26074           }, {
26075             base: 'ay',
26076             chars: "\uA73D",
26077           }, {
26078             base: 'b',
26079             chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
26080           }, {
26081             base: 'c',
26082             chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
26083           }, {
26084             base: 'd',
26085             chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
26086           }, {
26087             base: 'dh',
26088             chars: "\u00F0",
26089           }, {
26090             base: 'dz',
26091             chars: "\u01F3\u01C6",
26092           }, {
26093             base: 'e',
26094             chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
26095           }, {
26096             base: 'f',
26097             chars: "\u24D5\uFF46\u1E1F\u0192",
26098           }, {
26099             base: 'ff',
26100             chars: "\uFB00",
26101           }, {
26102             base: 'fi',
26103             chars: "\uFB01",
26104           }, {
26105             base: 'fl',
26106             chars: "\uFB02",
26107           }, {
26108             base: 'ffi',
26109             chars: "\uFB03",
26110           }, {
26111             base: 'ffl',
26112             chars: "\uFB04",
26113           }, {
26114             base: 'g',
26115             chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
26116           }, {
26117             base: 'h',
26118             chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
26119           }, {
26120             base: 'hv',
26121             chars: "\u0195",
26122           }, {
26123             base: 'i',
26124             chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
26125           }, {
26126             base: 'j',
26127             chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
26128           }, {
26129             base: 'k',
26130             chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
26131           }, {
26132             base: 'l',
26133             chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
26134           }, {
26135             base: 'lj',
26136             chars: "\u01C9",
26137           }, {
26138             base: 'm',
26139             chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
26140           }, {
26141             base: 'n',
26142             chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
26143           }, {
26144             base: 'nj',
26145             chars: "\u01CC",
26146           }, {
26147             base: 'o',
26148             chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
26149           }, {
26150             base: 'oe',
26151             chars: "\u0153",
26152           }, {
26153             base: 'oi',
26154             chars: "\u01A3",
26155           }, {
26156             base: 'oo',
26157             chars: "\uA74F",
26158           }, {
26159             base: 'ou',
26160             chars: "\u0223",
26161           }, {
26162             base: 'p',
26163             chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
26164           }, {
26165             base: 'q',
26166             chars: "\u24E0\uFF51\u024B\uA757\uA759",
26167           }, {
26168             base: 'r',
26169             chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
26170           }, {
26171             base: 's',
26172             chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
26173           }, {
26174             base: 'ss',
26175             chars: "\xDF",
26176           }, {
26177             base: 't',
26178             chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
26179           }, {
26180             base: 'th',
26181             chars: "\u00FE",
26182           }, {
26183             base: 'tz',
26184             chars: "\uA729",
26185           }, {
26186             base: 'u',
26187             chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
26188           }, {
26189             base: 'v',
26190             chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26191           }, {
26192             base: 'vy',
26193             chars: "\uA761",
26194           }, {
26195             base: 'w',
26196             chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26197           }, {
26198             base: 'x',
26199             chars: "\u24E7\uFF58\u1E8B\u1E8D",
26200           }, {
26201             base: 'y',
26202             chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26203           }, {
26204             base: 'z',
26205             chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26206           }
26207         ];
26208
26209         var diacriticsMap = {};
26210         for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
26211           var chars = replacementList[i$1].chars;
26212           for (var j = 0; j < chars.length; j += 1) {
26213             diacriticsMap[chars[j]] = replacementList[i$1].base;
26214           }
26215         }
26216
26217         function removeDiacritics(str) {
26218           return str.replace(/[^\u0000-\u007e]/g, function(c) {
26219             return diacriticsMap[c] || c;
26220           });
26221         }
26222
26223         var replacementList_1 = replacementList;
26224         var diacriticsMap_1 = diacriticsMap;
26225
26226         var diacritics = {
26227                 remove: remove$1,
26228                 replacementList: replacementList_1,
26229                 diacriticsMap: diacriticsMap_1
26230         };
26231
26232         var isArabic_1 = createCommonjsModule(function (module, exports) {
26233         Object.defineProperty(exports, "__esModule", { value: true });
26234         var arabicBlocks = [
26235             [0x0600, 0x06FF],
26236             [0x0750, 0x077F],
26237             [0x08A0, 0x08FF],
26238             [0xFB50, 0xFDFF],
26239             [0xFE70, 0xFEFF],
26240             [0x10E60, 0x10E7F],
26241             [0x1EC70, 0x1ECBF],
26242             [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
26243         ];
26244         function isArabic(char) {
26245             if (char.length > 1) {
26246                 // allow the newer chars?
26247                 throw new Error('isArabic works on only one-character strings');
26248             }
26249             var code = char.charCodeAt(0);
26250             for (var i = 0; i < arabicBlocks.length; i++) {
26251                 var block = arabicBlocks[i];
26252                 if (code >= block[0] && code <= block[1]) {
26253                     return true;
26254                 }
26255             }
26256             return false;
26257         }
26258         exports.isArabic = isArabic;
26259         function isMath(char) {
26260             if (char.length > 2) {
26261                 // allow the newer chars?
26262                 throw new Error('isMath works on only one-character strings');
26263             }
26264             var code = char.charCodeAt(0);
26265             return ((code >= 0x660 && code <= 0x66C) || (code >= 0x6F0 && code <= 0x6F9));
26266         }
26267         exports.isMath = isMath;
26268         });
26269
26270         unwrapExports(isArabic_1);
26271         var isArabic_2 = isArabic_1.isArabic;
26272         var isArabic_3 = isArabic_1.isMath;
26273
26274         var unicodeArabic = createCommonjsModule(function (module, exports) {
26275         Object.defineProperty(exports, "__esModule", { value: true });
26276         var arabicReference = {
26277             "alef": {
26278                 "normal": [
26279                     "\u0627"
26280                 ],
26281                 "madda_above": {
26282                     "normal": [
26283                         "\u0627\u0653",
26284                         "\u0622"
26285                     ],
26286                     "isolated": "\uFE81",
26287                     "final": "\uFE82"
26288                 },
26289                 "hamza_above": {
26290                     "normal": [
26291                         "\u0627\u0654",
26292                         "\u0623"
26293                     ],
26294                     "isolated": "\uFE83",
26295                     "final": "\uFE84"
26296                 },
26297                 "hamza_below": {
26298                     "normal": [
26299                         "\u0627\u0655",
26300                         "\u0625"
26301                     ],
26302                     "isolated": "\uFE87",
26303                     "final": "\uFE88"
26304                 },
26305                 "wasla": {
26306                     "normal": "\u0671",
26307                     "isolated": "\uFB50",
26308                     "final": "\uFB51"
26309                 },
26310                 "wavy_hamza_above": [
26311                     "\u0672"
26312                 ],
26313                 "wavy_hamza_below": [
26314                     "\u0627\u065F",
26315                     "\u0673"
26316                 ],
26317                 "high_hamza": [
26318                     "\u0675",
26319                     "\u0627\u0674"
26320                 ],
26321                 "indic_two_above": [
26322                     "\u0773"
26323                 ],
26324                 "indic_three_above": [
26325                     "\u0774"
26326                 ],
26327                 "fathatan": {
26328                     "normal": [
26329                         "\u0627\u064B"
26330                     ],
26331                     "final": "\uFD3C",
26332                     "isolated": "\uFD3D"
26333                 },
26334                 "isolated": "\uFE8D",
26335                 "final": "\uFE8E"
26336             },
26337             "beh": {
26338                 "normal": [
26339                     "\u0628"
26340                 ],
26341                 "dotless": [
26342                     "\u066E"
26343                 ],
26344                 "three_dots_horizontally_below": [
26345                     "\u0750"
26346                 ],
26347                 "dot_below_three_dots_above": [
26348                     "\u0751"
26349                 ],
26350                 "three_dots_pointing_upwards_below": [
26351                     "\u0752"
26352                 ],
26353                 "three_dots_pointing_upwards_below_two_dots_above": [
26354                     "\u0753"
26355                 ],
26356                 "two_dots_below_dot_above": [
26357                     "\u0754"
26358                 ],
26359                 "inverted_small_v_below": [
26360                     "\u0755"
26361                 ],
26362                 "small_v": [
26363                     "\u0756"
26364                 ],
26365                 "small_v_below": [
26366                     "\u08A0"
26367                 ],
26368                 "hamza_above": [
26369                     "\u08A1"
26370                 ],
26371                 "small_meem_above": [
26372                     "\u08B6"
26373                 ],
26374                 "isolated": "\uFE8F",
26375                 "final": "\uFE90",
26376                 "initial": "\uFE91",
26377                 "medial": "\uFE92"
26378             },
26379             "teh marbuta": {
26380                 "normal": [
26381                     "\u0629"
26382                 ],
26383                 "isolated": "\uFE93",
26384                 "final": "\uFE94"
26385             },
26386             "teh": {
26387                 "normal": [
26388                     "\u062A"
26389                 ],
26390                 "ring": [
26391                     "\u067C"
26392                 ],
26393                 "three_dots_above_downwards": [
26394                     "\u067D"
26395                 ],
26396                 "small_teh_above": [
26397                     "\u08B8"
26398                 ],
26399                 "isolated": "\uFE95",
26400                 "final": "\uFE96",
26401                 "initial": "\uFE97",
26402                 "medial": "\uFE98"
26403             },
26404             "theh": {
26405                 "normal": [
26406                     "\u062B"
26407                 ],
26408                 "isolated": "\uFE99",
26409                 "final": "\uFE9A",
26410                 "initial": "\uFE9B",
26411                 "medial": "\uFE9C"
26412             },
26413             "jeem": {
26414                 "normal": [
26415                     "\u062C"
26416                 ],
26417                 "two_dots_above": [
26418                     "\u08A2"
26419                 ],
26420                 "isolated": "\uFE9D",
26421                 "final": "\uFE9E",
26422                 "initial": "\uFE9F",
26423                 "medial": "\uFEA0"
26424             },
26425             "hah": {
26426                 "normal": [
26427                     "\u062D"
26428                 ],
26429                 "hamza_above": [
26430                     "\u0681"
26431                 ],
26432                 "two_dots_vertical_above": [
26433                     "\u0682"
26434                 ],
26435                 "three_dots_above": [
26436                     "\u0685"
26437                 ],
26438                 "two_dots_above": [
26439                     "\u0757"
26440                 ],
26441                 "three_dots_pointing_upwards_below": [
26442                     "\u0758"
26443                 ],
26444                 "small_tah_below": [
26445                     "\u076E"
26446                 ],
26447                 "small_tah_two_dots": [
26448                     "\u076F"
26449                 ],
26450                 "small_tah_above": [
26451                     "\u0772"
26452                 ],
26453                 "indic_four_below": [
26454                     "\u077C"
26455                 ],
26456                 "isolated": "\uFEA1",
26457                 "final": "\uFEA2",
26458                 "initial": "\uFEA3",
26459                 "medial": "\uFEA4"
26460             },
26461             "khah": {
26462                 "normal": [
26463                     "\u062E"
26464                 ],
26465                 "isolated": "\uFEA5",
26466                 "final": "\uFEA6",
26467                 "initial": "\uFEA7",
26468                 "medial": "\uFEA8"
26469             },
26470             "dal": {
26471                 "normal": [
26472                     "\u062F"
26473                 ],
26474                 "ring": [
26475                     "\u0689"
26476                 ],
26477                 "dot_below": [
26478                     "\u068A"
26479                 ],
26480                 "dot_below_small_tah": [
26481                     "\u068B"
26482                 ],
26483                 "three_dots_above_downwards": [
26484                     "\u068F"
26485                 ],
26486                 "four_dots_above": [
26487                     "\u0690"
26488                 ],
26489                 "inverted_v": [
26490                     "\u06EE"
26491                 ],
26492                 "two_dots_vertically_below_small_tah": [
26493                     "\u0759"
26494                 ],
26495                 "inverted_small_v_below": [
26496                     "\u075A"
26497                 ],
26498                 "three_dots_below": [
26499                     "\u08AE"
26500                 ],
26501                 "isolated": "\uFEA9",
26502                 "final": "\uFEAA"
26503             },
26504             "thal": {
26505                 "normal": [
26506                     "\u0630"
26507                 ],
26508                 "isolated": "\uFEAB",
26509                 "final": "\uFEAC"
26510             },
26511             "reh": {
26512                 "normal": [
26513                     "\u0631"
26514                 ],
26515                 "small_v": [
26516                     "\u0692"
26517                 ],
26518                 "ring": [
26519                     "\u0693"
26520                 ],
26521                 "dot_below": [
26522                     "\u0694"
26523                 ],
26524                 "small_v_below": [
26525                     "\u0695"
26526                 ],
26527                 "dot_below_dot_above": [
26528                     "\u0696"
26529                 ],
26530                 "two_dots_above": [
26531                     "\u0697"
26532                 ],
26533                 "four_dots_above": [
26534                     "\u0699"
26535                 ],
26536                 "inverted_v": [
26537                     "\u06EF"
26538                 ],
26539                 "stroke": [
26540                     "\u075B"
26541                 ],
26542                 "two_dots_vertically_above": [
26543                     "\u076B"
26544                 ],
26545                 "hamza_above": [
26546                     "\u076C"
26547                 ],
26548                 "small_tah_two_dots": [
26549                     "\u0771"
26550                 ],
26551                 "loop": [
26552                     "\u08AA"
26553                 ],
26554                 "small_noon_above": [
26555                     "\u08B9"
26556                 ],
26557                 "isolated": "\uFEAD",
26558                 "final": "\uFEAE"
26559             },
26560             "zain": {
26561                 "normal": [
26562                     "\u0632"
26563                 ],
26564                 "inverted_v_above": [
26565                     "\u08B2"
26566                 ],
26567                 "isolated": "\uFEAF",
26568                 "final": "\uFEB0"
26569             },
26570             "seen": {
26571                 "normal": [
26572                     "\u0633"
26573                 ],
26574                 "dot_below_dot_above": [
26575                     "\u069A"
26576                 ],
26577                 "three_dots_below": [
26578                     "\u069B"
26579                 ],
26580                 "three_dots_below_three_dots_above": [
26581                     "\u069C"
26582                 ],
26583                 "four_dots_above": [
26584                     "\u075C"
26585                 ],
26586                 "two_dots_vertically_above": [
26587                     "\u076D"
26588                 ],
26589                 "small_tah_two_dots": [
26590                     "\u0770"
26591                 ],
26592                 "indic_four_above": [
26593                     "\u077D"
26594                 ],
26595                 "inverted_v": [
26596                     "\u077E"
26597                 ],
26598                 "isolated": "\uFEB1",
26599                 "final": "\uFEB2",
26600                 "initial": "\uFEB3",
26601                 "medial": "\uFEB4"
26602             },
26603             "sheen": {
26604                 "normal": [
26605                     "\u0634"
26606                 ],
26607                 "dot_below": [
26608                     "\u06FA"
26609                 ],
26610                 "isolated": "\uFEB5",
26611                 "final": "\uFEB6",
26612                 "initial": "\uFEB7",
26613                 "medial": "\uFEB8"
26614             },
26615             "sad": {
26616                 "normal": [
26617                     "\u0635"
26618                 ],
26619                 "two_dots_below": [
26620                     "\u069D"
26621                 ],
26622                 "three_dots_above": [
26623                     "\u069E"
26624                 ],
26625                 "three_dots_below": [
26626                     "\u08AF"
26627                 ],
26628                 "isolated": "\uFEB9",
26629                 "final": "\uFEBA",
26630                 "initial": "\uFEBB",
26631                 "medial": "\uFEBC"
26632             },
26633             "dad": {
26634                 "normal": [
26635                     "\u0636"
26636                 ],
26637                 "dot_below": [
26638                     "\u06FB"
26639                 ],
26640                 "isolated": "\uFEBD",
26641                 "final": "\uFEBE",
26642                 "initial": "\uFEBF",
26643                 "medial": "\uFEC0"
26644             },
26645             "tah": {
26646                 "normal": [
26647                     "\u0637"
26648                 ],
26649                 "three_dots_above": [
26650                     "\u069F"
26651                 ],
26652                 "two_dots_above": [
26653                     "\u08A3"
26654                 ],
26655                 "isolated": "\uFEC1",
26656                 "final": "\uFEC2",
26657                 "initial": "\uFEC3",
26658                 "medial": "\uFEC4"
26659             },
26660             "zah": {
26661                 "normal": [
26662                     "\u0638"
26663                 ],
26664                 "isolated": "\uFEC5",
26665                 "final": "\uFEC6",
26666                 "initial": "\uFEC7",
26667                 "medial": "\uFEC8"
26668             },
26669             "ain": {
26670                 "normal": [
26671                     "\u0639"
26672                 ],
26673                 "three_dots_above": [
26674                     "\u06A0"
26675                 ],
26676                 "two_dots_above": [
26677                     "\u075D"
26678                 ],
26679                 "three_dots_pointing_downwards_above": [
26680                     "\u075E"
26681                 ],
26682                 "two_dots_vertically_above": [
26683                     "\u075F"
26684                 ],
26685                 "three_dots_below": [
26686                     "\u08B3"
26687                 ],
26688                 "isolated": "\uFEC9",
26689                 "final": "\uFECA",
26690                 "initial": "\uFECB",
26691                 "medial": "\uFECC"
26692             },
26693             "ghain": {
26694                 "normal": [
26695                     "\u063A"
26696                 ],
26697                 "dot_below": [
26698                     "\u06FC"
26699                 ],
26700                 "isolated": "\uFECD",
26701                 "final": "\uFECE",
26702                 "initial": "\uFECF",
26703                 "medial": "\uFED0"
26704             },
26705             "feh": {
26706                 "normal": [
26707                     "\u0641"
26708                 ],
26709                 "dotless": [
26710                     "\u06A1"
26711                 ],
26712                 "dot_moved_below": [
26713                     "\u06A2"
26714                 ],
26715                 "dot_below": [
26716                     "\u06A3"
26717                 ],
26718                 "three_dots_below": [
26719                     "\u06A5"
26720                 ],
26721                 "two_dots_below": [
26722                     "\u0760"
26723                 ],
26724                 "three_dots_pointing_upwards_below": [
26725                     "\u0761"
26726                 ],
26727                 "dot_below_three_dots_above": [
26728                     "\u08A4"
26729                 ],
26730                 "isolated": "\uFED1",
26731                 "final": "\uFED2",
26732                 "initial": "\uFED3",
26733                 "medial": "\uFED4"
26734             },
26735             "qaf": {
26736                 "normal": [
26737                     "\u0642"
26738                 ],
26739                 "dotless": [
26740                     "\u066F"
26741                 ],
26742                 "dot_above": [
26743                     "\u06A7"
26744                 ],
26745                 "three_dots_above": [
26746                     "\u06A8"
26747                 ],
26748                 "dot_below": [
26749                     "\u08A5"
26750                 ],
26751                 "isolated": "\uFED5",
26752                 "final": "\uFED6",
26753                 "initial": "\uFED7",
26754                 "medial": "\uFED8"
26755             },
26756             "kaf": {
26757                 "normal": [
26758                     "\u0643"
26759                 ],
26760                 "swash": [
26761                     "\u06AA"
26762                 ],
26763                 "ring": [
26764                     "\u06AB"
26765                 ],
26766                 "dot_above": [
26767                     "\u06AC"
26768                 ],
26769                 "three_dots_below": [
26770                     "\u06AE"
26771                 ],
26772                 "two_dots_above": [
26773                     "\u077F"
26774                 ],
26775                 "dot_below": [
26776                     "\u08B4"
26777                 ],
26778                 "isolated": "\uFED9",
26779                 "final": "\uFEDA",
26780                 "initial": "\uFEDB",
26781                 "medial": "\uFEDC"
26782             },
26783             "lam": {
26784                 "normal": [
26785                     "\u0644"
26786                 ],
26787                 "small_v": [
26788                     "\u06B5"
26789                 ],
26790                 "dot_above": [
26791                     "\u06B6"
26792                 ],
26793                 "three_dots_above": [
26794                     "\u06B7"
26795                 ],
26796                 "three_dots_below": [
26797                     "\u06B8"
26798                 ],
26799                 "bar": [
26800                     "\u076A"
26801                 ],
26802                 "double_bar": [
26803                     "\u08A6"
26804                 ],
26805                 "isolated": "\uFEDD",
26806                 "final": "\uFEDE",
26807                 "initial": "\uFEDF",
26808                 "medial": "\uFEE0"
26809             },
26810             "meem": {
26811                 "normal": [
26812                     "\u0645"
26813                 ],
26814                 "dot_above": [
26815                     "\u0765"
26816                 ],
26817                 "dot_below": [
26818                     "\u0766"
26819                 ],
26820                 "three_dots_above": [
26821                     "\u08A7"
26822                 ],
26823                 "isolated": "\uFEE1",
26824                 "final": "\uFEE2",
26825                 "initial": "\uFEE3",
26826                 "medial": "\uFEE4"
26827             },
26828             "noon": {
26829                 "normal": [
26830                     "\u0646"
26831                 ],
26832                 "dot_below": [
26833                     "\u06B9"
26834                 ],
26835                 "ring": [
26836                     "\u06BC"
26837                 ],
26838                 "three_dots_above": [
26839                     "\u06BD"
26840                 ],
26841                 "two_dots_below": [
26842                     "\u0767"
26843                 ],
26844                 "small_tah": [
26845                     "\u0768"
26846                 ],
26847                 "small_v": [
26848                     "\u0769"
26849                 ],
26850                 "isolated": "\uFEE5",
26851                 "final": "\uFEE6",
26852                 "initial": "\uFEE7",
26853                 "medial": "\uFEE8"
26854             },
26855             "heh": {
26856                 "normal": [
26857                     "\u0647"
26858                 ],
26859                 "isolated": "\uFEE9",
26860                 "final": "\uFEEA",
26861                 "initial": "\uFEEB",
26862                 "medial": "\uFEEC"
26863             },
26864             "waw": {
26865                 "normal": [
26866                     "\u0648"
26867                 ],
26868                 "hamza_above": {
26869                     "normal": [
26870                         "\u0624",
26871                         "\u0648\u0654"
26872                     ],
26873                     "isolated": "\uFE85",
26874                     "final": "\uFE86"
26875                 },
26876                 "high_hamza": [
26877                     "\u0676",
26878                     "\u0648\u0674"
26879                 ],
26880                 "ring": [
26881                     "\u06C4"
26882                 ],
26883                 "two_dots_above": [
26884                     "\u06CA"
26885                 ],
26886                 "dot_above": [
26887                     "\u06CF"
26888                 ],
26889                 "indic_two_above": [
26890                     "\u0778"
26891                 ],
26892                 "indic_three_above": [
26893                     "\u0779"
26894                 ],
26895                 "dot_within": [
26896                     "\u08AB"
26897                 ],
26898                 "isolated": "\uFEED",
26899                 "final": "\uFEEE"
26900             },
26901             "alef_maksura": {
26902                 "normal": [
26903                     "\u0649"
26904                 ],
26905                 "hamza_above": [
26906                     "\u0626",
26907                     "\u064A\u0654"
26908                 ],
26909                 "initial": "\uFBE8",
26910                 "medial": "\uFBE9",
26911                 "isolated": "\uFEEF",
26912                 "final": "\uFEF0"
26913             },
26914             "yeh": {
26915                 "normal": [
26916                     "\u064A"
26917                 ],
26918                 "hamza_above": {
26919                     "normal": [
26920                         "\u0626",
26921                         "\u0649\u0654"
26922                     ],
26923                     "isolated": "\uFE89",
26924                     "final": "\uFE8A",
26925                     "initial": "\uFE8B",
26926                     "medial": "\uFE8C"
26927                 },
26928                 "two_dots_below_hamza_above": [
26929                     "\u08A8"
26930                 ],
26931                 "high_hamza": [
26932                     "\u0678",
26933                     "\u064A\u0674"
26934                 ],
26935                 "tail": [
26936                     "\u06CD"
26937                 ],
26938                 "small_v": [
26939                     "\u06CE"
26940                 ],
26941                 "three_dots_below": [
26942                     "\u06D1"
26943                 ],
26944                 "two_dots_below_dot_above": [
26945                     "\u08A9"
26946                 ],
26947                 "two_dots_below_small_noon_above": [
26948                     "\u08BA"
26949                 ],
26950                 "isolated": "\uFEF1",
26951                 "final": "\uFEF2",
26952                 "initial": "\uFEF3",
26953                 "medial": "\uFEF4"
26954             },
26955             "tteh": {
26956                 "normal": [
26957                     "\u0679"
26958                 ],
26959                 "isolated": "\uFB66",
26960                 "final": "\uFB67",
26961                 "initial": "\uFB68",
26962                 "medial": "\uFB69"
26963             },
26964             "tteheh": {
26965                 "normal": [
26966                     "\u067A"
26967                 ],
26968                 "isolated": "\uFB5E",
26969                 "final": "\uFB5F",
26970                 "initial": "\uFB60",
26971                 "medial": "\uFB61"
26972             },
26973             "beeh": {
26974                 "normal": [
26975                     "\u067B"
26976                 ],
26977                 "isolated": "\uFB52",
26978                 "final": "\uFB53",
26979                 "initial": "\uFB54",
26980                 "medial": "\uFB55"
26981             },
26982             "peh": {
26983                 "normal": [
26984                     "\u067E"
26985                 ],
26986                 "small_meem_above": [
26987                     "\u08B7"
26988                 ],
26989                 "isolated": "\uFB56",
26990                 "final": "\uFB57",
26991                 "initial": "\uFB58",
26992                 "medial": "\uFB59"
26993             },
26994             "teheh": {
26995                 "normal": [
26996                     "\u067F"
26997                 ],
26998                 "isolated": "\uFB62",
26999                 "final": "\uFB63",
27000                 "initial": "\uFB64",
27001                 "medial": "\uFB65"
27002             },
27003             "beheh": {
27004                 "normal": [
27005                     "\u0680"
27006                 ],
27007                 "isolated": "\uFB5A",
27008                 "final": "\uFB5B",
27009                 "initial": "\uFB5C",
27010                 "medial": "\uFB5D"
27011             },
27012             "nyeh": {
27013                 "normal": [
27014                     "\u0683"
27015                 ],
27016                 "isolated": "\uFB76",
27017                 "final": "\uFB77",
27018                 "initial": "\uFB78",
27019                 "medial": "\uFB79"
27020             },
27021             "dyeh": {
27022                 "normal": [
27023                     "\u0684"
27024                 ],
27025                 "isolated": "\uFB72",
27026                 "final": "\uFB73",
27027                 "initial": "\uFB74",
27028                 "medial": "\uFB75"
27029             },
27030             "tcheh": {
27031                 "normal": [
27032                     "\u0686"
27033                 ],
27034                 "dot_above": [
27035                     "\u06BF"
27036                 ],
27037                 "isolated": "\uFB7A",
27038                 "final": "\uFB7B",
27039                 "initial": "\uFB7C",
27040                 "medial": "\uFB7D"
27041             },
27042             "tcheheh": {
27043                 "normal": [
27044                     "\u0687"
27045                 ],
27046                 "isolated": "\uFB7E",
27047                 "final": "\uFB7F",
27048                 "initial": "\uFB80",
27049                 "medial": "\uFB81"
27050             },
27051             "ddal": {
27052                 "normal": [
27053                     "\u0688"
27054                 ],
27055                 "isolated": "\uFB88",
27056                 "final": "\uFB89"
27057             },
27058             "dahal": {
27059                 "normal": [
27060                     "\u068C"
27061                 ],
27062                 "isolated": "\uFB84",
27063                 "final": "\uFB85"
27064             },
27065             "ddahal": {
27066                 "normal": [
27067                     "\u068D"
27068                 ],
27069                 "isolated": "\uFB82",
27070                 "final": "\uFB83"
27071             },
27072             "dul": {
27073                 "normal": [
27074                     "\u068F",
27075                     "\u068E"
27076                 ],
27077                 "isolated": "\uFB86",
27078                 "final": "\uFB87"
27079             },
27080             "rreh": {
27081                 "normal": [
27082                     "\u0691"
27083                 ],
27084                 "isolated": "\uFB8C",
27085                 "final": "\uFB8D"
27086             },
27087             "jeh": {
27088                 "normal": [
27089                     "\u0698"
27090                 ],
27091                 "isolated": "\uFB8A",
27092                 "final": "\uFB8B"
27093             },
27094             "veh": {
27095                 "normal": [
27096                     "\u06A4"
27097                 ],
27098                 "isolated": "\uFB6A",
27099                 "final": "\uFB6B",
27100                 "initial": "\uFB6C",
27101                 "medial": "\uFB6D"
27102             },
27103             "peheh": {
27104                 "normal": [
27105                     "\u06A6"
27106                 ],
27107                 "isolated": "\uFB6E",
27108                 "final": "\uFB6F",
27109                 "initial": "\uFB70",
27110                 "medial": "\uFB71"
27111             },
27112             "keheh": {
27113                 "normal": [
27114                     "\u06A9"
27115                 ],
27116                 "dot_above": [
27117                     "\u0762"
27118                 ],
27119                 "three_dots_above": [
27120                     "\u0763"
27121                 ],
27122                 "three_dots_pointing_upwards_below": [
27123                     "\u0764"
27124                 ],
27125                 "isolated": "\uFB8E",
27126                 "final": "\uFB8F",
27127                 "initial": "\uFB90",
27128                 "medial": "\uFB91"
27129             },
27130             "ng": {
27131                 "normal": [
27132                     "\u06AD"
27133                 ],
27134                 "isolated": "\uFBD3",
27135                 "final": "\uFBD4",
27136                 "initial": "\uFBD5",
27137                 "medial": "\uFBD6"
27138             },
27139             "gaf": {
27140                 "normal": [
27141                     "\u06AF"
27142                 ],
27143                 "ring": [
27144                     "\u06B0"
27145                 ],
27146                 "two_dots_below": [
27147                     "\u06B2"
27148                 ],
27149                 "three_dots_above": [
27150                     "\u06B4"
27151                 ],
27152                 "inverted_stroke": [
27153                     "\u08B0"
27154                 ],
27155                 "isolated": "\uFB92",
27156                 "final": "\uFB93",
27157                 "initial": "\uFB94",
27158                 "medial": "\uFB95"
27159             },
27160             "ngoeh": {
27161                 "normal": [
27162                     "\u06B1"
27163                 ],
27164                 "isolated": "\uFB9A",
27165                 "final": "\uFB9B",
27166                 "initial": "\uFB9C",
27167                 "medial": "\uFB9D"
27168             },
27169             "gueh": {
27170                 "normal": [
27171                     "\u06B3"
27172                 ],
27173                 "isolated": "\uFB96",
27174                 "final": "\uFB97",
27175                 "initial": "\uFB98",
27176                 "medial": "\uFB99"
27177             },
27178             "noon ghunna": {
27179                 "normal": [
27180                     "\u06BA"
27181                 ],
27182                 "isolated": "\uFB9E",
27183                 "final": "\uFB9F"
27184             },
27185             "rnoon": {
27186                 "normal": [
27187                     "\u06BB"
27188                 ],
27189                 "isolated": "\uFBA0",
27190                 "final": "\uFBA1",
27191                 "initial": "\uFBA2",
27192                 "medial": "\uFBA3"
27193             },
27194             "heh doachashmee": {
27195                 "normal": [
27196                     "\u06BE"
27197                 ],
27198                 "isolated": "\uFBAA",
27199                 "final": "\uFBAB",
27200                 "initial": "\uFBAC",
27201                 "medial": "\uFBAD"
27202             },
27203             "heh goal": {
27204                 "normal": [
27205                     "\u06C1"
27206                 ],
27207                 "hamza_above": [
27208                     "\u06C1\u0654",
27209                     "\u06C2"
27210                 ],
27211                 "isolated": "\uFBA6",
27212                 "final": "\uFBA7",
27213                 "initial": "\uFBA8",
27214                 "medial": "\uFBA9"
27215             },
27216             "teh marbuta goal": {
27217                 "normal": [
27218                     "\u06C3"
27219                 ]
27220             },
27221             "kirghiz oe": {
27222                 "normal": [
27223                     "\u06C5"
27224                 ],
27225                 "isolated": "\uFBE0",
27226                 "final": "\uFBE1"
27227             },
27228             "oe": {
27229                 "normal": [
27230                     "\u06C6"
27231                 ],
27232                 "isolated": "\uFBD9",
27233                 "final": "\uFBDA"
27234             },
27235             "u": {
27236                 "normal": [
27237                     "\u06C7"
27238                 ],
27239                 "hamza_above": {
27240                     "normal": [
27241                         "\u0677",
27242                         "\u06C7\u0674"
27243                     ],
27244                     "isolated": "\uFBDD"
27245                 },
27246                 "isolated": "\uFBD7",
27247                 "final": "\uFBD8"
27248             },
27249             "yu": {
27250                 "normal": [
27251                     "\u06C8"
27252                 ],
27253                 "isolated": "\uFBDB",
27254                 "final": "\uFBDC"
27255             },
27256             "kirghiz yu": {
27257                 "normal": [
27258                     "\u06C9"
27259                 ],
27260                 "isolated": "\uFBE2",
27261                 "final": "\uFBE3"
27262             },
27263             "ve": {
27264                 "normal": [
27265                     "\u06CB"
27266                 ],
27267                 "isolated": "\uFBDE",
27268                 "final": "\uFBDF"
27269             },
27270             "farsi yeh": {
27271                 "normal": [
27272                     "\u06CC"
27273                 ],
27274                 "indic_two_above": [
27275                     "\u0775"
27276                 ],
27277                 "indic_three_above": [
27278                     "\u0776"
27279                 ],
27280                 "indic_four_above": [
27281                     "\u0777"
27282                 ],
27283                 "isolated": "\uFBFC",
27284                 "final": "\uFBFD",
27285                 "initial": "\uFBFE",
27286                 "medial": "\uFBFF"
27287             },
27288             "e": {
27289                 "normal": [
27290                     "\u06D0"
27291                 ],
27292                 "isolated": "\uFBE4",
27293                 "final": "\uFBE5",
27294                 "initial": "\uFBE6",
27295                 "medial": "\uFBE7"
27296             },
27297             "yeh barree": {
27298                 "normal": [
27299                     "\u06D2"
27300                 ],
27301                 "hamza_above": {
27302                     "normal": [
27303                         "\u06D2\u0654",
27304                         "\u06D3"
27305                     ],
27306                     "isolated": "\uFBB0",
27307                     "final": "\uFBB1"
27308                 },
27309                 "indic_two_above": [
27310                     "\u077A"
27311                 ],
27312                 "indic_three_above": [
27313                     "\u077B"
27314                 ],
27315                 "isolated": "\uFBAE",
27316                 "final": "\uFBAF"
27317             },
27318             "ae": {
27319                 "normal": [
27320                     "\u06D5"
27321                 ],
27322                 "isolated": "\u06D5",
27323                 "final": "\uFEEA",
27324                 "yeh_above": {
27325                     "normal": [
27326                         "\u06C0",
27327                         "\u06D5\u0654"
27328                     ],
27329                     "isolated": "\uFBA4",
27330                     "final": "\uFBA5"
27331                 }
27332             },
27333             "rohingya yeh": {
27334                 "normal": [
27335                     "\u08AC"
27336                 ]
27337             },
27338             "low alef": {
27339                 "normal": [
27340                     "\u08AD"
27341                 ]
27342             },
27343             "straight waw": {
27344                 "normal": [
27345                     "\u08B1"
27346                 ]
27347             },
27348             "african feh": {
27349                 "normal": [
27350                     "\u08BB"
27351                 ]
27352             },
27353             "african qaf": {
27354                 "normal": [
27355                     "\u08BC"
27356                 ]
27357             },
27358             "african noon": {
27359                 "normal": [
27360                     "\u08BD"
27361                 ]
27362             }
27363         };
27364         exports.default = arabicReference;
27365         });
27366
27367         unwrapExports(unicodeArabic);
27368
27369         var unicodeLigatures = createCommonjsModule(function (module, exports) {
27370         Object.defineProperty(exports, "__esModule", { value: true });
27371         var ligatureReference = {
27372             "\u0626\u0627": {
27373                 "isolated": "\uFBEA",
27374                 "final": "\uFBEB"
27375             },
27376             "\u0626\u06D5": {
27377                 "isolated": "\uFBEC",
27378                 "final": "\uFBED"
27379             },
27380             "\u0626\u0648": {
27381                 "isolated": "\uFBEE",
27382                 "final": "\uFBEF"
27383             },
27384             "\u0626\u06C7": {
27385                 "isolated": "\uFBF0",
27386                 "final": "\uFBF1"
27387             },
27388             "\u0626\u06C6": {
27389                 "isolated": "\uFBF2",
27390                 "final": "\uFBF3"
27391             },
27392             "\u0626\u06C8": {
27393                 "isolated": "\uFBF4",
27394                 "final": "\uFBF5"
27395             },
27396             "\u0626\u06D0": {
27397                 "isolated": "\uFBF6",
27398                 "final": "\uFBF7",
27399                 "initial": "\uFBF8"
27400             },
27401             "\u0626\u0649": {
27402                 "uighur_kirghiz": {
27403                     "isolated": "\uFBF9",
27404                     "final": "\uFBFA",
27405                     "initial": "\uFBFB"
27406                 },
27407                 "isolated": "\uFC03",
27408                 "final": "\uFC68"
27409             },
27410             "\u0626\u062C": {
27411                 "isolated": "\uFC00",
27412                 "initial": "\uFC97"
27413             },
27414             "\u0626\u062D": {
27415                 "isolated": "\uFC01",
27416                 "initial": "\uFC98"
27417             },
27418             "\u0626\u0645": {
27419                 "isolated": "\uFC02",
27420                 "final": "\uFC66",
27421                 "initial": "\uFC9A",
27422                 "medial": "\uFCDF"
27423             },
27424             "\u0626\u064A": {
27425                 "isolated": "\uFC04",
27426                 "final": "\uFC69"
27427             },
27428             "\u0628\u062C": {
27429                 "isolated": "\uFC05",
27430                 "initial": "\uFC9C"
27431             },
27432             "\u0628\u062D": {
27433                 "isolated": "\uFC06",
27434                 "initial": "\uFC9D"
27435             },
27436             "\u0628\u062E": {
27437                 "isolated": "\uFC07",
27438                 "initial": "\uFC9E"
27439             },
27440             "\u0628\u0645": {
27441                 "isolated": "\uFC08",
27442                 "final": "\uFC6C",
27443                 "initial": "\uFC9F",
27444                 "medial": "\uFCE1"
27445             },
27446             "\u0628\u0649": {
27447                 "isolated": "\uFC09",
27448                 "final": "\uFC6E"
27449             },
27450             "\u0628\u064A": {
27451                 "isolated": "\uFC0A",
27452                 "final": "\uFC6F"
27453             },
27454             "\u062A\u062C": {
27455                 "isolated": "\uFC0B",
27456                 "initial": "\uFCA1"
27457             },
27458             "\u062A\u062D": {
27459                 "isolated": "\uFC0C",
27460                 "initial": "\uFCA2"
27461             },
27462             "\u062A\u062E": {
27463                 "isolated": "\uFC0D",
27464                 "initial": "\uFCA3"
27465             },
27466             "\u062A\u0645": {
27467                 "isolated": "\uFC0E",
27468                 "final": "\uFC72",
27469                 "initial": "\uFCA4",
27470                 "medial": "\uFCE3"
27471             },
27472             "\u062A\u0649": {
27473                 "isolated": "\uFC0F",
27474                 "final": "\uFC74"
27475             },
27476             "\u062A\u064A": {
27477                 "isolated": "\uFC10",
27478                 "final": "\uFC75"
27479             },
27480             "\u062B\u062C": {
27481                 "isolated": "\uFC11"
27482             },
27483             "\u062B\u0645": {
27484                 "isolated": "\uFC12",
27485                 "final": "\uFC78",
27486                 "initial": "\uFCA6",
27487                 "medial": "\uFCE5"
27488             },
27489             "\u062B\u0649": {
27490                 "isolated": "\uFC13",
27491                 "final": "\uFC7A"
27492             },
27493             "\u062B\u0648": {
27494                 "isolated": "\uFC14"
27495             },
27496             "\u062C\u062D": {
27497                 "isolated": "\uFC15",
27498                 "initial": "\uFCA7"
27499             },
27500             "\u062C\u0645": {
27501                 "isolated": "\uFC16",
27502                 "initial": "\uFCA8"
27503             },
27504             "\u062D\u062C": {
27505                 "isolated": "\uFC17",
27506                 "initial": "\uFCA9"
27507             },
27508             "\u062D\u0645": {
27509                 "isolated": "\uFC18",
27510                 "initial": "\uFCAA"
27511             },
27512             "\u062E\u062C": {
27513                 "isolated": "\uFC19",
27514                 "initial": "\uFCAB"
27515             },
27516             "\u062E\u062D": {
27517                 "isolated": "\uFC1A"
27518             },
27519             "\u062E\u0645": {
27520                 "isolated": "\uFC1B",
27521                 "initial": "\uFCAC"
27522             },
27523             "\u0633\u062C": {
27524                 "isolated": "\uFC1C",
27525                 "initial": "\uFCAD",
27526                 "medial": "\uFD34"
27527             },
27528             "\u0633\u062D": {
27529                 "isolated": "\uFC1D",
27530                 "initial": "\uFCAE",
27531                 "medial": "\uFD35"
27532             },
27533             "\u0633\u062E": {
27534                 "isolated": "\uFC1E",
27535                 "initial": "\uFCAF",
27536                 "medial": "\uFD36"
27537             },
27538             "\u0633\u0645": {
27539                 "isolated": "\uFC1F",
27540                 "initial": "\uFCB0",
27541                 "medial": "\uFCE7"
27542             },
27543             "\u0635\u062D": {
27544                 "isolated": "\uFC20",
27545                 "initial": "\uFCB1"
27546             },
27547             "\u0635\u0645": {
27548                 "isolated": "\uFC21",
27549                 "initial": "\uFCB3"
27550             },
27551             "\u0636\u062C": {
27552                 "isolated": "\uFC22",
27553                 "initial": "\uFCB4"
27554             },
27555             "\u0636\u062D": {
27556                 "isolated": "\uFC23",
27557                 "initial": "\uFCB5"
27558             },
27559             "\u0636\u062E": {
27560                 "isolated": "\uFC24",
27561                 "initial": "\uFCB6"
27562             },
27563             "\u0636\u0645": {
27564                 "isolated": "\uFC25",
27565                 "initial": "\uFCB7"
27566             },
27567             "\u0637\u062D": {
27568                 "isolated": "\uFC26",
27569                 "initial": "\uFCB8"
27570             },
27571             "\u0637\u0645": {
27572                 "isolated": "\uFC27",
27573                 "initial": "\uFD33",
27574                 "medial": "\uFD3A"
27575             },
27576             "\u0638\u0645": {
27577                 "isolated": "\uFC28",
27578                 "initial": "\uFCB9",
27579                 "medial": "\uFD3B"
27580             },
27581             "\u0639\u062C": {
27582                 "isolated": "\uFC29",
27583                 "initial": "\uFCBA"
27584             },
27585             "\u0639\u0645": {
27586                 "isolated": "\uFC2A",
27587                 "initial": "\uFCBB"
27588             },
27589             "\u063A\u062C": {
27590                 "isolated": "\uFC2B",
27591                 "initial": "\uFCBC"
27592             },
27593             "\u063A\u0645": {
27594                 "isolated": "\uFC2C",
27595                 "initial": "\uFCBD"
27596             },
27597             "\u0641\u062C": {
27598                 "isolated": "\uFC2D",
27599                 "initial": "\uFCBE"
27600             },
27601             "\u0641\u062D": {
27602                 "isolated": "\uFC2E",
27603                 "initial": "\uFCBF"
27604             },
27605             "\u0641\u062E": {
27606                 "isolated": "\uFC2F",
27607                 "initial": "\uFCC0"
27608             },
27609             "\u0641\u0645": {
27610                 "isolated": "\uFC30",
27611                 "initial": "\uFCC1"
27612             },
27613             "\u0641\u0649": {
27614                 "isolated": "\uFC31",
27615                 "final": "\uFC7C"
27616             },
27617             "\u0641\u064A": {
27618                 "isolated": "\uFC32",
27619                 "final": "\uFC7D"
27620             },
27621             "\u0642\u062D": {
27622                 "isolated": "\uFC33",
27623                 "initial": "\uFCC2"
27624             },
27625             "\u0642\u0645": {
27626                 "isolated": "\uFC34",
27627                 "initial": "\uFCC3"
27628             },
27629             "\u0642\u0649": {
27630                 "isolated": "\uFC35",
27631                 "final": "\uFC7E"
27632             },
27633             "\u0642\u064A": {
27634                 "isolated": "\uFC36",
27635                 "final": "\uFC7F"
27636             },
27637             "\u0643\u0627": {
27638                 "isolated": "\uFC37",
27639                 "final": "\uFC80"
27640             },
27641             "\u0643\u062C": {
27642                 "isolated": "\uFC38",
27643                 "initial": "\uFCC4"
27644             },
27645             "\u0643\u062D": {
27646                 "isolated": "\uFC39",
27647                 "initial": "\uFCC5"
27648             },
27649             "\u0643\u062E": {
27650                 "isolated": "\uFC3A",
27651                 "initial": "\uFCC6"
27652             },
27653             "\u0643\u0644": {
27654                 "isolated": "\uFC3B",
27655                 "final": "\uFC81",
27656                 "initial": "\uFCC7",
27657                 "medial": "\uFCEB"
27658             },
27659             "\u0643\u0645": {
27660                 "isolated": "\uFC3C",
27661                 "final": "\uFC82",
27662                 "initial": "\uFCC8",
27663                 "medial": "\uFCEC"
27664             },
27665             "\u0643\u0649": {
27666                 "isolated": "\uFC3D",
27667                 "final": "\uFC83"
27668             },
27669             "\u0643\u064A": {
27670                 "isolated": "\uFC3E",
27671                 "final": "\uFC84"
27672             },
27673             "\u0644\u062C": {
27674                 "isolated": "\uFC3F",
27675                 "initial": "\uFCC9"
27676             },
27677             "\u0644\u062D": {
27678                 "isolated": "\uFC40",
27679                 "initial": "\uFCCA"
27680             },
27681             "\u0644\u062E": {
27682                 "isolated": "\uFC41",
27683                 "initial": "\uFCCB"
27684             },
27685             "\u0644\u0645": {
27686                 "isolated": "\uFC42",
27687                 "final": "\uFC85",
27688                 "initial": "\uFCCC",
27689                 "medial": "\uFCED"
27690             },
27691             "\u0644\u0649": {
27692                 "isolated": "\uFC43",
27693                 "final": "\uFC86"
27694             },
27695             "\u0644\u064A": {
27696                 "isolated": "\uFC44",
27697                 "final": "\uFC87"
27698             },
27699             "\u0645\u062C": {
27700                 "isolated": "\uFC45",
27701                 "initial": "\uFCCE"
27702             },
27703             "\u0645\u062D": {
27704                 "isolated": "\uFC46",
27705                 "initial": "\uFCCF"
27706             },
27707             "\u0645\u062E": {
27708                 "isolated": "\uFC47",
27709                 "initial": "\uFCD0"
27710             },
27711             "\u0645\u0645": {
27712                 "isolated": "\uFC48",
27713                 "final": "\uFC89",
27714                 "initial": "\uFCD1"
27715             },
27716             "\u0645\u0649": {
27717                 "isolated": "\uFC49"
27718             },
27719             "\u0645\u064A": {
27720                 "isolated": "\uFC4A"
27721             },
27722             "\u0646\u062C": {
27723                 "isolated": "\uFC4B",
27724                 "initial": "\uFCD2"
27725             },
27726             "\u0646\u062D": {
27727                 "isolated": "\uFC4C",
27728                 "initial": "\uFCD3"
27729             },
27730             "\u0646\u062E": {
27731                 "isolated": "\uFC4D",
27732                 "initial": "\uFCD4"
27733             },
27734             "\u0646\u0645": {
27735                 "isolated": "\uFC4E",
27736                 "final": "\uFC8C",
27737                 "initial": "\uFCD5",
27738                 "medial": "\uFCEE"
27739             },
27740             "\u0646\u0649": {
27741                 "isolated": "\uFC4F",
27742                 "final": "\uFC8E"
27743             },
27744             "\u0646\u064A": {
27745                 "isolated": "\uFC50",
27746                 "final": "\uFC8F"
27747             },
27748             "\u0647\u062C": {
27749                 "isolated": "\uFC51",
27750                 "initial": "\uFCD7"
27751             },
27752             "\u0647\u0645": {
27753                 "isolated": "\uFC52",
27754                 "initial": "\uFCD8"
27755             },
27756             "\u0647\u0649": {
27757                 "isolated": "\uFC53"
27758             },
27759             "\u0647\u064A": {
27760                 "isolated": "\uFC54"
27761             },
27762             "\u064A\u062C": {
27763                 "isolated": "\uFC55",
27764                 "initial": "\uFCDA"
27765             },
27766             "\u064A\u062D": {
27767                 "isolated": "\uFC56",
27768                 "initial": "\uFCDB"
27769             },
27770             "\u064A\u062E": {
27771                 "isolated": "\uFC57",
27772                 "initial": "\uFCDC"
27773             },
27774             "\u064A\u0645": {
27775                 "isolated": "\uFC58",
27776                 "final": "\uFC93",
27777                 "initial": "\uFCDD",
27778                 "medial": "\uFCF0"
27779             },
27780             "\u064A\u0649": {
27781                 "isolated": "\uFC59",
27782                 "final": "\uFC95"
27783             },
27784             "\u064A\u064A": {
27785                 "isolated": "\uFC5A",
27786                 "final": "\uFC96"
27787             },
27788             "\u0630\u0670": {
27789                 "isolated": "\uFC5B"
27790             },
27791             "\u0631\u0670": {
27792                 "isolated": "\uFC5C"
27793             },
27794             "\u0649\u0670": {
27795                 "isolated": "\uFC5D",
27796                 "final": "\uFC90"
27797             },
27798             "\u064C\u0651": {
27799                 "isolated": "\uFC5E"
27800             },
27801             "\u064D\u0651": {
27802                 "isolated": "\uFC5F"
27803             },
27804             "\u064E\u0651": {
27805                 "isolated": "\uFC60"
27806             },
27807             "\u064F\u0651": {
27808                 "isolated": "\uFC61"
27809             },
27810             "\u0650\u0651": {
27811                 "isolated": "\uFC62"
27812             },
27813             "\u0651\u0670": {
27814                 "isolated": "\uFC63"
27815             },
27816             "\u0626\u0631": {
27817                 "final": "\uFC64"
27818             },
27819             "\u0626\u0632": {
27820                 "final": "\uFC65"
27821             },
27822             "\u0626\u0646": {
27823                 "final": "\uFC67"
27824             },
27825             "\u0628\u0631": {
27826                 "final": "\uFC6A"
27827             },
27828             "\u0628\u0632": {
27829                 "final": "\uFC6B"
27830             },
27831             "\u0628\u0646": {
27832                 "final": "\uFC6D"
27833             },
27834             "\u062A\u0631": {
27835                 "final": "\uFC70"
27836             },
27837             "\u062A\u0632": {
27838                 "final": "\uFC71"
27839             },
27840             "\u062A\u0646": {
27841                 "final": "\uFC73"
27842             },
27843             "\u062B\u0631": {
27844                 "final": "\uFC76"
27845             },
27846             "\u062B\u0632": {
27847                 "final": "\uFC77"
27848             },
27849             "\u062B\u0646": {
27850                 "final": "\uFC79"
27851             },
27852             "\u062B\u064A": {
27853                 "final": "\uFC7B"
27854             },
27855             "\u0645\u0627": {
27856                 "final": "\uFC88"
27857             },
27858             "\u0646\u0631": {
27859                 "final": "\uFC8A"
27860             },
27861             "\u0646\u0632": {
27862                 "final": "\uFC8B"
27863             },
27864             "\u0646\u0646": {
27865                 "final": "\uFC8D"
27866             },
27867             "\u064A\u0631": {
27868                 "final": "\uFC91"
27869             },
27870             "\u064A\u0632": {
27871                 "final": "\uFC92"
27872             },
27873             "\u064A\u0646": {
27874                 "final": "\uFC94"
27875             },
27876             "\u0626\u062E": {
27877                 "initial": "\uFC99"
27878             },
27879             "\u0626\u0647": {
27880                 "initial": "\uFC9B",
27881                 "medial": "\uFCE0"
27882             },
27883             "\u0628\u0647": {
27884                 "initial": "\uFCA0",
27885                 "medial": "\uFCE2"
27886             },
27887             "\u062A\u0647": {
27888                 "initial": "\uFCA5",
27889                 "medial": "\uFCE4"
27890             },
27891             "\u0635\u062E": {
27892                 "initial": "\uFCB2"
27893             },
27894             "\u0644\u0647": {
27895                 "initial": "\uFCCD"
27896             },
27897             "\u0646\u0647": {
27898                 "initial": "\uFCD6",
27899                 "medial": "\uFCEF"
27900             },
27901             "\u0647\u0670": {
27902                 "initial": "\uFCD9"
27903             },
27904             "\u064A\u0647": {
27905                 "initial": "\uFCDE",
27906                 "medial": "\uFCF1"
27907             },
27908             "\u062B\u0647": {
27909                 "medial": "\uFCE6"
27910             },
27911             "\u0633\u0647": {
27912                 "medial": "\uFCE8",
27913                 "initial": "\uFD31"
27914             },
27915             "\u0634\u0645": {
27916                 "medial": "\uFCE9",
27917                 "isolated": "\uFD0C",
27918                 "final": "\uFD28",
27919                 "initial": "\uFD30"
27920             },
27921             "\u0634\u0647": {
27922                 "medial": "\uFCEA",
27923                 "initial": "\uFD32"
27924             },
27925             "\u0640\u064E\u0651": {
27926                 "medial": "\uFCF2"
27927             },
27928             "\u0640\u064F\u0651": {
27929                 "medial": "\uFCF3"
27930             },
27931             "\u0640\u0650\u0651": {
27932                 "medial": "\uFCF4"
27933             },
27934             "\u0637\u0649": {
27935                 "isolated": "\uFCF5",
27936                 "final": "\uFD11"
27937             },
27938             "\u0637\u064A": {
27939                 "isolated": "\uFCF6",
27940                 "final": "\uFD12"
27941             },
27942             "\u0639\u0649": {
27943                 "isolated": "\uFCF7",
27944                 "final": "\uFD13"
27945             },
27946             "\u0639\u064A": {
27947                 "isolated": "\uFCF8",
27948                 "final": "\uFD14"
27949             },
27950             "\u063A\u0649": {
27951                 "isolated": "\uFCF9",
27952                 "final": "\uFD15"
27953             },
27954             "\u063A\u064A": {
27955                 "isolated": "\uFCFA",
27956                 "final": "\uFD16"
27957             },
27958             "\u0633\u0649": {
27959                 "isolated": "\uFCFB"
27960             },
27961             "\u0633\u064A": {
27962                 "isolated": "\uFCFC",
27963                 "final": "\uFD18"
27964             },
27965             "\u0634\u0649": {
27966                 "isolated": "\uFCFD",
27967                 "final": "\uFD19"
27968             },
27969             "\u0634\u064A": {
27970                 "isolated": "\uFCFE",
27971                 "final": "\uFD1A"
27972             },
27973             "\u062D\u0649": {
27974                 "isolated": "\uFCFF",
27975                 "final": "\uFD1B"
27976             },
27977             "\u062D\u064A": {
27978                 "isolated": "\uFD00",
27979                 "final": "\uFD1C"
27980             },
27981             "\u062C\u0649": {
27982                 "isolated": "\uFD01",
27983                 "final": "\uFD1D"
27984             },
27985             "\u062C\u064A": {
27986                 "isolated": "\uFD02",
27987                 "final": "\uFD1E"
27988             },
27989             "\u062E\u0649": {
27990                 "isolated": "\uFD03",
27991                 "final": "\uFD1F"
27992             },
27993             "\u062E\u064A": {
27994                 "isolated": "\uFD04",
27995                 "final": "\uFD20"
27996             },
27997             "\u0635\u0649": {
27998                 "isolated": "\uFD05",
27999                 "final": "\uFD21"
28000             },
28001             "\u0635\u064A": {
28002                 "isolated": "\uFD06",
28003                 "final": "\uFD22"
28004             },
28005             "\u0636\u0649": {
28006                 "isolated": "\uFD07",
28007                 "final": "\uFD23"
28008             },
28009             "\u0636\u064A": {
28010                 "isolated": "\uFD08",
28011                 "final": "\uFD24"
28012             },
28013             "\u0634\u062C": {
28014                 "isolated": "\uFD09",
28015                 "final": "\uFD25",
28016                 "initial": "\uFD2D",
28017                 "medial": "\uFD37"
28018             },
28019             "\u0634\u062D": {
28020                 "isolated": "\uFD0A",
28021                 "final": "\uFD26",
28022                 "initial": "\uFD2E",
28023                 "medial": "\uFD38"
28024             },
28025             "\u0634\u062E": {
28026                 "isolated": "\uFD0B",
28027                 "final": "\uFD27",
28028                 "initial": "\uFD2F",
28029                 "medial": "\uFD39"
28030             },
28031             "\u0634\u0631": {
28032                 "isolated": "\uFD0D",
28033                 "final": "\uFD29"
28034             },
28035             "\u0633\u0631": {
28036                 "isolated": "\uFD0E",
28037                 "final": "\uFD2A"
28038             },
28039             "\u0635\u0631": {
28040                 "isolated": "\uFD0F",
28041                 "final": "\uFD2B"
28042             },
28043             "\u0636\u0631": {
28044                 "isolated": "\uFD10",
28045                 "final": "\uFD2C"
28046             },
28047             "\u0633\u0639": {
28048                 "final": "\uFD17"
28049             },
28050             "\u062A\u062C\u0645": {
28051                 "initial": "\uFD50"
28052             },
28053             "\u062A\u062D\u062C": {
28054                 "final": "\uFD51",
28055                 "initial": "\uFD52"
28056             },
28057             "\u062A\u062D\u0645": {
28058                 "initial": "\uFD53"
28059             },
28060             "\u062A\u062E\u0645": {
28061                 "initial": "\uFD54"
28062             },
28063             "\u062A\u0645\u062C": {
28064                 "initial": "\uFD55"
28065             },
28066             "\u062A\u0645\u062D": {
28067                 "initial": "\uFD56"
28068             },
28069             "\u062A\u0645\u062E": {
28070                 "initial": "\uFD57"
28071             },
28072             "\u062C\u0645\u062D": {
28073                 "final": "\uFD58",
28074                 "initial": "\uFD59"
28075             },
28076             "\u062D\u0645\u064A": {
28077                 "final": "\uFD5A"
28078             },
28079             "\u062D\u0645\u0649": {
28080                 "final": "\uFD5B"
28081             },
28082             "\u0633\u062D\u062C": {
28083                 "initial": "\uFD5C"
28084             },
28085             "\u0633\u062C\u062D": {
28086                 "initial": "\uFD5D"
28087             },
28088             "\u0633\u062C\u0649": {
28089                 "final": "\uFD5E"
28090             },
28091             "\u0633\u0645\u062D": {
28092                 "final": "\uFD5F",
28093                 "initial": "\uFD60"
28094             },
28095             "\u0633\u0645\u062C": {
28096                 "initial": "\uFD61"
28097             },
28098             "\u0633\u0645\u0645": {
28099                 "final": "\uFD62",
28100                 "initial": "\uFD63"
28101             },
28102             "\u0635\u062D\u062D": {
28103                 "final": "\uFD64",
28104                 "initial": "\uFD65"
28105             },
28106             "\u0635\u0645\u0645": {
28107                 "final": "\uFD66",
28108                 "initial": "\uFDC5"
28109             },
28110             "\u0634\u062D\u0645": {
28111                 "final": "\uFD67",
28112                 "initial": "\uFD68"
28113             },
28114             "\u0634\u062C\u064A": {
28115                 "final": "\uFD69"
28116             },
28117             "\u0634\u0645\u062E": {
28118                 "final": "\uFD6A",
28119                 "initial": "\uFD6B"
28120             },
28121             "\u0634\u0645\u0645": {
28122                 "final": "\uFD6C",
28123                 "initial": "\uFD6D"
28124             },
28125             "\u0636\u062D\u0649": {
28126                 "final": "\uFD6E"
28127             },
28128             "\u0636\u062E\u0645": {
28129                 "final": "\uFD6F",
28130                 "initial": "\uFD70"
28131             },
28132             "\u0636\u0645\u062D": {
28133                 "final": "\uFD71"
28134             },
28135             "\u0637\u0645\u062D": {
28136                 "initial": "\uFD72"
28137             },
28138             "\u0637\u0645\u0645": {
28139                 "initial": "\uFD73"
28140             },
28141             "\u0637\u0645\u064A": {
28142                 "final": "\uFD74"
28143             },
28144             "\u0639\u062C\u0645": {
28145                 "final": "\uFD75",
28146                 "initial": "\uFDC4"
28147             },
28148             "\u0639\u0645\u0645": {
28149                 "final": "\uFD76",
28150                 "initial": "\uFD77"
28151             },
28152             "\u0639\u0645\u0649": {
28153                 "final": "\uFD78"
28154             },
28155             "\u063A\u0645\u0645": {
28156                 "final": "\uFD79"
28157             },
28158             "\u063A\u0645\u064A": {
28159                 "final": "\uFD7A"
28160             },
28161             "\u063A\u0645\u0649": {
28162                 "final": "\uFD7B"
28163             },
28164             "\u0641\u062E\u0645": {
28165                 "final": "\uFD7C",
28166                 "initial": "\uFD7D"
28167             },
28168             "\u0642\u0645\u062D": {
28169                 "final": "\uFD7E",
28170                 "initial": "\uFDB4"
28171             },
28172             "\u0642\u0645\u0645": {
28173                 "final": "\uFD7F"
28174             },
28175             "\u0644\u062D\u0645": {
28176                 "final": "\uFD80",
28177                 "initial": "\uFDB5"
28178             },
28179             "\u0644\u062D\u064A": {
28180                 "final": "\uFD81"
28181             },
28182             "\u0644\u062D\u0649": {
28183                 "final": "\uFD82"
28184             },
28185             "\u0644\u062C\u062C": {
28186                 "initial": "\uFD83",
28187                 "final": "\uFD84"
28188             },
28189             "\u0644\u062E\u0645": {
28190                 "final": "\uFD85",
28191                 "initial": "\uFD86"
28192             },
28193             "\u0644\u0645\u062D": {
28194                 "final": "\uFD87",
28195                 "initial": "\uFD88"
28196             },
28197             "\u0645\u062D\u062C": {
28198                 "initial": "\uFD89"
28199             },
28200             "\u0645\u062D\u0645": {
28201                 "initial": "\uFD8A"
28202             },
28203             "\u0645\u062D\u064A": {
28204                 "final": "\uFD8B"
28205             },
28206             "\u0645\u062C\u062D": {
28207                 "initial": "\uFD8C"
28208             },
28209             "\u0645\u062C\u0645": {
28210                 "initial": "\uFD8D"
28211             },
28212             "\u0645\u062E\u062C": {
28213                 "initial": "\uFD8E"
28214             },
28215             "\u0645\u062E\u0645": {
28216                 "initial": "\uFD8F"
28217             },
28218             "\u0645\u062C\u062E": {
28219                 "initial": "\uFD92"
28220             },
28221             "\u0647\u0645\u062C": {
28222                 "initial": "\uFD93"
28223             },
28224             "\u0647\u0645\u0645": {
28225                 "initial": "\uFD94"
28226             },
28227             "\u0646\u062D\u0645": {
28228                 "initial": "\uFD95"
28229             },
28230             "\u0646\u062D\u0649": {
28231                 "final": "\uFD96"
28232             },
28233             "\u0646\u062C\u0645": {
28234                 "final": "\uFD97",
28235                 "initial": "\uFD98"
28236             },
28237             "\u0646\u062C\u0649": {
28238                 "final": "\uFD99"
28239             },
28240             "\u0646\u0645\u064A": {
28241                 "final": "\uFD9A"
28242             },
28243             "\u0646\u0645\u0649": {
28244                 "final": "\uFD9B"
28245             },
28246             "\u064A\u0645\u0645": {
28247                 "final": "\uFD9C",
28248                 "initial": "\uFD9D"
28249             },
28250             "\u0628\u062E\u064A": {
28251                 "final": "\uFD9E"
28252             },
28253             "\u062A\u062C\u064A": {
28254                 "final": "\uFD9F"
28255             },
28256             "\u062A\u062C\u0649": {
28257                 "final": "\uFDA0"
28258             },
28259             "\u062A\u062E\u064A": {
28260                 "final": "\uFDA1"
28261             },
28262             "\u062A\u062E\u0649": {
28263                 "final": "\uFDA2"
28264             },
28265             "\u062A\u0645\u064A": {
28266                 "final": "\uFDA3"
28267             },
28268             "\u062A\u0645\u0649": {
28269                 "final": "\uFDA4"
28270             },
28271             "\u062C\u0645\u064A": {
28272                 "final": "\uFDA5"
28273             },
28274             "\u062C\u062D\u0649": {
28275                 "final": "\uFDA6"
28276             },
28277             "\u062C\u0645\u0649": {
28278                 "final": "\uFDA7"
28279             },
28280             "\u0633\u062E\u0649": {
28281                 "final": "\uFDA8"
28282             },
28283             "\u0635\u062D\u064A": {
28284                 "final": "\uFDA9"
28285             },
28286             "\u0634\u062D\u064A": {
28287                 "final": "\uFDAA"
28288             },
28289             "\u0636\u062D\u064A": {
28290                 "final": "\uFDAB"
28291             },
28292             "\u0644\u062C\u064A": {
28293                 "final": "\uFDAC"
28294             },
28295             "\u0644\u0645\u064A": {
28296                 "final": "\uFDAD"
28297             },
28298             "\u064A\u062D\u064A": {
28299                 "final": "\uFDAE"
28300             },
28301             "\u064A\u062C\u064A": {
28302                 "final": "\uFDAF"
28303             },
28304             "\u064A\u0645\u064A": {
28305                 "final": "\uFDB0"
28306             },
28307             "\u0645\u0645\u064A": {
28308                 "final": "\uFDB1"
28309             },
28310             "\u0642\u0645\u064A": {
28311                 "final": "\uFDB2"
28312             },
28313             "\u0646\u062D\u064A": {
28314                 "final": "\uFDB3"
28315             },
28316             "\u0639\u0645\u064A": {
28317                 "final": "\uFDB6"
28318             },
28319             "\u0643\u0645\u064A": {
28320                 "final": "\uFDB7"
28321             },
28322             "\u0646\u062C\u062D": {
28323                 "initial": "\uFDB8",
28324                 "final": "\uFDBD"
28325             },
28326             "\u0645\u062E\u064A": {
28327                 "final": "\uFDB9"
28328             },
28329             "\u0644\u062C\u0645": {
28330                 "initial": "\uFDBA",
28331                 "final": "\uFDBC"
28332             },
28333             "\u0643\u0645\u0645": {
28334                 "final": "\uFDBB",
28335                 "initial": "\uFDC3"
28336             },
28337             "\u062C\u062D\u064A": {
28338                 "final": "\uFDBE"
28339             },
28340             "\u062D\u062C\u064A": {
28341                 "final": "\uFDBF"
28342             },
28343             "\u0645\u062C\u064A": {
28344                 "final": "\uFDC0"
28345             },
28346             "\u0641\u0645\u064A": {
28347                 "final": "\uFDC1"
28348             },
28349             "\u0628\u062D\u064A": {
28350                 "final": "\uFDC2"
28351             },
28352             "\u0633\u062E\u064A": {
28353                 "final": "\uFDC6"
28354             },
28355             "\u0646\u062C\u064A": {
28356                 "final": "\uFDC7"
28357             },
28358             "\u0644\u0622": {
28359                 "isolated": "\uFEF5",
28360                 "final": "\uFEF6"
28361             },
28362             "\u0644\u0623": {
28363                 "isolated": "\uFEF7",
28364                 "final": "\uFEF8"
28365             },
28366             "\u0644\u0625": {
28367                 "isolated": "\uFEF9",
28368                 "final": "\uFEFA"
28369             },
28370             "\u0644\u0627": {
28371                 "isolated": "\uFEFB",
28372                 "final": "\uFEFC"
28373             },
28374             "words": {
28375                 "\u0635\u0644\u06D2": "\uFDF0",
28376                 "\u0642\u0644\u06D2": "\uFDF1",
28377                 "\u0627\u0644\u0644\u0647": "\uFDF2",
28378                 "\u0627\u0643\u0628\u0631": "\uFDF3",
28379                 "\u0645\u062D\u0645\u062F": "\uFDF4",
28380                 "\u0635\u0644\u0639\u0645": "\uFDF5",
28381                 "\u0631\u0633\u0648\u0644": "\uFDF6",
28382                 "\u0639\u0644\u064A\u0647": "\uFDF7",
28383                 "\u0648\u0633\u0644\u0645": "\uFDF8",
28384                 "\u0635\u0644\u0649": "\uFDF9",
28385                 "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
28386                 "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
28387                 "\u0631\u06CC\u0627\u0644": "\uFDFC"
28388             }
28389         };
28390         exports.default = ligatureReference;
28391         });
28392
28393         unwrapExports(unicodeLigatures);
28394
28395         var reference = createCommonjsModule(function (module, exports) {
28396         Object.defineProperty(exports, "__esModule", { value: true });
28397
28398
28399         var letterList = Object.keys(unicodeArabic.default);
28400         exports.letterList = letterList;
28401         var ligatureList = Object.keys(unicodeLigatures.default);
28402         exports.ligatureList = ligatureList;
28403         var ligatureWordList = Object.keys(unicodeLigatures.default.words);
28404         exports.ligatureWordList = ligatureWordList;
28405         var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
28406         exports.lams = lams;
28407         var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
28408         exports.alefs = alefs;
28409         // for (var l = 1; l < lams.length; l++) {
28410         //   console.log('-');
28411         //   for (var a = 0; a < alefs.length; a++) {
28412         //     console.log(a + ': ' + lams[l] + alefs[a]);
28413         //   }
28414         // }
28415         var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
28416         exports.tashkeel = tashkeel;
28417         function addToTashkeel(start, finish) {
28418             for (var i = start; i <= finish; i++) {
28419                 exports.tashkeel = tashkeel += String.fromCharCode(i);
28420             }
28421         }
28422         addToTashkeel(0x0610, 0x061A);
28423         addToTashkeel(0x064B, 0x065F);
28424         addToTashkeel(0x06D6, 0x06DC);
28425         addToTashkeel(0x06E0, 0x06E4);
28426         addToTashkeel(0x06EA, 0x06ED);
28427         addToTashkeel(0x08D3, 0x08E1);
28428         addToTashkeel(0x08E3, 0x08FF);
28429         addToTashkeel(0xFE70, 0xFE7F);
28430         var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
28431         exports.lineBreakers = lineBreakers;
28432         function addToLineBreakers(start, finish) {
28433             for (var i = start; i <= finish; i++) {
28434                 exports.lineBreakers = lineBreakers += String.fromCharCode(i);
28435             }
28436         }
28437         addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
28438         addToLineBreakers(0x0621, 0x0625);
28439         addToLineBreakers(0x062F, 0x0632);
28440         addToLineBreakers(0x0660, 0x066D); // numerals, math
28441         addToLineBreakers(0x0671, 0x0677);
28442         addToLineBreakers(0x0688, 0x0699);
28443         addToLineBreakers(0x06C3, 0x06CB);
28444         addToLineBreakers(0x06D2, 0x06F9);
28445         addToLineBreakers(0x0759, 0x075B);
28446         addToLineBreakers(0x08AA, 0x08AE);
28447         addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
28448         // Presentation Forms A includes diacritics but they are meant to stand alone
28449         addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
28450         // numerals, math
28451         addToLineBreakers(0x10E60, 0x10E7F);
28452         addToLineBreakers(0x1EC70, 0x1ECBF);
28453         addToLineBreakers(0x1EE00, 0x1EEFF);
28454         });
28455
28456         unwrapExports(reference);
28457         var reference_1 = reference.letterList;
28458         var reference_2 = reference.ligatureList;
28459         var reference_3 = reference.ligatureWordList;
28460         var reference_4 = reference.lams;
28461         var reference_5 = reference.alefs;
28462         var reference_6 = reference.tashkeel;
28463         var reference_7 = reference.lineBreakers;
28464
28465         var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
28466         Object.defineProperty(exports, "__esModule", { value: true });
28467
28468
28469         function GlyphSplitter(word) {
28470             var letters = [];
28471             var lastLetter = '';
28472             word.split('').forEach(function (letter) {
28473                 if (isArabic_1.isArabic(letter)) {
28474                     if (reference.tashkeel.indexOf(letter) > -1) {
28475                         letters[letters.length - 1] += letter;
28476                     }
28477                     else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) {
28478                         // valid LA forms
28479                         letters[letters.length - 1] += letter;
28480                     }
28481                     else {
28482                         letters.push(letter);
28483                     }
28484                 }
28485                 else {
28486                     letters.push(letter);
28487                 }
28488                 if (reference.tashkeel.indexOf(letter) === -1) {
28489                     lastLetter = letter;
28490                 }
28491             });
28492             return letters;
28493         }
28494         exports.GlyphSplitter = GlyphSplitter;
28495         });
28496
28497         unwrapExports(GlyphSplitter_1);
28498         var GlyphSplitter_2 = GlyphSplitter_1.GlyphSplitter;
28499
28500         var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
28501         Object.defineProperty(exports, "__esModule", { value: true });
28502
28503
28504         function BaselineSplitter(word) {
28505             var letters = [];
28506             var lastLetter = '';
28507             word.split('').forEach(function (letter) {
28508                 if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
28509                     if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
28510                         letters[letters.length - 1] += letter;
28511                     }
28512                     else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
28513                         letters.push(letter);
28514                     }
28515                     else {
28516                         letters[letters.length - 1] += letter;
28517                     }
28518                 }
28519                 else {
28520                     letters.push(letter);
28521                 }
28522                 if (reference.tashkeel.indexOf(letter) === -1) {
28523                     // don't allow tashkeel to hide line break
28524                     lastLetter = letter;
28525                 }
28526             });
28527             return letters;
28528         }
28529         exports.BaselineSplitter = BaselineSplitter;
28530         });
28531
28532         unwrapExports(BaselineSplitter_1);
28533         var BaselineSplitter_2 = BaselineSplitter_1.BaselineSplitter;
28534
28535         var Normalization = createCommonjsModule(function (module, exports) {
28536         Object.defineProperty(exports, "__esModule", { value: true });
28537
28538
28539
28540
28541         function Normal(word, breakPresentationForm) {
28542             // default is to turn initial/isolated/medial/final presentation form to generic
28543             if (typeof breakPresentationForm === 'undefined') {
28544                 breakPresentationForm = true;
28545             }
28546             var returnable = '';
28547             word.split('').forEach(function (letter) {
28548                 if (!isArabic_1.isArabic(letter)) {
28549                     returnable += letter;
28550                     return;
28551                 }
28552                 for (var w = 0; w < reference.letterList.length; w++) {
28553                     // ok so we are checking this potential lettertron
28554                     var letterForms = unicodeArabic.default[reference.letterList[w]];
28555                     var versions = Object.keys(letterForms);
28556                     for (var v = 0; v < versions.length; v++) {
28557                         var localVersion = letterForms[versions[v]];
28558                         if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28559                             // look at this embedded object
28560                             var embeddedForms = Object.keys(localVersion);
28561                             for (var ef = 0; ef < embeddedForms.length; ef++) {
28562                                 var form = localVersion[embeddedForms[ef]];
28563                                 if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28564                                     // match
28565                                     // console.log('embedded match');
28566                                     if (form === letter) {
28567                                         // match exact
28568                                         if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
28569                                             // replace presentation form
28570                                             // console.log('keeping normal form of the letter');
28571                                             if (typeof localVersion['normal'] === 'object') {
28572                                                 returnable += localVersion['normal'][0];
28573                                             }
28574                                             else {
28575                                                 returnable += localVersion['normal'];
28576                                             }
28577                                             return;
28578                                         }
28579                                         // console.log('keeping this letter');
28580                                         returnable += letter;
28581                                         return;
28582                                     }
28583                                     else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) {
28584                                         // match
28585                                         returnable += form[0];
28586                                         // console.log('added the first letter from the same array');
28587                                         return;
28588                                     }
28589                                 }
28590                             }
28591                         }
28592                         else if (localVersion === letter) {
28593                             // match exact
28594                             if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
28595                                 // replace presentation form
28596                                 // console.log('keeping normal form of the letter');
28597                                 if (typeof letterForms['normal'] === 'object') {
28598                                     returnable += letterForms['normal'][0];
28599                                 }
28600                                 else {
28601                                     returnable += letterForms['normal'];
28602                                 }
28603                                 return;
28604                             }
28605                             // console.log('keeping this letter');
28606                             returnable += letter;
28607                             return;
28608                         }
28609                         else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
28610                             // match
28611                             returnable += localVersion[0];
28612                             // console.log('added the first letter from the same array');
28613                             return;
28614                         }
28615                     }
28616                 }
28617                 // try ligatures
28618                 for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
28619                     var normalForm = reference.ligatureList[v2];
28620                     if (normalForm !== 'words') {
28621                         var ligForms = Object.keys(unicodeLigatures.default[normalForm]);
28622                         for (var f = 0; f < ligForms.length; f++) {
28623                             if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) {
28624                                 returnable += normalForm;
28625                                 return;
28626                             }
28627                         }
28628                     }
28629                 }
28630                 // try words ligatures
28631                 for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
28632                     var normalForm = reference.ligatureWordList[v3];
28633                     if (unicodeLigatures.default.words[normalForm] === letter) {
28634                         returnable += normalForm;
28635                         return;
28636                     }
28637                 }
28638                 returnable += letter;
28639                 // console.log('kept the letter')
28640             });
28641             return returnable;
28642         }
28643         exports.Normal = Normal;
28644         });
28645
28646         unwrapExports(Normalization);
28647         var Normalization_1 = Normalization.Normal;
28648
28649         var CharShaper_1 = createCommonjsModule(function (module, exports) {
28650         Object.defineProperty(exports, "__esModule", { value: true });
28651
28652
28653
28654         function CharShaper(letter, form) {
28655             if (!isArabic_1.isArabic(letter)) {
28656                 // fail not Arabic
28657                 throw new Error('Not Arabic');
28658             }
28659             if (letter === "\u0621") {
28660                 // hamza alone
28661                 return "\u0621";
28662             }
28663             for (var w = 0; w < reference.letterList.length; w++) {
28664                 // ok so we are checking this potential lettertron
28665                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28666                 var versions = Object.keys(letterForms);
28667                 for (var v = 0; v < versions.length; v++) {
28668                     var localVersion = letterForms[versions[v]];
28669                     if ((localVersion === letter) ||
28670                         (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28671                         if (versions.indexOf(form) > -1) {
28672                             return letterForms[form];
28673                         }
28674                     }
28675                     else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28676                         // check embedded
28677                         var embeddedVersions = Object.keys(localVersion);
28678                         for (var ev = 0; ev < embeddedVersions.length; ev++) {
28679                             if ((localVersion[embeddedVersions[ev]] === letter) ||
28680                                 (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) {
28681                                 if (embeddedVersions.indexOf(form) > -1) {
28682                                     return localVersion[form];
28683                                 }
28684                             }
28685                         }
28686                     }
28687                 }
28688             }
28689         }
28690         exports.CharShaper = CharShaper;
28691         });
28692
28693         unwrapExports(CharShaper_1);
28694         var CharShaper_2 = CharShaper_1.CharShaper;
28695
28696         var WordShaper_1 = createCommonjsModule(function (module, exports) {
28697         Object.defineProperty(exports, "__esModule", { value: true });
28698
28699
28700
28701
28702         function WordShaper(word) {
28703             var state = 'initial';
28704             var output = '';
28705             for (var w = 0; w < word.length; w++) {
28706                 var nextLetter = ' ';
28707                 for (var nxw = w + 1; nxw < word.length; nxw++) {
28708                     if (!isArabic_1.isArabic(word[nxw])) {
28709                         break;
28710                     }
28711                     if (reference.tashkeel.indexOf(word[nxw]) === -1) {
28712                         nextLetter = word[nxw];
28713                         break;
28714                     }
28715                 }
28716                 if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
28717                     // space or other non-Arabic
28718                     output += word[w];
28719                     state = 'initial';
28720                 }
28721                 else if (reference.tashkeel.indexOf(word[w]) > -1) {
28722                     // tashkeel - add without changing state
28723                     output += word[w];
28724                 }
28725                 else if ((nextLetter === ' ') // last Arabic letter in this word
28726                     || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines
28727                     output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
28728                     state = 'initial';
28729                 }
28730                 else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
28731                     // LA letters - advance an additional letter after this
28732                     output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')];
28733                     while (word[w] !== nextLetter) {
28734                         w++;
28735                     }
28736                     state = 'initial';
28737                 }
28738                 else {
28739                     output += CharShaper_1.CharShaper(word[w], state);
28740                     state = 'medial';
28741                 }
28742             }
28743             return output;
28744         }
28745         exports.WordShaper = WordShaper;
28746         });
28747
28748         unwrapExports(WordShaper_1);
28749         var WordShaper_2 = WordShaper_1.WordShaper;
28750
28751         var ParentLetter_1 = createCommonjsModule(function (module, exports) {
28752         Object.defineProperty(exports, "__esModule", { value: true });
28753
28754
28755
28756         function ParentLetter(letter) {
28757             if (!isArabic_1.isArabic(letter)) {
28758                 throw new Error('Not an Arabic letter');
28759             }
28760             for (var w = 0; w < reference.letterList.length; w++) {
28761                 // ok so we are checking this potential lettertron
28762                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28763                 var versions = Object.keys(letterForms);
28764                 for (var v = 0; v < versions.length; v++) {
28765                     var localVersion = letterForms[versions[v]];
28766                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28767                         // look at this embedded object
28768                         var embeddedForms = Object.keys(localVersion);
28769                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28770                             var form = localVersion[embeddedForms[ef]];
28771                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28772                                 // match
28773                                 return localVersion;
28774                             }
28775                         }
28776                     }
28777                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28778                         // match
28779                         return letterForms;
28780                     }
28781                 }
28782                 return null;
28783             }
28784         }
28785         exports.ParentLetter = ParentLetter;
28786         function GrandparentLetter(letter) {
28787             if (!isArabic_1.isArabic(letter)) {
28788                 throw new Error('Not an Arabic letter');
28789             }
28790             for (var w = 0; w < reference.letterList.length; w++) {
28791                 // ok so we are checking this potential lettertron
28792                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28793                 var versions = Object.keys(letterForms);
28794                 for (var v = 0; v < versions.length; v++) {
28795                     var localVersion = letterForms[versions[v]];
28796                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28797                         // look at this embedded object
28798                         var embeddedForms = Object.keys(localVersion);
28799                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28800                             var form = localVersion[embeddedForms[ef]];
28801                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28802                                 // match
28803                                 return letterForms;
28804                             }
28805                         }
28806                     }
28807                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28808                         // match
28809                         return letterForms;
28810                     }
28811                 }
28812                 return null;
28813             }
28814         }
28815         exports.GrandparentLetter = GrandparentLetter;
28816         });
28817
28818         unwrapExports(ParentLetter_1);
28819         var ParentLetter_2 = ParentLetter_1.ParentLetter;
28820         var ParentLetter_3 = ParentLetter_1.GrandparentLetter;
28821
28822         var lib$1 = createCommonjsModule(function (module, exports) {
28823         Object.defineProperty(exports, "__esModule", { value: true });
28824
28825         exports.isArabic = isArabic_1.isArabic;
28826
28827         exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
28828
28829         exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
28830
28831         exports.Normal = Normalization.Normal;
28832
28833         exports.CharShaper = CharShaper_1.CharShaper;
28834
28835         exports.WordShaper = WordShaper_1.WordShaper;
28836
28837         exports.ParentLetter = ParentLetter_1.ParentLetter;
28838         exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
28839         });
28840
28841         unwrapExports(lib$1);
28842         var lib_1 = lib$1.isArabic;
28843         var lib_2 = lib$1.GlyphSplitter;
28844         var lib_3 = lib$1.BaselineSplitter;
28845         var lib_4 = lib$1.Normal;
28846         var lib_5 = lib$1.CharShaper;
28847         var lib_6 = lib$1.WordShaper;
28848         var lib_7 = lib$1.ParentLetter;
28849         var lib_8 = lib$1.GrandparentLetter;
28850
28851         // see https://github.com/openstreetmap/iD/pull/3707
28852
28853         var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
28854
28855         function fixRTLTextForSvg(inputText) {
28856             var ret = '', rtlBuffer = [];
28857             var arabicRegex = /[\u0600-\u06FF]/g;
28858             var arabicMath = /[\u0660-\u066C]+/g;
28859             var thaanaVowel = /[\u07A6-\u07B0]/;
28860             var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
28861
28862             if (!arabicRegex.test(inputText)) {
28863                 // Hebrew or Thaana RTL script
28864                 for (var n = 0; n < inputText.length; n++) {
28865                     var c = inputText[n];
28866                     if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
28867                         rtlBuffer[rtlBuffer.length - 1] += c;
28868                     } else if (rtlRegex.test(c)) {
28869                         rtlBuffer.push(c);
28870                     } else if (c === ' ' && rtlBuffer.length) {
28871                         // whitespace within RTL text
28872                         rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
28873                     } else {
28874                         // non-RTL character
28875                         ret += rtlBuffer.reverse().join('') + c;
28876                         rtlBuffer = [];
28877                     }
28878                 }
28879                 ret += rtlBuffer.reverse().join('');
28880                 return ret;
28881             } else {
28882                 var label = lib_6(inputText).split('').reverse().join('');
28883                 // prevent Arabic numbers from being reversed
28884                 var numericSwaps = label.match(arabicMath) || [];
28885                 for (var i = 0; i < numericSwaps.length; i++) {
28886                     if (numericSwaps[i].length > 1) {
28887                         label = label.replace(numericSwaps[i], numericSwaps[i].split('').reverse().join(''));
28888                     }
28889                 }
28890                 return label;
28891             }
28892         }
28893
28894         var translations = Object.create(null);
28895
28896         var currentLocale = 'en';
28897         var textDirection = 'ltr';
28898
28899         function setLocale(val) {
28900             if (translations[val] !== undefined) {
28901                 currentLocale = val;
28902             } else if (translations[val.split('-')[0]]) {
28903                 currentLocale = val.split('-')[0];
28904             }
28905         }
28906
28907         function addTranslation(id, value) {
28908             translations[id] = value;
28909         }
28910
28911         /**
28912          * Given a string identifier, try to find that string in the current
28913          * language, and return it.  This function will be called recursively
28914          * with locale `en` if a string can not be found in the requested language.
28915          *
28916          * @param {string}   s   string identifier
28917          * @param {object?}  o   object of token replacements and default string
28918          * @param {string?}  loc locale to use
28919          * @returns {string?} locale string
28920          */
28921         function t(s, o, loc) {
28922             loc = loc || currentLocale;
28923
28924             var path = s
28925                 .split('.')
28926                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28927                 .reverse();
28928
28929             var rep = translations[loc];
28930
28931             while (rep !== undefined && path.length) {
28932                 rep = rep[path.pop()];
28933             }
28934
28935             if (rep !== undefined) {
28936                 if (o) {
28937                     for (var k in o) {
28938                         var variable = '{' + k + '}';
28939                         var re = new RegExp(variable, 'g'); // check globally for variables
28940                         rep = rep.replace(re, o[k]);
28941                     }
28942                 }
28943                 return rep;
28944             }
28945
28946             if (loc !== 'en') {
28947                 return t(s, o, 'en');
28948             }
28949
28950             if (o && 'default' in o) {
28951                 return o.default;
28952             }
28953
28954             var missing = 'Missing ' + loc + ' translation: ' + s;
28955             if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28956
28957             return missing;
28958         }
28959
28960         /**
28961          * Given string 'ltr' or 'rtl', save that setting
28962          *
28963          * @param {string} dir ltr or rtl
28964          */
28965
28966         function setTextDirection(dir) {
28967             textDirection = dir;
28968         }
28969
28970         var detected;
28971
28972         function utilDetect(force) {
28973             if (detected && !force) return detected;
28974             detected = {};
28975
28976             var ua = navigator.userAgent,
28977                 m = null,
28978                 q = utilStringQs(window.location.hash.substring(1));
28979
28980             m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
28981             if (m !== null) {
28982                 detected.browser = m[1];
28983                 detected.version = m[2];
28984             }
28985             if (!detected.browser) {
28986                 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
28987                 if (m !== null) {
28988                     detected.browser = 'msie';
28989                     detected.version = m[1];
28990                 }
28991             }
28992             if (!detected.browser) {
28993                 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
28994                 if (m !== null) {
28995                     detected.browser = 'Opera';
28996                     detected.version = m[2];
28997                 }
28998             }
28999             if (!detected.browser) {
29000                 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
29001                 if (m !== null) {
29002                     detected.browser = m[1];
29003                     detected.version = m[2];
29004                     m = ua.match(/version\/([\.\d]+)/i);
29005                     if (m !== null) detected.version = m[1];
29006                 }
29007             }
29008             if (!detected.browser) {
29009                 detected.browser = navigator.appName;
29010                 detected.version = navigator.appVersion;
29011             }
29012
29013             // keep major.minor version only..
29014             detected.version = detected.version.split(/\W/).slice(0,2).join('.');
29015
29016             if (detected.browser.toLowerCase() === 'msie') {
29017                 detected.ie = true;
29018                 detected.browser = 'Internet Explorer';
29019                 detected.support = parseFloat(detected.version) >= 11;
29020             } else {
29021                 detected.ie = false;
29022                 detected.support = true;
29023             }
29024
29025             // Added due to incomplete svg style support. See #715
29026             detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
29027
29028             // Set locale based on url param (format 'en-US') or browser lang (default)
29029             if (q.hasOwnProperty('locale')) {
29030                 detected.locale = q.locale;
29031                 detected.language = q.locale.split('-')[0];
29032             } else {
29033                 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
29034                 detected.language = detected.locale.split('-')[0];
29035
29036                 // Search `navigator.languages` for a better locale. Prefer the first language,
29037                 // unless the second language is a culture-specific version of the first one, see #3842
29038                 if (navigator.languages && navigator.languages.length > 0) {
29039                     var code0 = navigator.languages[0],
29040                         parts0 = code0.split('-');
29041
29042                     detected.locale = code0;
29043                     detected.language = parts0[0];
29044
29045                     if (navigator.languages.length > 1 && parts0.length === 1) {
29046                         var code1 = navigator.languages[1],
29047                             parts1 = code1.split('-');
29048
29049                         if (parts1[0] === parts0[0]) {
29050                             detected.locale = code1;
29051                         }
29052                     }
29053                 }
29054             }
29055
29056             // Loaded locale is stored in currentLocale
29057             // return that instead (except in the situation where 'en' might override 'en-US')
29058             var loadedLocale = currentLocale || 'en';
29059             if (loadedLocale !== 'en') {
29060                 detected.locale = loadedLocale;
29061                 detected.language = detected.locale.split('-')[0];
29062             }
29063
29064             // detect text direction
29065             var lang = dataLocales[detected.locale];
29066             if ((lang && lang.rtl) || (q.rtl === 'true')) {
29067                 detected.textDirection = 'rtl';
29068             } else {
29069                 detected.textDirection = 'ltr';
29070             }
29071             setTextDirection(detected.textDirection);
29072
29073             // detect host
29074             var loc = window.top.location;
29075             var origin = loc.origin;
29076             if (!origin) {  // for unpatched IE11
29077                 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
29078             }
29079
29080             detected.host = origin + loc.pathname;
29081
29082             detected.filedrop = (window.FileReader && 'ondrop' in window);
29083
29084             detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29085
29086             detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29087
29088             function nav(x) {
29089                 return navigator.userAgent.indexOf(x) !== -1;
29090             }
29091
29092             if (nav('Win')) {
29093                 detected.os = 'win';
29094                 detected.platform = 'Windows';
29095             }
29096             else if (nav('Mac')) {
29097                 detected.os = 'mac';
29098                 detected.platform = 'Macintosh';
29099             }
29100             else if (nav('X11') || nav('Linux')) {
29101                 detected.os = 'linux';
29102                 detected.platform = 'Linux';
29103             }
29104             else {
29105                 detected.os = 'win';
29106                 detected.platform = 'Unknown';
29107             }
29108
29109             return detected;
29110         }
29111
29112         function utilTagText(entity) {
29113             var obj = (entity && entity.tags) || {};
29114             return Object.keys(obj)
29115                 .map(function(k) { return k + '=' + obj[k]; })
29116                 .join(', ');
29117         }
29118
29119
29120         function utilTagDiff(oldTags, newTags) {
29121             var tagDiff = [];
29122             var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
29123             keys.forEach(function(k) {
29124                 var oldVal = oldTags[k];
29125                 var newVal = newTags[k];
29126
29127                 if (oldVal && (!newVal || newVal !== oldVal)) {
29128                     tagDiff.push({
29129                         type: '-',
29130                         key: k,
29131                         oldVal: oldVal,
29132                         newVal: newVal,
29133                         display: '- ' + k + '=' + oldVal
29134                     });
29135                 }
29136                 if (newVal && (!oldVal || newVal !== oldVal)) {
29137                     tagDiff.push({
29138                         type: '+',
29139                         key: k,
29140                         oldVal: oldVal,
29141                         newVal: newVal,
29142                         display: '+ ' + k + '=' + newVal
29143                     });
29144                 }
29145             });
29146             return tagDiff;
29147         }
29148
29149
29150         function utilEntitySelector(ids) {
29151             return ids.length ? '.' + ids.join(',.') : 'nothing';
29152         }
29153
29154
29155         // returns an selector to select entity ids for:
29156         //  - entityIDs passed in
29157         //  - shallow descendant entityIDs for any of those entities that are relations
29158         function utilEntityOrMemberSelector(ids, graph) {
29159             var seen = new Set(ids);
29160             ids.forEach(collectShallowDescendants);
29161             return utilEntitySelector(Array.from(seen));
29162
29163             function collectShallowDescendants(id) {
29164                 var entity = graph.hasEntity(id);
29165                 if (!entity || entity.type !== 'relation') return;
29166
29167                 entity.members
29168                     .map(function(member) { return member.id; })
29169                     .forEach(function(id) { seen.add(id); });
29170             }
29171         }
29172
29173
29174         // returns an selector to select entity ids for:
29175         //  - entityIDs passed in
29176         //  - deep descendant entityIDs for any of those entities that are relations
29177         function utilEntityOrDeepMemberSelector(ids, graph) {
29178             var seen = new Set();
29179             ids.forEach(collectDeepDescendants);
29180             return utilEntitySelector(Array.from(seen));
29181
29182             function collectDeepDescendants(id) {
29183                 if (seen.has(id)) return;
29184                 seen.add(id);
29185
29186                 var entity = graph.hasEntity(id);
29187                 if (!entity || entity.type !== 'relation') return;
29188
29189                 entity.members
29190                     .map(function(member) { return member.id; })
29191                     .forEach(collectDeepDescendants);   // recurse
29192             }
29193         }
29194
29195
29196         // Adds or removes highlight styling for the specified entities
29197         function utilHighlightEntities(ids, highlighted, context) {
29198             context.surface()
29199                 .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
29200                 .classed('highlighted', highlighted);
29201         }
29202
29203
29204         // returns an Array that is the union of:
29205         //  - nodes for any nodeIDs passed in
29206         //  - child nodes of any wayIDs passed in
29207         //  - descendant member and child nodes of relationIDs passed in
29208         function utilGetAllNodes(ids, graph) {
29209             var seen = new Set();
29210             var nodes = new Set();
29211
29212             ids.forEach(collectNodes);
29213             return Array.from(nodes);
29214
29215             function collectNodes(id) {
29216                 if (seen.has(id)) return;
29217                 seen.add(id);
29218
29219                 var entity = graph.hasEntity(id);
29220                 if (!entity) return;
29221
29222                 if (entity.type === 'node') {
29223                     nodes.add(entity);
29224                 } else if (entity.type === 'way') {
29225                     entity.nodes.forEach(collectNodes);
29226                 } else {
29227                     entity.members
29228                         .map(function(member) { return member.id; })
29229                         .forEach(collectNodes);   // recurse
29230                 }
29231             }
29232         }
29233
29234
29235         function utilDisplayName(entity) {
29236             var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29237             var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29238             var network = entity.tags.cycle_network || entity.tags.network;
29239
29240             if (!name && entity.tags.ref) {
29241                 name = entity.tags.ref;
29242                 if (network) {
29243                     name = network + ' ' + name;
29244                 }
29245             }
29246
29247             return name;
29248         }
29249
29250
29251         function utilDisplayNameForPath(entity) {
29252             var name = utilDisplayName(entity);
29253             var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29254
29255             if (!isFirefox && name && rtlRegex.test(name)) {
29256                 name = fixRTLTextForSvg(name);
29257             }
29258
29259             return name;
29260         }
29261
29262
29263         function utilDisplayType(id) {
29264             return {
29265                 n: t('inspector.node'),
29266                 w: t('inspector.way'),
29267                 r: t('inspector.relation')
29268             }[id.charAt(0)];
29269         }
29270
29271
29272         function utilDisplayLabel(entity, context) {
29273             var displayName = utilDisplayName(entity);
29274             if (displayName) {
29275                 // use the display name if there is one
29276                 return displayName;
29277             }
29278             var preset = utilPreset(entity, context);
29279             if (preset && preset.name()) {
29280                 // use the preset name if there is a match
29281                 return preset.name();
29282             }
29283             // fallback to the display type (node/way/relation)
29284             return utilDisplayType(entity.id);
29285         }
29286
29287
29288         function utilPreset(entity, context) {
29289             return context.presets().match(entity, context.graph());
29290         }
29291
29292
29293         function utilEntityRoot(entityType) {
29294             return {
29295                 node: 'n',
29296                 way: 'w',
29297                 relation: 'r'
29298             }[entityType];
29299         }
29300
29301
29302         function utilStringQs(str) {
29303             return str.split('&').reduce(function(obj, pair){
29304                 var parts = pair.split('=');
29305                 if (parts.length === 2) {
29306                     obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29307                 }
29308                 return obj;
29309             }, {});
29310         }
29311
29312
29313         function utilQsString(obj, noencode) {
29314             // encode everything except special characters used in certain hash parameters:
29315             // "/" in map states, ":", ",", {" and "}" in background
29316             function softEncode(s) {
29317                 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29318             }
29319
29320             return Object.keys(obj).sort().map(function(key) {
29321                 return encodeURIComponent(key) + '=' + (
29322                     noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29323             }).join('&');
29324         }
29325
29326
29327         function utilPrefixDOMProperty(property) {
29328             var prefixes = ['webkit', 'ms', 'moz', 'o'];
29329             var i = -1;
29330             var n = prefixes.length;
29331             var s = document.body;
29332
29333             if (property in s)
29334                 return property;
29335
29336             property = property.substr(0, 1).toUpperCase() + property.substr(1);
29337
29338             while (++i < n) {
29339                 if (prefixes[i] + property in s) {
29340                     return prefixes[i] + property;
29341                 }
29342             }
29343
29344             return false;
29345         }
29346
29347
29348         function utilPrefixCSSProperty(property) {
29349             var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29350             var i = -1;
29351             var n = prefixes.length;
29352             var s = document.body.style;
29353
29354             if (property.toLowerCase() in s) {
29355                 return property.toLowerCase();
29356             }
29357
29358             while (++i < n) {
29359                 if (prefixes[i] + property in s) {
29360                     return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29361                 }
29362             }
29363
29364             return false;
29365         }
29366
29367
29368         var transformProperty;
29369         function utilSetTransform(el, x, y, scale) {
29370             var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29371             var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29372                 : 'translate3d(' + x + 'px,' + y + 'px,0)';
29373             return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29374         }
29375
29376
29377         // Calculates Levenshtein distance between two strings
29378         // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29379         // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29380         function utilEditDistance(a, b) {
29381             a = remove$1(a.toLowerCase());
29382             b = remove$1(b.toLowerCase());
29383             if (a.length === 0) return b.length;
29384             if (b.length === 0) return a.length;
29385             var matrix = [];
29386             for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
29387             for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
29388             for (i = 1; i <= b.length; i++) {
29389                 for (j = 1; j <= a.length; j++) {
29390                     if (b.charAt(i-1) === a.charAt(j-1)) {
29391                         matrix[i][j] = matrix[i-1][j-1];
29392                     } else {
29393                         matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
29394                             Math.min(matrix[i][j-1] + 1, // insertion
29395                             matrix[i-1][j] + 1)); // deletion
29396                     }
29397                 }
29398             }
29399             return matrix[b.length][a.length];
29400         }
29401
29402
29403         // a d3.mouse-alike which
29404         // 1. Only works on HTML elements, not SVG
29405         // 2. Does not cause style recalculation
29406         function utilFastMouse(container) {
29407             var rect = container.getBoundingClientRect();
29408             var rectLeft = rect.left;
29409             var rectTop = rect.top;
29410             var clientLeft = +container.clientLeft;
29411             var clientTop = +container.clientTop;
29412
29413             if (textDirection === 'rtl') {
29414                 rectLeft = 0;
29415             }
29416             return function(e) {
29417                 return [
29418                     e.clientX - rectLeft - clientLeft,
29419                     e.clientY - rectTop - clientTop];
29420             };
29421         }
29422
29423
29424         function utilAsyncMap(inputs, func, callback) {
29425             var remaining = inputs.length;
29426             var results = [];
29427             var errors = [];
29428
29429             inputs.forEach(function(d, i) {
29430                 func(d, function done(err, data) {
29431                     errors[i] = err;
29432                     results[i] = data;
29433                     remaining--;
29434                     if (!remaining) callback(errors, results);
29435                 });
29436             });
29437         }
29438
29439
29440         // wraps an index to an interval [0..length-1]
29441         function utilWrap(index, length) {
29442             if (index < 0) {
29443                 index += Math.ceil(-index/length)*length;
29444             }
29445             return index % length;
29446         }
29447
29448
29449         /**
29450          * a replacement for functor
29451          *
29452          * @param {*} value any value
29453          * @returns {Function} a function that returns that value or the value if it's a function
29454          */
29455         function utilFunctor(value) {
29456             if (typeof value === 'function') return value;
29457             return function() {
29458                 return value;
29459             };
29460         }
29461
29462
29463         function utilNoAuto(selection) {
29464             var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
29465
29466             return selection
29467                 // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
29468                 .attr('autocomplete', 'new-password')
29469                 .attr('autocorrect', 'off')
29470                 .attr('autocapitalize', 'off')
29471                 .attr('spellcheck', isText ? 'true' : 'false');
29472         }
29473
29474
29475         // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
29476         // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
29477         function utilHashcode(str) {
29478             var hash = 0;
29479             if (str.length === 0) {
29480                 return hash;
29481             }
29482             for (var i = 0; i < str.length; i++) {
29483                 var char = str.charCodeAt(i);
29484                 hash = ((hash << 5) - hash) + char;
29485                 hash = hash & hash; // Convert to 32bit integer
29486             }
29487             return hash;
29488         }
29489
29490         function utilCleanTags(tags) {
29491             var out = {};
29492             for (var k in tags) {
29493                 if (!k) continue;
29494                 var v = tags[k];
29495                 if (v !== undefined) {
29496                     out[k] = cleanValue(k, v);
29497                 }
29498             }
29499
29500             return out;
29501
29502
29503             function cleanValue(k, v) {
29504                 function keepSpaces(k) {
29505                     return /_hours|_times|:conditional$/.test(k);
29506                 }
29507
29508                 function skip(k) {
29509                     return /^(description|note|fixme)$/.test(k);
29510                 }
29511
29512                 if (skip(k)) return v;
29513
29514                 var cleaned = v
29515                     .split(';')
29516                     .map(function(s) { return s.trim(); })
29517                     .join(keepSpaces(k) ? '; ' : ';');
29518
29519                 // The code below is not intended to validate websites and emails.
29520                 // It is only intended to prevent obvious copy-paste errors. (#2323)
29521                 // clean website- and email-like tags
29522                 if (k.indexOf('website') !== -1 ||
29523                     k.indexOf('email') !== -1 ||
29524                     cleaned.indexOf('http') === 0) {
29525                     cleaned = cleaned
29526                         .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
29527
29528                 }
29529
29530                 return cleaned;
29531             }
29532         }
29533
29534         // Like selection.property('value', ...), but avoids no-op value sets,
29535         // which can result in layout/repaint thrashing in some situations.
29536         function utilGetSetValue(selection, value) {
29537             function d3_selection_value(value) {
29538                 function valueNull() {
29539                     delete this.value;
29540                 }
29541
29542                 function valueConstant() {
29543                     if (this.value !== value) {
29544                         this.value = value;
29545                     }
29546                 }
29547
29548                 function valueFunction() {
29549                     var x = value.apply(this, arguments);
29550                     if (x == null) {
29551                         delete this.value;
29552                     } else if (this.value !== x) {
29553                         this.value = x;
29554                     }
29555                 }
29556
29557                 return value == null
29558                     ? valueNull : (typeof value === 'function'
29559                     ? valueFunction : valueConstant);
29560             }
29561
29562             if (arguments.length === 1) {
29563                 return selection.property('value');
29564             }
29565
29566             return selection.each(d3_selection_value(value));
29567         }
29568
29569         function utilKeybinding(namespace) {
29570             var _keybindings = {};
29571
29572
29573             function testBindings(isCapturing) {
29574                 var didMatch = false;
29575                 var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
29576                 var i, binding;
29577
29578                 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29579                 // so we don't strictly match on the shift key, but we prioritize
29580                 // shifted keybindings first, and fallback to unshifted only if no match.
29581                 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29582
29583                 // priority match shifted keybindings first
29584                 for (i = 0; i < bindings.length; i++) {
29585                     binding = bindings[i];
29586                     if (!binding.event.modifiers.shiftKey) continue;  // no shift
29587                     if (!!binding.capture !== isCapturing) continue;
29588                     if (matches(binding, true)) {
29589                         binding.callback();
29590                         didMatch = true;
29591                     }
29592                 }
29593
29594                 // then unshifted keybindings
29595                 if (didMatch) return;
29596                 for (i = 0; i < bindings.length; i++) {
29597                     binding = bindings[i];
29598                     if (binding.event.modifiers.shiftKey) continue;   // shift
29599                     if (!!binding.capture !== isCapturing) continue;
29600                     if (matches(binding, false)) {
29601                         binding.callback();
29602                     }
29603                 }
29604
29605
29606                 function matches(binding, testShift) {
29607                     var event$1 = event;
29608                     var isMatch = false;
29609                     var tryKeyCode = true;
29610
29611                     // Prefer a match on `KeyboardEvent.key`
29612                     if (event$1.key !== undefined) {
29613                         tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29614                         isMatch = true;
29615
29616                         if (binding.event.key === undefined) {
29617                             isMatch = false;
29618                         } else if (Array.isArray(binding.event.key)) {
29619                             if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
29620                                 isMatch = false;
29621                         } else {
29622                             if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29623                                 isMatch = false;
29624                         }
29625                     }
29626
29627                     // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29628                     // - browser doesn't support `KeyboardEvent.key`
29629                     // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29630                     if (!isMatch && tryKeyCode) {
29631                         isMatch = (event$1.keyCode === binding.event.keyCode);
29632                     }
29633
29634                     if (!isMatch) return false;
29635
29636                     // test modifier keys
29637                     if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29638                         if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29639                         if (event$1.altKey !== binding.event.modifiers.altKey) return false;
29640                     }
29641                     if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
29642                     if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29643
29644                     return true;
29645                 }
29646             }
29647
29648
29649             function capture() {
29650                 testBindings(true);
29651             }
29652
29653
29654             function bubble() {
29655                 var tagName = d3_select(event.target).node().tagName;
29656                 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29657                     return;
29658                 }
29659                 testBindings(false);
29660             }
29661
29662
29663             function keybinding(selection) {
29664                 selection = selection || d3_select(document);
29665                 selection.on('keydown.capture.' + namespace, capture, true);
29666                 selection.on('keydown.bubble.' + namespace, bubble, false);
29667                 return keybinding;
29668             }
29669
29670             // was: keybinding.off()
29671             keybinding.unbind = function(selection) {
29672                 _keybindings = [];
29673                 selection = selection || d3_select(document);
29674                 selection.on('keydown.capture.' + namespace, null);
29675                 selection.on('keydown.bubble.' + namespace, null);
29676                 return keybinding;
29677             };
29678
29679
29680             keybinding.clear = function() {
29681                 _keybindings = {};
29682                 return keybinding;
29683             };
29684
29685
29686             // Remove one or more keycode bindings.
29687             keybinding.off = function(codes, capture) {
29688                 var arr = utilArrayUniq([].concat(codes));
29689
29690                 for (var i = 0; i < arr.length; i++) {
29691                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29692                     delete _keybindings[id];
29693                 }
29694                 return keybinding;
29695             };
29696
29697
29698             // Add one or more keycode bindings.
29699             keybinding.on = function(codes, callback, capture) {
29700                 if (typeof callback !== 'function') {
29701                     return keybinding.off(codes, capture);
29702                 }
29703
29704                 var arr = utilArrayUniq([].concat(codes));
29705
29706                 for (var i = 0; i < arr.length; i++) {
29707                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29708                     var binding = {
29709                         id: id,
29710                         capture: capture,
29711                         callback: callback,
29712                         event: {
29713                             key: undefined,  // preferred
29714                             keyCode: 0,      // fallback
29715                             modifiers: {
29716                                 shiftKey: false,
29717                                 ctrlKey: false,
29718                                 altKey: false,
29719                                 metaKey: false
29720                             }
29721                         }
29722                     };
29723
29724                     if (_keybindings[id]) {
29725                         console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
29726                     }
29727
29728                     _keybindings[id] = binding;
29729
29730                     var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29731                     for (var j = 0; j < matches.length; j++) {
29732                         // Normalise matching errors
29733                         if (matches[j] === '++') matches[j] = '+';
29734
29735                         if (matches[j] in utilKeybinding.modifierCodes) {
29736                             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
29737                             binding.event.modifiers[prop] = true;
29738                         } else {
29739                             binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
29740                             if (matches[j] in utilKeybinding.keyCodes) {
29741                                 binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
29742                             }
29743                         }
29744                     }
29745                 }
29746
29747                 return keybinding;
29748             };
29749
29750
29751             return keybinding;
29752         }
29753
29754
29755         /*
29756          * See https://github.com/keithamus/jwerty
29757          */
29758
29759         utilKeybinding.modifierCodes = {
29760             // Shift key, ⇧
29761             '⇧': 16, shift: 16,
29762             // CTRL key, on Mac: ⌃
29763             '⌃': 17, ctrl: 17,
29764             // ALT key, on Mac: ⌥ (Alt)
29765             '⌥': 18, alt: 18, option: 18,
29766             // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29767             '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29768         };
29769
29770         utilKeybinding.modifierProperties = {
29771             16: 'shiftKey',
29772             17: 'ctrlKey',
29773             18: 'altKey',
29774             91: 'metaKey'
29775         };
29776
29777         utilKeybinding.keys = {
29778             // Backspace key, on Mac: ⌫ (Backspace)
29779             '⌫': 'Backspace', backspace: 'Backspace',
29780             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29781             '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29782             // Return key, ↩
29783             '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29784             // Pause/Break key
29785             'pause': 'Pause', 'pause-break': 'Pause',
29786             // Caps Lock key, ⇪
29787             '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29788             // Escape key, on Mac: ⎋, on Windows: Esc
29789             '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29790             // Space key
29791             space: [' ', 'Spacebar'],
29792             // Page-Up key, or pgup, on Mac: ↖
29793             '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29794             // Page-Down key, or pgdown, on Mac: ↘
29795             '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29796             // END key, on Mac: ⇟
29797             '⇟': 'End', end: 'End',
29798             // HOME key, on Mac: ⇞
29799             '⇞': 'Home', home: 'Home',
29800             // Insert key, or ins
29801             ins: 'Insert', insert: 'Insert',
29802             // Delete key, on Mac: ⌦ (Delete)
29803             '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29804             // Left Arrow Key, or ←
29805             '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29806             // Up Arrow Key, or ↑
29807             '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29808             // Right Arrow Key, or →
29809             '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29810             // Up Arrow Key, or ↓
29811             '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29812             // odities, stuff for backward compatibility (browsers and code):
29813             // Num-Multiply, or *
29814             '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29815             // Num-Plus or +
29816             '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29817             // Num-Subtract, or -
29818             '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29819             // Semicolon
29820             semicolon: ';',
29821             // = or equals
29822             equals: '=',
29823             // Comma, or ,
29824             comma: ',',
29825             // Period, or ., or full-stop
29826             period: '.', 'full-stop': '.',
29827             // Slash, or /, or forward-slash
29828             slash: '/', 'forward-slash': '/',
29829             // Tick, or `, or back-quote
29830             tick: '`', 'back-quote': '`',
29831             // Open bracket, or [
29832             'open-bracket': '[',
29833             // Back slash, or \
29834             'back-slash': '\\',
29835             // Close backet, or ]
29836             'close-bracket': ']',
29837             // Apostrophe, or Quote, or '
29838             quote: '\'', apostrophe: '\'',
29839             // NUMPAD 0-9
29840             'num-0': '0',
29841             'num-1': '1',
29842             'num-2': '2',
29843             'num-3': '3',
29844             'num-4': '4',
29845             'num-5': '5',
29846             'num-6': '6',
29847             'num-7': '7',
29848             'num-8': '8',
29849             'num-9': '9',
29850             // F1-F25
29851             f1: 'F1',
29852             f2: 'F2',
29853             f3: 'F3',
29854             f4: 'F4',
29855             f5: 'F5',
29856             f6: 'F6',
29857             f7: 'F7',
29858             f8: 'F8',
29859             f9: 'F9',
29860             f10: 'F10',
29861             f11: 'F11',
29862             f12: 'F12',
29863             f13: 'F13',
29864             f14: 'F14',
29865             f15: 'F15',
29866             f16: 'F16',
29867             f17: 'F17',
29868             f18: 'F18',
29869             f19: 'F19',
29870             f20: 'F20',
29871             f21: 'F21',
29872             f22: 'F22',
29873             f23: 'F23',
29874             f24: 'F24',
29875             f25: 'F25'
29876         };
29877
29878         utilKeybinding.keyCodes = {
29879             // Backspace key, on Mac: ⌫ (Backspace)
29880             '⌫': 8, backspace: 8,
29881             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29882             '⇥': 9, '⇆': 9, tab: 9,
29883             // Return key, ↩
29884             '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29885             // Pause/Break key
29886             'pause': 19, 'pause-break': 19,
29887             // Caps Lock key, ⇪
29888             '⇪': 20, caps: 20, 'caps-lock': 20,
29889             // Escape key, on Mac: ⎋, on Windows: Esc
29890             '⎋': 27, escape: 27, esc: 27,
29891             // Space key
29892             space: 32,
29893             // Page-Up key, or pgup, on Mac: ↖
29894             '↖': 33, pgup: 33, 'page-up': 33,
29895             // Page-Down key, or pgdown, on Mac: ↘
29896             '↘': 34, pgdown: 34, 'page-down': 34,
29897             // END key, on Mac: ⇟
29898             '⇟': 35, end: 35,
29899             // HOME key, on Mac: ⇞
29900             '⇞': 36, home: 36,
29901             // Insert key, or ins
29902             ins: 45, insert: 45,
29903             // Delete key, on Mac: ⌦ (Delete)
29904             '⌦': 46, del: 46, 'delete': 46,
29905             // Left Arrow Key, or ←
29906             '←': 37, left: 37, 'arrow-left': 37,
29907             // Up Arrow Key, or ↑
29908             '↑': 38, up: 38, 'arrow-up': 38,
29909             // Right Arrow Key, or →
29910             '→': 39, right: 39, 'arrow-right': 39,
29911             // Up Arrow Key, or ↓
29912             '↓': 40, down: 40, 'arrow-down': 40,
29913             // odities, printing characters that come out wrong:
29914             // Firefox Equals
29915             'ffequals': 61,
29916             // Num-Multiply, or *
29917             '*': 106, star: 106, asterisk: 106, multiply: 106,
29918             // Num-Plus or +
29919             '+': 107, 'plus': 107,
29920             // Num-Subtract, or -
29921             '-': 109, subtract: 109,
29922             // Firefox Plus
29923             'ffplus': 171,
29924             // Firefox Minus
29925             'ffminus': 173,
29926             // Semicolon
29927             ';': 186, semicolon: 186,
29928             // = or equals
29929             '=': 187, 'equals': 187,
29930             // Comma, or ,
29931             ',': 188, comma: 188,
29932             // Dash / Underscore key
29933             'dash': 189,
29934             // Period, or ., or full-stop
29935             '.': 190, period: 190, 'full-stop': 190,
29936             // Slash, or /, or forward-slash
29937             '/': 191, slash: 191, 'forward-slash': 191,
29938             // Tick, or `, or back-quote
29939             '`': 192, tick: 192, 'back-quote': 192,
29940             // Open bracket, or [
29941             '[': 219, 'open-bracket': 219,
29942             // Back slash, or \
29943             '\\': 220, 'back-slash': 220,
29944             // Close backet, or ]
29945             ']': 221, 'close-bracket': 221,
29946             // Apostrophe, or Quote, or '
29947             '\'': 222, quote: 222, apostrophe: 222
29948         };
29949
29950         // NUMPAD 0-9
29951         var i$2 = 95, n = 0;
29952         while (++i$2 < 106) {
29953             utilKeybinding.keyCodes['num-' + n] = i$2;
29954             ++n;
29955         }
29956
29957         // 0-9
29958         i$2 = 47; n = 0;
29959         while (++i$2 < 58) {
29960             utilKeybinding.keyCodes[n] = i$2;
29961             ++n;
29962         }
29963
29964         // F1-F25
29965         i$2 = 111; n = 1;
29966         while (++i$2 < 136) {
29967             utilKeybinding.keyCodes['f' + n] = i$2;
29968             ++n;
29969         }
29970
29971         // a-z
29972         i$2 = 64;
29973         while (++i$2 < 91) {
29974             utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2;
29975         }
29976
29977         function utilObjectOmit(obj, omitKeys) {
29978             return Object.keys(obj).reduce(function(result, key) {
29979                 if (omitKeys.indexOf(key) === -1) {
29980                     result[key] = obj[key];  // keep
29981                 }
29982                 return result;
29983             }, {});
29984         }
29985
29986         // Copies a variable number of methods from source to target.
29987         function utilRebind(target, source) {
29988             var i = 1, n = arguments.length, method;
29989             while (++i < n) {
29990                 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
29991             }
29992             return target;
29993         }
29994
29995         // Method is assumed to be a standard D3 getter-setter:
29996         // If passed with no arguments, gets the value.
29997         // If passed with arguments, sets the value and returns the target.
29998         function d3_rebind(target, source, method) {
29999             return function() {
30000                 var value = method.apply(source, arguments);
30001                 return value === source ? target : value;
30002             };
30003         }
30004
30005         // A per-domain session mutex backed by a cookie and dead man's
30006         // switch. If the session crashes, the mutex will auto-release
30007         // after 5 seconds.
30008
30009         // This accepts a string and returns an object that complies with utilSessionMutexType
30010         function utilSessionMutex(name) {
30011             var mutex = {};
30012             var intervalID;
30013
30014             function renew() {
30015                 var expires = new Date();
30016                 expires.setSeconds(expires.getSeconds() + 5);
30017                 document.cookie = name + '=1; expires=' + expires.toUTCString();
30018             }
30019
30020             mutex.lock = function () {
30021                 if (intervalID) return true;
30022                 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
30023                 if (cookie) return false;
30024                 renew();
30025                 intervalID = window.setInterval(renew, 4000);
30026                 return true;
30027             };
30028
30029             mutex.unlock = function () {
30030                 if (!intervalID) return;
30031                 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
30032                 clearInterval(intervalID);
30033                 intervalID = null;
30034             };
30035
30036             mutex.locked = function () {
30037                 return !!intervalID;
30038             };
30039
30040             return mutex;
30041         }
30042
30043         function utilTiler() {
30044             var _size = [256, 256];
30045             var _scale = 256;
30046             var _tileSize = 256;
30047             var _zoomExtent = [0, 20];
30048             var _translate = [_size[0] / 2, _size[1] / 2];
30049             var _margin = 0;
30050             var _skipNullIsland = false;
30051
30052
30053             function clamp(num, min, max) {
30054                 return Math.max(min, Math.min(num, max));
30055             }
30056
30057
30058             function nearNullIsland(tile) {
30059                 var x = tile[0];
30060                 var y = tile[1];
30061                 var z = tile[2];
30062                 if (z >= 7) {
30063                     var center = Math.pow(2, z - 1);
30064                     var width = Math.pow(2, z - 6);
30065                     var min = center - (width / 2);
30066                     var max = center + (width / 2) - 1;
30067                     return x >= min && x <= max && y >= min && y <= max;
30068                 }
30069                 return false;
30070             }
30071
30072
30073             function tiler() {
30074                 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
30075                 var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
30076                 var tileMin = 0;
30077                 var tileMax = Math.pow(2, z0) - 1;
30078                 var log2ts = Math.log(_tileSize) * Math.LOG2E;
30079                 var k = Math.pow(2, z - z0 + log2ts);
30080                 var origin = [
30081                     (_translate[0] - _scale / 2) / k,
30082                     (_translate[1] - _scale / 2) / k
30083                 ];
30084
30085                 var cols = d3_range(
30086                     clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
30087                     clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
30088                 );
30089                 var rows = d3_range(
30090                     clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
30091                     clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
30092                 );
30093
30094                 var tiles = [];
30095                 for (var i = 0; i < rows.length; i++) {
30096                     var y = rows[i];
30097                     for (var j = 0; j < cols.length; j++) {
30098                         var x = cols[j];
30099
30100                         if (i >= _margin && i <= rows.length - _margin &&
30101                             j >= _margin && j <= cols.length - _margin) {
30102                             tiles.unshift([x, y, z0]);  // tiles in view at beginning
30103                         } else {
30104                             tiles.push([x, y, z0]);     // tiles in margin at the end
30105                         }
30106                     }
30107                 }
30108
30109                 tiles.translate = origin;
30110                 tiles.scale = k;
30111
30112                 return tiles;
30113             }
30114
30115
30116             /**
30117              * getTiles() returns an array of tiles that cover the map view
30118              */
30119             tiler.getTiles = function(projection) {
30120                 var origin = [
30121                     projection.scale() * Math.PI - projection.translate()[0],
30122                     projection.scale() * Math.PI - projection.translate()[1]
30123                 ];
30124
30125                 this
30126                     .size(projection.clipExtent()[1])
30127                     .scale(projection.scale() * 2 * Math.PI)
30128                     .translate(projection.translate());
30129
30130                 var tiles = tiler();
30131                 var ts = tiles.scale;
30132
30133                 return tiles
30134                     .map(function(tile) {
30135                         if (_skipNullIsland && nearNullIsland(tile)) {
30136                             return false;
30137                         }
30138                         var x = tile[0] * ts - origin[0];
30139                         var y = tile[1] * ts - origin[1];
30140                         return {
30141                             id: tile.toString(),
30142                             xyz: tile,
30143                             extent: geoExtent(
30144                                 projection.invert([x, y + ts]),
30145                                 projection.invert([x + ts, y])
30146                             )
30147                         };
30148                     }).filter(Boolean);
30149             };
30150
30151
30152             /**
30153              * getGeoJSON() returns a FeatureCollection for debugging tiles
30154              */
30155             tiler.getGeoJSON = function(projection) {
30156                 var features = tiler.getTiles(projection).map(function(tile) {
30157                     return {
30158                         type: 'Feature',
30159                         properties: {
30160                             id: tile.id,
30161                             name: tile.id
30162                         },
30163                         geometry: {
30164                             type: 'Polygon',
30165                             coordinates: [ tile.extent.polygon() ]
30166                         }
30167                     };
30168                 });
30169
30170                 return {
30171                     type: 'FeatureCollection',
30172                     features: features
30173                 };
30174             };
30175
30176
30177             tiler.tileSize = function(val) {
30178                 if (!arguments.length) return _tileSize;
30179                 _tileSize = val;
30180                 return tiler;
30181             };
30182
30183
30184             tiler.zoomExtent = function(val) {
30185                 if (!arguments.length) return _zoomExtent;
30186                 _zoomExtent = val;
30187                 return tiler;
30188             };
30189
30190
30191             tiler.size = function(val) {
30192                 if (!arguments.length) return _size;
30193                 _size = val;
30194                 return tiler;
30195             };
30196
30197
30198             tiler.scale = function(val) {
30199                 if (!arguments.length) return _scale;
30200                 _scale = val;
30201                 return tiler;
30202             };
30203
30204
30205             tiler.translate = function(val) {
30206                 if (!arguments.length) return _translate;
30207                 _translate = val;
30208                 return tiler;
30209             };
30210
30211
30212             // number to extend the rows/columns beyond those covering the viewport
30213             tiler.margin = function(val) {
30214                 if (!arguments.length) return _margin;
30215                 _margin = +val;
30216                 return tiler;
30217             };
30218
30219
30220             tiler.skipNullIsland = function(val) {
30221                 if (!arguments.length) return _skipNullIsland;
30222                 _skipNullIsland = val;
30223                 return tiler;
30224             };
30225
30226
30227             return tiler;
30228         }
30229
30230         function utilTriggerEvent(target, type) {
30231             target.each(function() {
30232                 var evt = document.createEvent('HTMLEvents');
30233                 evt.initEvent(type, true, true);
30234                 this.dispatchEvent(evt);
30235             });
30236         }
30237
30238         function osmEntity(attrs) {
30239             // For prototypal inheritance.
30240             if (this instanceof osmEntity) return;
30241
30242             // Create the appropriate subtype.
30243             if (attrs && attrs.type) {
30244                 return osmEntity[attrs.type].apply(this, arguments);
30245             } else if (attrs && attrs.id) {
30246                 return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
30247             }
30248
30249             // Initialize a generic Entity (used only in tests).
30250             return (new osmEntity()).initialize(arguments);
30251         }
30252
30253
30254         osmEntity.id = function(type) {
30255             return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
30256         };
30257
30258
30259         osmEntity.id.next = {
30260             changeset: -1, node: -1, way: -1, relation: -1
30261         };
30262
30263
30264         osmEntity.id.fromOSM = function(type, id) {
30265             return type[0] + id;
30266         };
30267
30268
30269         osmEntity.id.toOSM = function(id) {
30270             return id.slice(1);
30271         };
30272
30273
30274         osmEntity.id.type = function(id) {
30275             return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
30276         };
30277
30278
30279         // A function suitable for use as the second argument to d3.selection#data().
30280         osmEntity.key = function(entity) {
30281             return entity.id + 'v' + (entity.v || 0);
30282         };
30283
30284         var _deprecatedTagValuesByKey;
30285
30286         osmEntity.deprecatedTagValuesByKey = function() {
30287             if (!_deprecatedTagValuesByKey) {
30288                 _deprecatedTagValuesByKey = {};
30289                 dataDeprecated.forEach(function(d) {
30290                     var oldKeys = Object.keys(d.old);
30291                     if (oldKeys.length === 1) {
30292                         var oldKey = oldKeys[0];
30293                         var oldValue = d.old[oldKey];
30294                         if (oldValue !== '*') {
30295                             if (!_deprecatedTagValuesByKey[oldKey]) {
30296                                 _deprecatedTagValuesByKey[oldKey] = [oldValue];
30297                             } else {
30298                                 _deprecatedTagValuesByKey[oldKey].push(oldValue);
30299                             }
30300                         }
30301                     }
30302                 });
30303             }
30304             return _deprecatedTagValuesByKey;
30305         };
30306
30307
30308         osmEntity.prototype = {
30309
30310             tags: {},
30311
30312
30313             initialize: function(sources) {
30314                 for (var i = 0; i < sources.length; ++i) {
30315                     var source = sources[i];
30316                     for (var prop in source) {
30317                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
30318                             if (source[prop] === undefined) {
30319                                 delete this[prop];
30320                             } else {
30321                                 this[prop] = source[prop];
30322                             }
30323                         }
30324                     }
30325                 }
30326
30327                 if (!this.id && this.type) {
30328                     this.id = osmEntity.id(this.type);
30329                 }
30330                 if (!this.hasOwnProperty('visible')) {
30331                     this.visible = true;
30332                 }
30333
30334                 return this;
30335             },
30336
30337
30338             copy: function(resolver, copies) {
30339                 if (copies[this.id])
30340                     return copies[this.id];
30341
30342                 var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
30343                 copies[this.id] = copy;
30344
30345                 return copy;
30346             },
30347
30348
30349             osmId: function() {
30350                 return osmEntity.id.toOSM(this.id);
30351             },
30352
30353
30354             isNew: function() {
30355                 return this.osmId() < 0;
30356             },
30357
30358
30359             update: function(attrs) {
30360                 return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
30361             },
30362
30363
30364             mergeTags: function(tags) {
30365                 var merged = Object.assign({}, this.tags);   // shallow copy
30366                 var changed = false;
30367                 for (var k in tags) {
30368                     var t1 = merged[k];
30369                     var t2 = tags[k];
30370                     if (!t1) {
30371                         changed = true;
30372                         merged[k] = t2;
30373                     } else if (t1 !== t2) {
30374                         changed = true;
30375                         merged[k] = utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
30376                     }
30377                 }
30378                 return changed ? this.update({ tags: merged }) : this;
30379             },
30380
30381
30382             intersects: function(extent, resolver) {
30383                 return this.extent(resolver).intersects(extent);
30384             },
30385
30386
30387             hasNonGeometryTags: function() {
30388                 return Object.keys(this.tags).some(function(k) { return k !== 'area'; });
30389             },
30390
30391             hasParentRelations: function(resolver) {
30392                 return resolver.parentRelations(this).length > 0;
30393             },
30394
30395             hasInterestingTags: function() {
30396                 return Object.keys(this.tags).some(osmIsInterestingTag);
30397             },
30398
30399             hasWikidata: function() {
30400                 return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
30401             },
30402
30403             isHighwayIntersection: function() {
30404                 return false;
30405             },
30406
30407             isDegenerate: function() {
30408                 return true;
30409             },
30410
30411             deprecatedTags: function() {
30412                 var tags = this.tags;
30413
30414                 // if there are no tags, none can be deprecated
30415                 if (Object.keys(tags).length === 0) return [];
30416
30417                 var deprecated = [];
30418                 dataDeprecated.forEach(function(d) {
30419                     var matchesDeprecatedTags = Object.keys(d.old).every(function(key) {
30420                         if (!tags[key]) return false;
30421                         if (d.old[key] === '*') return true;
30422
30423                         var vals = tags[key].split(';').filter(Boolean);
30424                         if (vals.length === 0) {
30425                             return false;
30426                         } else if (vals.length > 1) {
30427                             return vals.indexOf(d.old[key]) !== -1;
30428                         } else {
30429                             if (tags[key] === d.old[key]) {
30430                                 if (d.old[key] === d.replace[key]) {
30431                                     return !Object.keys(d.replace).every(function(key) {
30432                                         return tags[key] === d.replace[key];
30433                                     });
30434                                 } else {
30435                                     return true;
30436                                 }
30437                             }
30438                         }
30439                         return false;
30440                     });
30441                     if (matchesDeprecatedTags) {
30442                         deprecated.push(d);
30443                     }
30444                 });
30445
30446                 return deprecated;
30447             }
30448         };
30449
30450         function osmLanes(entity) {
30451             if (entity.type !== 'way') return null;
30452             if (!entity.tags.highway) return null;
30453
30454             var tags = entity.tags;
30455             var isOneWay = entity.isOneWay();
30456             var laneCount = getLaneCount(tags, isOneWay);
30457             var maxspeed = parseMaxspeed(tags);
30458
30459             var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
30460             var forward = laneDirections.forward;
30461             var backward = laneDirections.backward;
30462             var bothways = laneDirections.bothways;
30463
30464             // parse the piped string 'x|y|z' format
30465             var turnLanes = {};
30466             turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
30467             turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
30468             turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
30469
30470             var maxspeedLanes = {};
30471             maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
30472             maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
30473             maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
30474
30475             var psvLanes = {};
30476             psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
30477             psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
30478             psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
30479
30480             var busLanes = {};
30481             busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
30482             busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
30483             busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
30484
30485             var taxiLanes = {};
30486             taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
30487             taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
30488             taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
30489
30490             var hovLanes = {};
30491             hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
30492             hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
30493             hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
30494
30495             var hgvLanes = {};
30496             hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
30497             hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
30498             hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
30499
30500             var bicyclewayLanes = {};
30501             bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
30502             bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
30503             bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
30504
30505             var lanesObj = {
30506                 forward: [],
30507                 backward: [],
30508                 unspecified: []
30509             };
30510
30511             // map forward/backward/unspecified of each lane type to lanesObj
30512             mapToLanesObj(lanesObj, turnLanes, 'turnLane');
30513             mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
30514             mapToLanesObj(lanesObj, psvLanes, 'psv');
30515             mapToLanesObj(lanesObj, busLanes, 'bus');
30516             mapToLanesObj(lanesObj, taxiLanes, 'taxi');
30517             mapToLanesObj(lanesObj, hovLanes, 'hov');
30518             mapToLanesObj(lanesObj, hgvLanes, 'hgv');
30519             mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
30520
30521             return {
30522                 metadata: {
30523                     count: laneCount,
30524                     oneway: isOneWay,
30525                     forward: forward,
30526                     backward: backward,
30527                     bothways: bothways,
30528                     turnLanes: turnLanes,
30529                     maxspeed: maxspeed,
30530                     maxspeedLanes: maxspeedLanes,
30531                     psvLanes: psvLanes,
30532                     busLanes: busLanes,
30533                     taxiLanes: taxiLanes,
30534                     hovLanes: hovLanes,
30535                     hgvLanes: hgvLanes,
30536                     bicyclewayLanes: bicyclewayLanes
30537                 },
30538                 lanes: lanesObj
30539             };
30540         }
30541
30542
30543         function getLaneCount(tags, isOneWay) {
30544             var count;
30545             if (tags.lanes) {
30546                 count = parseInt(tags.lanes, 10);
30547                 if (count > 0) {
30548                     return count;
30549                 }
30550             }
30551
30552
30553             switch (tags.highway) {
30554                 case 'trunk':
30555                 case 'motorway':
30556                     count = isOneWay ? 2 : 4;
30557                     break;
30558                 default:
30559                     count = isOneWay ? 1 : 2;
30560                     break;
30561             }
30562
30563             return count;
30564         }
30565
30566
30567         function parseMaxspeed(tags) {
30568             var maxspeed = tags.maxspeed;
30569             if (!maxspeed) return;
30570
30571             var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
30572             if (!maxspeedRegex.test(maxspeed)) return;
30573
30574             return parseInt(maxspeed, 10);
30575         }
30576
30577
30578         function parseLaneDirections(tags, isOneWay, laneCount) {
30579             var forward = parseInt(tags['lanes:forward'], 10);
30580             var backward = parseInt(tags['lanes:backward'], 10);
30581             var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
30582
30583             if (parseInt(tags.oneway, 10) === -1) {
30584                 forward = 0;
30585                 bothways = 0;
30586                 backward = laneCount;
30587             }
30588             else if (isOneWay) {
30589                 forward = laneCount;
30590                 bothways = 0;
30591                 backward = 0;
30592             }
30593             else if (isNaN(forward) && isNaN(backward)) {
30594                 backward = Math.floor((laneCount - bothways) / 2);
30595                 forward = laneCount - bothways - backward;
30596             }
30597             else if (isNaN(forward)) {
30598                 if (backward > laneCount - bothways) {
30599                     backward = laneCount - bothways;
30600                 }
30601                 forward = laneCount - bothways - backward;
30602             }
30603             else if (isNaN(backward)) {
30604                 if (forward > laneCount - bothways) {
30605                     forward = laneCount - bothways;
30606                 }
30607                 backward = laneCount - bothways - forward;
30608             }
30609             return {
30610                 forward: forward,
30611                 backward: backward,
30612                 bothways: bothways
30613             };
30614         }
30615
30616
30617         function parseTurnLanes(tag){
30618             if (!tag) return;
30619
30620             var validValues = [
30621                 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
30622                 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
30623             ];
30624
30625             return tag.split('|')
30626                 .map(function (s) {
30627                     if (s === '') s = 'none';
30628                     return s.split(';')
30629                         .map(function (d) {
30630                             return validValues.indexOf(d) === -1 ? 'unknown': d;
30631                         });
30632                 });
30633         }
30634
30635
30636         function parseMaxspeedLanes(tag, maxspeed) {
30637             if (!tag) return;
30638
30639             return tag.split('|')
30640                 .map(function (s) {
30641                     if (s === 'none') return s;
30642                     var m = parseInt(s, 10);
30643                     if (s === '' || m === maxspeed) return null;
30644                     return isNaN(m) ? 'unknown': m;
30645                 });
30646         }
30647
30648
30649         function parseMiscLanes(tag) {
30650             if (!tag) return;
30651
30652             var validValues = [
30653                 'yes', 'no', 'designated'
30654             ];
30655
30656             return tag.split('|')
30657                 .map(function (s) {
30658                     if (s === '') s = 'no';
30659                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30660                 });
30661         }
30662
30663
30664         function parseBicycleWay(tag) {
30665             if (!tag) return;
30666
30667             var validValues = [
30668                 'yes', 'no', 'designated', 'lane'
30669             ];
30670
30671             return tag.split('|')
30672                 .map(function (s) {
30673                     if (s === '') s = 'no';
30674                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30675                 });
30676         }
30677
30678
30679         function mapToLanesObj(lanesObj, data, key) {
30680             if (data.forward) data.forward.forEach(function(l, i) {
30681                 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
30682                 lanesObj.forward[i][key] = l;
30683             });
30684             if (data.backward) data.backward.forEach(function(l, i) {
30685                 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
30686                 lanesObj.backward[i][key] = l;
30687             });
30688             if (data.unspecified) data.unspecified.forEach(function(l, i) {
30689                 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
30690                 lanesObj.unspecified[i][key] = l;
30691             });
30692         }
30693
30694         function osmWay() {
30695             if (!(this instanceof osmWay)) {
30696                 return (new osmWay()).initialize(arguments);
30697             } else if (arguments.length) {
30698                 this.initialize(arguments);
30699             }
30700         }
30701
30702
30703         osmEntity.way = osmWay;
30704
30705         osmWay.prototype = Object.create(osmEntity.prototype);
30706
30707
30708         Object.assign(osmWay.prototype, {
30709             type: 'way',
30710             nodes: [],
30711
30712
30713             copy: function(resolver, copies) {
30714                 if (copies[this.id]) return copies[this.id];
30715
30716                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
30717
30718                 var nodes = this.nodes.map(function(id) {
30719                     return resolver.entity(id).copy(resolver, copies).id;
30720                 });
30721
30722                 copy = copy.update({ nodes: nodes });
30723                 copies[this.id] = copy;
30724
30725                 return copy;
30726             },
30727
30728
30729             extent: function(resolver) {
30730                 return resolver.transient(this, 'extent', function() {
30731                     var extent = geoExtent();
30732                     for (var i = 0; i < this.nodes.length; i++) {
30733                         var node = resolver.hasEntity(this.nodes[i]);
30734                         if (node) {
30735                             extent._extend(node.extent());
30736                         }
30737                     }
30738                     return extent;
30739                 });
30740             },
30741
30742
30743             first: function() {
30744                 return this.nodes[0];
30745             },
30746
30747
30748             last: function() {
30749                 return this.nodes[this.nodes.length - 1];
30750             },
30751
30752
30753             contains: function(node) {
30754                 return this.nodes.indexOf(node) >= 0;
30755             },
30756
30757
30758             affix: function(node) {
30759                 if (this.nodes[0] === node) return 'prefix';
30760                 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
30761             },
30762
30763
30764             layer: function() {
30765                 // explicit layer tag, clamp between -10, 10..
30766                 if (isFinite(this.tags.layer)) {
30767                     return Math.max(-10, Math.min(+(this.tags.layer), 10));
30768                 }
30769
30770                 // implied layer tag..
30771                 if (this.tags.covered === 'yes') return -1;
30772                 if (this.tags.location === 'overground') return 1;
30773                 if (this.tags.location === 'underground') return -1;
30774                 if (this.tags.location === 'underwater') return -10;
30775
30776                 if (this.tags.power === 'line') return 10;
30777                 if (this.tags.power === 'minor_line') return 10;
30778                 if (this.tags.aerialway) return 10;
30779                 if (this.tags.bridge) return 1;
30780                 if (this.tags.cutting) return -1;
30781                 if (this.tags.tunnel) return -1;
30782                 if (this.tags.waterway) return -1;
30783                 if (this.tags.man_made === 'pipeline') return -10;
30784                 if (this.tags.boundary) return -10;
30785                 return 0;
30786             },
30787
30788
30789             isOneWay: function() {
30790                 // explicit oneway tag..
30791                 var values = {
30792                     'yes': true,
30793                     '1': true,
30794                     '-1': true,
30795                     'reversible': true,
30796                     'alternating': true,
30797                     'no': false,
30798                     '0': false
30799                 };
30800                 if (values[this.tags.oneway] !== undefined) {
30801                     return values[this.tags.oneway];
30802                 }
30803
30804                 // implied oneway tag..
30805                 for (var key in this.tags) {
30806                     if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
30807                         return true;
30808                 }
30809                 return false;
30810             },
30811
30812             // Some identifier for tag that implies that this way is "sided",
30813             // i.e. the right side is the 'inside' (e.g. the right side of a
30814             // natural=cliff is lower).
30815             sidednessIdentifier: function() {
30816                 for (var key in this.tags) {
30817                     var value = this.tags[key];
30818                     if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
30819                         if (osmRightSideIsInsideTags[key][value] === true) {
30820                             return key;
30821                         } else {
30822                             // if the map's value is something other than a
30823                             // literal true, we should use it so we can
30824                             // special case some keys (e.g. natural=coastline
30825                             // is handled differently to other naturals).
30826                             return osmRightSideIsInsideTags[key][value];
30827                         }
30828                     }
30829                 }
30830
30831                 return null;
30832             },
30833
30834             isSided: function() {
30835                 if (this.tags.two_sided === 'yes') {
30836                     return false;
30837                 }
30838
30839                 return this.sidednessIdentifier() !== null;
30840             },
30841
30842             lanes: function() {
30843                 return osmLanes(this);
30844             },
30845
30846
30847             isClosed: function() {
30848                 return this.nodes.length > 1 && this.first() === this.last();
30849             },
30850
30851
30852             isConvex: function(resolver) {
30853                 if (!this.isClosed() || this.isDegenerate()) return null;
30854
30855                 var nodes = utilArrayUniq(resolver.childNodes(this));
30856                 var coords = nodes.map(function(n) { return n.loc; });
30857                 var curr = 0;
30858                 var prev = 0;
30859
30860                 for (var i = 0; i < coords.length; i++) {
30861                     var o = coords[(i+1) % coords.length];
30862                     var a = coords[i];
30863                     var b = coords[(i+2) % coords.length];
30864                     var res = geoVecCross(a, b, o);
30865
30866                     curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
30867                     if (curr === 0) {
30868                         continue;
30869                     } else if (prev && curr !== prev) {
30870                         return false;
30871                     }
30872                     prev = curr;
30873                 }
30874                 return true;
30875             },
30876
30877             // returns an object with the tag that implies this is an area, if any
30878             tagSuggestingArea: function() {
30879                 if (this.tags.area === 'yes') return { area: 'yes' };
30880                 if (this.tags.area === 'no') return null;
30881
30882                 // `highway` and `railway` are typically linear features, but there
30883                 // are a few exceptions that should be treated as areas, even in the
30884                 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
30885                 var lineKeys = {
30886                     highway: {
30887                         rest_area: true,
30888                         services: true
30889                     },
30890                     railway: {
30891                         roundhouse: true,
30892                         station: true,
30893                         traverser: true,
30894                         turntable: true,
30895                         wash: true
30896                     }
30897                 };
30898                 var returnTags = {};
30899                 for (var key in this.tags) {
30900                     if (key in osmAreaKeys && !(this.tags[key] in osmAreaKeys[key])) {
30901                         returnTags[key] = this.tags[key];
30902                         return returnTags;
30903                     }
30904                     if (key in lineKeys && this.tags[key] in lineKeys[key]) {
30905                         returnTags[key] = this.tags[key];
30906                         return returnTags;
30907                     }
30908                 }
30909                 return null;
30910             },
30911
30912             isArea: function() {
30913                 if (this.tags.area === 'yes')
30914                     return true;
30915                 if (!this.isClosed() || this.tags.area === 'no')
30916                     return false;
30917                 return this.tagSuggestingArea() !== null;
30918             },
30919
30920
30921             isDegenerate: function() {
30922                 return (new Set(this.nodes).size < (this.isArea() ? 3 : 2));
30923             },
30924
30925
30926             areAdjacent: function(n1, n2) {
30927                 for (var i = 0; i < this.nodes.length; i++) {
30928                     if (this.nodes[i] === n1) {
30929                         if (this.nodes[i - 1] === n2) return true;
30930                         if (this.nodes[i + 1] === n2) return true;
30931                     }
30932                 }
30933                 return false;
30934             },
30935
30936
30937             geometry: function(graph) {
30938                 return graph.transient(this, 'geometry', function() {
30939                     return this.isArea() ? 'area' : 'line';
30940                 });
30941             },
30942
30943
30944             // If this way is not closed, append the beginning node to the end of the nodelist to close it.
30945             close: function() {
30946                 if (this.isClosed() || !this.nodes.length) return this;
30947
30948                 var nodes = this.nodes.slice();
30949                 nodes = nodes.filter(noRepeatNodes);
30950                 nodes.push(nodes[0]);
30951                 return this.update({ nodes: nodes });
30952             },
30953
30954
30955             // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
30956             unclose: function() {
30957                 if (!this.isClosed()) return this;
30958
30959                 var nodes = this.nodes.slice();
30960                 var connector = this.first();
30961                 var i = nodes.length - 1;
30962
30963                 // remove trailing connectors..
30964                 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30965                     nodes.splice(i, 1);
30966                     i = nodes.length - 1;
30967                 }
30968
30969                 nodes = nodes.filter(noRepeatNodes);
30970                 return this.update({ nodes: nodes });
30971             },
30972
30973
30974             // Adds a node (id) in front of the node which is currently at position index.
30975             // If index is undefined, the node will be added to the end of the way for linear ways,
30976             //   or just before the final connecting node for circular ways.
30977             // Consecutive duplicates are eliminated including existing ones.
30978             // Circularity is always preserved when adding a node.
30979             addNode: function(id, index) {
30980                 var nodes = this.nodes.slice();
30981                 var isClosed = this.isClosed();
30982                 var max = isClosed ? nodes.length - 1 : nodes.length;
30983
30984                 if (index === undefined) {
30985                     index = max;
30986                 }
30987
30988                 if (index < 0 || index > max) {
30989                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30990                 }
30991
30992                 // If this is a closed way, remove all connector nodes except the first one
30993                 // (there may be duplicates) and adjust index if necessary..
30994                 if (isClosed) {
30995                     var connector = this.first();
30996
30997                     // leading connectors..
30998                     var i = 1;
30999                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
31000                         nodes.splice(i, 1);
31001                         if (index > i) index--;
31002                     }
31003
31004                     // trailing connectors..
31005                     i = nodes.length - 1;
31006                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
31007                         nodes.splice(i, 1);
31008                         if (index > i) index--;
31009                         i = nodes.length - 1;
31010                     }
31011                 }
31012
31013                 nodes.splice(index, 0, id);
31014                 nodes = nodes.filter(noRepeatNodes);
31015
31016                 // If the way was closed before, append a connector node to keep it closed..
31017                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
31018                     nodes.push(nodes[0]);
31019                 }
31020
31021                 return this.update({ nodes: nodes });
31022             },
31023
31024
31025             // Replaces the node which is currently at position index with the given node (id).
31026             // Consecutive duplicates are eliminated including existing ones.
31027             // Circularity is preserved when updating a node.
31028             updateNode: function(id, index) {
31029                 var nodes = this.nodes.slice();
31030                 var isClosed = this.isClosed();
31031                 var max = nodes.length - 1;
31032
31033                 if (index === undefined || index < 0 || index > max) {
31034                     throw new RangeError('index ' + index + ' out of range 0..' + max);
31035                 }
31036
31037                 // If this is a closed way, remove all connector nodes except the first one
31038                 // (there may be duplicates) and adjust index if necessary..
31039                 if (isClosed) {
31040                     var connector = this.first();
31041
31042                     // leading connectors..
31043                     var i = 1;
31044                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
31045                         nodes.splice(i, 1);
31046                         if (index > i) index--;
31047                     }
31048
31049                     // trailing connectors..
31050                     i = nodes.length - 1;
31051                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
31052                         nodes.splice(i, 1);
31053                         if (index === i) index = 0;  // update leading connector instead
31054                         i = nodes.length - 1;
31055                     }
31056                 }
31057
31058                 nodes.splice(index, 1, id);
31059                 nodes = nodes.filter(noRepeatNodes);
31060
31061                 // If the way was closed before, append a connector node to keep it closed..
31062                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
31063                     nodes.push(nodes[0]);
31064                 }
31065
31066                 return this.update({nodes: nodes});
31067             },
31068
31069
31070             // Replaces each occurrence of node id needle with replacement.
31071             // Consecutive duplicates are eliminated including existing ones.
31072             // Circularity is preserved.
31073             replaceNode: function(needleID, replacementID) {
31074                 var nodes = this.nodes.slice();
31075                 var isClosed = this.isClosed();
31076
31077                 for (var i = 0; i < nodes.length; i++) {
31078                     if (nodes[i] === needleID) {
31079                         nodes[i] = replacementID;
31080                     }
31081                 }
31082
31083                 nodes = nodes.filter(noRepeatNodes);
31084
31085                 // If the way was closed before, append a connector node to keep it closed..
31086                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
31087                     nodes.push(nodes[0]);
31088                 }
31089
31090                 return this.update({nodes: nodes});
31091             },
31092
31093
31094             // Removes each occurrence of node id.
31095             // Consecutive duplicates are eliminated including existing ones.
31096             // Circularity is preserved.
31097             removeNode: function(id) {
31098                 var nodes = this.nodes.slice();
31099                 var isClosed = this.isClosed();
31100
31101                 nodes = nodes
31102                     .filter(function(node) { return node !== id; })
31103                     .filter(noRepeatNodes);
31104
31105                 // If the way was closed before, append a connector node to keep it closed..
31106                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
31107                     nodes.push(nodes[0]);
31108                 }
31109
31110                 return this.update({nodes: nodes});
31111             },
31112
31113
31114             asJXON: function(changeset_id) {
31115                 var r = {
31116                     way: {
31117                         '@id': this.osmId(),
31118                         '@version': this.version || 0,
31119                         nd: this.nodes.map(function(id) {
31120                             return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
31121                         }, this),
31122                         tag: Object.keys(this.tags).map(function(k) {
31123                             return { keyAttributes: { k: k, v: this.tags[k] } };
31124                         }, this)
31125                     }
31126                 };
31127                 if (changeset_id) {
31128                     r.way['@changeset'] = changeset_id;
31129                 }
31130                 return r;
31131             },
31132
31133
31134             asGeoJSON: function(resolver) {
31135                 return resolver.transient(this, 'GeoJSON', function() {
31136                     var coordinates = resolver.childNodes(this)
31137                         .map(function(n) { return n.loc; });
31138
31139                     if (this.isArea() && this.isClosed()) {
31140                         return {
31141                             type: 'Polygon',
31142                             coordinates: [coordinates]
31143                         };
31144                     } else {
31145                         return {
31146                             type: 'LineString',
31147                             coordinates: coordinates
31148                         };
31149                     }
31150                 });
31151             },
31152
31153
31154             area: function(resolver) {
31155                 return resolver.transient(this, 'area', function() {
31156                     var nodes = resolver.childNodes(this);
31157
31158                     var json = {
31159                         type: 'Polygon',
31160                         coordinates: [ nodes.map(function(n) { return n.loc; }) ]
31161                     };
31162
31163                     if (!this.isClosed() && nodes.length) {
31164                         json.coordinates[0].push(nodes[0].loc);
31165                     }
31166
31167                     var area = d3_geoArea(json);
31168
31169                     // Heuristic for detecting counterclockwise winding order. Assumes
31170                     // that OpenStreetMap polygons are not hemisphere-spanning.
31171                     if (area > 2 * Math.PI) {
31172                         json.coordinates[0] = json.coordinates[0].reverse();
31173                         area = d3_geoArea(json);
31174                     }
31175
31176                     return isNaN(area) ? 0 : area;
31177                 });
31178             }
31179         });
31180
31181
31182         // Filter function to eliminate consecutive duplicates.
31183         function noRepeatNodes(node, i, arr) {
31184             return i === 0 || node !== arr[i - 1];
31185         }
31186
31187         // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
31188         //
31189         // 1. Relation tagged with `type=multipolygon` and no interesting tags.
31190         // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
31191         // 3. No members without a role.
31192         //
31193         // Old multipolygons are no longer recommended but are still rendered as areas by iD.
31194
31195         function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
31196             if (entity.type !== 'relation' ||
31197                 !entity.isMultipolygon()
31198                 || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
31199                 return false;
31200             }
31201
31202             var outerMember;
31203             for (var memberIndex in entity.members) {
31204                 var member = entity.members[memberIndex];
31205                 if (!member.role || member.role === 'outer') {
31206                     if (outerMember) return false;
31207                     if (member.type !== 'way') return false;
31208                     if (!graph.hasEntity(member.id)) return false;
31209
31210                     outerMember = graph.entity(member.id);
31211
31212                     if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
31213                         return false;
31214                     }
31215                 }
31216             }
31217
31218             return outerMember;
31219         }
31220
31221         // For fixing up rendering of multipolygons with tags on the outer member.
31222         // https://github.com/openstreetmap/iD/issues/613
31223         function osmIsOldMultipolygonOuterMember(entity, graph) {
31224             if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
31225                 return false;
31226
31227             var parents = graph.parentRelations(entity);
31228             if (parents.length !== 1)
31229                 return false;
31230
31231             var parent = parents[0];
31232             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31233                 return false;
31234
31235             var members = parent.members, member;
31236             for (var i = 0; i < members.length; i++) {
31237                 member = members[i];
31238                 if (member.id === entity.id && member.role && member.role !== 'outer')
31239                     return false; // Not outer member
31240                 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
31241                     return false; // Not a simple multipolygon
31242             }
31243
31244             return parent;
31245         }
31246
31247
31248         function osmOldMultipolygonOuterMember(entity, graph) {
31249             if (entity.type !== 'way')
31250                 return false;
31251
31252             var parents = graph.parentRelations(entity);
31253             if (parents.length !== 1)
31254                 return false;
31255
31256             var parent = parents[0];
31257             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31258                 return false;
31259
31260             var members = parent.members, member, outerMember;
31261             for (var i = 0; i < members.length; i++) {
31262                 member = members[i];
31263                 if (!member.role || member.role === 'outer') {
31264                     if (outerMember)
31265                         return false; // Not a simple multipolygon
31266                     outerMember = member;
31267                 }
31268             }
31269
31270             if (!outerMember)
31271                 return false;
31272
31273             var outerEntity = graph.hasEntity(outerMember.id);
31274             if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
31275                 return false;
31276
31277             return outerEntity;
31278         }
31279
31280
31281         // Join `toJoin` array into sequences of connecting ways.
31282
31283         // Segments which share identical start/end nodes will, as much as possible,
31284         // be connected with each other.
31285         //
31286         // The return value is a nested array. Each constituent array contains elements
31287         // of `toJoin` which have been determined to connect.
31288         //
31289         // Each consitituent array also has a `nodes` property whose value is an
31290         // ordered array of member nodes, with appropriate order reversal and
31291         // start/end coordinate de-duplication.
31292         //
31293         // Members of `toJoin` must have, at minimum, `type` and `id` properties.
31294         // Thus either an array of `osmWay`s or a relation member array may be used.
31295         //
31296         // If an member is an `osmWay`, its tags and childnodes may be reversed via
31297         // `actionReverse` in the output.
31298         //
31299         // The returned sequences array also has an `actions` array property, containing
31300         // any reversal actions that should be applied to the graph, should the calling
31301         // code attempt to actually join the given ways.
31302         //
31303         // Incomplete members (those for which `graph.hasEntity(element.id)` returns
31304         // false) and non-way members are ignored.
31305         //
31306         function osmJoinWays(toJoin, graph) {
31307             function resolve(member) {
31308                 return graph.childNodes(graph.entity(member.id));
31309             }
31310
31311             function reverse(item) {
31312                 var action = actionReverse(item.id, { reverseOneway: true });
31313                 sequences.actions.push(action);
31314                 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
31315             }
31316
31317             // make a copy containing only the items to join
31318             toJoin = toJoin.filter(function(member) {
31319                 return member.type === 'way' && graph.hasEntity(member.id);
31320             });
31321
31322             // Are the things we are joining relation members or `osmWays`?
31323             // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
31324             var i;
31325             var joinAsMembers = true;
31326             for (i = 0; i < toJoin.length; i++) {
31327                 if (toJoin[i] instanceof osmWay) {
31328                     joinAsMembers = false;
31329                     break;
31330                 }
31331             }
31332
31333             var sequences = [];
31334             sequences.actions = [];
31335
31336             while (toJoin.length) {
31337                 // start a new sequence
31338                 var item = toJoin.shift();
31339                 var currWays = [item];
31340                 var currNodes = resolve(item).slice();
31341                 var doneSequence = false;
31342
31343                 // add to it
31344                 while (toJoin.length && !doneSequence) {
31345                     var start = currNodes[0];
31346                     var end = currNodes[currNodes.length - 1];
31347                     var fn = null;
31348                     var nodes = null;
31349
31350                     // Find the next way/member to join.
31351                     for (i = 0; i < toJoin.length; i++) {
31352                         item = toJoin[i];
31353                         nodes = resolve(item);
31354
31355                         // (for member ordering only, not way ordering - see #4872)
31356                         // Strongly prefer to generate a forward path that preserves the order
31357                         // of the members array. For multipolygons and most relations, member
31358                         // order does not matter - but for routes, it does. (see #4589)
31359                         // If we started this sequence backwards (i.e. next member way attaches to
31360                         // the start node and not the end node), reverse the initial way before continuing.
31361                         if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
31362                             (nodes[nodes.length - 1] === start || nodes[0] === start)
31363                         ) {
31364                             currWays[0] = reverse(currWays[0]);
31365                             currNodes.reverse();
31366                             start = currNodes[0];
31367                             end = currNodes[currNodes.length - 1];
31368                         }
31369
31370                         if (nodes[0] === end) {
31371                             fn = currNodes.push;               // join to end
31372                             nodes = nodes.slice(1);
31373                             break;
31374                         } else if (nodes[nodes.length - 1] === end) {
31375                             fn = currNodes.push;               // join to end
31376                             nodes = nodes.slice(0, -1).reverse();
31377                             item = reverse(item);
31378                             break;
31379                         } else if (nodes[nodes.length - 1] === start) {
31380                             fn = currNodes.unshift;            // join to beginning
31381                             nodes = nodes.slice(0, -1);
31382                             break;
31383                         } else if (nodes[0] === start) {
31384                             fn = currNodes.unshift;            // join to beginning
31385                             nodes = nodes.slice(1).reverse();
31386                             item = reverse(item);
31387                             break;
31388                         } else {
31389                             fn = nodes = null;
31390                         }
31391                     }
31392
31393                     if (!nodes) {     // couldn't find a joinable way/member
31394                         doneSequence = true;
31395                         break;
31396                     }
31397
31398                     fn.apply(currWays, [item]);
31399                     fn.apply(currNodes, nodes);
31400
31401                     toJoin.splice(i, 1);
31402                 }
31403
31404                 currWays.nodes = currNodes;
31405                 sequences.push(currWays);
31406             }
31407
31408             return sequences;
31409         }
31410
31411         function actionAddMember(relationId, member, memberIndex, insertPair) {
31412
31413             return function action(graph) {
31414                 var relation = graph.entity(relationId);
31415
31416                 // There are some special rules for Public Transport v2 routes.
31417                 var isPTv2 = /stop|platform/.test(member.role);
31418
31419                 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
31420                     // Try to perform sensible inserts based on how the ways join together
31421                     graph = addWayMember(relation, graph);
31422                 } else {
31423                     // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31424                     // Stops and Platforms for PTv2 should be ordered first.
31425                     // hack: We do not currently have the ability to place them in the exactly correct order.
31426                     if (isPTv2 && isNaN(memberIndex)) {
31427                         memberIndex = 0;
31428                     }
31429
31430                     graph = graph.replace(relation.addMember(member, memberIndex));
31431                 }
31432
31433                 return graph;
31434             };
31435
31436
31437             // Add a way member into the relation "wherever it makes sense".
31438             // In this situation we were not supplied a memberIndex.
31439             function addWayMember(relation, graph) {
31440                 var groups, tempWay, item, i, j, k;
31441
31442                 // remove PTv2 stops and platforms before doing anything.
31443                 var PTv2members = [];
31444                 var members = [];
31445                 for (i = 0; i < relation.members.length; i++) {
31446                     var m = relation.members[i];
31447                     if (/stop|platform/.test(m.role)) {
31448                         PTv2members.push(m);
31449                     } else {
31450                         members.push(m);
31451                     }
31452                 }
31453                 relation = relation.update({ members: members });
31454
31455
31456                 if (insertPair) {
31457                     // We're adding a member that must stay paired with an existing member.
31458                     // (This feature is used by `actionSplit`)
31459                     //
31460                     // This is tricky because the members may exist multiple times in the
31461                     // member list, and with different A-B/B-A ordering and different roles.
31462                     // (e.g. a bus route that loops out and back - #4589).
31463                     //
31464                     // Replace the existing member with a temporary way,
31465                     // so that `osmJoinWays` can treat the pair like a single way.
31466                     tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
31467                     graph = graph.replace(tempWay);
31468                     var tempMember = { id: tempWay.id, type: 'way', role: member.role };
31469                     var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
31470                     groups = utilArrayGroupBy(tempRelation.members, 'type');
31471                     groups.way = groups.way || [];
31472
31473                 } else {
31474                     // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
31475                     groups = utilArrayGroupBy(relation.members, 'type');
31476                     groups.way = groups.way || [];
31477                     groups.way.push(member);
31478                 }
31479
31480                 members = withIndex(groups.way);
31481                 var joined = osmJoinWays(members, graph);
31482
31483                 // `joined` might not contain all of the way members,
31484                 // But will contain only the completed (downloaded) members
31485                 for (i = 0; i < joined.length; i++) {
31486                     var segment = joined[i];
31487                     var nodes = segment.nodes.slice();
31488                     var startIndex = segment[0].index;
31489
31490                     // j = array index in `members` where this segment starts
31491                     for (j = 0; j < members.length; j++) {
31492                         if (members[j].index === startIndex) {
31493                             break;
31494                         }
31495                     }
31496
31497                     // k = each member in segment
31498                     for (k = 0; k < segment.length; k++) {
31499                         item = segment[k];
31500                         var way = graph.entity(item.id);
31501
31502                         // If this is a paired item, generate members in correct order and role
31503                         if (tempWay && item.id === tempWay.id) {
31504                             if (nodes[0].id === insertPair.nodes[0]) {
31505                                 item.pair = [
31506                                     { id: insertPair.originalID, type: 'way', role: item.role },
31507                                     { id: insertPair.insertedID, type: 'way', role: item.role }
31508                                 ];
31509                             } else {
31510                                 item.pair = [
31511                                     { id: insertPair.insertedID, type: 'way', role: item.role },
31512                                     { id: insertPair.originalID, type: 'way', role: item.role }
31513                                 ];
31514                             }
31515                         }
31516
31517                         // reorder `members` if necessary
31518                         if (k > 0) {
31519                             if (j+k >= members.length || item.index !== members[j+k].index) {
31520                                 moveMember(members, item.index, j+k);
31521                             }
31522                         }
31523
31524                         nodes.splice(0, way.nodes.length - 1);
31525                     }
31526                 }
31527
31528                 if (tempWay) {
31529                     graph = graph.remove(tempWay);
31530                 }
31531
31532                 // Final pass: skip dead items, split pairs, remove index properties
31533                 var wayMembers = [];
31534                 for (i = 0; i < members.length; i++) {
31535                     item = members[i];
31536                     if (item.index === -1) continue;
31537
31538                     if (item.pair) {
31539                         wayMembers.push(item.pair[0]);
31540                         wayMembers.push(item.pair[1]);
31541                     } else {
31542                         wayMembers.push(utilObjectOmit(item, ['index']));
31543                     }
31544                 }
31545
31546                 // Put stops and platforms first, then nodes, ways, relations
31547                 // This is recommended for Public Transport v2 routes:
31548                 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31549                 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
31550
31551                 return graph.replace(relation.update({ members: newMembers }));
31552
31553
31554                 // `moveMember()` changes the `members` array in place by splicing
31555                 // the item with `.index = findIndex` to where it belongs,
31556                 // and marking the old position as "dead" with `.index = -1`
31557                 //
31558                 // j=5, k=0                jk
31559                 // segment                 5 4 7 6
31560                 // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
31561                 //
31562                 // j=5, k=1                j k
31563                 // segment                 5 4 7 6
31564                 // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
31565                 // members       0 1 2 3 x 5 4 6 7 8 9      moved
31566                 //
31567                 // j=5, k=2                j   k
31568                 // segment                 5 4 7 6
31569                 // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
31570                 // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
31571                 //
31572                 // j=5, k=3                j     k
31573                 // segment                 5 4 7 6
31574                 // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
31575                 //
31576                 function moveMember(arr, findIndex, toIndex) {
31577                     for (var i = 0; i < arr.length; i++) {
31578                         if (arr[i].index === findIndex) {
31579                             break;
31580                         }
31581                     }
31582
31583                     var item = Object.assign({}, arr[i]);   // shallow copy
31584                     arr[i].index = -1;   // mark as dead
31585                     item.index = toIndex;
31586                     arr.splice(toIndex, 0, item);
31587                 }
31588
31589
31590                 // This is the same as `Relation.indexedMembers`,
31591                 // Except we don't want to index all the members, only the ways
31592                 function withIndex(arr) {
31593                     var result = new Array(arr.length);
31594                     for (var i = 0; i < arr.length; i++) {
31595                         result[i] = Object.assign({}, arr[i]);   // shallow copy
31596                         result[i].index = i;
31597                     }
31598                     return result;
31599                 }
31600             }
31601
31602         }
31603
31604         function actionAddMidpoint(midpoint, node) {
31605             return function(graph) {
31606                 graph = graph.replace(node.move(midpoint.loc));
31607
31608                 var parents = utilArrayIntersection(
31609                     graph.parentWays(graph.entity(midpoint.edge[0])),
31610                     graph.parentWays(graph.entity(midpoint.edge[1]))
31611                 );
31612
31613                 parents.forEach(function(way) {
31614                     for (var i = 0; i < way.nodes.length - 1; i++) {
31615                         if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
31616                             graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
31617
31618                             // Add only one midpoint on doubled-back segments,
31619                             // turning them into self-intersections.
31620                             return;
31621                         }
31622                     }
31623                 });
31624
31625                 return graph;
31626             };
31627         }
31628
31629         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
31630         function actionAddVertex(wayId, nodeId, index) {
31631             return function(graph) {
31632                 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
31633             };
31634         }
31635
31636         function actionChangeMember(relationId, member, memberIndex) {
31637             return function(graph) {
31638                 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
31639             };
31640         }
31641
31642         function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
31643             return function action(graph) {
31644                 var entity = graph.entity(entityID);
31645                 var geometry = entity.geometry(graph);
31646                 var tags = entity.tags;
31647
31648                 if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
31649                 if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
31650
31651                 return graph.replace(entity.update({tags: tags}));
31652             };
31653         }
31654
31655         function actionChangeTags(entityId, tags) {
31656             return function(graph) {
31657                 var entity = graph.entity(entityId);
31658                 return graph.replace(entity.update({tags: tags}));
31659             };
31660         }
31661
31662         function osmNode() {
31663             if (!(this instanceof osmNode)) {
31664                 return (new osmNode()).initialize(arguments);
31665             } else if (arguments.length) {
31666                 this.initialize(arguments);
31667             }
31668         }
31669
31670         osmEntity.node = osmNode;
31671
31672         osmNode.prototype = Object.create(osmEntity.prototype);
31673
31674         Object.assign(osmNode.prototype, {
31675             type: 'node',
31676             loc: [9999, 9999],
31677
31678             extent: function() {
31679                 return new geoExtent(this.loc);
31680             },
31681
31682
31683             geometry: function(graph) {
31684                 return graph.transient(this, 'geometry', function() {
31685                     return graph.isPoi(this) ? 'point' : 'vertex';
31686                 });
31687             },
31688
31689
31690             move: function(loc) {
31691                 return this.update({loc: loc});
31692             },
31693
31694
31695             isDegenerate: function() {
31696                 return !(
31697                     Array.isArray(this.loc) && this.loc.length === 2 &&
31698                     this.loc[0] >= -180 && this.loc[0] <= 180 &&
31699                     this.loc[1] >= -90 && this.loc[1] <= 90
31700                 );
31701             },
31702
31703
31704             // Inspect tags and geometry to determine which direction(s) this node/vertex points
31705             directions: function(resolver, projection) {
31706                 var val;
31707                 var i;
31708
31709                 // which tag to use?
31710                 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
31711                     // all-way stop tag on a highway intersection
31712                     val = 'all';
31713                 } else {
31714                     // generic direction tag
31715                     val = (this.tags.direction || '').toLowerCase();
31716
31717                     // better suffix-style direction tag
31718                     var re = /:direction$/i;
31719                     var keys = Object.keys(this.tags);
31720                     for (i = 0; i < keys.length; i++) {
31721                         if (re.test(keys[i])) {
31722                             val = this.tags[keys[i]].toLowerCase();
31723                             break;
31724                         }
31725                     }
31726                 }
31727
31728                 if (val === '') return [];
31729
31730                 var cardinal = {
31731                     north: 0,               n: 0,
31732                     northnortheast: 22,     nne: 22,
31733                     northeast: 45,          ne: 45,
31734                     eastnortheast: 67,      ene: 67,
31735                     east: 90,               e: 90,
31736                     eastsoutheast: 112,     ese: 112,
31737                     southeast: 135,         se: 135,
31738                     southsoutheast: 157,    sse: 157,
31739                     south: 180,             s: 180,
31740                     southsouthwest: 202,    ssw: 202,
31741                     southwest: 225,         sw: 225,
31742                     westsouthwest: 247,     wsw: 247,
31743                     west: 270,              w: 270,
31744                     westnorthwest: 292,     wnw: 292,
31745                     northwest: 315,         nw: 315,
31746                     northnorthwest: 337,    nnw: 337
31747                 };
31748
31749
31750                 var values = val.split(';');
31751                 var results = [];
31752
31753                 values.forEach(function(v) {
31754                     // swap cardinal for numeric directions
31755                     if (cardinal[v] !== undefined) {
31756                         v = cardinal[v];
31757                     }
31758
31759                     // numeric direction - just add to results
31760                     if (v !== '' && !isNaN(+v)) {
31761                         results.push(+v);
31762                         return;
31763                     }
31764
31765                     // string direction - inspect parent ways
31766                     var lookBackward =
31767                         (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
31768                     var lookForward =
31769                         (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
31770
31771                     if (!lookForward && !lookBackward) return;
31772
31773                     var nodeIds = {};
31774                     resolver.parentWays(this).forEach(function(parent) {
31775                         var nodes = parent.nodes;
31776                         for (i = 0; i < nodes.length; i++) {
31777                             if (nodes[i] === this.id) {  // match current entity
31778                                 if (lookForward && i > 0) {
31779                                     nodeIds[nodes[i - 1]] = true;  // look back to prev node
31780                                 }
31781                                 if (lookBackward && i < nodes.length - 1) {
31782                                     nodeIds[nodes[i + 1]] = true;  // look ahead to next node
31783                                 }
31784                             }
31785                         }
31786                     }, this);
31787
31788                     Object.keys(nodeIds).forEach(function(nodeId) {
31789                         // +90 because geoAngle returns angle from X axis, not Y (north)
31790                         results.push(
31791                             (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
31792                         );
31793                     }, this);
31794
31795                 }, this);
31796
31797                 return utilArrayUniq(results);
31798             },
31799
31800
31801             isEndpoint: function(resolver) {
31802                 return resolver.transient(this, 'isEndpoint', function() {
31803                     var id = this.id;
31804                     return resolver.parentWays(this).filter(function(parent) {
31805                         return !parent.isClosed() && !!parent.affix(id);
31806                     }).length > 0;
31807                 });
31808             },
31809
31810
31811             isConnected: function(resolver) {
31812                 return resolver.transient(this, 'isConnected', function() {
31813                     var parents = resolver.parentWays(this);
31814
31815                     function isLine(entity) {
31816                         return entity.geometry(resolver) === 'line' &&
31817                             entity.hasInterestingTags();
31818                     }
31819
31820                     // vertex is connected to multiple parent lines
31821                     if (parents.length > 1 && parents.some(isLine)) {
31822                         return true;
31823
31824                     } else if (parents.length === 1) {
31825                         var way = parents[0];
31826                         var nodes = way.nodes.slice();
31827                         if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
31828
31829                         // return true if vertex appears multiple times (way is self intersecting)
31830                         return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
31831                     }
31832
31833                     return false;
31834                 });
31835             },
31836
31837
31838             isIntersection: function(resolver) {
31839                 return resolver.transient(this, 'isIntersection', function() {
31840                     return resolver.parentWays(this).filter(function(parent) {
31841                         return (parent.tags.highway ||
31842                             parent.tags.waterway ||
31843                             parent.tags.railway ||
31844                             parent.tags.aeroway) &&
31845                             parent.geometry(resolver) === 'line';
31846                     }).length > 1;
31847                 });
31848             },
31849
31850
31851             isHighwayIntersection: function(resolver) {
31852                 return resolver.transient(this, 'isHighwayIntersection', function() {
31853                     return resolver.parentWays(this).filter(function(parent) {
31854                         return parent.tags.highway && parent.geometry(resolver) === 'line';
31855                     }).length > 1;
31856                 });
31857             },
31858
31859
31860             isOnAddressLine: function(resolver) {
31861                 return resolver.transient(this, 'isOnAddressLine', function() {
31862                     return resolver.parentWays(this).filter(function(parent) {
31863                         return parent.tags.hasOwnProperty('addr:interpolation') &&
31864                             parent.geometry(resolver) === 'line';
31865                     }).length > 0;
31866                 });
31867             },
31868
31869
31870             asJXON: function(changeset_id) {
31871                 var r = {
31872                     node: {
31873                         '@id': this.osmId(),
31874                         '@lon': this.loc[0],
31875                         '@lat': this.loc[1],
31876                         '@version': (this.version || 0),
31877                         tag: Object.keys(this.tags).map(function(k) {
31878                             return { keyAttributes: { k: k, v: this.tags[k] } };
31879                         }, this)
31880                     }
31881                 };
31882                 if (changeset_id) r.node['@changeset'] = changeset_id;
31883                 return r;
31884             },
31885
31886
31887             asGeoJSON: function() {
31888                 return {
31889                     type: 'Point',
31890                     coordinates: this.loc
31891                 };
31892             }
31893         });
31894
31895         function actionCircularize(wayId, projection, maxAngle) {
31896             maxAngle = (maxAngle || 20) * Math.PI / 180;
31897
31898
31899             var action = function(graph, t) {
31900                 if (t === null || !isFinite(t)) t = 1;
31901                 t = Math.min(Math.max(+t, 0), 1);
31902
31903                 var way = graph.entity(wayId);
31904                 var origNodes = {};
31905
31906                 graph.childNodes(way).forEach(function(node) {
31907                     if (!origNodes[node.id]) origNodes[node.id] = node;
31908                 });
31909
31910                 if (!way.isConvex(graph)) {
31911                     graph = action.makeConvex(graph);
31912                 }
31913
31914                 var nodes = utilArrayUniq(graph.childNodes(way));
31915                 var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; });
31916                 var points = nodes.map(function(n) { return projection(n.loc); });
31917                 var keyPoints = keyNodes.map(function(n) { return projection(n.loc); });
31918                 var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
31919                 var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); });
31920                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31921                 var ids, i, j, k;
31922
31923                 // we need atleast two key nodes for the algorithm to work
31924                 if (!keyNodes.length) {
31925                     keyNodes = [nodes[0]];
31926                     keyPoints = [points[0]];
31927                 }
31928
31929                 if (keyNodes.length === 1) {
31930                     var index = nodes.indexOf(keyNodes[0]);
31931                     var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
31932
31933                     keyNodes.push(nodes[oppositeIndex]);
31934                     keyPoints.push(points[oppositeIndex]);
31935                 }
31936
31937                 // key points and nodes are those connected to the ways,
31938                 // they are projected onto the circle, inbetween nodes are moved
31939                 // to constant intervals between key nodes, extra inbetween nodes are
31940                 // added if necessary.
31941                 for (i = 0; i < keyPoints.length; i++) {
31942                     var nextKeyNodeIndex = (i + 1) % keyNodes.length;
31943                     var startNode = keyNodes[i];
31944                     var endNode = keyNodes[nextKeyNodeIndex];
31945                     var startNodeIndex = nodes.indexOf(startNode);
31946                     var endNodeIndex = nodes.indexOf(endNode);
31947                     var numberNewPoints = -1;
31948                     var indexRange = endNodeIndex - startNodeIndex;
31949                     var nearNodes = {};
31950                     var inBetweenNodes = [];
31951                     var startAngle, endAngle, totalAngle, eachAngle;
31952                     var angle, loc, node, origNode;
31953
31954                     if (indexRange < 0) {
31955                         indexRange += nodes.length;
31956                     }
31957
31958                     // position this key node
31959                     var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
31960                     keyPoints[i] = [
31961                         centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
31962                         centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
31963                     ];
31964                     loc = projection.invert(keyPoints[i]);
31965                     node = keyNodes[i];
31966                     origNode = origNodes[node.id];
31967                     node = node.move(geoVecInterp(origNode.loc, loc, t));
31968                     graph = graph.replace(node);
31969
31970                     // figure out the between delta angle we want to match to
31971                     startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
31972                     endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
31973                     totalAngle = endAngle - startAngle;
31974
31975                     // detects looping around -pi/pi
31976                     if (totalAngle * sign > 0) {
31977                         totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
31978                     }
31979
31980                     do {
31981                         numberNewPoints++;
31982                         eachAngle = totalAngle / (indexRange + numberNewPoints);
31983                     } while (Math.abs(eachAngle) > maxAngle);
31984
31985
31986                     // move existing nodes
31987                     for (j = 1; j < indexRange; j++) {
31988                         angle = startAngle + j * eachAngle;
31989                         loc = projection.invert([
31990                             centroid[0] + Math.cos(angle) * radius,
31991                             centroid[1] + Math.sin(angle) * radius
31992                         ]);
31993
31994                         node = nodes[(j + startNodeIndex) % nodes.length];
31995                         origNode = origNodes[node.id];
31996                         nearNodes[node.id] = angle;
31997
31998                         node = node.move(geoVecInterp(origNode.loc, loc, t));
31999                         graph = graph.replace(node);
32000                     }
32001
32002                     // add new inbetween nodes if necessary
32003                     for (j = 0; j < numberNewPoints; j++) {
32004                         angle = startAngle + (indexRange + j) * eachAngle;
32005                         loc = projection.invert([
32006                             centroid[0] + Math.cos(angle) * radius,
32007                             centroid[1] + Math.sin(angle) * radius
32008                         ]);
32009
32010                         // choose a nearnode to use as the original
32011                         var min = Infinity;
32012                         for (var nodeId in nearNodes) {
32013                             var nearAngle = nearNodes[nodeId];
32014                             var dist = Math.abs(nearAngle - angle);
32015                             if (dist < min) {
32016                                 dist = min;
32017                                 origNode = origNodes[nodeId];
32018                             }
32019                         }
32020
32021                         node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
32022                         graph = graph.replace(node);
32023
32024                         nodes.splice(endNodeIndex + j, 0, node);
32025                         inBetweenNodes.push(node.id);
32026                     }
32027
32028                     // Check for other ways that share these keyNodes..
32029                     // If keyNodes are adjacent in both ways,
32030                     // we can add inBetween nodes to that shared way too..
32031                     if (indexRange === 1 && inBetweenNodes.length) {
32032                         var startIndex1 = way.nodes.lastIndexOf(startNode.id);
32033                         var endIndex1 = way.nodes.lastIndexOf(endNode.id);
32034                         var wayDirection1 = (endIndex1 - startIndex1);
32035                         if (wayDirection1 < -1) { wayDirection1 = 1; }
32036
32037                         var parentWays = graph.parentWays(keyNodes[i]);
32038                         for (j = 0; j < parentWays.length; j++) {
32039                             var sharedWay = parentWays[j];
32040                             if (sharedWay === way) continue;
32041
32042                             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
32043                                 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
32044                                 var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
32045                                 var wayDirection2 = (endIndex2 - startIndex2);
32046                                 var insertAt = endIndex2;
32047                                 if (wayDirection2 < -1) { wayDirection2 = 1; }
32048
32049                                 if (wayDirection1 !== wayDirection2) {
32050                                     inBetweenNodes.reverse();
32051                                     insertAt = startIndex2;
32052                                 }
32053                                 for (k = 0; k < inBetweenNodes.length; k++) {
32054                                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
32055                                 }
32056                                 graph = graph.replace(sharedWay);
32057                             }
32058                         }
32059                     }
32060
32061                 }
32062
32063                 // update the way to have all the new nodes
32064                 ids = nodes.map(function(n) { return n.id; });
32065                 ids.push(ids[0]);
32066
32067                 way = way.update({nodes: ids});
32068                 graph = graph.replace(way);
32069
32070                 return graph;
32071             };
32072
32073
32074             action.makeConvex = function(graph) {
32075                 var way = graph.entity(wayId);
32076                 var nodes = utilArrayUniq(graph.childNodes(way));
32077                 var points = nodes.map(function(n) { return projection(n.loc); });
32078                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
32079                 var hull = d3_polygonHull(points);
32080                 var i, j;
32081
32082                 // D3 convex hulls go counterclockwise..
32083                 if (sign === -1) {
32084                     nodes.reverse();
32085                     points.reverse();
32086                 }
32087
32088                 for (i = 0; i < hull.length - 1; i++) {
32089                     var startIndex = points.indexOf(hull[i]);
32090                     var endIndex = points.indexOf(hull[i+1]);
32091                     var indexRange = (endIndex - startIndex);
32092
32093                     if (indexRange < 0) {
32094                         indexRange += nodes.length;
32095                     }
32096
32097                     // move interior nodes to the surface of the convex hull..
32098                     for (j = 1; j < indexRange; j++) {
32099                         var point = geoVecInterp(hull[i], hull[i+1], j / indexRange);
32100                         var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
32101                         graph = graph.replace(node);
32102                     }
32103                 }
32104                 return graph;
32105             };
32106
32107
32108             action.disabled = function(graph) {
32109                 if (!graph.entity(wayId).isClosed()) {
32110                     return 'not_closed';
32111                 }
32112             };
32113
32114
32115             action.transitionable = true;
32116
32117
32118             return action;
32119         }
32120
32121         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
32122         function actionDeleteWay(wayID) {
32123
32124             function canDeleteNode(node, graph) {
32125                 // don't delete nodes still attached to ways or relations
32126                 if (graph.parentWays(node).length ||
32127                     graph.parentRelations(node).length) return false;
32128
32129                 var geometries = osmNodeGeometriesForTags(node.tags);
32130                 // don't delete if this node can be a standalone point
32131                 if (geometries.point) return false;
32132                 // delete if this node only be a vertex
32133                 if (geometries.vertex) return true;
32134
32135                 // iD doesn't know if this should be a point or vertex,
32136                 // so only delete if there are no interesting tags
32137                 return !node.hasInterestingTags();
32138             }
32139
32140
32141             var action = function(graph) {
32142                 var way = graph.entity(wayID);
32143
32144                 graph.parentRelations(way).forEach(function(parent) {
32145                     parent = parent.removeMembersWithID(wayID);
32146                     graph = graph.replace(parent);
32147
32148                     if (parent.isDegenerate()) {
32149                         graph = actionDeleteRelation(parent.id)(graph);
32150                     }
32151                 });
32152
32153                 (new Set(way.nodes)).forEach(function(nodeID) {
32154                     graph = graph.replace(way.removeNode(nodeID));
32155
32156                     var node = graph.entity(nodeID);
32157                     if (canDeleteNode(node, graph)) {
32158                         graph = graph.remove(node);
32159                     }
32160                 });
32161
32162                 return graph.remove(way);
32163             };
32164
32165
32166             return action;
32167         }
32168
32169         function actionDeleteMultiple(ids) {
32170             var actions = {
32171                 way: actionDeleteWay,
32172                 node: actionDeleteNode,
32173                 relation: actionDeleteRelation
32174             };
32175
32176
32177             var action = function(graph) {
32178                 ids.forEach(function(id) {
32179                     if (graph.hasEntity(id)) { // It may have been deleted aready.
32180                         graph = actions[graph.entity(id).type](id)(graph);
32181                     }
32182                 });
32183
32184                 return graph;
32185             };
32186
32187
32188             return action;
32189         }
32190
32191         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
32192         function actionDeleteRelation(relationID, allowUntaggedMembers) {
32193
32194             function canDeleteEntity(entity, graph) {
32195                 return !graph.parentWays(entity).length &&
32196                     !graph.parentRelations(entity).length &&
32197                     (!entity.hasInterestingTags() && !allowUntaggedMembers);
32198             }
32199
32200
32201             var action = function(graph) {
32202                 var relation = graph.entity(relationID);
32203
32204                 graph.parentRelations(relation)
32205                     .forEach(function(parent) {
32206                         parent = parent.removeMembersWithID(relationID);
32207                         graph = graph.replace(parent);
32208
32209                         if (parent.isDegenerate()) {
32210                             graph = actionDeleteRelation(parent.id)(graph);
32211                         }
32212                     });
32213
32214                 var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; }));
32215                 memberIDs.forEach(function(memberID) {
32216                     graph = graph.replace(relation.removeMembersWithID(memberID));
32217
32218                     var entity = graph.entity(memberID);
32219                     if (canDeleteEntity(entity, graph)) {
32220                         graph = actionDeleteMultiple([memberID])(graph);
32221                     }
32222                 });
32223
32224                 return graph.remove(relation);
32225             };
32226
32227
32228             return action;
32229         }
32230
32231         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
32232         function actionDeleteNode(nodeId) {
32233             var action = function(graph) {
32234                 var node = graph.entity(nodeId);
32235
32236                 graph.parentWays(node)
32237                     .forEach(function(parent) {
32238                         parent = parent.removeNode(nodeId);
32239                         graph = graph.replace(parent);
32240
32241                         if (parent.isDegenerate()) {
32242                             graph = actionDeleteWay(parent.id)(graph);
32243                         }
32244                     });
32245
32246                 graph.parentRelations(node)
32247                     .forEach(function(parent) {
32248                         parent = parent.removeMembersWithID(nodeId);
32249                         graph = graph.replace(parent);
32250
32251                         if (parent.isDegenerate()) {
32252                             graph = actionDeleteRelation(parent.id)(graph);
32253                         }
32254                     });
32255
32256                 return graph.remove(node);
32257             };
32258
32259
32260             return action;
32261         }
32262
32263         // Connect the ways at the given nodes.
32264         //
32265         // First choose a node to be the survivor, with preference given
32266         // to an existing (not new) node.
32267         //
32268         // Tags and relation memberships of of non-surviving nodes are merged
32269         // to the survivor.
32270         //
32271         // This is the inverse of `iD.actionDisconnect`.
32272         //
32273         // Reference:
32274         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
32275         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
32276         //
32277         function actionConnect(nodeIDs) {
32278             var action = function(graph) {
32279                 var survivor;
32280                 var node;
32281                 var parents;
32282                 var i, j;
32283
32284                 // Choose a survivor node, prefer an existing (not new) node - #4974
32285                 for (i = 0; i < nodeIDs.length; i++) {
32286                     survivor = graph.entity(nodeIDs[i]);
32287                     if (survivor.version) break;  // found one
32288                 }
32289
32290                 // Replace all non-surviving nodes with the survivor and merge tags.
32291                 for (i = 0; i < nodeIDs.length; i++) {
32292                     node = graph.entity(nodeIDs[i]);
32293                     if (node.id === survivor.id) continue;
32294
32295                     parents = graph.parentWays(node);
32296                     for (j = 0; j < parents.length; j++) {
32297                         if (!parents[j].areAdjacent(node.id, survivor.id)) {
32298                             graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
32299                         }
32300                     }
32301
32302                     parents = graph.parentRelations(node);
32303                     for (j = 0; j < parents.length; j++) {
32304                         graph = graph.replace(parents[j].replaceMember(node, survivor));
32305                     }
32306
32307                     survivor = survivor.mergeTags(node.tags);
32308                     graph = actionDeleteNode(node.id)(graph);
32309                 }
32310
32311                 graph = graph.replace(survivor);
32312
32313                 return graph;
32314             };
32315
32316
32317             action.disabled = function(graph) {
32318                 var seen = {};
32319                 var restrictionIDs = [];
32320                 var survivor;
32321                 var node, way;
32322                 var relations, relation, role;
32323                 var i, j, k;
32324
32325                 // Choose a survivor node, prefer an existing (not new) node - #4974
32326                 for (i = 0; i < nodeIDs.length; i++) {
32327                     survivor = graph.entity(nodeIDs[i]);
32328                     if (survivor.version) break;  // found one
32329                 }
32330
32331                 // 1. disable if the nodes being connected have conflicting relation roles
32332                 for (i = 0; i < nodeIDs.length; i++) {
32333                     node = graph.entity(nodeIDs[i]);
32334                     relations = graph.parentRelations(node);
32335
32336                     for (j = 0; j < relations.length; j++) {
32337                         relation = relations[j];
32338                         role = relation.memberById(node.id).role || '';
32339
32340                         // if this node is a via node in a restriction, remember for later
32341                         if (relation.hasFromViaTo()) {
32342                             restrictionIDs.push(relation.id);
32343                         }
32344
32345                         if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
32346                             return 'relation';
32347                         } else {
32348                             seen[relation.id] = role;
32349                         }
32350                     }
32351                 }
32352
32353                 // gather restrictions for parent ways
32354                 for (i = 0; i < nodeIDs.length; i++) {
32355                     node = graph.entity(nodeIDs[i]);
32356
32357                     var parents = graph.parentWays(node);
32358                     for (j = 0; j < parents.length; j++) {
32359                         var parent = parents[j];
32360                         relations = graph.parentRelations(parent);
32361
32362                         for (k = 0; k < relations.length; k++) {
32363                             relation = relations[k];
32364                             if (relation.hasFromViaTo()) {
32365                                 restrictionIDs.push(relation.id);
32366                             }
32367                         }
32368                     }
32369                 }
32370
32371
32372                 // test restrictions
32373                 restrictionIDs = utilArrayUniq(restrictionIDs);
32374                 for (i = 0; i < restrictionIDs.length; i++) {
32375                     relation = graph.entity(restrictionIDs[i]);
32376                     if (!relation.isComplete(graph)) continue;
32377
32378                     var memberWays = relation.members
32379                         .filter(function(m) { return m.type === 'way'; })
32380                         .map(function(m) { return graph.entity(m.id); });
32381
32382                     memberWays = utilArrayUniq(memberWays);
32383                     var f = relation.memberByRole('from');
32384                     var t = relation.memberByRole('to');
32385                     var isUturn = (f.id === t.id);
32386
32387                     // 2a. disable if connection would damage a restriction
32388                     // (a key node is a node at the junction of ways)
32389                     var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
32390                     for (j = 0; j < relation.members.length; j++) {
32391                         collectNodes(relation.members[j], nodes);
32392                     }
32393
32394                     nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
32395                     nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
32396
32397                     var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
32398                     nodes.from = nodes.from.filter(filter);
32399                     nodes.via = nodes.via.filter(filter);
32400                     nodes.to = nodes.to.filter(filter);
32401
32402                     var connectFrom = false;
32403                     var connectVia = false;
32404                     var connectTo = false;
32405                     var connectKeyFrom = false;
32406                     var connectKeyTo = false;
32407
32408                     for (j = 0; j < nodeIDs.length; j++) {
32409                         var n = nodeIDs[j];
32410                         if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
32411                         if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
32412                         if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
32413                         if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
32414                         if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
32415                     }
32416                     if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
32417                     if (connectFrom && connectVia) { return 'restriction'; }
32418                     if (connectTo   && connectVia) { return 'restriction'; }
32419
32420                     // connecting to a key node -
32421                     // if both nodes are on a member way (i.e. part of the turn restriction),
32422                     // the connecting node must be adjacent to the key node.
32423                     if (connectKeyFrom || connectKeyTo) {
32424                         if (nodeIDs.length !== 2) { return 'restriction'; }
32425
32426                         var n0 = null;
32427                         var n1 = null;
32428                         for (j = 0; j < memberWays.length; j++) {
32429                             way = memberWays[j];
32430                             if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
32431                             if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
32432                         }
32433
32434                         if (n0 && n1) {    // both nodes are part of the restriction
32435                             var ok = false;
32436                             for (j = 0; j < memberWays.length; j++) {
32437                                 way = memberWays[j];
32438                                 if (way.areAdjacent(n0, n1)) {
32439                                     ok = true;
32440                                     break;
32441                                 }
32442                             }
32443                             if (!ok) {
32444                                 return 'restriction';
32445                             }
32446                         }
32447                     }
32448
32449                     // 2b. disable if nodes being connected will destroy a member way in a restriction
32450                     // (to test, make a copy and try actually connecting the nodes)
32451                     for (j = 0; j < memberWays.length; j++) {
32452                         way = memberWays[j].update({});   // make copy
32453                         for (k = 0; k < nodeIDs.length; k++) {
32454                             if (nodeIDs[k] === survivor.id) continue;
32455
32456                             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
32457                                 way = way.removeNode(nodeIDs[k]);
32458                             } else {
32459                                 way = way.replaceNode(nodeIDs[k], survivor.id);
32460                             }
32461                         }
32462                         if (way.isDegenerate()) {
32463                             return 'restriction';
32464                         }
32465                     }
32466                 }
32467
32468                 return false;
32469
32470
32471                 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
32472                 function hasDuplicates(n, i, arr) {
32473                     return arr.indexOf(n) !== arr.lastIndexOf(n);
32474                 }
32475
32476                 function keyNodeFilter(froms, tos) {
32477                     return function(n) {
32478                         return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
32479                     };
32480                 }
32481
32482                 function collectNodes(member, collection) {
32483                     var entity = graph.hasEntity(member.id);
32484                     if (!entity) return;
32485
32486                     var role = member.role || '';
32487                     if (!collection[role]) {
32488                         collection[role] = [];
32489                     }
32490
32491                     if (member.type === 'node') {
32492                         collection[role].push(member.id);
32493                         if (role === 'via') {
32494                             collection.keyfrom.push(member.id);
32495                             collection.keyto.push(member.id);
32496                         }
32497
32498                     } else if (member.type === 'way') {
32499                         collection[role].push.apply(collection[role], entity.nodes);
32500                         if (role === 'from' || role === 'via') {
32501                             collection.keyfrom.push(entity.first());
32502                             collection.keyfrom.push(entity.last());
32503                         }
32504                         if (role === 'to' || role === 'via') {
32505                             collection.keyto.push(entity.first());
32506                             collection.keyto.push(entity.last());
32507                         }
32508                     }
32509                 }
32510             };
32511
32512
32513             return action;
32514         }
32515
32516         function actionCopyEntities(ids, fromGraph) {
32517             var _copies = {};
32518
32519
32520             var action = function(graph) {
32521                 ids.forEach(function(id) {
32522                     fromGraph.entity(id).copy(fromGraph, _copies);
32523                 });
32524
32525                 for (var id in _copies) {
32526                     graph = graph.replace(_copies[id]);
32527                 }
32528
32529                 return graph;
32530             };
32531
32532
32533             action.copies = function() {
32534                 return _copies;
32535             };
32536
32537
32538             return action;
32539         }
32540
32541         function actionDeleteMember(relationId, memberIndex) {
32542             return function(graph) {
32543                 var relation = graph.entity(relationId)
32544                     .removeMember(memberIndex);
32545
32546                 graph = graph.replace(relation);
32547
32548                 if (relation.isDegenerate())
32549                     graph = actionDeleteRelation(relation.id)(graph);
32550
32551                 return graph;
32552             };
32553         }
32554
32555         function actionDiscardTags(difference) {
32556
32557             return function(graph) {
32558                 function discardTags(entity) {
32559                     var tags = {};
32560                     var keys = Object.keys(entity.tags);
32561                     var discarded = false;
32562
32563                     for (var i = 0; i < keys.length; i++) {
32564                         var k = keys[i];
32565                         if (dataDiscarded[k] || !entity.tags[k]) {
32566                             discarded = true;
32567                         } else {
32568                             tags[k] = entity.tags[k];
32569                         }
32570                     }
32571
32572                     if (discarded) {
32573                         graph = graph.replace(entity.update({ tags: tags }));
32574                     }
32575                 }
32576
32577                 difference.modified().forEach(discardTags);
32578                 difference.created().forEach(discardTags);
32579
32580                 return graph;
32581             };
32582         }
32583
32584         // Disconect the ways at the given node.
32585         //
32586         // Optionally, disconnect only the given ways.
32587         //
32588         // For testing convenience, accepts an ID to assign to the (first) new node.
32589         // Normally, this will be undefined and the way will automatically
32590         // be assigned a new ID.
32591         //
32592         // This is the inverse of `iD.actionConnect`.
32593         //
32594         // Reference:
32595         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
32596         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
32597         //
32598         function actionDisconnect(nodeId, newNodeId) {
32599             var wayIds;
32600
32601
32602             var action = function(graph) {
32603                 var node = graph.entity(nodeId);
32604                 var connections = action.connections(graph);
32605
32606                 connections.forEach(function(connection) {
32607                     var way = graph.entity(connection.wayID);
32608                     var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
32609
32610                     graph = graph.replace(newNode);
32611                     if (connection.index === 0 && way.isArea()) {
32612                         // replace shared node with shared node..
32613                         graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
32614                     } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
32615                         // replace closing node with new new node..
32616                         graph = graph.replace(way.unclose().addNode(newNode.id));
32617                     } else {
32618                         // replace shared node with multiple new nodes..
32619                         graph = graph.replace(way.updateNode(newNode.id, connection.index));
32620                     }
32621                 });
32622
32623                 return graph;
32624             };
32625
32626
32627             action.connections = function(graph) {
32628                 var candidates = [];
32629                 var keeping = false;
32630                 var parentWays = graph.parentWays(graph.entity(nodeId));
32631
32632                 parentWays.forEach(function(way) {
32633                     if (wayIds && wayIds.indexOf(way.id) === -1) {
32634                         keeping = true;
32635                         return;
32636                     }
32637                     if (way.isArea() && (way.nodes[0] === nodeId)) {
32638                         candidates.push({ wayID: way.id, index: 0 });
32639                     } else {
32640                         way.nodes.forEach(function(waynode, index) {
32641                             if (waynode === nodeId) {
32642                                 if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && index === way.nodes.length-1) {
32643                                     return;
32644                                 }
32645                                 candidates.push({ wayID: way.id, index: index });
32646                             }
32647                         });
32648                     }
32649                 });
32650
32651                 return keeping ? candidates : candidates.slice(1);
32652             };
32653
32654
32655             action.disabled = function(graph) {
32656                 var connections = action.connections(graph);
32657                 if (connections.length === 0)
32658                     return 'not_connected';
32659
32660                 var parentWays = graph.parentWays(graph.entity(nodeId));
32661                 var seenRelationIds = {};
32662                 var sharedRelation;
32663
32664                 parentWays.forEach(function(way) {
32665                     var relations = graph.parentRelations(way);
32666                     relations.forEach(function(relation) {
32667                         if (relation.id in seenRelationIds) {
32668                             if (wayIds) {
32669                                 if (wayIds.indexOf(way.id) !== -1 ||
32670                                     wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
32671                                     sharedRelation = relation;
32672                                 }
32673                             } else {
32674                                 sharedRelation = relation;
32675                             }
32676                         } else {
32677                             seenRelationIds[relation.id] = way.id;
32678                         }
32679                     });
32680                 });
32681
32682                 if (sharedRelation)
32683                     return 'relation';
32684             };
32685
32686
32687             action.limitWays = function(val) {
32688                 if (!arguments.length) return wayIds;
32689                 wayIds = val;
32690                 return action;
32691             };
32692
32693
32694             return action;
32695         }
32696
32697         function actionExtract(entityID, projection) {
32698
32699             var extractedNodeID;
32700
32701             var action = function(graph) {
32702                 var entity = graph.entity(entityID);
32703
32704                 if (entity.type === 'node') {
32705                     return extractFromNode(entity, graph);
32706                 }
32707
32708                 return extractFromArea(entity, graph);
32709             };
32710
32711             function extractFromNode(node, graph) {
32712
32713                 extractedNodeID = node.id;
32714
32715                 // Create a new node to replace the one we will detach
32716                 var replacement = osmNode({ loc: node.loc });
32717                 graph = graph.replace(replacement);
32718
32719                 // Process each way in turn, updating the graph as we go
32720                 graph = graph.parentWays(node)
32721                     .reduce(function(accGraph, parentWay) {
32722                         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
32723                     }, graph);
32724
32725                 // Process any relations too
32726                 return graph.parentRelations(node)
32727                     .reduce(function(accGraph, parentRel) {
32728                         return accGraph.replace(parentRel.replaceMember(node, replacement));
32729                     }, graph);
32730             }
32731
32732             function extractFromArea(entity, graph) {
32733
32734                 var keysToCopyAndRetain = ['source', 'wheelchair'];
32735                 var keysToRetain = ['type'];
32736                 var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
32737
32738                 var centroid = d3_geoPath(projection).centroid(entity.asGeoJSON(graph, true));
32739
32740                 var isBuilding = entity.tags.building;
32741
32742                 var areaTags = Object.assign({}, entity.tags);  // shallow copy
32743                 var pointTags = {};
32744                 for (var key in areaTags) {
32745
32746                     if (keysToRetain.indexOf(key) !== -1) {
32747                         continue;
32748                     }
32749
32750                     if (isBuilding) {
32751                         // don't transfer building-related tags
32752                         if (buildingKeysToRetain.indexOf(key) !== -1 ||
32753                             key.match(/^building:.{1,}/) ||
32754                             key.match(/^roof:.{1,}/)) continue;
32755                     }
32756
32757                     // copy the tag from the area to the point
32758                     pointTags[key] = areaTags[key];
32759
32760                     // leave addresses and some other tags so they're on both features
32761                     if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
32762                         continue;
32763                     }
32764
32765                     // remove the tag from the area
32766                     delete areaTags[key];
32767                 }
32768
32769                 if (!isBuilding) {
32770                     // ensure that the area keeps the area geometry
32771                     areaTags.area = 'yes';
32772                 }
32773
32774                 var replacement = osmNode({ loc: centroid, tags: pointTags });
32775                 graph = graph.replace(replacement);
32776
32777                 extractedNodeID = replacement.id;
32778
32779                 return graph.replace(entity.update({tags: areaTags}));
32780             }
32781
32782             action.getExtractedNodeID = function() {
32783                 return extractedNodeID;
32784             };
32785
32786             action.disabled = function(graph) {
32787                 var entity = graph.entity(entityID);
32788
32789                 if (entity.type === 'node') {
32790                     var parentRels = graph.parentRelations(entity);
32791                     for (var i = 0; i < parentRels.length; i++) {
32792                         var relation = parentRels[i];
32793                         if (!relation.hasFromViaTo()) continue;
32794
32795                         for (var j = 0; j < relation.members.length; j++) {
32796                             var m = relation.members[j];
32797                             if (m.id === entityID && (m.role === 'via' || m.role === 'location_hint')) {
32798                                 return 'restriction';
32799                             }
32800                         }
32801                     }
32802                 }
32803
32804                 return false;
32805             };
32806
32807
32808             return action;
32809         }
32810
32811         // Join ways at the end node they share.
32812         //
32813         // This is the inverse of `iD.actionSplit`.
32814         //
32815         // Reference:
32816         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
32817         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
32818         //
32819         function actionJoin(ids) {
32820
32821             function groupEntitiesByGeometry(graph) {
32822                 var entities = ids.map(function(id) { return graph.entity(id); });
32823                 return Object.assign(
32824                     { line: [] },
32825                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32826                 );
32827             }
32828
32829
32830             var action = function(graph) {
32831                 var ways = ids.map(graph.entity, graph);
32832                 var survivorID = ways[0].id;
32833
32834                 // if any of the ways are sided (e.g. coastline, cliff, kerb)
32835                 // sort them first so they establish the overall order - #6033
32836                 ways.sort(function(a, b) {
32837                     var aSided = a.isSided();
32838                     var bSided = b.isSided();
32839                     return (aSided && !bSided) ? -1
32840                         : (bSided && !aSided) ? 1
32841                         : 0;
32842                 });
32843
32844                 // Prefer to keep an existing way.
32845                 for (var i = 0; i < ways.length; i++) {
32846                     if (!ways[i].isNew()) {
32847                         survivorID = ways[i].id;
32848                         break;
32849                     }
32850                 }
32851
32852                 var sequences = osmJoinWays(ways, graph);
32853                 var joined = sequences[0];
32854
32855                 // We might need to reverse some of these ways before joining them.  #4688
32856                 // `joined.actions` property will contain any actions we need to apply.
32857                 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
32858
32859                 var survivor = graph.entity(survivorID);
32860                 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
32861                 graph = graph.replace(survivor);
32862
32863                 joined.forEach(function(way) {
32864                     if (way.id === survivorID) return;
32865
32866                     graph.parentRelations(way).forEach(function(parent) {
32867                         graph = graph.replace(parent.replaceMember(way, survivor));
32868                     });
32869
32870                     survivor = survivor.mergeTags(way.tags);
32871
32872                     graph = graph.replace(survivor);
32873                     graph = actionDeleteWay(way.id)(graph);
32874                 });
32875
32876                 return graph;
32877             };
32878
32879
32880             action.disabled = function(graph) {
32881                 var geometries = groupEntitiesByGeometry(graph);
32882                 if (ids.length < 2 || ids.length !== geometries.line.length) {
32883                     return 'not_eligible';
32884                 }
32885
32886                 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
32887                 if (joined.length > 1) {
32888                     return 'not_adjacent';
32889                 }
32890
32891                 // Loop through all combinations of path-pairs
32892                 // to check potential intersections between all pairs
32893                 for (var i = 0; i < ids.length - 1; i++) {
32894                     for (var j = i + 1; j < ids.length; j++) {
32895                         var path1 = graph.childNodes(graph.entity(ids[i]))
32896                             .map(function(e) { return e.loc; });
32897                         var path2 = graph.childNodes(graph.entity(ids[j]))
32898                             .map(function(e) { return e.loc; });
32899                         var intersections = geoPathIntersections(path1, path2);
32900
32901                         // Check if intersections are just nodes lying on top of
32902                         // each other/the line, as opposed to crossing it
32903                         var common = utilArrayIntersection(
32904                             joined[0].nodes.map(function(n) { return n.loc.toString(); }),
32905                             intersections.map(function(n) { return n.toString(); })
32906                         );
32907                         if (common.length !== intersections.length) {
32908                             return 'paths_intersect';
32909                         }
32910                     }
32911                 }
32912
32913                 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
32914                 var relation;
32915                 var tags = {};
32916                 var conflicting = false;
32917
32918                 joined[0].forEach(function(way) {
32919                     var parents = graph.parentRelations(way);
32920                     parents.forEach(function(parent) {
32921                         if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) {
32922                             relation = parent;
32923                         }
32924                     });
32925
32926                     for (var k in way.tags) {
32927                         if (!(k in tags)) {
32928                             tags[k] = way.tags[k];
32929                         } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
32930                             conflicting = true;
32931                         }
32932                     }
32933                 });
32934
32935                 if (relation) {
32936                     return 'restriction';
32937                 }
32938
32939                 if (conflicting) {
32940                     return 'conflicting_tags';
32941                 }
32942             };
32943
32944
32945             return action;
32946         }
32947
32948         function actionMerge(ids) {
32949
32950             function groupEntitiesByGeometry(graph) {
32951                 var entities = ids.map(function(id) { return graph.entity(id); });
32952                 return Object.assign(
32953                     { point: [], area: [], line: [], relation: [] },
32954                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32955                 );
32956             }
32957
32958
32959             var action = function(graph) {
32960                 var geometries = groupEntitiesByGeometry(graph);
32961                 var target = geometries.area[0] || geometries.line[0];
32962                 var points = geometries.point;
32963
32964                 points.forEach(function(point) {
32965                     target = target.mergeTags(point.tags);
32966                     graph = graph.replace(target);
32967
32968                     graph.parentRelations(point).forEach(function(parent) {
32969                         graph = graph.replace(parent.replaceMember(point, target));
32970                     });
32971
32972                     var nodes = utilArrayUniq(graph.childNodes(target));
32973                     var removeNode = point;
32974
32975                     for (var i = 0; i < nodes.length; i++) {
32976                         var node = nodes[i];
32977                         if (graph.parentWays(node).length > 1 ||
32978                             graph.parentRelations(node).length ||
32979                             node.hasInterestingTags()) {
32980                             continue;
32981                         }
32982
32983                         // Found an uninteresting child node on the target way.
32984                         // Move orig point into its place to preserve point's history. #3683
32985                         graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
32986                         target = target.replaceNode(node.id, point.id);
32987                         graph = graph.replace(target);
32988                         removeNode = node;
32989                         break;
32990                     }
32991
32992                     graph = graph.remove(removeNode);
32993                 });
32994
32995                 return graph;
32996             };
32997
32998
32999             action.disabled = function(graph) {
33000                 var geometries = groupEntitiesByGeometry(graph);
33001                 if (geometries.point.length === 0 ||
33002                     (geometries.area.length + geometries.line.length) !== 1 ||
33003                     geometries.relation.length !== 0) {
33004                     return 'not_eligible';
33005                 }
33006             };
33007
33008
33009             return action;
33010         }
33011
33012         // `actionMergeNodes` is just a combination of:
33013         //
33014         // 1. move all the nodes to a common location
33015         // 2. `actionConnect` them
33016
33017         function actionMergeNodes(nodeIDs, loc) {
33018
33019             // If there is a single "interesting" node, use that as the location.
33020             // Otherwise return the average location of all the nodes.
33021             function chooseLoc(graph) {
33022                 if (!nodeIDs.length) return null;
33023                 var sum = [0,0];
33024                 var interestingCount = 0;
33025                 var interestingLoc;
33026
33027                 for (var i = 0; i < nodeIDs.length; i++) {
33028                     var node = graph.entity(nodeIDs[i]);
33029                     if (node.hasInterestingTags()) {
33030                         interestingLoc = (++interestingCount === 1) ? node.loc : null;
33031                     }
33032                     sum = geoVecAdd(sum, node.loc);
33033                 }
33034
33035                 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
33036             }
33037
33038
33039             var action = function(graph) {
33040                 if (nodeIDs.length < 2) return graph;
33041                 var toLoc = loc;
33042                 if (!toLoc) {
33043                     toLoc = chooseLoc(graph);
33044                 }
33045
33046                 for (var i = 0; i < nodeIDs.length; i++) {
33047                     var node = graph.entity(nodeIDs[i]);
33048                     if (node.loc !== toLoc) {
33049                         graph = graph.replace(node.move(toLoc));
33050                     }
33051                 }
33052
33053                 return actionConnect(nodeIDs)(graph);
33054             };
33055
33056
33057             action.disabled = function(graph) {
33058                 if (nodeIDs.length < 2) return 'not_eligible';
33059
33060                 for (var i = 0; i < nodeIDs.length; i++) {
33061                     var entity = graph.entity(nodeIDs[i]);
33062                     if (entity.type !== 'node') return 'not_eligible';
33063                 }
33064
33065                 return actionConnect(nodeIDs).disabled(graph);
33066             };
33067
33068             return action;
33069         }
33070
33071         function osmChangeset() {
33072             if (!(this instanceof osmChangeset)) {
33073                 return (new osmChangeset()).initialize(arguments);
33074             } else if (arguments.length) {
33075                 this.initialize(arguments);
33076             }
33077         }
33078
33079
33080         osmEntity.changeset = osmChangeset;
33081
33082         osmChangeset.prototype = Object.create(osmEntity.prototype);
33083
33084         Object.assign(osmChangeset.prototype, {
33085
33086             type: 'changeset',
33087
33088
33089             extent: function() {
33090                 return new geoExtent();
33091             },
33092
33093
33094             geometry: function() {
33095                 return 'changeset';
33096             },
33097
33098
33099             asJXON: function() {
33100                 return {
33101                     osm: {
33102                         changeset: {
33103                             tag: Object.keys(this.tags).map(function(k) {
33104                                 return { '@k': k, '@v': this.tags[k] };
33105                             }, this),
33106                             '@version': 0.6,
33107                             '@generator': 'iD'
33108                         }
33109                     }
33110                 };
33111             },
33112
33113
33114             // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
33115             // XML. Returns a string.
33116             osmChangeJXON: function(changes) {
33117                 var changeset_id = this.id;
33118
33119                 function nest(x, order) {
33120                     var groups = {};
33121                     for (var i = 0; i < x.length; i++) {
33122                         var tagName = Object.keys(x[i])[0];
33123                         if (!groups[tagName]) groups[tagName] = [];
33124                         groups[tagName].push(x[i][tagName]);
33125                     }
33126                     var ordered = {};
33127                     order.forEach(function(o) {
33128                         if (groups[o]) ordered[o] = groups[o];
33129                     });
33130                     return ordered;
33131                 }
33132
33133
33134                 // sort relations in a changeset by dependencies
33135                 function sort(changes) {
33136
33137                     // find a referenced relation in the current changeset
33138                     function resolve(item) {
33139                         return relations.find(function(relation) {
33140                             return item.keyAttributes.type === 'relation'
33141                                 && item.keyAttributes.ref === relation['@id'];
33142                         });
33143                     }
33144
33145                     // a new item is an item that has not been already processed
33146                     function isNew(item) {
33147                         return !sorted[ item['@id'] ] && !processing.find(function(proc) {
33148                             return proc['@id'] === item['@id'];
33149                         });
33150                     }
33151
33152                     var processing = [];
33153                     var sorted = {};
33154                     var relations = changes.relation;
33155
33156                     if (!relations) return changes;
33157
33158                     for (var i = 0; i < relations.length; i++) {
33159                         var relation = relations[i];
33160
33161                         // skip relation if already sorted
33162                         if (!sorted[relation['@id']]) {
33163                             processing.push(relation);
33164                         }
33165
33166                         while (processing.length > 0) {
33167                             var next = processing[0],
33168                             deps = next.member.map(resolve).filter(Boolean).filter(isNew);
33169                             if (deps.length === 0) {
33170                                 sorted[next['@id']] = next;
33171                                 processing.shift();
33172                             } else {
33173                                 processing = deps.concat(processing);
33174                             }
33175                         }
33176                     }
33177
33178                     changes.relation = Object.values(sorted);
33179                     return changes;
33180                 }
33181
33182                 function rep(entity) {
33183                     return entity.asJXON(changeset_id);
33184                 }
33185
33186                 return {
33187                     osmChange: {
33188                         '@version': 0.6,
33189                         '@generator': 'iD',
33190                         'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
33191                         'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
33192                         'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
33193                     }
33194                 };
33195             },
33196
33197
33198             asGeoJSON: function() {
33199                 return {};
33200             }
33201
33202         });
33203
33204         function osmNote() {
33205             if (!(this instanceof osmNote)) {
33206                 return (new osmNote()).initialize(arguments);
33207             } else if (arguments.length) {
33208                 this.initialize(arguments);
33209             }
33210         }
33211
33212
33213         osmNote.id = function() {
33214             return osmNote.id.next--;
33215         };
33216
33217
33218         osmNote.id.next = -1;
33219
33220
33221         Object.assign(osmNote.prototype, {
33222
33223             type: 'note',
33224
33225             initialize: function(sources) {
33226                 for (var i = 0; i < sources.length; ++i) {
33227                     var source = sources[i];
33228                     for (var prop in source) {
33229                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33230                             if (source[prop] === undefined) {
33231                                 delete this[prop];
33232                             } else {
33233                                 this[prop] = source[prop];
33234                             }
33235                         }
33236                     }
33237                 }
33238
33239                 if (!this.id) {
33240                     this.id = osmNote.id() + '';  // as string
33241                 }
33242
33243                 return this;
33244             },
33245
33246             extent: function() {
33247                 return new geoExtent(this.loc);
33248             },
33249
33250             update: function(attrs) {
33251                 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
33252             },
33253
33254             isNew: function() {
33255                 return this.id < 0;
33256             },
33257
33258             move: function(loc) {
33259                 return this.update({ loc: loc });
33260             }
33261
33262         });
33263
33264         function osmRelation() {
33265             if (!(this instanceof osmRelation)) {
33266                 return (new osmRelation()).initialize(arguments);
33267             } else if (arguments.length) {
33268                 this.initialize(arguments);
33269             }
33270         }
33271
33272
33273         osmEntity.relation = osmRelation;
33274
33275         osmRelation.prototype = Object.create(osmEntity.prototype);
33276
33277
33278         osmRelation.creationOrder = function(a, b) {
33279             var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
33280             var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
33281
33282             if (aId < 0 || bId < 0) return aId - bId;
33283             return bId - aId;
33284         };
33285
33286
33287         Object.assign(osmRelation.prototype, {
33288             type: 'relation',
33289             members: [],
33290
33291
33292             copy: function(resolver, copies) {
33293                 if (copies[this.id]) return copies[this.id];
33294
33295                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
33296
33297                 var members = this.members.map(function(member) {
33298                     return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
33299                 });
33300
33301                 copy = copy.update({members: members});
33302                 copies[this.id] = copy;
33303
33304                 return copy;
33305             },
33306
33307
33308             extent: function(resolver, memo) {
33309                 return resolver.transient(this, 'extent', function() {
33310                     if (memo && memo[this.id]) return geoExtent();
33311                     memo = memo || {};
33312                     memo[this.id] = true;
33313
33314                     var extent = geoExtent();
33315                     for (var i = 0; i < this.members.length; i++) {
33316                         var member = resolver.hasEntity(this.members[i].id);
33317                         if (member) {
33318                             extent._extend(member.extent(resolver, memo));
33319                         }
33320                     }
33321                     return extent;
33322                 });
33323             },
33324
33325
33326             geometry: function(graph) {
33327                 return graph.transient(this, 'geometry', function() {
33328                     return this.isMultipolygon() ? 'area' : 'relation';
33329                 });
33330             },
33331
33332
33333             isDegenerate: function() {
33334                 return this.members.length === 0;
33335             },
33336
33337
33338             // Return an array of members, each extended with an 'index' property whose value
33339             // is the member index.
33340             indexedMembers: function() {
33341                 var result = new Array(this.members.length);
33342                 for (var i = 0; i < this.members.length; i++) {
33343                     result[i] = Object.assign({}, this.members[i], {index: i});
33344                 }
33345                 return result;
33346             },
33347
33348
33349             // Return the first member with the given role. A copy of the member object
33350             // is returned, extended with an 'index' property whose value is the member index.
33351             memberByRole: function(role) {
33352                 for (var i = 0; i < this.members.length; i++) {
33353                     if (this.members[i].role === role) {
33354                         return Object.assign({}, this.members[i], {index: i});
33355                     }
33356                 }
33357             },
33358
33359             // Same as memberByRole, but returns all members with the given role
33360             membersByRole: function(role) {
33361                 var result = [];
33362                 for (var i = 0; i < this.members.length; i++) {
33363                     if (this.members[i].role === role) {
33364                         result.push(Object.assign({}, this.members[i], {index: i}));
33365                     }
33366                 }
33367                 return result;
33368             },
33369
33370             // Return the first member with the given id. A copy of the member object
33371             // is returned, extended with an 'index' property whose value is the member index.
33372             memberById: function(id) {
33373                 for (var i = 0; i < this.members.length; i++) {
33374                     if (this.members[i].id === id) {
33375                         return Object.assign({}, this.members[i], {index: i});
33376                     }
33377                 }
33378             },
33379
33380
33381             // Return the first member with the given id and role. A copy of the member object
33382             // is returned, extended with an 'index' property whose value is the member index.
33383             memberByIdAndRole: function(id, role) {
33384                 for (var i = 0; i < this.members.length; i++) {
33385                     if (this.members[i].id === id && this.members[i].role === role) {
33386                         return Object.assign({}, this.members[i], {index: i});
33387                     }
33388                 }
33389             },
33390
33391
33392             addMember: function(member, index) {
33393                 var members = this.members.slice();
33394                 members.splice(index === undefined ? members.length : index, 0, member);
33395                 return this.update({members: members});
33396             },
33397
33398
33399             updateMember: function(member, index) {
33400                 var members = this.members.slice();
33401                 members.splice(index, 1, Object.assign({}, members[index], member));
33402                 return this.update({members: members});
33403             },
33404
33405
33406             removeMember: function(index) {
33407                 var members = this.members.slice();
33408                 members.splice(index, 1);
33409                 return this.update({members: members});
33410             },
33411
33412
33413             removeMembersWithID: function(id) {
33414                 var members = this.members.filter(function(m) { return m.id !== id; });
33415                 return this.update({members: members});
33416             },
33417
33418             moveMember: function(fromIndex, toIndex) {
33419                 var members = this.members.slice();
33420                 members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
33421                 return this.update({members: members});
33422             },
33423
33424
33425             // Wherever a member appears with id `needle.id`, replace it with a member
33426             // with id `replacement.id`, type `replacement.type`, and the original role,
33427             // By default, adding a duplicate member (by id and role) is prevented.
33428             // Return an updated relation.
33429             replaceMember: function(needle, replacement, keepDuplicates) {
33430                 if (!this.memberById(needle.id)) return this;
33431
33432                 var members = [];
33433
33434                 for (var i = 0; i < this.members.length; i++) {
33435                     var member = this.members[i];
33436                     if (member.id !== needle.id) {
33437                         members.push(member);
33438                     } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
33439                         members.push({ id: replacement.id, type: replacement.type, role: member.role });
33440                     }
33441                 }
33442
33443                 return this.update({ members: members });
33444             },
33445
33446
33447             asJXON: function(changeset_id) {
33448                 var r = {
33449                     relation: {
33450                         '@id': this.osmId(),
33451                         '@version': this.version || 0,
33452                         member: this.members.map(function(member) {
33453                             return {
33454                                 keyAttributes: {
33455                                     type: member.type,
33456                                     role: member.role,
33457                                     ref: osmEntity.id.toOSM(member.id)
33458                                 }
33459                             };
33460                         }, this),
33461                         tag: Object.keys(this.tags).map(function(k) {
33462                             return { keyAttributes: { k: k, v: this.tags[k] } };
33463                         }, this)
33464                     }
33465                 };
33466                 if (changeset_id) {
33467                     r.relation['@changeset'] = changeset_id;
33468                 }
33469                 return r;
33470             },
33471
33472
33473             asGeoJSON: function(resolver) {
33474                 return resolver.transient(this, 'GeoJSON', function () {
33475                     if (this.isMultipolygon()) {
33476                         return {
33477                             type: 'MultiPolygon',
33478                             coordinates: this.multipolygon(resolver)
33479                         };
33480                     } else {
33481                         return {
33482                             type: 'FeatureCollection',
33483                             properties: this.tags,
33484                             features: this.members.map(function (member) {
33485                                 return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
33486                             })
33487                         };
33488                     }
33489                 });
33490             },
33491
33492
33493             area: function(resolver) {
33494                 return resolver.transient(this, 'area', function() {
33495                     return d3_geoArea(this.asGeoJSON(resolver));
33496                 });
33497             },
33498
33499
33500             isMultipolygon: function() {
33501                 return this.tags.type === 'multipolygon';
33502             },
33503
33504
33505             isComplete: function(resolver) {
33506                 for (var i = 0; i < this.members.length; i++) {
33507                     if (!resolver.hasEntity(this.members[i].id)) {
33508                         return false;
33509                     }
33510                 }
33511                 return true;
33512             },
33513
33514
33515             hasFromViaTo: function() {
33516                 return (
33517                     this.members.some(function(m) { return m.role === 'from'; }) &&
33518                     this.members.some(function(m) { return m.role === 'via'; }) &&
33519                     this.members.some(function(m) { return m.role === 'to'; })
33520                 );
33521             },
33522
33523
33524             isRestriction: function() {
33525                 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
33526             },
33527
33528
33529             isValidRestriction: function() {
33530                 if (!this.isRestriction()) return false;
33531
33532                 var froms = this.members.filter(function(m) { return m.role === 'from'; });
33533                 var vias = this.members.filter(function(m) { return m.role === 'via'; });
33534                 var tos = this.members.filter(function(m) { return m.role === 'to'; });
33535
33536                 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
33537                 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
33538
33539                 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
33540                 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
33541
33542                 if (vias.length === 0) return false;
33543                 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
33544
33545                 return true;
33546             },
33547
33548
33549             // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
33550             // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
33551             //
33552             // This corresponds to the structure needed for rendering a multipolygon path using a
33553             // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
33554             //
33555             // In the case of invalid geometries, this function will still return a result which
33556             // includes the nodes of all way members, but some Nds may be unclosed and some inner
33557             // rings not matched with the intended outer ring.
33558             //
33559             multipolygon: function(resolver) {
33560                 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
33561                 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
33562
33563                 outers = osmJoinWays(outers, resolver);
33564                 inners = osmJoinWays(inners, resolver);
33565
33566                 outers = outers.map(function(outer) {
33567                     return outer.nodes.map(function(node) { return node.loc; });
33568                 });
33569                 inners = inners.map(function(inner) {
33570                     return inner.nodes.map(function(node) { return node.loc; });
33571                 });
33572
33573                 var result = outers.map(function(o) {
33574                     // Heuristic for detecting counterclockwise winding order. Assumes
33575                     // that OpenStreetMap polygons are not hemisphere-spanning.
33576                     return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
33577                 });
33578
33579                 function findOuter(inner) {
33580                     var o, outer;
33581
33582                     for (o = 0; o < outers.length; o++) {
33583                         outer = outers[o];
33584                         if (geoPolygonContainsPolygon(outer, inner))
33585                             return o;
33586                     }
33587
33588                     for (o = 0; o < outers.length; o++) {
33589                         outer = outers[o];
33590                         if (geoPolygonIntersectsPolygon(outer, inner, false))
33591                             return o;
33592                     }
33593                 }
33594
33595                 for (var i = 0; i < inners.length; i++) {
33596                     var inner = inners[i];
33597
33598                     if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
33599                         inner = inner.reverse();
33600                     }
33601
33602                     var o = findOuter(inners[i]);
33603                     if (o !== undefined) {
33604                         result[o].push(inners[i]);
33605                     } else {
33606                         result.push([inners[i]]); // Invalid geometry
33607                     }
33608                 }
33609
33610                 return result;
33611             }
33612         });
33613
33614         var services = {improveOSM:{errorTypes:{ow:{icon:"fas-long-arrow-alt-right",category:"routing"},"mr-both":{icon:"maki-car",category:"geometry"},"mr-parking":{icon:"maki-parking",category:"geometry"},"mr-path":{icon:"maki-shoe",category:"geometry"},"mr-road":{icon:"maki-car",category:"geometry"},tr:{icon:"temaki-junction",category:"routing"}}},keepRight:{errorTypes:{}}};
33615
33616         function qaError() {
33617             if (!(this instanceof qaError)) {
33618                 return (new qaError()).initialize(arguments);
33619             } else if (arguments.length) {
33620                 this.initialize(arguments);
33621             }
33622         }
33623
33624         // Generic handling for services without nice IDs
33625         qaError.id = function() {
33626             return qaError.id.next--;
33627         };
33628
33629         qaError.id.next = -1;
33630
33631         Object.assign(qaError.prototype, {
33632             type: 'qaError',
33633
33634             // All errors need a position
33635             loc: [0, 0],
33636
33637             // These should be passed in, used to retrieve from qa_errors.json
33638             service: '',
33639             error_type: '',
33640
33641             initialize: function(sources) {
33642                 for (var i = 0; i < sources.length; ++i) {
33643                     var source = sources[i];
33644                     for (var prop in source) {
33645                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33646                             if (source[prop] === undefined) {
33647                                 delete this[prop];
33648                             } else {
33649                                 this[prop] = source[prop];
33650                             }
33651                         }
33652                     }
33653                 }
33654
33655                 // Extract common error information from data
33656                 if (this.service && this.error_type) {
33657                     var serviceInfo = services[this.service];
33658
33659                     if (serviceInfo) {
33660                         var errInfo = serviceInfo.errorTypes[this.error_type];
33661
33662                         if (errInfo) {
33663                             this.icon = errInfo.icon;
33664                             this.category = errInfo.category;
33665                         }
33666                     }
33667                 }
33668
33669                 // All errors must have an ID for selection
33670                 if (!this.id) {
33671                     this.id = qaError.id() + '';  // as string
33672                 }
33673
33674                 return this;
33675             },
33676
33677             update: function(attrs) {
33678                 return qaError(this, attrs); // {v: 1 + (this.v || 0)}
33679             }
33680         });
33681
33682         // Split a way at the given node.
33683         //
33684         // Optionally, split only the given ways, if multiple ways share
33685         // the given node.
33686         //
33687         // This is the inverse of `iD.actionJoin`.
33688         //
33689         // For testing convenience, accepts an ID to assign to the new way.
33690         // Normally, this will be undefined and the way will automatically
33691         // be assigned a new ID.
33692         //
33693         // Reference:
33694         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
33695         //
33696         function actionSplit(nodeId, newWayIds) {
33697             var _wayIDs;
33698
33699             // If the way is closed, we need to search for a partner node
33700             // to split the way at.
33701             //
33702             // The following looks for a node that is both far away from
33703             // the initial node in terms of way segment length and nearby
33704             // in terms of beeline-distance. This assures that areas get
33705             // split on the most "natural" points (independent of the number
33706             // of nodes).
33707             // For example: bone-shaped areas get split across their waist
33708             // line, circles across the diameter.
33709             function splitArea(nodes, idxA, graph) {
33710                 var lengths = new Array(nodes.length);
33711                 var length;
33712                 var i;
33713                 var best = 0;
33714                 var idxB;
33715
33716                 function wrap(index) {
33717                     return utilWrap(index, nodes.length);
33718                 }
33719
33720                 function dist(nA, nB) {
33721                     var locA = graph.entity(nA).loc;
33722                     var locB = graph.entity(nB).loc;
33723                     var epsilon = 1e-6;
33724                     return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
33725                 }
33726
33727                 // calculate lengths
33728                 length = 0;
33729                 for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
33730                     length += dist(nodes[i], nodes[wrap(i - 1)]);
33731                     lengths[i] = length;
33732                 }
33733
33734                 length = 0;
33735                 for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
33736                     length += dist(nodes[i], nodes[wrap(i + 1)]);
33737                     if (length < lengths[i]) {
33738                         lengths[i] = length;
33739                     }
33740                 }
33741
33742                 // determine best opposite node to split
33743                 for (i = 0; i < nodes.length; i++) {
33744                     var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
33745                     if (cost > best) {
33746                         idxB = i;
33747                         best = cost;
33748                     }
33749                 }
33750
33751                 return idxB;
33752             }
33753
33754
33755             function split(graph, wayA, newWayId) {
33756                 var wayB = osmWay({ id: newWayId, tags: wayA.tags });   // `wayB` is the NEW way
33757                 var origNodes = wayA.nodes.slice();
33758                 var nodesA;
33759                 var nodesB;
33760                 var isArea = wayA.isArea();
33761                 var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
33762
33763                 if (wayA.isClosed()) {
33764                     var nodes = wayA.nodes.slice(0, -1);
33765                     var idxA = nodes.indexOf(nodeId);
33766                     var idxB = splitArea(nodes, idxA, graph);
33767
33768                     if (idxB < idxA) {
33769                         nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
33770                         nodesB = nodes.slice(idxB, idxA + 1);
33771                     } else {
33772                         nodesA = nodes.slice(idxA, idxB + 1);
33773                         nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
33774                     }
33775                 } else {
33776                     var idx = wayA.nodes.indexOf(nodeId, 1);
33777                     nodesA = wayA.nodes.slice(0, idx + 1);
33778                     nodesB = wayA.nodes.slice(idx);
33779                 }
33780
33781                 wayA = wayA.update({ nodes: nodesA });
33782                 wayB = wayB.update({ nodes: nodesB });
33783
33784                 graph = graph.replace(wayA);
33785                 graph = graph.replace(wayB);
33786
33787                 graph.parentRelations(wayA).forEach(function(relation) {
33788                     var member;
33789
33790                     // Turn restrictions - make sure:
33791                     // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
33792                     //    (whichever one is connected to the VIA node/ways)
33793                     // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
33794                     if (relation.hasFromViaTo()) {
33795                         var f = relation.memberByRole('from');
33796                         var v = relation.membersByRole('via');
33797                         var t = relation.memberByRole('to');
33798                         var i;
33799
33800                         // 1. split a FROM/TO
33801                         if (f.id === wayA.id || t.id === wayA.id) {
33802                             var keepB = false;
33803                             if (v.length === 1 && v[0].type === 'node') {   // check via node
33804                                 keepB = wayB.contains(v[0].id);
33805                             } else {                                        // check via way(s)
33806                                 for (i = 0; i < v.length; i++) {
33807                                     if (v[i].type === 'way') {
33808                                         var wayVia = graph.hasEntity(v[i].id);
33809                                         if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
33810                                             keepB = true;
33811                                             break;
33812                                         }
33813                                     }
33814                                 }
33815                             }
33816
33817                             if (keepB) {
33818                                 relation = relation.replaceMember(wayA, wayB);
33819                                 graph = graph.replace(relation);
33820                             }
33821
33822                         // 2. split a VIA
33823                         } else {
33824                             for (i = 0; i < v.length; i++) {
33825                                 if (v[i].type === 'way' && v[i].id === wayA.id) {
33826                                     member = {
33827                                         id: wayB.id,
33828                                         type: 'way',
33829                                         role: 'via'
33830                                     };
33831                                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
33832                                     break;
33833                                 }
33834                             }
33835                         }
33836
33837                     // All other relations (Routes, Multipolygons, etc):
33838                     // 1. Both `wayA` and `wayB` remain in the relation
33839                     // 2. But must be inserted as a pair (see `actionAddMember` for details)
33840                     } else {
33841                         if (relation === isOuter) {
33842                             graph = graph.replace(relation.mergeTags(wayA.tags));
33843                             graph = graph.replace(wayA.update({ tags: {} }));
33844                             graph = graph.replace(wayB.update({ tags: {} }));
33845                         }
33846
33847                         member = {
33848                             id: wayB.id,
33849                             type: 'way',
33850                             role: relation.memberById(wayA.id).role
33851                         };
33852
33853                         var insertPair = {
33854                             originalID: wayA.id,
33855                             insertedID: wayB.id,
33856                             nodes: origNodes
33857                         };
33858
33859                         graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
33860                     }
33861                 });
33862
33863                 if (!isOuter && isArea) {
33864                     var multipolygon = osmRelation({
33865                         tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }),
33866                         members: [
33867                             { id: wayA.id, role: 'outer', type: 'way' },
33868                             { id: wayB.id, role: 'outer', type: 'way' }
33869                         ]
33870                     });
33871
33872                     graph = graph.replace(multipolygon);
33873                     graph = graph.replace(wayA.update({ tags: {} }));
33874                     graph = graph.replace(wayB.update({ tags: {} }));
33875                 }
33876
33877                 return graph;
33878             }
33879
33880
33881             var action = function(graph) {
33882                 var candidates = action.ways(graph);
33883                 for (var i = 0; i < candidates.length; i++) {
33884                     graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
33885                 }
33886                 return graph;
33887             };
33888
33889
33890             action.ways = function(graph) {
33891                 var node = graph.entity(nodeId);
33892                 var parents = graph.parentWays(node);
33893                 var hasLines = parents.some(function(parent) {
33894                     return parent.geometry(graph) === 'line';
33895                 });
33896
33897                 return parents.filter(function(parent) {
33898                     if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
33899                         return false;
33900
33901                     if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
33902                         return false;
33903
33904                     if (parent.isClosed()) {
33905                         return true;
33906                     }
33907
33908                     for (var i = 1; i < parent.nodes.length - 1; i++) {
33909                         if (parent.nodes[i] === nodeId) {
33910                             return true;
33911                         }
33912                     }
33913
33914                     return false;
33915                 });
33916             };
33917
33918
33919             action.disabled = function(graph) {
33920                 var candidates = action.ways(graph);
33921                 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) {
33922                     return 'not_eligible';
33923                 }
33924             };
33925
33926
33927             action.limitWays = function(val) {
33928                 if (!arguments.length) return _wayIDs;
33929                 _wayIDs = val;
33930                 return action;
33931             };
33932
33933
33934             return action;
33935         }
33936
33937         function coreGraph(other, mutable) {
33938             if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
33939
33940             if (other instanceof coreGraph) {
33941                 var base = other.base();
33942                 this.entities = Object.assign(Object.create(base.entities), other.entities);
33943                 this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
33944                 this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
33945
33946             } else {
33947                 this.entities = Object.create({});
33948                 this._parentWays = Object.create({});
33949                 this._parentRels = Object.create({});
33950                 this.rebase(other || [], [this]);
33951             }
33952
33953             this.transients = {};
33954             this._childNodes = {};
33955             this.frozen = !mutable;
33956         }
33957
33958
33959         coreGraph.prototype = {
33960
33961             hasEntity: function(id) {
33962                 return this.entities[id];
33963             },
33964
33965
33966             entity: function(id) {
33967                 var entity = this.entities[id];
33968
33969                 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
33970                 if (!entity) {
33971                     entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
33972                 }
33973
33974                 if (!entity) {
33975                     throw new Error('entity ' + id + ' not found');
33976                 }
33977                 return entity;
33978             },
33979
33980
33981             transient: function(entity, key, fn) {
33982                 var id = entity.id;
33983                 var transients = this.transients[id] || (this.transients[id] = {});
33984
33985                 if (transients[key] !== undefined) {
33986                     return transients[key];
33987                 }
33988
33989                 transients[key] = fn.call(entity);
33990
33991                 return transients[key];
33992             },
33993
33994
33995             parentWays: function(entity) {
33996                 var parents = this._parentWays[entity.id];
33997                 var result = [];
33998                 if (parents) {
33999                     parents.forEach(function(id) {
34000                         result.push(this.entity(id));
34001                     }, this);
34002                 }
34003                 return result;
34004             },
34005
34006
34007             isPoi: function(entity) {
34008                 var parents = this._parentWays[entity.id];
34009                 return !parents || parents.size === 0;
34010             },
34011
34012
34013             isShared: function(entity) {
34014                 var parents = this._parentWays[entity.id];
34015                 return parents && parents.size > 1;
34016             },
34017
34018
34019             parentRelations: function(entity) {
34020                 var parents = this._parentRels[entity.id];
34021                 var result = [];
34022                 if (parents) {
34023                     parents.forEach(function(id) {
34024                         result.push(this.entity(id));
34025                     }, this);
34026                 }
34027                 return result;
34028             },
34029
34030             parentMultipolygons: function(entity) {
34031                 return this.parentRelations(entity).filter(function(relation) {
34032                     return relation.isMultipolygon();
34033                 });
34034             },
34035
34036
34037             childNodes: function(entity) {
34038                 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
34039                 if (!entity.nodes) return [];
34040
34041                 var nodes = [];
34042                 for (var i = 0; i < entity.nodes.length; i++) {
34043                     nodes[i] = this.entity(entity.nodes[i]);
34044                 }
34045
34046                 this._childNodes[entity.id] = nodes;
34047                 return this._childNodes[entity.id];
34048             },
34049
34050
34051             base: function() {
34052                 return {
34053                     'entities': Object.getPrototypeOf(this.entities),
34054                     'parentWays': Object.getPrototypeOf(this._parentWays),
34055                     'parentRels': Object.getPrototypeOf(this._parentRels)
34056                 };
34057             },
34058
34059
34060             // Unlike other graph methods, rebase mutates in place. This is because it
34061             // is used only during the history operation that merges newly downloaded
34062             // data into each state. To external consumers, it should appear as if the
34063             // graph always contained the newly downloaded data.
34064             rebase: function(entities, stack, force) {
34065                 var base = this.base();
34066                 var i, j, k, id;
34067
34068                 for (i = 0; i < entities.length; i++) {
34069                     var entity = entities[i];
34070
34071                     if (!entity.visible || (!force && base.entities[entity.id]))
34072                         continue;
34073
34074                     // Merging data into the base graph
34075                     base.entities[entity.id] = entity;
34076                     this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
34077
34078                     // Restore provisionally-deleted nodes that are discovered to have an extant parent
34079                     if (entity.type === 'way') {
34080                         for (j = 0; j < entity.nodes.length; j++) {
34081                             id = entity.nodes[j];
34082                             for (k = 1; k < stack.length; k++) {
34083                                 var ents = stack[k].entities;
34084                                 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
34085                                     delete ents[id];
34086                                 }
34087                             }
34088                         }
34089                     }
34090                 }
34091
34092                 for (i = 0; i < stack.length; i++) {
34093                     stack[i]._updateRebased();
34094                 }
34095             },
34096
34097
34098             _updateRebased: function() {
34099                 var base = this.base();
34100
34101                 Object.keys(this._parentWays).forEach(function(child) {
34102                     if (base.parentWays[child]) {
34103                         base.parentWays[child].forEach(function(id) {
34104                             if (!this.entities.hasOwnProperty(id)) {
34105                                 this._parentWays[child].add(id);
34106                             }
34107                         }, this);
34108                     }
34109                 }, this);
34110
34111                 Object.keys(this._parentRels).forEach(function(child) {
34112                     if (base.parentRels[child]) {
34113                         base.parentRels[child].forEach(function(id) {
34114                             if (!this.entities.hasOwnProperty(id)) {
34115                                 this._parentRels[child].add(id);
34116                             }
34117                         }, this);
34118                     }
34119                 }, this);
34120
34121                 this.transients = {};
34122
34123                 // this._childNodes is not updated, under the assumption that
34124                 // ways are always downloaded with their child nodes.
34125             },
34126
34127
34128             // Updates calculated properties (parentWays, parentRels) for the specified change
34129             _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
34130                 parentWays = parentWays || this._parentWays;
34131                 parentRels = parentRels || this._parentRels;
34132
34133                 var type = entity && entity.type || oldentity && oldentity.type;
34134                 var removed, added, i;
34135
34136                 if (type === 'way') {   // Update parentWays
34137                     if (oldentity && entity) {
34138                         removed = utilArrayDifference(oldentity.nodes, entity.nodes);
34139                         added = utilArrayDifference(entity.nodes, oldentity.nodes);
34140                     } else if (oldentity) {
34141                         removed = oldentity.nodes;
34142                         added = [];
34143                     } else if (entity) {
34144                         removed = [];
34145                         added = entity.nodes;
34146                     }
34147                     for (i = 0; i < removed.length; i++) {
34148                         // make a copy of prototype property, store as own property, and update..
34149                         parentWays[removed[i]] = new Set(parentWays[removed[i]]);
34150                         parentWays[removed[i]].delete(oldentity.id);
34151                     }
34152                     for (i = 0; i < added.length; i++) {
34153                         // make a copy of prototype property, store as own property, and update..
34154                         parentWays[added[i]] = new Set(parentWays[added[i]]);
34155                         parentWays[added[i]].add(entity.id);
34156                     }
34157
34158                 } else if (type === 'relation') {   // Update parentRels
34159
34160                     // diff only on the IDs since the same entity can be a member multiple times with different roles
34161                     var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : [];
34162                     var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : [];
34163
34164                     if (oldentity && entity) {
34165                         removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs);
34166                         added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs);
34167                     } else if (oldentity) {
34168                         removed = oldentityMemberIDs;
34169                         added = [];
34170                     } else if (entity) {
34171                         removed = [];
34172                         added = entityMemberIDs;
34173                     }
34174                     for (i = 0; i < removed.length; i++) {
34175                         // make a copy of prototype property, store as own property, and update..
34176                         parentRels[removed[i]] = new Set(parentRels[removed[i]]);
34177                         parentRels[removed[i]].delete(oldentity.id);
34178                     }
34179                     for (i = 0; i < added.length; i++) {
34180                         // make a copy of prototype property, store as own property, and update..
34181                         parentRels[added[i]] = new Set(parentRels[added[i]]);
34182                         parentRels[added[i]].add(entity.id);
34183                     }
34184                 }
34185             },
34186
34187
34188             replace: function(entity) {
34189                 if (this.entities[entity.id] === entity) return this;
34190
34191                 return this.update(function() {
34192                     this._updateCalculated(this.entities[entity.id], entity);
34193                     this.entities[entity.id] = entity;
34194                 });
34195             },
34196
34197
34198             remove: function(entity) {
34199                 return this.update(function() {
34200                     this._updateCalculated(entity, undefined);
34201                     this.entities[entity.id] = undefined;
34202                 });
34203             },
34204
34205
34206             revert: function(id) {
34207                 var baseEntity = this.base().entities[id];
34208                 var headEntity = this.entities[id];
34209                 if (headEntity === baseEntity) return this;
34210
34211                 return this.update(function() {
34212                     this._updateCalculated(headEntity, baseEntity);
34213                     delete this.entities[id];
34214                 });
34215             },
34216
34217
34218             update: function() {
34219                 var graph = this.frozen ? coreGraph(this, true) : this;
34220                 for (var i = 0; i < arguments.length; i++) {
34221                     arguments[i].call(graph, graph);
34222                 }
34223
34224                 if (this.frozen) graph.frozen = true;
34225
34226                 return graph;
34227             },
34228
34229
34230             // Obliterates any existing entities
34231             load: function(entities) {
34232                 var base = this.base();
34233                 this.entities = Object.create(base.entities);
34234
34235                 for (var i in entities) {
34236                     this.entities[i] = entities[i];
34237                     this._updateCalculated(base.entities[i], this.entities[i]);
34238                 }
34239
34240                 return this;
34241             }
34242         };
34243
34244         function osmTurn(turn) {
34245             if (!(this instanceof osmTurn)) {
34246                 return new osmTurn(turn);
34247             }
34248             Object.assign(this, turn);
34249         }
34250
34251
34252         function osmIntersection(graph, startVertexId, maxDistance) {
34253             maxDistance = maxDistance || 30;    // in meters
34254             var vgraph = coreGraph();           // virtual graph
34255             var i, j, k;
34256
34257
34258             function memberOfRestriction(entity) {
34259                 return graph.parentRelations(entity)
34260                     .some(function(r) { return r.isRestriction(); });
34261             }
34262
34263             function isRoad(way) {
34264                 if (way.isArea() || way.isDegenerate()) return false;
34265                 var roads = {
34266                     'motorway': true,
34267                     'motorway_link': true,
34268                     'trunk': true,
34269                     'trunk_link': true,
34270                     'primary': true,
34271                     'primary_link': true,
34272                     'secondary': true,
34273                     'secondary_link': true,
34274                     'tertiary': true,
34275                     'tertiary_link': true,
34276                     'residential': true,
34277                     'unclassified': true,
34278                     'living_street': true,
34279                     'service': true,
34280                     'road': true,
34281                     'track': true
34282                 };
34283                 return roads[way.tags.highway];
34284             }
34285
34286
34287             var startNode = graph.entity(startVertexId);
34288             var checkVertices = [startNode];
34289             var checkWays;
34290             var vertices = [];
34291             var vertexIds = [];
34292             var vertex;
34293             var ways = [];
34294             var wayIds = [];
34295             var way;
34296             var nodes = [];
34297             var node;
34298             var parents = [];
34299             var parent;
34300
34301             // `actions` will store whatever actions must be performed to satisfy
34302             // preconditions for adding a turn restriction to this intersection.
34303             //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
34304             //  - Reverse oneways so that they are drawn in the forward direction
34305             //  - Split ways on key vertices
34306             var actions = [];
34307
34308
34309             // STEP 1:  walk the graph outwards from starting vertex to search
34310             //  for more key vertices and ways to include in the intersection..
34311
34312             while (checkVertices.length) {
34313                 vertex = checkVertices.pop();
34314
34315                 // check this vertex for parent ways that are roads
34316                 checkWays = graph.parentWays(vertex);
34317                 var hasWays = false;
34318                 for (i = 0; i < checkWays.length; i++) {
34319                     way = checkWays[i];
34320                     if (!isRoad(way) && !memberOfRestriction(way)) continue;
34321
34322                     ways.push(way);   // it's a road, or it's already in a turn restriction
34323                     hasWays = true;
34324
34325                     // check the way's children for more key vertices
34326                     nodes = utilArrayUniq(graph.childNodes(way));
34327                     for (j = 0; j < nodes.length; j++) {
34328                         node = nodes[j];
34329                         if (node === vertex) continue;                                           // same thing
34330                         if (vertices.indexOf(node) !== -1) continue;                             // seen it already
34331                         if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
34332
34333                         // a key vertex will have parents that are also roads
34334                         var hasParents = false;
34335                         parents = graph.parentWays(node);
34336                         for (k = 0; k < parents.length; k++) {
34337                             parent = parents[k];
34338                             if (parent === way) continue;                 // same thing
34339                             if (ways.indexOf(parent) !== -1) continue;    // seen it already
34340                             if (!isRoad(parent)) continue;                // not a road
34341                             hasParents = true;
34342                             break;
34343                         }
34344
34345                         if (hasParents) {
34346                             checkVertices.push(node);
34347                         }
34348                     }
34349                 }
34350
34351                 if (hasWays) {
34352                     vertices.push(vertex);
34353                 }
34354             }
34355
34356             vertices = utilArrayUniq(vertices);
34357             ways = utilArrayUniq(ways);
34358
34359
34360             // STEP 2:  Build a virtual graph containing only the entities in the intersection..
34361             // Everything done after this step should act on the virtual graph
34362             // Any actions that must be performed later to the main graph go in `actions` array
34363             ways.forEach(function(way) {
34364                 graph.childNodes(way).forEach(function(node) {
34365                     vgraph = vgraph.replace(node);
34366                 });
34367
34368                 vgraph = vgraph.replace(way);
34369
34370                 graph.parentRelations(way).forEach(function(relation) {
34371                     if (relation.isRestriction()) {
34372                         if (relation.isValidRestriction(graph)) {
34373                             vgraph = vgraph.replace(relation);
34374                         } else if (relation.isComplete(graph)) {
34375                             actions.push(actionDeleteRelation(relation.id));
34376                         }
34377                     }
34378                 });
34379             });
34380
34381
34382             // STEP 3:  Force all oneways to be drawn in the forward direction
34383             ways.forEach(function(w) {
34384                 var way = vgraph.entity(w.id);
34385                 if (way.tags.oneway === '-1') {
34386                     var action = actionReverse(way.id, { reverseOneway: true });
34387                     actions.push(action);
34388                     vgraph = action(vgraph);
34389                 }
34390             });
34391
34392
34393             // STEP 4:  Split ways on key vertices
34394             var origCount = osmEntity.id.next.way;
34395             vertices.forEach(function(v) {
34396                 // This is an odd way to do it, but we need to find all the ways that
34397                 // will be split here, then split them one at a time to ensure that these
34398                 // actions can be replayed on the main graph exactly in the same order.
34399                 // (It is unintuitive, but the order of ways returned from graph.parentWays()
34400                 // is arbitrary, depending on how the main graph and vgraph were built)
34401                 var splitAll = actionSplit(v.id);
34402                 if (!splitAll.disabled(vgraph)) {
34403                     splitAll.ways(vgraph).forEach(function(way) {
34404                         var splitOne = actionSplit(v.id).limitWays([way.id]);
34405                         actions.push(splitOne);
34406                         vgraph = splitOne(vgraph);
34407                     });
34408                 }
34409             });
34410
34411             // In here is where we should also split the intersection at nearby junction.
34412             //   for https://github.com/mapbox/iD-internal/issues/31
34413             // nearbyVertices.forEach(function(v) {
34414             // });
34415
34416             // Reasons why we reset the way id count here:
34417             //  1. Continuity with way ids created by the splits so that we can replay
34418             //     these actions later if the user decides to create a turn restriction
34419             //  2. Avoids churning way ids just by hovering over a vertex
34420             //     and displaying the turn restriction editor
34421             osmEntity.id.next.way = origCount;
34422
34423
34424             // STEP 5:  Update arrays to point to vgraph entities
34425             vertexIds = vertices.map(function(v) { return v.id; });
34426             vertices = [];
34427             ways = [];
34428
34429             vertexIds.forEach(function(id) {
34430                 var vertex = vgraph.entity(id);
34431                 var parents = vgraph.parentWays(vertex);
34432                 vertices.push(vertex);
34433                 ways = ways.concat(parents);
34434             });
34435
34436             vertices = utilArrayUniq(vertices);
34437             ways = utilArrayUniq(ways);
34438
34439             vertexIds = vertices.map(function(v) { return v.id; });
34440             wayIds = ways.map(function(w) { return w.id; });
34441
34442
34443             // STEP 6:  Update the ways with some metadata that will be useful for
34444             // walking the intersection graph later and rendering turn arrows.
34445
34446             function withMetadata(way, vertexIds) {
34447                 var __oneWay = way.isOneWay();
34448
34449                 // which affixes are key vertices?
34450                 var __first = (vertexIds.indexOf(way.first()) !== -1);
34451                 var __last = (vertexIds.indexOf(way.last()) !== -1);
34452
34453                 // what roles is this way eligible for?
34454                 var __via = (__first && __last);
34455                 var __from = ((__first && !__oneWay) || __last);
34456                 var __to = (__first || (__last && !__oneWay));
34457
34458                 return way.update({
34459                     __first:  __first,
34460                     __last:  __last,
34461                     __from:  __from,
34462                     __via: __via,
34463                     __to:  __to,
34464                     __oneWay:  __oneWay
34465                 });
34466             }
34467
34468             ways = [];
34469             wayIds.forEach(function(id) {
34470                 var way = withMetadata(vgraph.entity(id), vertexIds);
34471                 vgraph = vgraph.replace(way);
34472                 ways.push(way);
34473             });
34474
34475
34476             // STEP 7:  Simplify - This is an iterative process where we:
34477             //  1. Find trivial vertices with only 2 parents
34478             //  2. trim off the leaf way from those vertices and remove from vgraph
34479
34480             var keepGoing;
34481             var removeWayIds = [];
34482             var removeVertexIds = [];
34483
34484             do {
34485                 keepGoing = false;
34486                 checkVertices = vertexIds.slice();
34487
34488                 for (i = 0; i < checkVertices.length; i++) {
34489                     var vertexId = checkVertices[i];
34490                     vertex = vgraph.hasEntity(vertexId);
34491
34492                     if (!vertex) {
34493                         if (vertexIds.indexOf(vertexId) !== -1) {
34494                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34495                         }
34496                         removeVertexIds.push(vertexId);
34497                         continue;
34498                     }
34499
34500                     parents = vgraph.parentWays(vertex);
34501                     if (parents.length < 3) {
34502                         if (vertexIds.indexOf(vertexId) !== -1) {
34503                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34504                         }
34505                     }
34506
34507                     if (parents.length === 2) {     // vertex with 2 parents is trivial
34508                         var a = parents[0];
34509                         var b = parents[1];
34510                         var aIsLeaf = a && !a.__via;
34511                         var bIsLeaf = b && !b.__via;
34512                         var leaf, survivor;
34513
34514                         if (aIsLeaf && !bIsLeaf) {
34515                             leaf = a;
34516                             survivor = b;
34517                         } else if (!aIsLeaf && bIsLeaf) {
34518                             leaf = b;
34519                             survivor = a;
34520                         }
34521
34522                         if (leaf && survivor) {
34523                             survivor = withMetadata(survivor, vertexIds);      // update survivor way
34524                             vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
34525                             removeWayIds.push(leaf.id);
34526                             keepGoing = true;
34527                         }
34528                     }
34529
34530                     parents = vgraph.parentWays(vertex);
34531
34532                     if (parents.length < 2) {     // vertex is no longer a key vertex
34533                         if (vertexIds.indexOf(vertexId) !== -1) {
34534                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34535                         }
34536                         removeVertexIds.push(vertexId);
34537                         keepGoing = true;
34538                     }
34539
34540                     if (parents.length < 1) {     // vertex is no longer attached to anything
34541                         vgraph = vgraph.remove(vertex);
34542                     }
34543
34544                 }
34545             } while (keepGoing);
34546
34547
34548             vertices = vertices
34549                 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
34550                 .map(function(vertex) { return vgraph.entity(vertex.id); });
34551             ways = ways
34552                 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
34553                 .map(function(way) { return vgraph.entity(way.id); });
34554
34555
34556             // OK!  Here is our intersection..
34557             var intersection = {
34558                 graph: vgraph,
34559                 actions: actions,
34560                 vertices: vertices,
34561                 ways: ways,
34562             };
34563
34564
34565
34566             // Get all the valid turns through this intersection given a starting way id.
34567             // This operates on the virtual graph for everything.
34568             //
34569             // Basically, walk through all possible paths from starting way,
34570             //   honoring the existing turn restrictions as we go (watch out for loops!)
34571             //
34572             // For each path found, generate and return a `osmTurn` datastructure.
34573             //
34574             intersection.turns = function(fromWayId, maxViaWay) {
34575                 if (!fromWayId) return [];
34576                 if (!maxViaWay) maxViaWay = 0;
34577
34578                 var vgraph = intersection.graph;
34579                 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
34580
34581                 var start = vgraph.entity(fromWayId);
34582                 if (!start || !(start.__from || start.__via)) return [];
34583
34584                 // maxViaWay=0   from-*-to              (0 vias)
34585                 // maxViaWay=1   from-*-via-*-to        (1 via max)
34586                 // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
34587                 var maxPathLength = (maxViaWay * 2) + 3;
34588                 var turns = [];
34589
34590                 step(start);
34591                 return turns;
34592
34593
34594                 // traverse the intersection graph and find all the valid paths
34595                 function step(entity, currPath, currRestrictions, matchedRestriction) {
34596                     currPath = (currPath || []).slice();  // shallow copy
34597                     if (currPath.length >= maxPathLength) return;
34598                     currPath.push(entity.id);
34599                     currRestrictions = (currRestrictions || []).slice();  // shallow copy
34600                     var i, j;
34601
34602                     if (entity.type === 'node') {
34603                         var parents = vgraph.parentWays(entity);
34604                         var nextWays = [];
34605
34606                         // which ways can we step into?
34607                         for (i = 0; i < parents.length; i++) {
34608                             var way = parents[i];
34609
34610                             // if next way is a oneway incoming to this vertex, skip
34611                             if (way.__oneWay && way.nodes[0] !== entity.id) continue;
34612
34613                             // if we have seen it before (allowing for an initial u-turn), skip
34614                             if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
34615
34616                             // Check all "current" restrictions (where we've already walked the `FROM`)
34617                             var restrict = undefined;
34618                             for (j = 0; j < currRestrictions.length; j++) {
34619                                 var restriction = currRestrictions[j];
34620                                 var f = restriction.memberByRole('from');
34621                                 var v = restriction.membersByRole('via');
34622                                 var t = restriction.memberByRole('to');
34623                                 var isOnly = /^only_/.test(restriction.tags.restriction);
34624
34625                                 // Does the current path match this turn restriction?
34626                                 var matchesFrom = (f.id === fromWayId);
34627                                 var matchesViaTo = false;
34628                                 var isAlongOnlyPath = false;
34629
34630                                 if (t.id === way.id) {     // match TO
34631
34632                                     if (v.length === 1 && v[0].type === 'node') {    // match VIA node
34633                                         matchesViaTo = (v[0].id === entity.id && (
34634                                             (matchesFrom && currPath.length === 2) ||
34635                                             (!matchesFrom && currPath.length > 2)
34636                                         ));
34637
34638                                     } else {                                         // match all VIA ways
34639                                         var pathVias = [];
34640                                         for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
34641                                             pathVias.push(currPath[k]);              // (path goes way-node-way...)
34642                                         }
34643                                         var restrictionVias = [];
34644                                         for (k = 0; k < v.length; k++) {
34645                                             if (v[k].type === 'way') {
34646                                                 restrictionVias.push(v[k].id);
34647                                             }
34648                                         }
34649                                         var diff = utilArrayDifference(pathVias, restrictionVias);
34650                                         matchesViaTo = !diff.length;
34651                                     }
34652
34653                                 } else if (isOnly) {
34654                                     for (k = 0; k < v.length; k++) {
34655                                         // way doesn't match TO, but is one of the via ways along the path of an "only"
34656                                         if (v[k].type === 'way' && v[k].id === way.id) {
34657                                             isAlongOnlyPath = true;
34658                                             break;
34659                                         }
34660                                     }
34661                                 }
34662
34663                                 if (matchesViaTo) {
34664                                     if (isOnly) {
34665                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
34666                                     } else {
34667                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
34668                                     }
34669                                 } else {    // indirect - caused by a different nearby restriction
34670                                     if (isAlongOnlyPath) {
34671                                         restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
34672                                     } else if (isOnly) {
34673                                         restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
34674                                     }
34675                                 }
34676
34677                                 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
34678                                 if (restrict && restrict.direct)
34679                                     break;
34680                             }
34681
34682                             nextWays.push({ way: way, restrict: restrict });
34683                         }
34684
34685                         nextWays.forEach(function(nextWay) {
34686                             step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
34687                         });
34688
34689
34690                     } else {  // entity.type === 'way'
34691                         if (currPath.length >= 3) {     // this is a "complete" path..
34692                             var turnPath = currPath.slice();   // shallow copy
34693
34694                             // an indirect restriction - only include the partial path (starting at FROM)
34695                             if (matchedRestriction && matchedRestriction.direct === false) {
34696                                 for (i = 0; i < turnPath.length; i++) {
34697                                     if (turnPath[i] === matchedRestriction.from) {
34698                                         turnPath = turnPath.slice(i);
34699                                         break;
34700                                     }
34701                                 }
34702                             }
34703
34704                             var turn = pathToTurn(turnPath);
34705                             if (turn) {
34706                                 if (matchedRestriction) {
34707                                     turn.restrictionID = matchedRestriction.id;
34708                                     turn.no = matchedRestriction.no;
34709                                     turn.only = matchedRestriction.only;
34710                                     turn.direct = matchedRestriction.direct;
34711                                 }
34712                                 turns.push(osmTurn(turn));
34713                             }
34714
34715                             if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
34716                         }
34717
34718                         if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
34719
34720                         // which nodes can we step into?
34721                         var n1 = vgraph.entity(entity.first());
34722                         var n2 = vgraph.entity(entity.last());
34723                         var dist = geoSphericalDistance(n1.loc, n2.loc);
34724                         var nextNodes = [];
34725
34726                         if (currPath.length > 1) {
34727                             if (dist > maxDistance) return;   // the next node is too far
34728                             if (!entity.__via) return;        // this way is a leaf / can't be a via
34729                         }
34730
34731                         if (!entity.__oneWay &&                     // bidirectional..
34732                             keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
34733                             currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
34734                             nextNodes.push(n1);                     // can advance to first node
34735                         }
34736                         if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
34737                             currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
34738                             nextNodes.push(n2);                     // can advance to last node
34739                         }
34740
34741                         nextNodes.forEach(function(nextNode) {
34742                             // gather restrictions FROM this way
34743                             var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
34744                                 if (!r.isRestriction()) return false;
34745
34746                                 var f = r.memberByRole('from');
34747                                 if (!f || f.id !== entity.id) return false;
34748
34749                                 var isOnly = /^only_/.test(r.tags.restriction);
34750                                 if (!isOnly) return true;
34751
34752                                 // `only_` restrictions only matter along the direction of the VIA - #4849
34753                                 var isOnlyVia = false;
34754                                 var v = r.membersByRole('via');
34755                                 if (v.length === 1 && v[0].type === 'node') {   // via node
34756                                     isOnlyVia = (v[0].id === nextNode.id);
34757                                 } else {                                        // via way(s)
34758                                     for (var i = 0; i < v.length; i++) {
34759                                         if (v[i].type !== 'way') continue;
34760                                         var viaWay = vgraph.entity(v[i].id);
34761                                         if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
34762                                             isOnlyVia = true;
34763                                             break;
34764                                         }
34765                                     }
34766                                 }
34767                                 return isOnlyVia;
34768                             });
34769
34770                             step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
34771                         });
34772                     }
34773                 }
34774
34775
34776                 // assumes path is alternating way-node-way of odd length
34777                 function pathToTurn(path) {
34778                     if (path.length < 3) return;
34779                     var fromWayId, fromNodeId, fromVertexId;
34780                     var toWayId, toNodeId, toVertexId;
34781                     var viaWayIds, viaNodeId, isUturn;
34782
34783                     fromWayId = path[0];
34784                     toWayId = path[path.length - 1];
34785
34786                     if (path.length === 3 && fromWayId === toWayId) {  // u turn
34787                         var way = vgraph.entity(fromWayId);
34788                         if (way.__oneWay) return null;
34789
34790                         isUturn = true;
34791                         viaNodeId = fromVertexId = toVertexId = path[1];
34792                         fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
34793
34794                     } else {
34795                         isUturn = false;
34796                         fromVertexId = path[1];
34797                         fromNodeId = adjacentNode(fromWayId, fromVertexId);
34798                         toVertexId = path[path.length - 2];
34799                         toNodeId = adjacentNode(toWayId, toVertexId);
34800
34801                         if (path.length === 3) {
34802                             viaNodeId = path[1];
34803                         } else {
34804                             viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
34805                             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
34806                         }
34807                     }
34808
34809                     return {
34810                         key:  path.join('_'),
34811                         path: path,
34812                         from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
34813                         via:  { node: viaNodeId,  ways: viaWayIds },
34814                         to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
34815                         u:    isUturn
34816                     };
34817
34818
34819                     function adjacentNode(wayId, affixId) {
34820                         var nodes = vgraph.entity(wayId).nodes;
34821                         return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
34822                     }
34823                 }
34824
34825             };
34826
34827             return intersection;
34828         }
34829
34830
34831         function osmInferRestriction(graph, turn, projection) {
34832             var fromWay = graph.entity(turn.from.way);
34833             var fromNode = graph.entity(turn.from.node);
34834             var fromVertex = graph.entity(turn.from.vertex);
34835             var toWay = graph.entity(turn.to.way);
34836             var toNode = graph.entity(turn.to.node);
34837             var toVertex = graph.entity(turn.to.vertex);
34838
34839             var fromOneWay = (fromWay.tags.oneway === 'yes');
34840             var toOneWay = (toWay.tags.oneway === 'yes');
34841             var angle = (geoAngle(fromVertex, fromNode, projection) -
34842                         geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
34843
34844             while (angle < 0)
34845                 angle += 360;
34846
34847             if (fromNode === toNode)
34848                 return 'no_u_turn';
34849             if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
34850                 return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
34851             if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
34852                 return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
34853             if (angle < 158)
34854                 return 'no_right_turn';
34855             if (angle > 202)
34856                 return 'no_left_turn';
34857
34858             return 'no_straight_on';
34859         }
34860
34861         function actionMergePolygon(ids, newRelationId) {
34862
34863             function groupEntities(graph) {
34864                 var entities = ids.map(function (id) { return graph.entity(id); });
34865                 var geometryGroups = utilArrayGroupBy(entities, function(entity) {
34866                     if (entity.type === 'way' && entity.isClosed()) {
34867                         return 'closedWay';
34868                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
34869                         return 'multipolygon';
34870                     } else {
34871                         return 'other';
34872                     }
34873                 });
34874
34875                 return Object.assign(
34876                     { closedWay: [], multipolygon: [], other: [] },
34877                     geometryGroups
34878                 );
34879             }
34880
34881
34882             var action = function(graph) {
34883                 var entities = groupEntities(graph);
34884
34885                 // An array representing all the polygons that are part of the multipolygon.
34886                 //
34887                 // Each element is itself an array of objects with an id property, and has a
34888                 // locs property which is an array of the locations forming the polygon.
34889                 var polygons = entities.multipolygon.reduce(function(polygons, m) {
34890                     return polygons.concat(osmJoinWays(m.members, graph));
34891                 }, []).concat(entities.closedWay.map(function(d) {
34892                     var member = [{id: d.id}];
34893                     member.nodes = graph.childNodes(d);
34894                     return member;
34895                 }));
34896
34897                 // contained is an array of arrays of boolean values,
34898                 // where contained[j][k] is true iff the jth way is
34899                 // contained by the kth way.
34900                 var contained = polygons.map(function(w, i) {
34901                     return polygons.map(function(d, n) {
34902                         if (i === n) return null;
34903                         return geoPolygonContainsPolygon(
34904                             d.nodes.map(function(n) { return n.loc; }),
34905                             w.nodes.map(function(n) { return n.loc; })
34906                         );
34907                     });
34908                 });
34909
34910                 // Sort all polygons as either outer or inner ways
34911                 var members = [];
34912                 var outer = true;
34913
34914                 while (polygons.length) {
34915                     extractUncontained(polygons);
34916                     polygons = polygons.filter(isContained);
34917                     contained = contained.filter(isContained).map(filterContained);
34918                 }
34919
34920                 function isContained(d, i) {
34921                     return contained[i].some(function(val) { return val; });
34922                 }
34923
34924                 function filterContained(d) {
34925                     return d.filter(isContained);
34926                 }
34927
34928                 function extractUncontained(polygons) {
34929                     polygons.forEach(function(d, i) {
34930                         if (!isContained(d, i)) {
34931                             d.forEach(function(member) {
34932                                 members.push({
34933                                     type: 'way',
34934                                     id: member.id,
34935                                     role: outer ? 'outer' : 'inner'
34936                                 });
34937                             });
34938                         }
34939                     });
34940                     outer = !outer;
34941                 }
34942
34943                 // Move all tags to one relation
34944                 var relation = entities.multipolygon[0] ||
34945                     osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
34946
34947                 entities.multipolygon.slice(1).forEach(function(m) {
34948                     relation = relation.mergeTags(m.tags);
34949                     graph = graph.remove(m);
34950                 });
34951
34952                 entities.closedWay.forEach(function(way) {
34953                     function isThisOuter(m) {
34954                         return m.id === way.id && m.role !== 'inner';
34955                     }
34956                     if (members.some(isThisOuter)) {
34957                         relation = relation.mergeTags(way.tags);
34958                         graph = graph.replace(way.update({ tags: {} }));
34959                     }
34960                 });
34961
34962                 return graph.replace(relation.update({
34963                     members: members,
34964                     tags: utilObjectOmit(relation.tags, ['area'])
34965                 }));
34966             };
34967
34968
34969             action.disabled = function(graph) {
34970                 var entities = groupEntities(graph);
34971                 if (entities.other.length > 0 ||
34972                     entities.closedWay.length + entities.multipolygon.length < 2)
34973                     return 'not_eligible';
34974                 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
34975                     return 'incomplete_relation';
34976             };
34977
34978
34979             return action;
34980         }
34981
34982         var isArray$4 = Array.isArray;
34983         var keyList = Object.keys;
34984         var hasProp = Object.prototype.hasOwnProperty;
34985
34986         var fastDeepEqual = function equal(a, b) {
34987           if (a === b) return true;
34988
34989           if (a && b && typeof a == 'object' && typeof b == 'object') {
34990             var arrA = isArray$4(a)
34991               , arrB = isArray$4(b)
34992               , i
34993               , length
34994               , key;
34995
34996             if (arrA && arrB) {
34997               length = a.length;
34998               if (length != b.length) return false;
34999               for (i = length; i-- !== 0;)
35000                 if (!equal(a[i], b[i])) return false;
35001               return true;
35002             }
35003
35004             if (arrA != arrB) return false;
35005
35006             var dateA = a instanceof Date
35007               , dateB = b instanceof Date;
35008             if (dateA != dateB) return false;
35009             if (dateA && dateB) return a.getTime() == b.getTime();
35010
35011             var regexpA = a instanceof RegExp
35012               , regexpB = b instanceof RegExp;
35013             if (regexpA != regexpB) return false;
35014             if (regexpA && regexpB) return a.toString() == b.toString();
35015
35016             var keys = keyList(a);
35017             length = keys.length;
35018
35019             if (length !== keyList(b).length)
35020               return false;
35021
35022             for (i = length; i-- !== 0;)
35023               if (!hasProp.call(b, keys[i])) return false;
35024
35025             for (i = length; i-- !== 0;) {
35026               key = keys[i];
35027               if (!equal(a[key], b[key])) return false;
35028             }
35029
35030             return true;
35031           }
35032
35033           return a!==a && b!==b;
35034         };
35035
35036         // Text diff algorithm following Hunt and McIlroy 1976.
35037         // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
35038         // comparison, Bell Telephone Laboratories CSTR #41 (1976)
35039         // http://www.cs.dartmouth.edu/~doug/
35040         //
35041         // Expects two arrays of strings.
35042         function LCS(file1, file2) {
35043           var equivalenceClasses;
35044           var file2indices;
35045           var newCandidate;
35046           var candidates;
35047           var line;
35048           var c, i, j, jX, r, s;
35049
35050           equivalenceClasses = {};
35051           for (j = 0; j < file2.length; j++) {
35052             line = file2[j];
35053             if (equivalenceClasses[line]) {
35054               equivalenceClasses[line].push(j);
35055             } else {
35056               equivalenceClasses[line] = [j];
35057             }
35058           }
35059
35060           candidates = [
35061             { file1index: -1, file2index: -1, chain: null }
35062           ];
35063
35064           for (i = 0; i < file1.length; i++) {
35065             line = file1[i];
35066             file2indices = equivalenceClasses[line] || [];
35067
35068             r = 0;
35069             c = candidates[0];
35070
35071             for (jX = 0; jX < file2indices.length; jX++) {
35072               j = file2indices[jX];
35073
35074               for (s = r; s < candidates.length; s++) {
35075                 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
35076                   break;
35077                 }
35078               }
35079
35080               if (s < candidates.length) {
35081                 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
35082                 if (r === candidates.length) {
35083                   candidates.push(c);
35084                 } else {
35085                   candidates[r] = c;
35086                 }
35087                 r = s + 1;
35088                 c = newCandidate;
35089                 if (r === candidates.length) {
35090                   break; // no point in examining further (j)s
35091                 }
35092               }
35093             }
35094
35095             candidates[r] = c;
35096           }
35097
35098           // At this point, we know the LCS: it's in the reverse of the
35099           // linked-list through .chain of candidates[candidates.length - 1].
35100
35101           return candidates[candidates.length - 1];
35102         }
35103
35104
35105         // We apply the LCS to give a simple representation of the
35106         // offsets and lengths of mismatched chunks in the input
35107         // files. This is used by diff3MergeIndices below.
35108         function diffIndices(file1, file2) {
35109           var result = [];
35110           var tail1 = file1.length;
35111           var tail2 = file2.length;
35112
35113           for (var candidate = LCS(file1, file2);
35114              candidate !== null;
35115              candidate = candidate.chain)
35116           {
35117             var mismatchLength1 = tail1 - candidate.file1index - 1;
35118             var mismatchLength2 = tail2 - candidate.file2index - 1;
35119             tail1 = candidate.file1index;
35120             tail2 = candidate.file2index;
35121
35122             if (mismatchLength1 || mismatchLength2) {
35123               result.push({
35124                 file1: [tail1 + 1, mismatchLength1],
35125                 file2: [tail2 + 1, mismatchLength2]
35126               });
35127             }
35128           }
35129
35130           result.reverse();
35131           return result;
35132         }
35133
35134
35135         // Given three files, A, O, and B, where both A and B are
35136         // independently derived from O, returns a fairly complicated
35137         // internal representation of merge decisions it's taken. The
35138         // interested reader may wish to consult
35139         //
35140         // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
35141         // 'A Formal Investigation of ' In Arvind and Prasad,
35142         // editors, Foundations of Software Technology and Theoretical
35143         // Computer Science (FSTTCS), December 2007.
35144         //
35145         // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
35146         function diff3MergeIndices(a, o, b) {
35147           var i;
35148           var m1 = diffIndices(o, a);
35149           var m2 = diffIndices(o, b);
35150
35151           var hunks = [];
35152           function addHunk(h, side) {
35153             hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
35154           }
35155           for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
35156           for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
35157           hunks.sort(function (x, y) { return x[0] - y[0]; });
35158
35159           var result = [];
35160           var commonOffset = 0;
35161           function copyCommon(targetOffset) {
35162             if (targetOffset > commonOffset) {
35163               result.push([1, commonOffset, targetOffset - commonOffset]);
35164               commonOffset = targetOffset;
35165             }
35166           }
35167
35168           for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
35169             var firstHunkIndex = hunkIndex;
35170             var hunk = hunks[hunkIndex];
35171             var regionLhs = hunk[0];
35172             var regionRhs = regionLhs + hunk[2];
35173             while (hunkIndex < hunks.length - 1) {
35174               var maybeOverlapping = hunks[hunkIndex + 1];
35175               var maybeLhs = maybeOverlapping[0];
35176               if (maybeLhs > regionRhs) {
35177                 break;
35178               }
35179               regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
35180               hunkIndex++;
35181             }
35182
35183             copyCommon(regionLhs);
35184             if (firstHunkIndex === hunkIndex) {
35185               // The 'overlap' was only one hunk long, meaning that
35186               // there's no conflict here. Either a and o were the
35187               // same, or b and o were the same.
35188               if (hunk[4] > 0) {
35189                 result.push([hunk[1], hunk[3], hunk[4]]);
35190               }
35191             } else {
35192               // A proper conflict. Determine the extents of the
35193               // regions involved from a, o and b. Effectively merge
35194               // all the hunks on the left into one giant hunk, and
35195               // do the same for the right; then, correct for skew
35196               // in the regions of o that each side changed, and
35197               // report appropriate spans for the three sides.
35198               var regions = {
35199                 0: [a.length, -1, o.length, -1],
35200                 2: [b.length, -1, o.length, -1]
35201               };
35202               for (i = firstHunkIndex; i <= hunkIndex; i++) {
35203                 hunk = hunks[i];
35204                 var side = hunk[1];
35205                 var r = regions[side];
35206                 var oLhs = hunk[0];
35207                 var oRhs = oLhs + hunk[2];
35208                 var abLhs = hunk[3];
35209                 var abRhs = abLhs + hunk[4];
35210                 r[0] = Math.min(abLhs, r[0]);
35211                 r[1] = Math.max(abRhs, r[1]);
35212                 r[2] = Math.min(oLhs, r[2]);
35213                 r[3] = Math.max(oRhs, r[3]);
35214               }
35215               var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
35216               var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
35217               var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
35218               var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
35219               result.push([-1,
35220                            aLhs,      aRhs      - aLhs,
35221                            regionLhs, regionRhs - regionLhs,
35222                            bLhs,      bRhs      - bLhs]);
35223             }
35224             commonOffset = regionRhs;
35225           }
35226
35227           copyCommon(o.length);
35228           return result;
35229         }
35230
35231
35232         // Applies the output of diff3MergeIndices to actually
35233         // construct the merged file; the returned result alternates
35234         // between 'ok' and 'conflict' blocks.
35235         function diff3Merge(a, o, b, excludeFalseConflicts) {
35236           var result = [];
35237           var files = [a, o, b];
35238           var indices = diff3MergeIndices(a, o, b);
35239
35240           var okLines = [];
35241           function flushOk() {
35242             if (okLines.length) {
35243               result.push({ok: okLines});
35244             }
35245             okLines = [];
35246           }
35247           function pushOk(xs) {
35248             for (var j = 0; j < xs.length; j++) {
35249               okLines.push(xs[j]);
35250             }
35251           }
35252
35253           function isTrueConflict(rec) {
35254             if (rec[2] !== rec[6]) return true;
35255             var aoff = rec[1];
35256             var boff = rec[5];
35257             for (var j = 0; j < rec[2]; j++) {
35258               if (a[j + aoff] !== b[j + boff]) {
35259                 return true;
35260               }
35261             }
35262             return false;
35263           }
35264
35265           for (var i = 0; i < indices.length; i++) {
35266             var x = indices[i];
35267             var side = x[0];
35268             if (side === -1) {
35269               if (excludeFalseConflicts && !isTrueConflict(x)) {
35270                 pushOk(files[0].slice(x[1], x[1] + x[2]));
35271               } else {
35272                 flushOk();
35273                 result.push({
35274                   conflict: {
35275                     a: a.slice(x[1], x[1] + x[2]),
35276                     aIndex: x[1],
35277                     o: o.slice(x[3], x[3] + x[4]),
35278                     oIndex: x[3],
35279                     b: b.slice(x[5], x[5] + x[6]),
35280                     bIndex: x[5]
35281                   }
35282                 });
35283               }
35284             } else {
35285               pushOk(files[side].slice(x[1], x[1] + x[2]));
35286             }
35287           }
35288
35289           flushOk();
35290           return result;
35291         }
35292
35293         function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
35294             var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
35295             var _conflicts = [];
35296
35297
35298             function user(d) {
35299                 return (typeof formatUser === 'function') ? formatUser(d) : d;
35300             }
35301
35302
35303             function mergeLocation(remote, target) {
35304                 function pointEqual(a, b) {
35305                     var epsilon = 1e-6;
35306                     return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
35307                 }
35308
35309                 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
35310                     return target;
35311                 }
35312                 if (_option === 'force_remote') {
35313                     return target.update({loc: remote.loc});
35314                 }
35315
35316                 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
35317                 return target;
35318             }
35319
35320
35321             function mergeNodes(base, remote, target) {
35322                 if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
35323                     return target;
35324                 }
35325                 if (_option === 'force_remote') {
35326                     return target.update({nodes: remote.nodes});
35327                 }
35328
35329                 var ccount = _conflicts.length;
35330                 var o = base.nodes || [];
35331                 var a = target.nodes || [];
35332                 var b = remote.nodes || [];
35333                 var nodes = [];
35334                 var hunks = diff3Merge(a, o, b, true);
35335
35336                 for (var i = 0; i < hunks.length; i++) {
35337                     var hunk = hunks[i];
35338                     if (hunk.ok) {
35339                         nodes.push.apply(nodes, hunk.ok);
35340                     } else {
35341                         // for all conflicts, we can assume c.a !== c.b
35342                         // because `diff3Merge` called with `true` option to exclude false conflicts..
35343                         var c = hunk.conflict;
35344                         if (fastDeepEqual(c.o, c.a)) {  // only changed remotely
35345                             nodes.push.apply(nodes, c.b);
35346                         } else if (fastDeepEqual(c.o, c.b)) {  // only changed locally
35347                             nodes.push.apply(nodes, c.a);
35348                         } else {       // changed both locally and remotely
35349                             _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
35350                             break;
35351                         }
35352                     }
35353                 }
35354
35355                 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
35356             }
35357
35358
35359             function mergeChildren(targetWay, children, updates, graph) {
35360                 function isUsed(node, targetWay) {
35361                     var hasInterestingParent = graph.parentWays(node)
35362                         .some(function(way) { return way.id !== targetWay.id; });
35363
35364                     return node.hasInterestingTags() ||
35365                         hasInterestingParent ||
35366                         graph.parentRelations(node).length > 0;
35367                 }
35368
35369                 var ccount = _conflicts.length;
35370
35371                 for (var i = 0; i < children.length; i++) {
35372                     var id = children[i];
35373                     var node = graph.hasEntity(id);
35374
35375                     // remove unused childNodes..
35376                     if (targetWay.nodes.indexOf(id) === -1) {
35377                         if (node && !isUsed(node, targetWay)) {
35378                             updates.removeIds.push(id);
35379                         }
35380                         continue;
35381                     }
35382
35383                     // restore used childNodes..
35384                     var local = localGraph.hasEntity(id);
35385                     var remote = remoteGraph.hasEntity(id);
35386                     var target;
35387
35388                     if (_option === 'force_remote' && remote && remote.visible) {
35389                         updates.replacements.push(remote);
35390
35391                     } else if (_option === 'force_local' && local) {
35392                         target = osmEntity(local);
35393                         if (remote) {
35394                             target = target.update({ version: remote.version });
35395                         }
35396                         updates.replacements.push(target);
35397
35398                     } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
35399                         target = osmEntity(local, { version: remote.version });
35400                         if (remote.visible) {
35401                             target = mergeLocation(remote, target);
35402                         } else {
35403                             _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35404                         }
35405
35406                         if (_conflicts.length !== ccount) break;
35407                         updates.replacements.push(target);
35408                     }
35409                 }
35410
35411                 return targetWay;
35412             }
35413
35414
35415             function updateChildren(updates, graph) {
35416                 for (var i = 0; i < updates.replacements.length; i++) {
35417                     graph = graph.replace(updates.replacements[i]);
35418                 }
35419                 if (updates.removeIds.length) {
35420                     graph = actionDeleteMultiple(updates.removeIds)(graph);
35421                 }
35422                 return graph;
35423             }
35424
35425
35426             function mergeMembers(remote, target) {
35427                 if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
35428                     return target;
35429                 }
35430                 if (_option === 'force_remote') {
35431                     return target.update({members: remote.members});
35432                 }
35433
35434                 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
35435                 return target;
35436             }
35437
35438
35439             function mergeTags(base, remote, target) {
35440                 if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
35441                     return target;
35442                 }
35443                 if (_option === 'force_remote') {
35444                     return target.update({tags: remote.tags});
35445                 }
35446
35447                 var ccount = _conflicts.length;
35448                 var o = base.tags || {};
35449                 var a = target.tags || {};
35450                 var b = remote.tags || {};
35451                 var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b))
35452                     .filter(function(k) { return !dataDiscarded[k]; });
35453                 var tags = Object.assign({}, a);   // shallow copy
35454                 var changed = false;
35455
35456                 for (var i = 0; i < keys.length; i++) {
35457                     var k = keys[i];
35458
35459                     if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
35460                         if (o[k] !== a[k]) {      // changed locally..
35461                             _conflicts.push(t('merge_remote_changes.conflict.tags',
35462                                 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
35463
35464                         } else {                  // unchanged locally, accept remote change..
35465                             if (b.hasOwnProperty(k)) {
35466                                 tags[k] = b[k];
35467                             } else {
35468                                 delete tags[k];
35469                             }
35470                             changed = true;
35471                         }
35472                     }
35473                 }
35474
35475                 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
35476             }
35477
35478
35479             //  `graph.base()` is the common ancestor of the two graphs.
35480             //  `localGraph` contains user's edits up to saving
35481             //  `remoteGraph` contains remote edits to modified nodes
35482             //  `graph` must be a descendent of `localGraph` and may include
35483             //      some conflict resolution actions performed on it.
35484             //
35485             //                  --- ... --- `localGraph` -- ... -- `graph`
35486             //                 /
35487             //  `graph.base()` --- ... --- `remoteGraph`
35488             //
35489             var action = function(graph) {
35490                 var updates = { replacements: [], removeIds: [] };
35491                 var base = graph.base().entities[id];
35492                 var local = localGraph.entity(id);
35493                 var remote = remoteGraph.entity(id);
35494                 var target = osmEntity(local, { version: remote.version });
35495
35496                 // delete/undelete
35497                 if (!remote.visible) {
35498                     if (_option === 'force_remote') {
35499                         return actionDeleteMultiple([id])(graph);
35500
35501                     } else if (_option === 'force_local') {
35502                         if (target.type === 'way') {
35503                             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
35504                             graph = updateChildren(updates, graph);
35505                         }
35506                         return graph.replace(target);
35507
35508                     } else {
35509                         _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35510                         return graph;  // do nothing
35511                     }
35512                 }
35513
35514                 // merge
35515                 if (target.type === 'node') {
35516                     target = mergeLocation(remote, target);
35517
35518                 } else if (target.type === 'way') {
35519                     // pull in any child nodes that may not be present locally..
35520                     graph.rebase(remoteGraph.childNodes(remote), [graph], false);
35521                     target = mergeNodes(base, remote, target);
35522                     target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
35523
35524                 } else if (target.type === 'relation') {
35525                     target = mergeMembers(remote, target);
35526                 }
35527
35528                 target = mergeTags(base, remote, target);
35529
35530                 if (!_conflicts.length) {
35531                     graph = updateChildren(updates, graph).replace(target);
35532                 }
35533
35534                 return graph;
35535             };
35536
35537
35538             action.withOption = function(opt) {
35539                 _option = opt;
35540                 return action;
35541             };
35542
35543
35544             action.conflicts = function() {
35545                 return _conflicts;
35546             };
35547
35548
35549             return action;
35550         }
35551
35552         // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
35553         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
35554         function actionMove(moveIDs, tryDelta, projection, cache) {
35555             var _delta = tryDelta;
35556
35557             function setupCache(graph) {
35558                 function canMove(nodeID) {
35559                     // Allow movement of any node that is in the selectedIDs list..
35560                     if (moveIDs.indexOf(nodeID) !== -1) return true;
35561
35562                     // Allow movement of a vertex where 2 ways meet..
35563                     var parents = graph.parentWays(graph.entity(nodeID));
35564                     if (parents.length < 3) return true;
35565
35566                     // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
35567                     var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; });
35568                     if (!parentsMoving) delete cache.moving[nodeID];
35569
35570                     return parentsMoving;
35571                 }
35572
35573                 function cacheEntities(ids) {
35574                     for (var i = 0; i < ids.length; i++) {
35575                         var id = ids[i];
35576                         if (cache.moving[id]) continue;
35577                         cache.moving[id] = true;
35578
35579                         var entity = graph.hasEntity(id);
35580                         if (!entity) continue;
35581
35582                         if (entity.type === 'node') {
35583                             cache.nodes.push(id);
35584                             cache.startLoc[id] = entity.loc;
35585                         } else if (entity.type === 'way') {
35586                             cache.ways.push(id);
35587                             cacheEntities(entity.nodes);
35588                         } else {
35589                             cacheEntities(entity.members.map(function(member) {
35590                                 return member.id;
35591                             }));
35592                         }
35593                     }
35594                 }
35595
35596                 function cacheIntersections(ids) {
35597                     function isEndpoint(way, id) {
35598                         return !way.isClosed() && !!way.affix(id);
35599                     }
35600
35601                     for (var i = 0; i < ids.length; i++) {
35602                         var id = ids[i];
35603
35604                         // consider only intersections with 1 moved and 1 unmoved way.
35605                         var childNodes = graph.childNodes(graph.entity(id));
35606                         for (var j = 0; j < childNodes.length; j++) {
35607                             var node = childNodes[j];
35608                             var parents = graph.parentWays(node);
35609                             if (parents.length !== 2) continue;
35610
35611                             var moved = graph.entity(id);
35612                             var unmoved = null;
35613                             for (var k = 0; k < parents.length; k++) {
35614                                 var way = parents[k];
35615                                 if (!cache.moving[way.id]) {
35616                                     unmoved = way;
35617                                     break;
35618                                 }
35619                             }
35620                             if (!unmoved) continue;
35621
35622                             // exclude ways that are overly connected..
35623                             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
35624                             if (moved.isArea() || unmoved.isArea()) continue;
35625
35626                             cache.intersections.push({
35627                                 nodeId: node.id,
35628                                 movedId: moved.id,
35629                                 unmovedId: unmoved.id,
35630                                 movedIsEP: isEndpoint(moved, node.id),
35631                                 unmovedIsEP: isEndpoint(unmoved, node.id)
35632                             });
35633                         }
35634                     }
35635                 }
35636
35637
35638                 if (!cache) {
35639                     cache = {};
35640                 }
35641                 if (!cache.ok) {
35642                     cache.moving = {};
35643                     cache.intersections = [];
35644                     cache.replacedVertex = {};
35645                     cache.startLoc = {};
35646                     cache.nodes = [];
35647                     cache.ways = [];
35648
35649                     cacheEntities(moveIDs);
35650                     cacheIntersections(cache.ways);
35651                     cache.nodes = cache.nodes.filter(canMove);
35652
35653                     cache.ok = true;
35654                 }
35655             }
35656
35657
35658             // Place a vertex where the moved vertex used to be, to preserve way shape..
35659             //
35660             //  Start:
35661             //      b ---- e
35662             //     / \
35663             //    /   \
35664             //   /     \
35665             //  a       c
35666             //
35667             //      *               node '*' added to preserve shape
35668             //     / \
35669             //    /   b ---- e      way `b,e` moved here:
35670             //   /     \
35671             //  a       c
35672             //
35673             //
35674             function replaceMovedVertex(nodeId, wayId, graph, delta) {
35675                 var way = graph.entity(wayId);
35676                 var moved = graph.entity(nodeId);
35677                 var movedIndex = way.nodes.indexOf(nodeId);
35678                 var len, prevIndex, nextIndex;
35679
35680                 if (way.isClosed()) {
35681                     len = way.nodes.length - 1;
35682                     prevIndex = (movedIndex + len - 1) % len;
35683                     nextIndex = (movedIndex + len + 1) % len;
35684                 } else {
35685                     len = way.nodes.length;
35686                     prevIndex = movedIndex - 1;
35687                     nextIndex = movedIndex + 1;
35688                 }
35689
35690                 var prev = graph.hasEntity(way.nodes[prevIndex]);
35691                 var next = graph.hasEntity(way.nodes[nextIndex]);
35692
35693                 // Don't add orig vertex at endpoint..
35694                 if (!prev || !next) return graph;
35695
35696                 var key = wayId + '_' + nodeId;
35697                 var orig = cache.replacedVertex[key];
35698                 if (!orig) {
35699                     orig = osmNode();
35700                     cache.replacedVertex[key] = orig;
35701                     cache.startLoc[orig.id] = cache.startLoc[nodeId];
35702                 }
35703
35704                 var start, end;
35705                 if (delta) {
35706                     start = projection(cache.startLoc[nodeId]);
35707                     end = projection.invert(geoVecAdd(start, delta));
35708                 } else {
35709                     end = cache.startLoc[nodeId];
35710                 }
35711                 orig = orig.move(end);
35712
35713                 var angle = Math.abs(geoAngle(orig, prev, projection) -
35714                         geoAngle(orig, next, projection)) * 180 / Math.PI;
35715
35716                 // Don't add orig vertex if it would just make a straight line..
35717                 if (angle > 175 && angle < 185) return graph;
35718
35719                 // moving forward or backward along way?
35720                 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
35721                 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
35722                 var d1 = geoPathLength(p1);
35723                 var d2 = geoPathLength(p2);
35724                 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
35725
35726                 // moving around closed loop?
35727                 if (way.isClosed() && insertAt === 0) insertAt = len;
35728
35729                 way = way.addNode(orig.id, insertAt);
35730                 return graph.replace(orig).replace(way);
35731             }
35732
35733
35734             // Remove duplicate vertex that might have been added by
35735             // replaceMovedVertex.  This is done after the unzorro checks.
35736             function removeDuplicateVertices(wayId, graph) {
35737                 var way = graph.entity(wayId);
35738                 var epsilon = 1e-6;
35739                 var prev, curr;
35740
35741                 function isInteresting(node, graph) {
35742                     return graph.parentWays(node).length > 1 ||
35743                         graph.parentRelations(node).length ||
35744                         node.hasInterestingTags();
35745                 }
35746
35747                 for (var i = 0; i < way.nodes.length; i++) {
35748                     curr = graph.entity(way.nodes[i]);
35749
35750                     if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
35751                         if (!isInteresting(prev, graph)) {
35752                             way = way.removeNode(prev.id);
35753                             graph = graph.replace(way).remove(prev);
35754                         } else if (!isInteresting(curr, graph)) {
35755                             way = way.removeNode(curr.id);
35756                             graph = graph.replace(way).remove(curr);
35757                         }
35758                     }
35759
35760                     prev = curr;
35761                 }
35762
35763                 return graph;
35764             }
35765
35766
35767             // Reorder nodes around intersections that have moved..
35768             //
35769             //  Start:                way1.nodes: b,e         (moving)
35770             //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
35771             //      |                 vertex: b
35772             //      e                 isEP1: true,  isEP2, false
35773             //
35774             //  way1 `b,e` moved here:
35775             //  a ----- c = b - d
35776             //              |
35777             //              e
35778             //
35779             //  reorder nodes         way1.nodes: b,e
35780             //  a ----- c - b - d     way2.nodes: a,c,b,d
35781             //              |
35782             //              e
35783             //
35784             function unZorroIntersection(intersection, graph) {
35785                 var vertex = graph.entity(intersection.nodeId);
35786                 var way1 = graph.entity(intersection.movedId);
35787                 var way2 = graph.entity(intersection.unmovedId);
35788                 var isEP1 = intersection.movedIsEP;
35789                 var isEP2 = intersection.unmovedIsEP;
35790
35791                 // don't move the vertex if it is the endpoint of both ways.
35792                 if (isEP1 && isEP2) return graph;
35793
35794                 var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; });
35795                 var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; });
35796
35797                 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
35798                 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
35799
35800                 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
35801                 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
35802                 var loc;
35803
35804                 // snap vertex to nearest edge (or some point between them)..
35805                 if (!isEP1 && !isEP2) {
35806                     var epsilon = 1e-6, maxIter = 10;
35807                     for (var i = 0; i < maxIter; i++) {
35808                         loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
35809                         edge1 = geoChooseEdge(nodes1, projection(loc), projection);
35810                         edge2 = geoChooseEdge(nodes2, projection(loc), projection);
35811                         if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
35812                     }
35813                 } else if (!isEP1) {
35814                     loc = edge1.loc;
35815                 } else {
35816                     loc = edge2.loc;
35817                 }
35818
35819                 graph = graph.replace(vertex.move(loc));
35820
35821                 // if zorro happened, reorder nodes..
35822                 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
35823                     way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
35824                     graph = graph.replace(way1);
35825                 }
35826                 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
35827                     way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
35828                     graph = graph.replace(way2);
35829                 }
35830
35831                 return graph;
35832             }
35833
35834
35835             function cleanupIntersections(graph) {
35836                 for (var i = 0; i < cache.intersections.length; i++) {
35837                     var obj = cache.intersections[i];
35838                     graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
35839                     graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
35840                     graph = unZorroIntersection(obj, graph);
35841                     graph = removeDuplicateVertices(obj.movedId, graph);
35842                     graph = removeDuplicateVertices(obj.unmovedId, graph);
35843                 }
35844
35845                 return graph;
35846             }
35847
35848
35849             // check if moving way endpoint can cross an unmoved way, if so limit delta..
35850             function limitDelta(graph) {
35851                 function moveNode(loc) {
35852                     return geoVecAdd(projection(loc), _delta);
35853                 }
35854
35855                 for (var i = 0; i < cache.intersections.length; i++) {
35856                     var obj = cache.intersections[i];
35857
35858                     // Don't limit movement if this is vertex joins 2 endpoints..
35859                     if (obj.movedIsEP && obj.unmovedIsEP) continue;
35860                     // Don't limit movement if this vertex is not an endpoint anyway..
35861                     if (!obj.movedIsEP) continue;
35862
35863                     var node = graph.entity(obj.nodeId);
35864                     var start = projection(node.loc);
35865                     var end = geoVecAdd(start, _delta);
35866                     var movedNodes = graph.childNodes(graph.entity(obj.movedId));
35867                     var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); });
35868                     var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
35869                     var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); });
35870                     var hits = geoPathIntersections(movedPath, unmovedPath);
35871
35872                     for (var j = 0; i < hits.length; i++) {
35873                         if (geoVecEqual(hits[j], end)) continue;
35874                         var edge = geoChooseEdge(unmovedNodes, end, projection);
35875                         _delta = geoVecSubtract(projection(edge.loc), start);
35876                     }
35877                 }
35878             }
35879
35880
35881             var action = function(graph) {
35882                 if (_delta[0] === 0 && _delta[1] === 0) return graph;
35883
35884                 setupCache(graph);
35885
35886                 if (cache.intersections.length) {
35887                     limitDelta(graph);
35888                 }
35889
35890                 for (var i = 0; i < cache.nodes.length; i++) {
35891                     var node = graph.entity(cache.nodes[i]);
35892                     var start = projection(node.loc);
35893                     var end = geoVecAdd(start, _delta);
35894                     graph = graph.replace(node.move(projection.invert(end)));
35895                 }
35896
35897                 if (cache.intersections.length) {
35898                     graph = cleanupIntersections(graph);
35899                 }
35900
35901                 return graph;
35902             };
35903
35904
35905             action.delta = function() {
35906                 return _delta;
35907             };
35908
35909
35910             return action;
35911         }
35912
35913         function actionMoveMember(relationId, fromIndex, toIndex) {
35914             return function(graph) {
35915                 return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
35916             };
35917         }
35918
35919         function actionMoveNode(nodeID, toLoc) {
35920
35921             var action = function(graph, t) {
35922                 if (t === null || !isFinite(t)) t = 1;
35923                 t = Math.min(Math.max(+t, 0), 1);
35924
35925                 var node = graph.entity(nodeID);
35926                 return graph.replace(
35927                     node.move(geoVecInterp(node.loc, toLoc, t))
35928                 );
35929             };
35930
35931             action.transitionable = true;
35932
35933             return action;
35934         }
35935
35936         function actionNoop() {
35937             return function(graph) {
35938                 return graph;
35939             };
35940         }
35941
35942         function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
35943             var epsilon = ep || 1e-4;
35944             var threshold = degThresh || 13;  // degrees within right or straight to alter
35945
35946             // We test normalized dot products so we can compare as cos(angle)
35947             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
35948             var upperThreshold = Math.cos(threshold * Math.PI / 180);
35949
35950
35951             var action = function(graph, t) {
35952                 if (t === null || !isFinite(t)) t = 1;
35953                 t = Math.min(Math.max(+t, 0), 1);
35954
35955                 var way = graph.entity(wayID);
35956                 way = way.removeNode('');   // sanity check - remove any consecutive duplicates
35957
35958                 if (way.tags.nonsquare) {
35959                     var tags = Object.assign({}, way.tags);
35960                     // since we're squaring, remove indication that this is physically unsquare
35961                     delete tags.nonsquare;
35962                     way = way.update({tags: tags});
35963                 }
35964
35965                 graph = graph.replace(way);
35966
35967                 var isClosed = way.isClosed();
35968                 var nodes = graph.childNodes(way).slice();  // shallow copy
35969                 if (isClosed) nodes.pop();
35970
35971                 if (vertexID !== undefined) {
35972                     nodes = nodeSubset(nodes, vertexID, isClosed);
35973                     if (nodes.length !== 3) return graph;
35974                 }
35975
35976                 // note: all geometry functions here use the unclosed node/point/coord list
35977
35978                 var nodeCount = {};
35979                 var points = [];
35980                 var corner = { i: 0, dotp: 1 };
35981                 var node, point, loc, score, motions, i, j;
35982
35983                 for (i = 0; i < nodes.length; i++) {
35984                     node = nodes[i];
35985                     nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
35986                     points.push({ id: node.id, coord: projection(node.loc) });
35987                 }
35988
35989
35990                 if (points.length === 3) {   // move only one vertex for right triangle
35991                     for (i = 0; i < 1000; i++) {
35992                         motions = points.map(calcMotion);
35993
35994                         points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
35995                         score = corner.dotp;
35996                         if (score < epsilon) {
35997                             break;
35998                         }
35999                     }
36000
36001                     node = graph.entity(nodes[corner.i].id);
36002                     loc = projection.invert(points[corner.i].coord);
36003                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
36004
36005                 } else {
36006                     var straights = [];
36007                     var simplified = [];
36008
36009                     // Remove points from nearly straight sections..
36010                     // This produces a simplified shape to orthogonalize
36011                     for (i = 0; i < points.length; i++) {
36012                         point = points[i];
36013                         var dotp = 0;
36014                         if (isClosed || (i > 0 && i < points.length - 1)) {
36015                             var a = points[(i - 1 + points.length) % points.length];
36016                             var b = points[(i + 1) % points.length];
36017                             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
36018                         }
36019
36020                         if (dotp > upperThreshold) {
36021                             straights.push(point);
36022                         } else {
36023                             simplified.push(point);
36024                         }
36025                     }
36026
36027                     // Orthogonalize the simplified shape
36028                     var bestPoints = clonePoints(simplified);
36029                     var originalPoints = clonePoints(simplified);
36030
36031                     score = Infinity;
36032                     for (i = 0; i < 1000; i++) {
36033                         motions = simplified.map(calcMotion);
36034
36035                         for (j = 0; j < motions.length; j++) {
36036                             simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
36037                         }
36038                         var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
36039                         if (newScore < score) {
36040                             bestPoints = clonePoints(simplified);
36041                             score = newScore;
36042                         }
36043                         if (score < epsilon) {
36044                             break;
36045                         }
36046                     }
36047
36048                     var bestCoords = bestPoints.map(function(p) { return p.coord; });
36049                     if (isClosed) bestCoords.push(bestCoords[0]);
36050
36051                     // move the nodes that should move
36052                     for (i = 0; i < bestPoints.length; i++) {
36053                         point = bestPoints[i];
36054                         if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
36055                             node = graph.entity(point.id);
36056                             loc = projection.invert(point.coord);
36057                             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
36058                         }
36059                     }
36060
36061                     // move the nodes along straight segments
36062                     for (i = 0; i < straights.length; i++) {
36063                         point = straights[i];
36064                         if (nodeCount[point.id] > 1) continue;   // skip self-intersections
36065
36066                         node = graph.entity(point.id);
36067
36068                         if (t === 1 &&
36069                             graph.parentWays(node).length === 1 &&
36070                             graph.parentRelations(node).length === 0 &&
36071                             !node.hasInterestingTags()
36072                         ) {
36073                             // remove uninteresting points..
36074                             graph = actionDeleteNode(node.id)(graph);
36075
36076                         } else {
36077                             // move interesting points to the nearest edge..
36078                             var choice = geoVecProject(point.coord, bestCoords);
36079                             if (choice) {
36080                                 loc = projection.invert(choice.target);
36081                                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
36082                             }
36083                         }
36084                     }
36085                 }
36086
36087                 return graph;
36088
36089
36090                 function clonePoints(array) {
36091                     return array.map(function(p) {
36092                         return { id: p.id, coord: [p.coord[0], p.coord[1]] };
36093                     });
36094                 }
36095
36096
36097                 function calcMotion(point, i, array) {
36098                     // don't try to move the endpoints of a non-closed way.
36099                     if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0];
36100                     // don't try to move a node that appears more than once (self intersection)
36101                     if (nodeCount[array[i].id] > 1) return [0, 0];
36102
36103                     var a = array[(i - 1 + array.length) % array.length].coord;
36104                     var origin = point.coord;
36105                     var b = array[(i + 1) % array.length].coord;
36106                     var p = geoVecSubtract(a, origin);
36107                     var q = geoVecSubtract(b, origin);
36108
36109                     var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
36110                     p = geoVecNormalize(p);
36111                     q = geoVecNormalize(q);
36112
36113                     var dotp = (p[0] * q[0] + p[1] * q[1]);
36114                     var val = Math.abs(dotp);
36115
36116                     if (val < lowerThreshold) {  // nearly orthogonal
36117                         corner.i = i;
36118                         corner.dotp = val;
36119                         var vec = geoVecNormalize(geoVecAdd(p, q));
36120                         return geoVecScale(vec, 0.1 * dotp * scale);
36121                     }
36122
36123                     return [0, 0];   // do nothing
36124                 }
36125             };
36126
36127
36128             // if we are only orthogonalizing one vertex,
36129             // get that vertex and the previous and next
36130             function nodeSubset(nodes, vertexID, isClosed) {
36131                 var first = isClosed ? 0 : 1;
36132                 var last = isClosed ? nodes.length : nodes.length - 1;
36133
36134                 for (var i = first; i < last; i++) {
36135                     if (nodes[i].id === vertexID) {
36136                         return [
36137                             nodes[(i - 1 + nodes.length) % nodes.length],
36138                             nodes[i],
36139                             nodes[(i + 1) % nodes.length]
36140                         ];
36141                     }
36142                 }
36143
36144                 return [];
36145             }
36146
36147
36148             action.disabled = function(graph) {
36149                 var way = graph.entity(wayID);
36150                 way = way.removeNode('');  // sanity check - remove any consecutive duplicates
36151                 graph = graph.replace(way);
36152
36153                 var isClosed = way.isClosed();
36154                 var nodes = graph.childNodes(way).slice();  // shallow copy
36155                 if (isClosed) nodes.pop();
36156
36157                 var allowStraightAngles = false;
36158                 if (vertexID !== undefined) {
36159                     allowStraightAngles = true;
36160                     nodes = nodeSubset(nodes, vertexID, isClosed);
36161                     if (nodes.length !== 3) return 'end_vertex';
36162                 }
36163
36164                 var coords = nodes.map(function(n) { return projection(n.loc); });
36165                 var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
36166
36167                 if (score === null) {
36168                     return 'not_squarish';
36169                 } else if (score === 0) {
36170                     return 'square_enough';
36171                 } else {
36172                     return false;
36173                 }
36174             };
36175
36176
36177             action.transitionable = true;
36178
36179             return action;
36180         }
36181
36182         // `actionRestrictTurn` creates a turn restriction relation.
36183         //
36184         // `turn` must be an `osmTurn` object
36185         // see osm/intersection.js, pathToTurn()
36186         //
36187         // This specifies a restriction of type `restriction` when traveling from
36188         // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
36189         // (The action does not check that these entities form a valid intersection.)
36190         //
36191         // From, to, and via ways should be split before calling this action.
36192         // (old versions of the code would split the ways here, but we no longer do it)
36193         //
36194         // For testing convenience, accepts a restrictionID to assign to the new
36195         // relation. Normally, this will be undefined and the relation will
36196         // automatically be assigned a new ID.
36197         //
36198         function actionRestrictTurn(turn, restrictionType, restrictionID) {
36199
36200             return function(graph) {
36201                 var fromWay = graph.entity(turn.from.way);
36202                 var toWay = graph.entity(turn.to.way);
36203                 var viaNode = turn.via.node && graph.entity(turn.via.node);
36204                 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
36205                 var members = [];
36206
36207                 members.push({ id: fromWay.id, type: 'way',  role: 'from' });
36208
36209                 if (viaNode) {
36210                     members.push({ id: viaNode.id,  type: 'node', role: 'via' });
36211                 } else if (viaWays) {
36212                     viaWays.forEach(function(viaWay) {
36213                         members.push({ id: viaWay.id,  type: 'way', role: 'via' });
36214                     });
36215                 }
36216
36217                 members.push({ id: toWay.id, type: 'way',  role: 'to' });
36218
36219                 return graph.replace(osmRelation({
36220                     id: restrictionID,
36221                     tags: {
36222                         type: 'restriction',
36223                         restriction: restrictionType
36224                     },
36225                     members: members
36226                 }));
36227             };
36228         }
36229
36230         function actionRevert(id) {
36231             var action = function(graph) {
36232                 var entity = graph.hasEntity(id),
36233                     base = graph.base().entities[id];
36234
36235                 if (entity && !base) {    // entity will be removed..
36236                     if (entity.type === 'node') {
36237                         graph.parentWays(entity)
36238                             .forEach(function(parent) {
36239                                 parent = parent.removeNode(id);
36240                                 graph = graph.replace(parent);
36241
36242                                 if (parent.isDegenerate()) {
36243                                     graph = actionDeleteWay(parent.id)(graph);
36244                                 }
36245                             });
36246                     }
36247
36248                     graph.parentRelations(entity)
36249                         .forEach(function(parent) {
36250                             parent = parent.removeMembersWithID(id);
36251                             graph = graph.replace(parent);
36252
36253                             if (parent.isDegenerate()) {
36254                                 graph = actionDeleteRelation(parent.id)(graph);
36255                             }
36256                         });
36257                 }
36258
36259                 return graph.revert(id);
36260             };
36261
36262             return action;
36263         }
36264
36265         function actionRotate(rotateIds, pivot, angle, projection) {
36266
36267             var action = function(graph) {
36268                 return graph.update(function(graph) {
36269                     utilGetAllNodes(rotateIds, graph).forEach(function(node) {
36270                         var point = geoRotate([projection(node.loc)], angle, pivot)[0];
36271                         graph = graph.replace(node.move(projection.invert(point)));
36272                     });
36273                 });
36274             };
36275
36276             return action;
36277         }
36278
36279         /* Align nodes along their common axis */
36280         function actionStraightenNodes(nodeIDs, projection) {
36281
36282             function positionAlongWay(a, o, b) {
36283                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36284             }
36285
36286
36287             var action = function(graph, t) {
36288                 if (t === null || !isFinite(t)) t = 1;
36289                 t = Math.min(Math.max(+t, 0), 1);
36290
36291                 var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
36292                 var points = nodes.map(function(n) { return projection(n.loc); });
36293                 var ssr = geoGetSmallestSurroundingRectangle(points);
36294
36295                 // Choose line pq = axis of symmetry.
36296                 // The shape's surrounding rectangle has 2 axes of symmetry.
36297                 // Snap points to the long axis
36298                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36299                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36300                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36301                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36302                 var p, q;
36303
36304                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36305                 if (isLong) {
36306                     p = p1;
36307                     q = q1;
36308                 } else {
36309                     p = p2;
36310                     q = q2;
36311                 }
36312
36313                 // Move points onto line pq
36314                 for (var i = 0; i < points.length; i++) {
36315                     var node = nodes[i];
36316                     var point = points[i];
36317                     var u = positionAlongWay(point, p, q);
36318                     var point2 = geoVecInterp(p, q, u);
36319                     var loc2 = projection.invert(point2);
36320                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36321                 }
36322
36323                 return graph;
36324             };
36325
36326
36327             action.disabled = function() {
36328                 return false;
36329             };
36330
36331
36332             action.transitionable = true;
36333
36334
36335             return action;
36336         }
36337
36338         /*
36339          * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
36340          */
36341         function actionStraightenWay(selectedIDs, projection) {
36342
36343             function positionAlongWay(a, o, b) {
36344                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36345             }
36346
36347             // Return all selected ways as a continuous, ordered array of nodes
36348             function allNodes(graph) {
36349                 var nodes = [];
36350                 var startNodes = [];
36351                 var endNodes = [];
36352                 var remainingWays = [];
36353                 var selectedWays = selectedIDs.filter(function(w) {
36354                     return graph.entity(w).type === 'way';
36355                 });
36356                 var selectedNodes = selectedIDs.filter(function(n) {
36357                     return graph.entity(n).type === 'node';
36358                 });
36359
36360                 for (var i = 0; i < selectedWays.length; i++) {
36361                     var way = graph.entity(selectedWays[i]);
36362                     nodes = way.nodes.slice(0);
36363                     remainingWays.push(nodes);
36364                     startNodes.push(nodes[0]);
36365                     endNodes.push(nodes[nodes.length-1]);
36366                 }
36367
36368                 // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
36369                 //   and need to be removed so currNode difference calculation below works)
36370                 // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
36371                 startNodes = startNodes.filter(function(n) {
36372                     return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
36373                 });
36374                 endNodes = endNodes.filter(function(n) {
36375                     return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
36376                 });
36377
36378                 // Choose the initial endpoint to start from
36379                 var currNode = utilArrayDifference(startNodes, endNodes)
36380                     .concat(utilArrayDifference(endNodes, startNodes))[0];
36381                 var nextWay = [];
36382                 nodes = [];
36383
36384                 // Create nested function outside of loop to avoid "function in loop" lint error
36385                 var getNextWay = function(currNode, remainingWays) {
36386                     return remainingWays.filter(function(way) {
36387                         return way[0] === currNode || way[way.length-1] === currNode;
36388                     })[0];
36389                 };
36390
36391                 // Add nodes to end of nodes array, until all ways are added
36392                 while (remainingWays.length) {
36393                     nextWay = getNextWay(currNode, remainingWays);
36394                     remainingWays = utilArrayDifference(remainingWays, [nextWay]);
36395
36396                     if (nextWay[0] !== currNode) {
36397                         nextWay.reverse();
36398                     }
36399                     nodes = nodes.concat(nextWay);
36400                     currNode = nodes[nodes.length-1];
36401                 }
36402
36403                 // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
36404                 if (selectedNodes.length === 2) {
36405                     var startNodeIdx = nodes.indexOf(selectedNodes[0]);
36406                     var endNodeIdx = nodes.indexOf(selectedNodes[1]);
36407                     var sortedStartEnd = [startNodeIdx, endNodeIdx];
36408
36409                     sortedStartEnd.sort(function(a, b) { return a - b; });
36410                     nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1);
36411                 }
36412
36413                 return nodes.map(function(n) { return graph.entity(n); });
36414             }
36415
36416
36417             var action = function(graph, t) {
36418                 if (t === null || !isFinite(t)) t = 1;
36419                 t = Math.min(Math.max(+t, 0), 1);
36420
36421                 var nodes = allNodes(graph);
36422                 var points = nodes.map(function(n) { return projection(n.loc); });
36423                 var startPoint = points[0];
36424                 var endPoint = points[points.length-1];
36425                 var toDelete = [];
36426                 var i;
36427
36428                 for (i = 1; i < points.length-1; i++) {
36429                     var node = nodes[i];
36430                     var point = points[i];
36431
36432                     if (t < 1 || graph.parentWays(node).length > 1 ||
36433                         graph.parentRelations(node).length ||
36434                         node.hasInterestingTags()
36435                     ) {
36436                         var u = positionAlongWay(point, startPoint, endPoint);
36437                         var p = geoVecInterp(startPoint, endPoint, u);
36438                         var loc2 = projection.invert(p);
36439                         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36440
36441                     } else {
36442                         // safe to delete
36443                         if (toDelete.indexOf(node) === -1) {
36444                             toDelete.push(node);
36445                         }
36446                     }
36447                 }
36448
36449                 for (i = 0; i < toDelete.length; i++) {
36450                     graph = actionDeleteNode(toDelete[i].id)(graph);
36451                 }
36452
36453                 return graph;
36454             };
36455
36456
36457             action.disabled = function(graph) {
36458                 // check way isn't too bendy
36459                 var nodes = allNodes(graph);
36460                 var points = nodes.map(function(n) { return projection(n.loc); });
36461                 var startPoint = points[0];
36462                 var endPoint = points[points.length-1];
36463                 var threshold = 0.2 * geoVecLength(startPoint, endPoint);
36464                 var i;
36465
36466                 if (threshold === 0) {
36467                     return 'too_bendy';
36468                 }
36469
36470                 for (i = 1; i < points.length - 1; i++) {
36471                     var point = points[i];
36472                     var u = positionAlongWay(point, startPoint, endPoint);
36473                     var p = geoVecInterp(startPoint, endPoint, u);
36474                     var dist = geoVecLength(p, point);
36475
36476                     // to bendy if point is off by 20% of total start/end distance in projected space
36477                     if (isNaN(dist) || dist > threshold) {
36478                         return 'too_bendy';
36479                     }
36480                 }
36481             };
36482
36483             action.transitionable = true;
36484
36485
36486             return action;
36487         }
36488
36489         // `actionUnrestrictTurn` deletes a turn restriction relation.
36490         //
36491         // `turn` must be an `osmTurn` object with a `restrictionID` property.
36492         // see osm/intersection.js, pathToTurn()
36493         //
36494         function actionUnrestrictTurn(turn) {
36495             return function(graph) {
36496                 return actionDeleteRelation(turn.restrictionID)(graph);
36497             };
36498         }
36499
36500         /* Reflect the given area around its axis of symmetry */
36501         function actionReflect(reflectIds, projection) {
36502             var _useLongAxis = true;
36503
36504
36505             var action = function(graph, t) {
36506                 if (t === null || !isFinite(t)) t = 1;
36507                 t = Math.min(Math.max(+t, 0), 1);
36508
36509                 var nodes = utilGetAllNodes(reflectIds, graph);
36510                 var points = nodes.map(function(n) { return projection(n.loc); });
36511                 var ssr = geoGetSmallestSurroundingRectangle(points);
36512
36513                 // Choose line pq = axis of symmetry.
36514                 // The shape's surrounding rectangle has 2 axes of symmetry.
36515                 // Reflect across the longer axis by default.
36516                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36517                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36518                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36519                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36520                 var p, q;
36521
36522                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36523                 if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) {
36524                     p = p1;
36525                     q = q1;
36526                 } else {
36527                     p = p2;
36528                     q = q2;
36529                 }
36530
36531                 // reflect c across pq
36532                 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
36533                 var dx = q[0] - p[0];
36534                 var dy = q[1] - p[1];
36535                 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
36536                 var b = 2 * dx * dy / (dx * dx + dy * dy);
36537                 for (var i = 0; i < nodes.length; i++) {
36538                     var node = nodes[i];
36539                     var c = projection(node.loc);
36540                     var c2 = [
36541                         a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
36542                         b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
36543                     ];
36544                     var loc2 = projection.invert(c2);
36545                     node = node.move(geoVecInterp(node.loc, loc2, t));
36546                     graph = graph.replace(node);
36547                 }
36548
36549                 return graph;
36550             };
36551
36552
36553             action.useLongAxis = function(val) {
36554                 if (!arguments.length) return _useLongAxis;
36555                 _useLongAxis = val;
36556                 return action;
36557             };
36558
36559
36560             action.transitionable = true;
36561
36562
36563             return action;
36564         }
36565
36566         function actionUpgradeTags(entityId, oldTags, replaceTags) {
36567
36568             return function(graph) {
36569                 var entity = graph.entity(entityId);
36570                 var tags = Object.assign({}, entity.tags);  // shallow copy
36571                 var transferValue;
36572                 var semiIndex;
36573
36574                 for (var oldTagKey in oldTags) {
36575                     if (oldTags[oldTagKey] === '*') {
36576                         transferValue = tags[oldTagKey];
36577                         delete tags[oldTagKey];
36578                     } else {
36579                         var vals = tags[oldTagKey].split(';').filter(Boolean);
36580                         var oldIndex = vals.indexOf(oldTags[oldTagKey]);
36581                         if (vals.length === 1 || oldIndex === -1) {
36582                             delete tags[oldTagKey];
36583                         } else {
36584                             if (replaceTags && replaceTags[oldTagKey]) {
36585                                 // replacing a value within a semicolon-delimited value, note the index
36586                                 semiIndex = oldIndex;
36587                             }
36588                             vals.splice(oldIndex, 1);
36589                             tags[oldTagKey] = vals.join(';');
36590                         }
36591                     }
36592                 }
36593
36594                 if (replaceTags) {
36595                     for (var replaceKey in replaceTags) {
36596                         var replaceValue = replaceTags[replaceKey];
36597                         if (replaceValue === '*') {
36598                             if (tags[replaceKey] && tags[replaceKey] !== 'no') {
36599                                 // allow any pre-existing value except `no` (troll tag)
36600                                 continue;
36601                             } else {
36602                                 // otherwise assume `yes` is okay
36603                                 tags[replaceKey] = 'yes';
36604                             }
36605                         } else if (replaceValue === '$1') {
36606                             tags[replaceKey] = transferValue;
36607                         } else {
36608                             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
36609                                 // don't override preexisting values
36610                                 var existingVals = tags[replaceKey].split(';').filter(Boolean);
36611                                 if (existingVals.indexOf(replaceValue) === -1) {
36612                                     existingVals.splice(semiIndex, 0, replaceValue);
36613                                     tags[replaceKey] = existingVals.join(';');
36614                                 }
36615                             } else {
36616                                 tags[replaceKey] = replaceValue;
36617                             }
36618                         }
36619                     }
36620                 }
36621
36622                 return graph.replace(entity.update({ tags: tags }));
36623             };
36624         }
36625
36626         function behaviorEdit(context) {
36627
36628             function behavior() {
36629                 context.map()
36630                     .minzoom(context.minEditableZoom());
36631             }
36632
36633
36634             behavior.off = function() {
36635                 context.map()
36636                     .minzoom(0);
36637             };
36638
36639             return behavior;
36640         }
36641
36642         /*
36643            The hover behavior adds the `.hover` class on mouseover to all elements to which
36644            the identical datum is bound, and removes it on mouseout.
36645
36646            The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
36647            representation may consist of several elements scattered throughout the DOM hierarchy.
36648            Only one of these elements can have the :hover pseudo-class, but all of them will
36649            have the .hover class.
36650          */
36651         function behaviorHover(context) {
36652             var dispatch$1 = dispatch('hover');
36653             var _selection = d3_select(null);
36654             var _newNodeId = null;
36655             var _initialNodeID = null;
36656             var _buttonDown;
36657             var _altDisables;
36658             var _ignoreVertex;
36659             var _target;
36660
36661
36662             function keydown() {
36663                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36664                     _selection.selectAll('.hover')
36665                         .classed('hover-suppressed', true)
36666                         .classed('hover', false);
36667
36668                     _selection
36669                         .classed('hover-disabled', true);
36670
36671                     dispatch$1.call('hover', this, null);
36672                 }
36673             }
36674
36675
36676             function keyup() {
36677                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36678                     _selection.selectAll('.hover-suppressed')
36679                         .classed('hover-suppressed', false)
36680                         .classed('hover', true);
36681
36682                     _selection
36683                         .classed('hover-disabled', false);
36684
36685                     dispatch$1.call('hover', this, _target ? _target.id : null);
36686                 }
36687             }
36688
36689
36690             function behavior(selection) {
36691                 _selection = selection;
36692
36693                 if (_initialNodeID) {
36694                     _newNodeId = _initialNodeID;
36695                     _initialNodeID = null;
36696                 } else {
36697                     _newNodeId = null;
36698                 }
36699
36700                 _selection
36701                     .on('mouseover.hover', mouseover)
36702                     .on('mouseout.hover', mouseout)
36703                     .on('mousedown.hover', mousedown);
36704
36705                 d3_select(window)
36706                     .on('keydown.hover', keydown)
36707                     .on('keyup.hover', keyup);
36708
36709
36710                 function mouseover() {
36711                     if (_buttonDown) return;
36712                     var target = event.target;
36713                     enter(target ? target.__data__ : null);
36714                 }
36715
36716
36717                 function mouseout() {
36718                     if (_buttonDown) return;
36719                     var target = event.relatedTarget;
36720                     enter(target ? target.__data__ : null);
36721                 }
36722
36723
36724                 function mousedown() {
36725                     _buttonDown = true;
36726                     d3_select(window)
36727                         .on('mouseup.hover', mouseup, true);
36728                 }
36729
36730
36731                 function mouseup() {
36732                     _buttonDown = false;
36733                     d3_select(window)
36734                         .on('mouseup.hover', null, true);
36735                 }
36736
36737                 function allowsVertex(d) {
36738                     return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36739                 }
36740
36741                 function modeAllowsHover(target) {
36742                     var mode = context.mode();
36743                     if (mode.id === 'add-point') {
36744                         return mode.preset.matchGeometry('vertex') ||
36745                             (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex');
36746                     }
36747                     return true;
36748                 }
36749
36750                 function enter(datum) {
36751                     if (datum === _target) return;
36752                     _target = datum;
36753
36754                     _selection.selectAll('.hover')
36755                         .classed('hover', false);
36756                     _selection.selectAll('.hover-suppressed')
36757                         .classed('hover-suppressed', false);
36758
36759                     // What are we hovering over?
36760                     var entity, selector;
36761                     if (datum && datum.__featurehash__) {
36762                         entity = datum;
36763                         selector = '.data' + datum.__featurehash__;
36764
36765                     } else if (datum instanceof qaError) {
36766                         entity = datum;
36767                         selector = '.' + datum.service + '.error_id-' + datum.id;
36768
36769                     } else if (datum instanceof osmNote) {
36770                         entity = datum;
36771                         selector = '.note-' + datum.id;
36772
36773                     } else if (datum instanceof osmEntity) {
36774                         entity = datum;
36775                         selector = '.' + entity.id;
36776                         if (entity.type === 'relation') {
36777                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36778                         }
36779                     } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
36780                         entity = datum.properties.entity;
36781                         selector = '.' + entity.id;
36782                         if (entity.type === 'relation') {
36783                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36784                         }
36785                     }
36786
36787                     var mode = context.mode();
36788
36789                     // Update hover state and dispatch event
36790                     if (entity && entity.id !== _newNodeId) {
36791                         // If drawing a way, don't hover on a node that was just placed. #3974
36792
36793                         if ((mode.id === 'draw-line' || mode.id === 'draw-area') && !_newNodeId && entity.type === 'node') {
36794                             _newNodeId = entity.id;
36795                             return;
36796                         }
36797
36798                         var suppressed = (_altDisables && event && event.altKey) ||
36799                             (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity)) ||
36800                             !modeAllowsHover(entity);
36801                         _selection.selectAll(selector)
36802                             .classed(suppressed ? 'hover-suppressed' : 'hover', true);
36803
36804                         dispatch$1.call('hover', this, !suppressed && entity);
36805
36806                     } else {
36807                         dispatch$1.call('hover', this, null);
36808                     }
36809                 }
36810             }
36811
36812
36813             behavior.off = function(selection) {
36814                 selection.selectAll('.hover')
36815                     .classed('hover', false);
36816                 selection.selectAll('.hover-suppressed')
36817                     .classed('hover-suppressed', false);
36818                 selection
36819                     .classed('hover-disabled', false);
36820
36821                 selection
36822                     .on('mouseover.hover', null)
36823                     .on('mouseout.hover', null)
36824                     .on('mousedown.hover', null);
36825
36826                 d3_select(window)
36827                     .on('keydown.hover', null)
36828                     .on('keyup.hover', null);
36829             };
36830
36831
36832             behavior.altDisables = function(val) {
36833                 if (!arguments.length) return _altDisables;
36834                 _altDisables = val;
36835                 return behavior;
36836             };
36837
36838             behavior.ignoreVertex = function(val) {
36839                 if (!arguments.length) return _ignoreVertex;
36840                 _ignoreVertex = val;
36841                 return behavior;
36842             };
36843
36844             behavior.initialNodeID = function(nodeId) {
36845                 _initialNodeID = nodeId;
36846                 return behavior;
36847             };
36848
36849             return utilRebind(behavior, dispatch$1, 'on');
36850         }
36851
36852         function refresh(selection, node) {
36853             var cr = node.getBoundingClientRect();
36854             var prop = [cr.width, cr.height];
36855             selection.property('__dimensions__', prop);
36856             return prop;
36857         }
36858
36859         function utilGetDimensions(selection, force) {
36860             if (!selection || selection.empty()) {
36861                 return [0, 0];
36862             }
36863             var node = selection.node(),
36864                 cached = selection.property('__dimensions__');
36865             return (!cached || force) ? refresh(selection, node) : cached;
36866         }
36867
36868
36869         function utilSetDimensions(selection, dimensions) {
36870             if (!selection || selection.empty()) {
36871                 return selection;
36872             }
36873             var node = selection.node();
36874             if (dimensions === null) {
36875                 refresh(selection, node);
36876                 return selection;
36877             }
36878             return selection
36879                 .property('__dimensions__', [dimensions[0], dimensions[1]])
36880                 .attr('width', dimensions[0])
36881                 .attr('height', dimensions[1]);
36882         }
36883
36884         function behaviorTail() {
36885             var container;
36886             var xmargin = 25;
36887             var tooltipSize = [0, 0];
36888             var selectionSize = [0, 0];
36889             var _text;
36890
36891
36892             function behavior(selection) {
36893                 if (!_text) return;
36894
36895                 d3_select(window)
36896                     .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
36897
36898                 container = d3_select(document.body)
36899                     .append('div')
36900                     .style('display', 'none')
36901                     .attr('class', 'tail tooltip-inner');
36902
36903                 container.append('div')
36904                     .text(_text);
36905
36906                 selection
36907                     .on('mousemove.tail', mousemove)
36908                     .on('mouseenter.tail', mouseenter)
36909                     .on('mouseleave.tail', mouseleave);
36910
36911                 container
36912                     .on('mousemove.tail', mousemove);
36913
36914                 tooltipSize = utilGetDimensions(container);
36915                 selectionSize = utilGetDimensions(selection);
36916
36917
36918                 function show() {
36919                     container.style('display', 'block');
36920                     tooltipSize = utilGetDimensions(container);
36921                 }
36922
36923
36924                 function mousemove() {
36925                     if (container.style('display') === 'none') show();
36926                     var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
36927                         -tooltipSize[0] - xmargin : xmargin;
36928                     container.classed('left', xoffset > 0);
36929                     utilSetTransform(container, event.clientX + xoffset, event.clientY);
36930                 }
36931
36932
36933                 function mouseleave() {
36934                     if (event.relatedTarget !== container.node()) {
36935                         container.style('display', 'none');
36936                     }
36937                 }
36938
36939
36940                 function mouseenter() {
36941                     if (event.relatedTarget !== container.node()) {
36942                         show();
36943                     }
36944                 }
36945             }
36946
36947
36948             behavior.off = function(selection) {
36949                 if (!_text) return;
36950
36951                 container
36952                     .on('mousemove.tail', null)
36953                     .remove();
36954
36955                 selection
36956                     .on('mousemove.tail', null)
36957                     .on('mouseenter.tail', null)
36958                     .on('mouseleave.tail', null);
36959
36960                 d3_select(window)
36961                     .on('resize.tail', null);
36962             };
36963
36964
36965             behavior.text = function(val) {
36966                 if (!arguments.length) return _text;
36967                 _text = val;
36968                 return behavior;
36969             };
36970
36971
36972             return behavior;
36973         }
36974
36975         var _usedTails = {};
36976         var _disableSpace = false;
36977         var _lastSpace = null;
36978
36979
36980         function behaviorDraw(context) {
36981             var dispatch$1 = dispatch(
36982                 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
36983             );
36984
36985             var keybinding = utilKeybinding('draw');
36986
36987             var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
36988                 .on('hover', context.ui().sidebar.hover);
36989             var tail = behaviorTail();
36990             var edit = behaviorEdit(context);
36991
36992             var closeTolerance = 4;
36993             var tolerance = 12;
36994             var _mouseLeave = false;
36995             var _lastMouse = null;
36996
36997
36998             // related code
36999             // - `mode/drag_node.js` `datum()`
37000             function datum() {
37001                 var mode = context.mode();
37002                 var isNote = mode && (mode.id.indexOf('note') !== -1);
37003                 if (event.altKey || isNote) return {};
37004
37005                 var element;
37006                 if (event.type === 'keydown') {
37007                     element = _lastMouse && _lastMouse.target;
37008                 } else {
37009                     element = event.target;
37010                 }
37011
37012                 // When drawing, snap only to touch targets..
37013                 // (this excludes area fills and active drawing elements)
37014                 var d = element.__data__;
37015                 return (d && d.properties && d.properties.target) ? d : {};
37016             }
37017
37018
37019             function mousedown() {
37020
37021                 function point() {
37022                     var p = context.container().node();
37023                     return touchId !== null ? d3_touches(p).filter(function(p) {
37024                         return p.identifier === touchId;
37025                     })[0] : d3_mouse(p);
37026                 }
37027
37028                 var element = d3_select(this);
37029                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
37030                 var t1 = +new Date();
37031                 var p1 = point();
37032
37033                 element.on('mousemove.draw', null);
37034
37035                 d3_select(window).on('mouseup.draw', function() {
37036                     var t2 = +new Date();
37037                     var p2 = point();
37038                     var dist = geoVecLength(p1, p2);
37039
37040                     element.on('mousemove.draw', mousemove);
37041                     d3_select(window).on('mouseup.draw', null);
37042
37043                     if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
37044                         // Prevent a quick second click
37045                         d3_select(window).on('click.draw-block', function() {
37046                             event.stopPropagation();
37047                         }, true);
37048
37049                         context.map().dblclickEnable(false);
37050
37051                         window.setTimeout(function() {
37052                             context.map().dblclickEnable(true);
37053                             d3_select(window).on('click.draw-block', null);
37054                         }, 500);
37055
37056                         click();
37057                     }
37058                 }, true);
37059             }
37060
37061
37062             function mousemove() {
37063                 _lastMouse = event;
37064                 dispatch$1.call('move', this, datum());
37065             }
37066
37067
37068             function mouseenter() {
37069                 _mouseLeave = false;
37070             }
37071
37072
37073             function mouseleave() {
37074                 _mouseLeave = true;
37075             }
37076
37077             function allowsVertex(d) {
37078                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
37079             }
37080
37081             // related code
37082             // - `mode/drag_node.js`     `doMode()`
37083             // - `behavior/draw.js`      `click()`
37084             // - `behavior/draw_way.js`  `move()`
37085             function click() {
37086                 var d = datum();
37087                 var target = d && d.properties && d.properties.entity;
37088
37089                 var mode = context.mode();
37090
37091                 if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
37092                     dispatch$1.call('clickNode', this, target, d);
37093                     return;
37094
37095                 } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {   // Snap to a way
37096                     var choice = geoChooseEdge(
37097                         context.childNodes(target), context.mouse(), context.projection, context.activeID()
37098                     );
37099                     if (choice) {
37100                         var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
37101                         dispatch$1.call('clickWay', this, choice.loc, edge, d);
37102                         return;
37103                     }
37104                 } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
37105                     dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
37106                 }
37107
37108             }
37109
37110
37111             function space() {
37112                 event.preventDefault();
37113                 event.stopPropagation();
37114
37115                 var currSpace = context.mouse();
37116                 if (_disableSpace && _lastSpace) {
37117                     var dist = geoVecLength(_lastSpace, currSpace);
37118                     if (dist > tolerance) {
37119                         _disableSpace = false;
37120                     }
37121                 }
37122
37123                 if (_disableSpace || _mouseLeave || !_lastMouse) return;
37124
37125                 // user must move mouse or release space bar to allow another click
37126                 _lastSpace = currSpace;
37127                 _disableSpace = true;
37128
37129                 d3_select(window).on('keyup.space-block', function() {
37130                     event.preventDefault();
37131                     event.stopPropagation();
37132                     _disableSpace = false;
37133                     d3_select(window).on('keyup.space-block', null);
37134                 });
37135
37136                 click();
37137             }
37138
37139
37140             function backspace() {
37141                 event.preventDefault();
37142                 dispatch$1.call('undo');
37143             }
37144
37145
37146             function del() {
37147                 event.preventDefault();
37148                 dispatch$1.call('cancel');
37149             }
37150
37151
37152             function ret() {
37153                 event.preventDefault();
37154                 dispatch$1.call('finish');
37155             }
37156
37157
37158             function behavior(selection) {
37159                 context.install(_hover);
37160                 context.install(edit);
37161
37162                 if (!context.inIntro() && !_usedTails[tail.text()]) {
37163                     context.install(tail);
37164                 }
37165
37166                 keybinding
37167                     .on('⌫', backspace)
37168                     .on('⌦', del)
37169                     .on('⎋', ret)
37170                     .on('↩', ret)
37171                     .on('space', space)
37172                     .on('⌥space', space);
37173
37174                 selection
37175                     .on('mouseenter.draw', mouseenter)
37176                     .on('mouseleave.draw', mouseleave)
37177                     .on('mousedown.draw', mousedown)
37178                     .on('mousemove.draw', mousemove);
37179
37180                 d3_select(document)
37181                     .call(keybinding);
37182
37183                 return behavior;
37184             }
37185
37186
37187             behavior.off = function(selection) {
37188                 context.ui().sidebar.hover.cancel();
37189                 context.uninstall(_hover);
37190                 context.uninstall(edit);
37191
37192                 if (!context.inIntro() && !_usedTails[tail.text()]) {
37193                     context.uninstall(tail);
37194                     _usedTails[tail.text()] = true;
37195                 }
37196
37197                 selection
37198                     .on('mouseenter.draw', null)
37199                     .on('mouseleave.draw', null)
37200                     .on('mousedown.draw', null)
37201                     .on('mousemove.draw', null);
37202
37203                 d3_select(window)
37204                     .on('mouseup.draw', null);
37205                     // note: keyup.space-block, click.draw-block should remain
37206
37207                 d3_select(document)
37208                     .call(keybinding.unbind);
37209             };
37210
37211
37212             behavior.tail = function(_) {
37213                 tail.text(_);
37214                 return behavior;
37215             };
37216
37217             behavior.hover = function() {
37218                 return _hover;
37219             };
37220
37221
37222             return utilRebind(behavior, dispatch$1, 'on');
37223         }
37224
37225         function behaviorBreathe() {
37226             var duration = 800;
37227             var steps = 4;
37228             var selector = '.selected.shadow, .selected .shadow';
37229             var _selected = d3_select(null);
37230             var _classed = '';
37231             var _params = {};
37232             var _done = false;
37233             var _timer;
37234
37235
37236             function ratchetyInterpolator(a, b, steps, units) {
37237                 a = parseFloat(a);
37238                 b = parseFloat(b);
37239                 var sample = quantize()
37240                     .domain([0, 1])
37241                     .range(d3_quantize(d3_interpolateNumber(a, b), steps));
37242
37243                 return function(t) {
37244                     return String(sample(t)) + (units || '');
37245                 };
37246             }
37247
37248
37249             function reset(selection) {
37250                 selection
37251                     .style('stroke-opacity', null)
37252                     .style('stroke-width', null)
37253                     .style('fill-opacity', null)
37254                     .style('r', null);
37255             }
37256
37257
37258             function setAnimationParams(transition, fromTo) {
37259                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37260
37261                 transition
37262                     .styleTween('stroke-opacity', function(d) {
37263                         return ratchetyInterpolator(
37264                             _params[d.id][toFrom].opacity,
37265                             _params[d.id][fromTo].opacity,
37266                             steps
37267                         );
37268                     })
37269                     .styleTween('stroke-width', function(d) {
37270                         return ratchetyInterpolator(
37271                             _params[d.id][toFrom].width,
37272                             _params[d.id][fromTo].width,
37273                             steps,
37274                             'px'
37275                         );
37276                     })
37277                     .styleTween('fill-opacity', function(d) {
37278                         return ratchetyInterpolator(
37279                             _params[d.id][toFrom].opacity,
37280                             _params[d.id][fromTo].opacity,
37281                             steps
37282                         );
37283                     })
37284                     .styleTween('r', function(d) {
37285                         return ratchetyInterpolator(
37286                             _params[d.id][toFrom].width,
37287                             _params[d.id][fromTo].width,
37288                             steps,
37289                             'px'
37290                         );
37291                     });
37292             }
37293
37294
37295             function calcAnimationParams(selection) {
37296                 selection
37297                     .call(reset)
37298                     .each(function(d) {
37299                         var s = d3_select(this);
37300                         var tag = s.node().tagName;
37301                         var p = {'from': {}, 'to': {}};
37302                         var opacity;
37303                         var width;
37304
37305                         // determine base opacity and width
37306                         if (tag === 'circle') {
37307                             opacity = parseFloat(s.style('fill-opacity') || 0.5);
37308                             width = parseFloat(s.style('r') || 15.5);
37309                         } else {
37310                             opacity = parseFloat(s.style('stroke-opacity') || 0.7);
37311                             width = parseFloat(s.style('stroke-width') || 10);
37312                         }
37313
37314                         // calculate from/to interpolation params..
37315                         p.tag = tag;
37316                         p.from.opacity = opacity * 0.6;
37317                         p.to.opacity = opacity * 1.25;
37318                         p.from.width = width * 0.7;
37319                         p.to.width = width * (tag === 'circle' ? 1.5 : 1);
37320                         _params[d.id] = p;
37321                     });
37322             }
37323
37324
37325             function run(surface, fromTo) {
37326                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37327                 var currSelected = surface.selectAll(selector);
37328                 var currClassed = surface.attr('class');
37329
37330                 if (_done || currSelected.empty()) {
37331                     _selected.call(reset);
37332                     return;
37333                 }
37334
37335                 if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
37336                     _selected.call(reset);
37337                     _classed = currClassed;
37338                     _selected = currSelected.call(calcAnimationParams);
37339                 }
37340
37341                 _selected
37342                     .transition()
37343                     .duration(duration)
37344                     .call(setAnimationParams, fromTo)
37345                     .on('end', function() {
37346                         surface.call(run, toFrom);
37347                     });
37348             }
37349
37350
37351             function behavior(surface) {
37352                 _done = false;
37353                 _timer = timer(function() {
37354                     // wait for elements to actually become selected
37355                     if (surface.selectAll(selector).empty()) {
37356                         return false;
37357                     }
37358
37359                     surface.call(run, 'from');
37360                     _timer.stop();
37361                     return true;
37362                 }, 20);
37363             }
37364
37365
37366             behavior.off = function() {
37367                 _done = true;
37368                 if (_timer) {
37369                     _timer.stop();
37370                 }
37371                 _selected
37372                     .interrupt()
37373                     .call(reset);
37374             };
37375
37376
37377             return behavior;
37378         }
37379
37380         // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37381         // For example, ⌘Z -> Ctrl+Z
37382         var uiCmd = function (code) {
37383             var detected = utilDetect();
37384
37385             if (detected.os === 'mac') {
37386                 return code;
37387             }
37388
37389             if (detected.os === 'win') {
37390                 if (code === '⌘⇧Z') return 'Ctrl+Y';
37391             }
37392
37393             var result = '',
37394                 replacements = {
37395                     '⌘': 'Ctrl',
37396                     '⇧': 'Shift',
37397                     '⌥': 'Alt',
37398                     '⌫': 'Backspace',
37399                     '⌦': 'Delete'
37400                 };
37401
37402             for (var i = 0; i < code.length; i++) {
37403                 if (code[i] in replacements) {
37404                     result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37405                 } else {
37406                     result += code[i];
37407                 }
37408             }
37409
37410             return result;
37411         };
37412
37413
37414         // return a display-focused string for a given keyboard code
37415         uiCmd.display = function(code) {
37416             if (code.length !== 1) return code;
37417
37418             var detected = utilDetect();
37419             var mac = (detected.os === 'mac');
37420             var replacements = {
37421                 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37422                 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37423                 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37424                 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37425                 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37426                 '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37427                 '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37428                 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37429                 '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37430                 '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37431                 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37432                 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37433             };
37434
37435             return replacements[code] || code;
37436         };
37437
37438         function behaviorCopy(context) {
37439
37440             function groupEntities(ids, graph) {
37441                 var entities = ids.map(function (id) { return graph.entity(id); });
37442                 return Object.assign(
37443                     { relation: [], way: [], node: [] },
37444                     utilArrayGroupBy(entities, 'type')
37445                 );
37446             }
37447
37448
37449             function getDescendants(id, graph, descendants) {
37450                 var entity = graph.entity(id);
37451                 var children;
37452
37453                 descendants = descendants || {};
37454
37455                 if (entity.type === 'relation') {
37456                     children = entity.members.map(function(m) { return m.id; });
37457                 } else if (entity.type === 'way') {
37458                     children = entity.nodes;
37459                 } else {
37460                     children = [];
37461                 }
37462
37463                 for (var i = 0; i < children.length; i++) {
37464                     if (!descendants[children[i]]) {
37465                         descendants[children[i]] = true;
37466                         descendants = getDescendants(children[i], graph, descendants);
37467                     }
37468                 }
37469
37470                 return descendants;
37471             }
37472
37473
37474             function getSelectionText() {
37475                 return window.getSelection().toString();
37476             }
37477
37478
37479             function doCopy() {
37480                 if (!getSelectionText()) {
37481                     event.preventDefault();
37482                 }
37483
37484                 var graph = context.graph();
37485                 var selected = groupEntities(context.selectedIDs(), graph);
37486                 var canCopy = [];
37487                 var skip = {};
37488                 var entity;
37489                 var i;
37490
37491                 for (i = 0; i < selected.relation.length; i++) {
37492                     entity = selected.relation[i];
37493                     if (!skip[entity.id] && entity.isComplete(graph)) {
37494                         canCopy.push(entity.id);
37495                         skip = getDescendants(entity.id, graph, skip);
37496                     }
37497                 }
37498                 for (i = 0; i < selected.way.length; i++) {
37499                     entity = selected.way[i];
37500                     if (!skip[entity.id]) {
37501                         canCopy.push(entity.id);
37502                         skip = getDescendants(entity.id, graph, skip);
37503                     }
37504                 }
37505                 for (i = 0; i < selected.node.length; i++) {
37506                     entity = selected.node[i];
37507                     if (!skip[entity.id]) {
37508                         canCopy.push(entity.id);
37509                     }
37510                 }
37511
37512                 context.copyIDs(canCopy);
37513             }
37514
37515
37516             function behavior() {
37517                 context.keybinding().on(uiCmd('⌘C'), doCopy);
37518                 return behavior;
37519             }
37520
37521             behavior.off = function() {
37522                 context.keybinding().off(uiCmd('⌘C'));
37523             };
37524
37525
37526             return behavior;
37527         }
37528
37529         var _flashTimer;
37530
37531
37532         function uiFlash() {
37533             var _duration = 2000;
37534             var _iconName = '#iD-icon-no';
37535             var _iconClass = 'disabled';
37536             var _text = '';
37537             var _textClass;
37538
37539
37540             function flash() {
37541                 if (_flashTimer) {
37542                     _flashTimer.stop();
37543                 }
37544
37545                 d3_select('#footer-wrap')
37546                     .attr('class', 'footer-hide');
37547                 d3_select('#flash-wrap')
37548                     .attr('class', 'footer-show');
37549
37550                 var content = d3_select('#flash-wrap').selectAll('.flash-content')
37551                     .data([0]);
37552
37553                 // Enter
37554                 var contentEnter = content.enter()
37555                     .append('div')
37556                     .attr('class', 'flash-content');
37557
37558                 var iconEnter = contentEnter
37559                     .append('svg')
37560                     .attr('class', 'flash-icon')
37561                     .append('g')
37562                     .attr('transform', 'translate(10,10)');
37563
37564                 iconEnter
37565                     .append('circle')
37566                     .attr('r', 9);
37567
37568                 iconEnter
37569                     .append('use')
37570                     .attr('transform', 'translate(-7,-7)')
37571                     .attr('width', '14')
37572                     .attr('height', '14');
37573
37574                 contentEnter
37575                     .append('div')
37576                     .attr('class', 'flash-text');
37577
37578
37579                 // Update
37580                 content = content
37581                     .merge(contentEnter);
37582
37583                 content
37584                     .selectAll('.flash-icon')
37585                     .attr('class', 'flash-icon ' + (_iconClass || ''));
37586
37587                 content
37588                     .selectAll('.flash-icon use')
37589                     .attr('xlink:href', _iconName);
37590
37591                 content
37592                     .selectAll('.flash-text')
37593                     .attr('class', 'flash-text ' + (_textClass || ''))
37594                     .text(_text);
37595
37596
37597                 _flashTimer = d3_timeout(function() {
37598                     _flashTimer = null;
37599                     d3_select('#footer-wrap')
37600                         .attr('class', 'footer-show');
37601                     d3_select('#flash-wrap')
37602                         .attr('class', 'footer-hide');
37603                 }, _duration);
37604
37605                 return content;
37606             }
37607
37608
37609             flash.duration = function(_) {
37610                 if (!arguments.length) return _duration;
37611                 _duration = _;
37612                 return flash;
37613             };
37614
37615             flash.text = function(_) {
37616                 if (!arguments.length) return _text;
37617                 _text = _;
37618                 return flash;
37619             };
37620
37621             flash.textClass = function(_) {
37622                 if (!arguments.length) return _textClass;
37623                 _textClass = _;
37624                 return flash;
37625             };
37626
37627             flash.iconName = function(_) {
37628                 if (!arguments.length) return _iconName;
37629                 _iconName = _;
37630                 return flash;
37631             };
37632
37633             flash.iconClass = function(_) {
37634                 if (!arguments.length) return _iconClass;
37635                 _iconClass = _;
37636                 return flash;
37637             };
37638
37639             return flash;
37640         }
37641
37642         /* Creates a keybinding behavior for an operation */
37643         function behaviorOperation(context) {
37644             var _operation;
37645
37646             function keypress() {
37647                 event.preventDefault();
37648                 var disabled = _operation.disabled();
37649                 var flash;
37650
37651                 if (disabled) {
37652                     flash = uiFlash()
37653                         .duration(4000)
37654                         .iconName('#iD-operation-' + _operation.id)
37655                         .iconClass('operation disabled')
37656                         .text(_operation.tooltip);
37657
37658                     flash();
37659
37660                 } else {
37661                     flash = uiFlash()
37662                         .duration(2000)
37663                         .iconName('#iD-operation-' + _operation.id)
37664                         .iconClass('operation')
37665                         .text(_operation.annotation() || _operation.title);
37666
37667                     flash();
37668                     _operation();
37669                 }
37670             }
37671
37672
37673             function behavior() {
37674                 if (_operation && _operation.available()) {
37675                     context.keybinding()
37676                         .on(_operation.keys, keypress);
37677                 }
37678
37679                 return behavior;
37680             }
37681
37682
37683             behavior.off = function() {
37684                 context.keybinding()
37685                     .off(_operation.keys);
37686             };
37687
37688
37689             behavior.which = function (_) {
37690                 if (!arguments.length) return _operation;
37691                 _operation = _;
37692                 return behavior;
37693             };
37694
37695
37696             return behavior;
37697         }
37698
37699         function operationCircularize(selectedIDs, context) {
37700             var entityID = selectedIDs[0];
37701             var entity = context.entity(entityID);
37702             var extent = entity.extent(context.graph());
37703             var geometry = context.geometry(entityID);
37704             var action = actionCircularize(entityID, context.projection);
37705             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37706             var coords = nodes.map(function(n) { return n.loc; });
37707
37708             var operation = function() {
37709                 context.perform(action, operation.annotation());
37710
37711                 window.setTimeout(function() {
37712                     context.validator().validate();
37713                 }, 300);  // after any transition
37714             };
37715
37716
37717             operation.available = function() {
37718                 return selectedIDs.length === 1 &&
37719                     entity.type === 'way' &&
37720                     new Set(entity.nodes).size > 1;
37721             };
37722
37723
37724             // don't cache this because the visible extent could change
37725             operation.disabled = function() {
37726                 var actionDisabled = action.disabled(context.graph());
37727                 if (actionDisabled) {
37728                     return actionDisabled;
37729                 } else if (extent.percentContainedIn(context.extent()) < 0.8) {
37730                     return 'too_large';
37731                 } else if (someMissing()) {
37732                     return 'not_downloaded';
37733                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37734                     return 'connected_to_hidden';
37735                 }
37736
37737                 return false;
37738
37739
37740                 function someMissing() {
37741                     if (context.inIntro()) return false;
37742                     var osm = context.connection();
37743                     if (osm) {
37744                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37745                         if (missing.length) {
37746                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37747                             return true;
37748                         }
37749                     }
37750                     return false;
37751                 }
37752             };
37753
37754
37755             operation.tooltip = function() {
37756                 var disable = operation.disabled();
37757                 return disable ?
37758                     t('operations.circularize.' + disable) :
37759                     t('operations.circularize.description.' + geometry);
37760             };
37761
37762
37763             operation.annotation = function() {
37764                 return t('operations.circularize.annotation.' + geometry);
37765             };
37766
37767
37768             operation.id = 'circularize';
37769             operation.keys = [t('operations.circularize.key')];
37770             operation.title = t('operations.circularize.title');
37771             operation.behavior = behaviorOperation(context).which(operation);
37772
37773             return operation;
37774         }
37775
37776         function operationDelete(selectedIDs, context) {
37777             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37778             var action = actionDeleteMultiple(selectedIDs);
37779             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37780             var coords = nodes.map(function(n) { return n.loc; });
37781             var extent = nodes.reduce(function(extent, node) {
37782                 return extent.extend(node.extent(context.graph()));
37783             }, geoExtent());
37784
37785
37786             var operation = function() {
37787                 var nextSelectedID;
37788                 var nextSelectedLoc;
37789
37790                 if (selectedIDs.length === 1) {
37791                     var id = selectedIDs[0];
37792                     var entity = context.entity(id);
37793                     var geometry = context.geometry(id);
37794                     var parents = context.graph().parentWays(entity);
37795                     var parent = parents[0];
37796
37797                     // Select the next closest node in the way.
37798                     if (geometry === 'vertex') {
37799                         var nodes = parent.nodes;
37800                         var i = nodes.indexOf(id);
37801
37802                         if (i === 0) {
37803                             i++;
37804                         } else if (i === nodes.length - 1) {
37805                             i--;
37806                         } else {
37807                             var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
37808                             var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
37809                             i = a < b ? i - 1 : i + 1;
37810                         }
37811
37812                         nextSelectedID = nodes[i];
37813                         nextSelectedLoc = context.entity(nextSelectedID).loc;
37814                     }
37815                 }
37816
37817                 context.perform(action, operation.annotation());
37818                 context.validator().validate();
37819
37820                 if (nextSelectedID && nextSelectedLoc) {
37821                     if (context.hasEntity(nextSelectedID)) {
37822                         context.enter(modeSelect(context, [nextSelectedID]).follow(true));
37823                     } else {
37824                         context.map().centerEase(nextSelectedLoc);
37825                         context.enter(modeBrowse(context));
37826                     }
37827                 } else {
37828                     context.enter(modeBrowse(context));
37829                 }
37830
37831             };
37832
37833
37834             operation.available = function() {
37835                 return true;
37836             };
37837
37838
37839             operation.disabled = function() {
37840                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37841                     return 'too_large';
37842                 } else if (someMissing()) {
37843                     return 'not_downloaded';
37844                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37845                     return 'connected_to_hidden';
37846                 } else if (selectedIDs.some(protectedMember)) {
37847                     return 'part_of_relation';
37848                 } else if (selectedIDs.some(incompleteRelation)) {
37849                     return 'incomplete_relation';
37850                 } else if (selectedIDs.some(hasWikidataTag)) {
37851                     return 'has_wikidata_tag';
37852                 }
37853
37854                 return false;
37855
37856
37857                 function someMissing() {
37858                     if (context.inIntro()) return false;
37859                     var osm = context.connection();
37860                     if (osm) {
37861                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37862                         if (missing.length) {
37863                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37864                             return true;
37865                         }
37866                     }
37867                     return false;
37868                 }
37869
37870                 function hasWikidataTag(id) {
37871                     var entity = context.entity(id);
37872                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
37873                 }
37874
37875                 function incompleteRelation(id) {
37876                     var entity = context.entity(id);
37877                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37878                 }
37879
37880                 function protectedMember(id) {
37881                     var entity = context.entity(id);
37882                     if (entity.type !== 'way') return false;
37883
37884                     var parents = context.graph().parentRelations(entity);
37885                     for (var i = 0; i < parents.length; i++) {
37886                         var parent = parents[i];
37887                         var type = parent.tags.type;
37888                         var role = parent.memberById(id).role || 'outer';
37889                         if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
37890                             return true;
37891                         }
37892                     }
37893                     return false;
37894                 }
37895             };
37896
37897
37898             operation.tooltip = function() {
37899                 var disable = operation.disabled();
37900                 return disable ?
37901                     t('operations.delete.' + disable + '.' + multi) :
37902                     t('operations.delete.description' + '.' + multi);
37903             };
37904
37905
37906             operation.annotation = function() {
37907                 return selectedIDs.length === 1 ?
37908                     t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
37909                     t('operations.delete.annotation.multiple', { n: selectedIDs.length });
37910             };
37911
37912
37913             operation.id = 'delete';
37914             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
37915             operation.title = t('operations.delete.title');
37916             operation.behavior = behaviorOperation(context).which(operation);
37917
37918             return operation;
37919         }
37920
37921         function operationOrthogonalize(selectedIDs, context) {
37922             var _entityID;
37923             var _entity;
37924             var _geometry;
37925             var action = chooseAction();
37926             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37927             var coords = nodes.map(function(n) { return n.loc; });
37928
37929
37930             function chooseAction() {
37931                 if (selectedIDs.length !== 1) return null;
37932
37933                 _entityID = selectedIDs[0];
37934                 _entity = context.entity(_entityID);
37935                 _geometry = context.geometry(_entityID);
37936
37937                 // square a line/area
37938                 if (_entity.type === 'way' && new Set(_entity.nodes).size > 2 ) {
37939                     return actionOrthogonalize(_entityID, context.projection);
37940
37941                 // square a single vertex
37942                 } else if (_geometry === 'vertex') {
37943                     var graph = context.graph();
37944                     var parents = graph.parentWays(_entity);
37945                     if (parents.length === 1) {
37946                         var way = parents[0];
37947                         if (way.nodes.indexOf(_entityID) !== -1) {
37948                             return actionOrthogonalize(way.id, context.projection, _entityID);
37949                         }
37950                     }
37951                 }
37952
37953                 return null;
37954             }
37955
37956
37957             var operation = function() {
37958                 if (!action) return;
37959
37960                 context.perform(action, operation.annotation());
37961
37962                 window.setTimeout(function() {
37963                     context.validator().validate();
37964                 }, 300);  // after any transition
37965             };
37966
37967
37968             operation.available = function() {
37969                 return Boolean(action);
37970             };
37971
37972
37973             // don't cache this because the visible extent could change
37974             operation.disabled = function() {
37975                 if (!action) return '';
37976
37977                 var actionDisabled = action.disabled(context.graph());
37978                 if (actionDisabled) {
37979                     return actionDisabled;
37980                 } else if (_geometry !== 'vertex' &&
37981                            _entity.extent(context.graph()).percentContainedIn(context.extent()) < 0.8) {
37982                     return 'too_large';
37983                 } else if (someMissing()) {
37984                     return 'not_downloaded';
37985                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37986                     return 'connected_to_hidden';
37987                 }
37988
37989                 return false;
37990
37991
37992                 function someMissing() {
37993                     if (context.inIntro()) return false;
37994                     var osm = context.connection();
37995                     if (osm) {
37996                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37997                         if (missing.length) {
37998                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37999                             return true;
38000                         }
38001                     }
38002                     return false;
38003                 }
38004             };
38005
38006
38007             operation.tooltip = function() {
38008                 var disable = operation.disabled();
38009                 return disable ?
38010                     t('operations.orthogonalize.' + disable) :
38011                     t('operations.orthogonalize.description.' + _geometry);
38012             };
38013
38014
38015             operation.annotation = function() {
38016                 return t('operations.orthogonalize.annotation.' + _geometry);
38017             };
38018
38019
38020             operation.id = 'orthogonalize';
38021             operation.keys = [t('operations.orthogonalize.key')];
38022             operation.title = t('operations.orthogonalize.title');
38023             operation.behavior = behaviorOperation(context).which(operation);
38024
38025             return operation;
38026         }
38027
38028         function operationReflectShort(selectedIDs, context) {
38029             return operationReflect(selectedIDs, context, 'short');
38030         }
38031
38032
38033         function operationReflectLong(selectedIDs, context) {
38034             return operationReflect(selectedIDs, context, 'long');
38035         }
38036
38037
38038         function operationReflect(selectedIDs, context, axis) {
38039             axis = axis || 'long';
38040             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38041             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38042             var coords = nodes.map(function(n) { return n.loc; });
38043             var extent = nodes.reduce(function(extent, node) {
38044                 return extent.extend(node.extent(context.graph()));
38045             }, geoExtent());
38046
38047
38048             var operation = function() {
38049                 var action = actionReflect(selectedIDs, context.projection)
38050                     .useLongAxis(Boolean(axis === 'long'));
38051
38052                 context.perform(action, operation.annotation());
38053
38054                 window.setTimeout(function() {
38055                     context.validator().validate();
38056                 }, 300);  // after any transition
38057             };
38058
38059
38060             operation.available = function() {
38061                 return nodes.length >= 3;
38062             };
38063
38064
38065             // don't cache this because the visible extent could change
38066             operation.disabled = function() {
38067                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38068                     return 'too_large';
38069                 } else if (someMissing()) {
38070                     return 'not_downloaded';
38071                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38072                     return 'connected_to_hidden';
38073                 } else if (selectedIDs.some(incompleteRelation)) {
38074                     return 'incomplete_relation';
38075                 }
38076
38077                 return false;
38078
38079
38080                 function someMissing() {
38081                     if (context.inIntro()) return false;
38082                     var osm = context.connection();
38083                     if (osm) {
38084                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38085                         if (missing.length) {
38086                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38087                             return true;
38088                         }
38089                     }
38090                     return false;
38091                 }
38092
38093                 function incompleteRelation(id) {
38094                     var entity = context.entity(id);
38095                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38096                 }
38097             };
38098
38099
38100             operation.tooltip = function() {
38101                 var disable = operation.disabled();
38102                 return disable ?
38103                     t('operations.reflect.' + disable + '.' + multi) :
38104                     t('operations.reflect.description.' + axis + '.' + multi);
38105             };
38106
38107
38108             operation.annotation = function() {
38109                 return t('operations.reflect.annotation.' + axis + '.' + multi);
38110             };
38111
38112
38113             operation.id = 'reflect-' + axis;
38114             operation.keys = [t('operations.reflect.key.' + axis)];
38115             operation.title = t('operations.reflect.title.' + axis);
38116             operation.behavior = behaviorOperation(context).which(operation);
38117
38118             return operation;
38119         }
38120
38121         function operationMove(selectedIDs, context) {
38122             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38123             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38124             var coords = nodes.map(function(n) { return n.loc; });
38125             var extent = nodes.reduce(function(extent, node) {
38126                 return extent.extend(node.extent(context.graph()));
38127             }, geoExtent());
38128
38129
38130             var operation = function() {
38131                 context.enter(modeMove(context, selectedIDs));
38132             };
38133
38134
38135             operation.available = function() {
38136                 return selectedIDs.length > 1 ||
38137                     context.entity(selectedIDs[0]).type !== 'node';
38138             };
38139
38140
38141             operation.disabled = function() {
38142                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38143                     return 'too_large';
38144                 } else if (someMissing()) {
38145                     return 'not_downloaded';
38146                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38147                     return 'connected_to_hidden';
38148                 } else if (selectedIDs.some(incompleteRelation)) {
38149                     return 'incomplete_relation';
38150                 }
38151
38152                 return false;
38153
38154
38155                 function someMissing() {
38156                     if (context.inIntro()) return false;
38157                     var osm = context.connection();
38158                     if (osm) {
38159                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38160                         if (missing.length) {
38161                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38162                             return true;
38163                         }
38164                     }
38165                     return false;
38166                 }
38167
38168                 function incompleteRelation(id) {
38169                     var entity = context.entity(id);
38170                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38171                 }
38172             };
38173
38174
38175             operation.tooltip = function() {
38176                 var disable = operation.disabled();
38177                 return disable ?
38178                     t('operations.move.' + disable + '.' + multi) :
38179                     t('operations.move.description.' + multi);
38180             };
38181
38182
38183             operation.annotation = function() {
38184                 return selectedIDs.length === 1 ?
38185                     t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
38186                     t('operations.move.annotation.multiple');
38187             };
38188
38189
38190             operation.id = 'move';
38191             operation.keys = [t('operations.move.key')];
38192             operation.title = t('operations.move.title');
38193             operation.behavior = behaviorOperation(context).which(operation);
38194
38195             return operation;
38196         }
38197
38198         function modeRotate(context, entityIDs) {
38199             var mode = {
38200                 id: 'rotate',
38201                 button: 'browse'
38202             };
38203
38204             var keybinding = utilKeybinding('rotate');
38205             var behaviors = [
38206                 behaviorEdit(context),
38207                 operationCircularize(entityIDs, context).behavior,
38208                 operationDelete(entityIDs, context).behavior,
38209                 operationMove(entityIDs, context).behavior,
38210                 operationOrthogonalize(entityIDs, context).behavior,
38211                 operationReflectLong(entityIDs, context).behavior,
38212                 operationReflectShort(entityIDs, context).behavior
38213             ];
38214             var annotation = entityIDs.length === 1 ?
38215                 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
38216                 t('operations.rotate.annotation.multiple');
38217
38218             var _prevGraph;
38219             var _prevAngle;
38220             var _prevTransform;
38221             var _pivot;
38222
38223
38224             function doRotate() {
38225                 var fn;
38226                 if (context.graph() !== _prevGraph) {
38227                     fn = context.perform;
38228                 } else {
38229                     fn = context.replace;
38230                 }
38231
38232                 // projection changed, recalculate _pivot
38233                 var projection = context.projection;
38234                 var currTransform = projection.transform();
38235                 if (!_prevTransform ||
38236                     currTransform.k !== _prevTransform.k ||
38237                     currTransform.x !== _prevTransform.x ||
38238                     currTransform.y !== _prevTransform.y) {
38239
38240                     var nodes = utilGetAllNodes(entityIDs, context.graph());
38241                     var points = nodes.map(function(n) { return projection(n.loc); });
38242
38243                     if (points.length === 1) {  // degenerate case
38244                         _pivot = points[0];
38245                     } else if (points.length === 2) {
38246                         _pivot = geoVecInterp(points[0], points[1], 0.5);
38247                     } else {
38248                         _pivot = d3_polygonCentroid(d3_polygonHull(points));
38249                     }
38250                     _prevAngle = undefined;
38251                 }
38252
38253
38254                 var currMouse = context.mouse();
38255                 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
38256
38257                 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
38258                 var delta = currAngle - _prevAngle;
38259
38260                 fn(actionRotate(entityIDs, _pivot, delta, projection));
38261
38262                 _prevTransform = currTransform;
38263                 _prevAngle = currAngle;
38264                 _prevGraph = context.graph();
38265             }
38266
38267
38268             function finish() {
38269                 event.stopPropagation();
38270                 context.replace(actionNoop(), annotation);
38271                 context.enter(modeSelect(context, entityIDs));
38272             }
38273
38274
38275             function cancel() {
38276                 context.pop();
38277                 context.enter(modeSelect(context, entityIDs));
38278             }
38279
38280
38281             function undone() {
38282                 context.enter(modeBrowse(context));
38283             }
38284
38285
38286             mode.enter = function() {
38287                 context.features().forceVisible(entityIDs);
38288
38289                 behaviors.forEach(context.install);
38290
38291                 context.surface()
38292                     .on('mousemove.rotate', doRotate)
38293                     .on('click.rotate', finish);
38294
38295                 context.history()
38296                     .on('undone.rotate', undone);
38297
38298                 keybinding
38299                     .on('⎋', cancel)
38300                     .on('↩', finish);
38301
38302                 d3_select(document)
38303                     .call(keybinding);
38304             };
38305
38306
38307             mode.exit = function() {
38308                 behaviors.forEach(context.uninstall);
38309
38310                 context.surface()
38311                     .on('mousemove.rotate', null)
38312                     .on('click.rotate', null);
38313
38314                 context.history()
38315                     .on('undone.rotate', null);
38316
38317                 d3_select(document)
38318                     .call(keybinding.unbind);
38319
38320                 context.features().forceVisible([]);
38321             };
38322
38323
38324             mode.selectedIDs = function() {
38325                 if (!arguments.length) return entityIDs;
38326                 // no assign
38327                 return mode;
38328             };
38329
38330
38331             return mode;
38332         }
38333
38334         function operationRotate(selectedIDs, context) {
38335             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38336             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38337             var coords = nodes.map(function(n) { return n.loc; });
38338             var extent = nodes.reduce(function(extent, node) {
38339                 return extent.extend(node.extent(context.graph()));
38340             }, geoExtent());
38341
38342
38343             var operation = function() {
38344                 context.enter(modeRotate(context, selectedIDs));
38345             };
38346
38347
38348             operation.available = function() {
38349                 return nodes.length >= 2;
38350             };
38351
38352
38353             operation.disabled = function() {
38354
38355                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38356                     return 'too_large';
38357                 } else if (someMissing()) {
38358                     return 'not_downloaded';
38359                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38360                     return 'connected_to_hidden';
38361                 } else if (selectedIDs.some(incompleteRelation)) {
38362                     return 'incomplete_relation';
38363                 }
38364
38365                 return false;
38366
38367
38368                 function someMissing() {
38369                     if (context.inIntro()) return false;
38370                     var osm = context.connection();
38371                     if (osm) {
38372                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38373                         if (missing.length) {
38374                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38375                             return true;
38376                         }
38377                     }
38378                     return false;
38379                 }
38380
38381                 function incompleteRelation(id) {
38382                     var entity = context.entity(id);
38383                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38384                 }
38385             };
38386
38387
38388             operation.tooltip = function() {
38389                 var disable = operation.disabled();
38390                 return disable ?
38391                     t('operations.rotate.' + disable + '.' + multi) :
38392                     t('operations.rotate.description.' + multi);
38393             };
38394
38395
38396             operation.annotation = function() {
38397                 return selectedIDs.length === 1 ?
38398                     t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
38399                     t('operations.rotate.annotation.multiple');
38400             };
38401
38402
38403             operation.id = 'rotate';
38404             operation.keys = [t('operations.rotate.key')];
38405             operation.title = t('operations.rotate.title');
38406             operation.behavior = behaviorOperation(context).which(operation);
38407
38408             return operation;
38409         }
38410
38411         function modeMove(context, entityIDs, baseGraph) {
38412             var mode = {
38413                 id: 'move',
38414                 button: 'browse'
38415             };
38416
38417             var keybinding = utilKeybinding('move');
38418             var behaviors = [
38419                 behaviorEdit(context),
38420                 operationCircularize(entityIDs, context).behavior,
38421                 operationDelete(entityIDs, context).behavior,
38422                 operationOrthogonalize(entityIDs, context).behavior,
38423                 operationReflectLong(entityIDs, context).behavior,
38424                 operationReflectShort(entityIDs, context).behavior,
38425                 operationRotate(entityIDs, context).behavior
38426             ];
38427             var annotation = entityIDs.length === 1 ?
38428                 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
38429                 t('operations.move.annotation.multiple');
38430
38431             var _prevGraph;
38432             var _cache;
38433             var _origin;
38434             var _nudgeInterval;
38435
38436
38437             function doMove(nudge) {
38438                 nudge = nudge || [0, 0];
38439
38440                 var fn;
38441                 if (_prevGraph !== context.graph()) {
38442                     _cache = {};
38443                     _origin = context.map().mouseCoordinates();
38444                     fn = context.perform;
38445                 } else {
38446                     fn = context.overwrite;
38447                 }
38448
38449                 var currMouse = context.mouse();
38450                 var origMouse = context.projection(_origin);
38451                 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
38452
38453                 fn(actionMove(entityIDs, delta, context.projection, _cache));
38454                 _prevGraph = context.graph();
38455             }
38456
38457
38458             function startNudge(nudge) {
38459                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38460                 _nudgeInterval = window.setInterval(function() {
38461                     context.pan(nudge);
38462                     doMove(nudge);
38463                 }, 50);
38464             }
38465
38466
38467             function stopNudge() {
38468                 if (_nudgeInterval) {
38469                     window.clearInterval(_nudgeInterval);
38470                     _nudgeInterval = null;
38471                 }
38472             }
38473
38474
38475             function move() {
38476                 doMove();
38477                 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
38478                 if (nudge) {
38479                     startNudge(nudge);
38480                 } else {
38481                     stopNudge();
38482                 }
38483             }
38484
38485
38486             function finish() {
38487                 event.stopPropagation();
38488                 context.replace(actionNoop(), annotation);
38489                 context.enter(modeSelect(context, entityIDs));
38490                 stopNudge();
38491             }
38492
38493
38494             function cancel() {
38495                 if (baseGraph) {
38496                     while (context.graph() !== baseGraph) context.pop();
38497                     context.enter(modeBrowse(context));
38498                 } else {
38499                     context.pop();
38500                     context.enter(modeSelect(context, entityIDs));
38501                 }
38502                 stopNudge();
38503             }
38504
38505
38506             function undone() {
38507                 context.enter(modeBrowse(context));
38508             }
38509
38510
38511             mode.enter = function() {
38512                 _origin = context.map().mouseCoordinates();
38513                 _prevGraph = null;
38514                 _cache = {};
38515
38516                 context.features().forceVisible(entityIDs);
38517
38518                 behaviors.forEach(context.install);
38519
38520                 context.surface()
38521                     .on('mousemove.move', move)
38522                     .on('click.move', finish);
38523
38524                 context.history()
38525                     .on('undone.move', undone);
38526
38527                 keybinding
38528                     .on('⎋', cancel)
38529                     .on('↩', finish);
38530
38531                 d3_select(document)
38532                     .call(keybinding);
38533             };
38534
38535
38536             mode.exit = function() {
38537                 stopNudge();
38538
38539                 behaviors.forEach(function(behavior) {
38540                     context.uninstall(behavior);
38541                 });
38542
38543                 context.surface()
38544                     .on('mousemove.move', null)
38545                     .on('click.move', null);
38546
38547                 context.history()
38548                     .on('undone.move', null);
38549
38550                 d3_select(document)
38551                     .call(keybinding.unbind);
38552
38553                 context.features().forceVisible([]);
38554             };
38555
38556
38557             mode.selectedIDs = function() {
38558                 if (!arguments.length) return entityIDs;
38559                 // no assign
38560                 return mode;
38561             };
38562
38563
38564             return mode;
38565         }
38566
38567         function behaviorPaste(context) {
38568
38569             function doPaste() {
38570                 event.preventDefault();
38571
38572                 var baseGraph = context.graph();
38573                 var mouse = context.mouse();
38574                 var projection = context.projection;
38575                 var viewport = geoExtent(projection.clipExtent()).polygon();
38576
38577                 if (!geoPointInPolygon(mouse, viewport)) return;
38578
38579                 var extent = geoExtent();
38580                 var oldIDs = context.copyIDs();
38581                 var oldGraph = context.copyGraph();
38582                 var newIDs = [];
38583
38584                 if (!oldIDs.length) return;
38585
38586                 var action = actionCopyEntities(oldIDs, oldGraph);
38587                 context.perform(action);
38588
38589                 var copies = action.copies();
38590                 var originals = new Set();
38591                 Object.values(copies).forEach(function(entity) { originals.add(entity.id); });
38592
38593                 for (var id in copies) {
38594                     var oldEntity = oldGraph.entity(id);
38595                     var newEntity = copies[id];
38596
38597                     extent._extend(oldEntity.extent(oldGraph));
38598
38599                     // Exclude child nodes from newIDs if their parent way was also copied.
38600                     var parents = context.graph().parentWays(newEntity);
38601                     var parentCopied = parents.some(function(parent) {
38602                         return originals.has(parent.id);
38603                     });
38604
38605                     if (!parentCopied) {
38606                         newIDs.push(newEntity.id);
38607                     }
38608                 }
38609
38610                 // Put pasted objects where mouse pointer is..
38611                 var center = projection(extent.center());
38612                 var delta = geoVecSubtract(mouse, center);
38613
38614                 context.perform(actionMove(newIDs, delta, projection));
38615                 context.enter(modeMove(context, newIDs, baseGraph));
38616             }
38617
38618
38619             function behavior() {
38620                 context.keybinding().on(uiCmd('⌘V'), doPaste);
38621                 return behavior;
38622             }
38623
38624
38625             behavior.off = function() {
38626                 context.keybinding().off(uiCmd('⌘V'));
38627             };
38628
38629
38630             return behavior;
38631         }
38632
38633         /*
38634             `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
38635
38636             * The `origin` function is expected to return an [x, y] tuple rather than an
38637               {x, y} object.
38638             * The events are `start`, `move`, and `end`.
38639               (https://github.com/mbostock/d3/issues/563)
38640             * The `start` event is not dispatched until the first cursor movement occurs.
38641               (https://github.com/mbostock/d3/pull/368)
38642             * The `move` event has a `point` and `delta` [x, y] tuple properties rather
38643               than `x`, `y`, `dx`, and `dy` properties.
38644             * The `end` event is not dispatched if no movement occurs.
38645             * An `off` function is available that unbinds the drag's internal event handlers.
38646          */
38647
38648         function behaviorDrag() {
38649             var dispatch$1 = dispatch('start', 'move', 'end');
38650             var _origin = null;
38651             var _selector = '';
38652             var _event;
38653             var _target;
38654             var _surface;
38655
38656
38657             var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
38658             var d3_event_userSelectSuppress = function() {
38659                     var selection$1 = selection();
38660                     var select = selection$1.style(d3_event_userSelectProperty);
38661                     selection$1.style(d3_event_userSelectProperty, 'none');
38662                     return function() {
38663                         selection$1.style(d3_event_userSelectProperty, select);
38664                     };
38665                 };
38666
38667
38668             function d3_eventCancel() {
38669                 event.stopPropagation();
38670                 event.preventDefault();
38671             }
38672
38673
38674             function eventOf(thiz, argumentz) {
38675                 return function(e1) {
38676                     e1.target = behavior;
38677                     customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
38678                 };
38679             }
38680
38681
38682             function dragstart() {
38683                 _target = this;
38684                 _event = eventOf(_target, arguments);
38685
38686                 var eventTarget = event.target;
38687                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
38688                 var offset;
38689                 var startOrigin = point();
38690                 var started = false;
38691                 var selectEnable = d3_event_userSelectSuppress();
38692
38693                 d3_select(window)
38694                     .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
38695                     .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
38696
38697                 if (_origin) {
38698                     offset = _origin.apply(_target, arguments);
38699                     offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
38700                 } else {
38701                     offset = [0, 0];
38702                 }
38703
38704                 if (touchId === null) {
38705                     event.stopPropagation();
38706                 }
38707
38708
38709                 function point() {
38710                     var p = _surface || _target.parentNode;
38711                     return touchId !== null ? d3_touches(p).filter(function(p) {
38712                         return p.identifier === touchId;
38713                     })[0] : d3_mouse(p);
38714                 }
38715
38716
38717                 function dragmove() {
38718                     var p = point();
38719                     var dx = p[0] - startOrigin[0];
38720                     var dy = p[1] - startOrigin[1];
38721
38722                     if (dx === 0 && dy === 0)
38723                         return;
38724
38725                     startOrigin = p;
38726                     d3_eventCancel();
38727
38728                     if (!started) {
38729                         started = true;
38730                         _event({ type: 'start' });
38731                     } else {
38732                         _event({
38733                             type: 'move',
38734                             point: [p[0] + offset[0],  p[1] + offset[1]],
38735                             delta: [dx, dy]
38736                         });
38737                     }
38738                 }
38739
38740
38741                 function dragend() {
38742                     if (started) {
38743                         _event({ type: 'end' });
38744
38745                         d3_eventCancel();
38746                         if (event.target === eventTarget) {
38747                             d3_select(window)
38748                                 .on('click.drag', click, true);
38749                         }
38750                     }
38751
38752                     d3_select(window)
38753                         .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
38754                         .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
38755
38756                     selectEnable();
38757                 }
38758
38759
38760                 function click() {
38761                     d3_eventCancel();
38762                     d3_select(window)
38763                         .on('click.drag', null);
38764                 }
38765             }
38766
38767
38768             function behavior(selection) {
38769                 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
38770                 var delegate = dragstart;
38771
38772                 if (_selector) {
38773                     delegate = function() {
38774                         var root = this;
38775                         var target = event.target;
38776                         for (; target && target !== root; target = target.parentNode) {
38777                             var datum = target.__data__;
38778
38779                             var entity = datum instanceof osmNote ? datum
38780                                 : datum && datum.properties && datum.properties.entity;
38781
38782                             if (entity && target[matchesSelector](_selector)) {
38783                                 return dragstart.call(target, entity);
38784                             }
38785                         }
38786                     };
38787                 }
38788
38789                 selection
38790                     .on('mousedown.drag' + _selector, delegate)
38791                     .on('touchstart.drag' + _selector, delegate);
38792             }
38793
38794
38795             behavior.off = function(selection) {
38796                 selection
38797                     .on('mousedown.drag' + _selector, null)
38798                     .on('touchstart.drag' + _selector, null);
38799             };
38800
38801
38802             behavior.selector = function(_) {
38803                 if (!arguments.length) return _selector;
38804                 _selector = _;
38805                 return behavior;
38806             };
38807
38808
38809             behavior.origin = function(_) {
38810                 if (!arguments.length) return _origin;
38811                 _origin = _;
38812                 return behavior;
38813             };
38814
38815
38816             behavior.cancel = function() {
38817                 d3_select(window)
38818                     .on('mousemove.drag', null)
38819                     .on('mouseup.drag', null);
38820                 return behavior;
38821             };
38822
38823
38824             behavior.target = function() {
38825                 if (!arguments.length) return _target;
38826                 _target = arguments[0];
38827                 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
38828                 return behavior;
38829             };
38830
38831
38832             behavior.surface = function() {
38833                 if (!arguments.length) return _surface;
38834                 _surface = arguments[0];
38835                 return behavior;
38836             };
38837
38838
38839             return utilRebind(behavior, dispatch$1, 'on');
38840         }
38841
38842         function modeDragNode(context) {
38843             var mode = {
38844                 id: 'drag-node',
38845                 button: 'browse'
38846             };
38847             var hover = behaviorHover(context).altDisables(true)
38848                 .on('hover', context.ui().sidebar.hover);
38849             var edit = behaviorEdit(context);
38850
38851             var _nudgeInterval;
38852             var _restoreSelectedIDs = [];
38853             var _wasMidpoint = false;
38854             var _isCancelled = false;
38855             var _activeEntity;
38856             var _startLoc;
38857             var _lastLoc;
38858
38859
38860             function startNudge(entity, nudge) {
38861                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38862                 _nudgeInterval = window.setInterval(function() {
38863                     context.pan(nudge);
38864                     doMove(entity, nudge);
38865                 }, 50);
38866             }
38867
38868
38869             function stopNudge() {
38870                 if (_nudgeInterval) {
38871                     window.clearInterval(_nudgeInterval);
38872                     _nudgeInterval = null;
38873                 }
38874             }
38875
38876
38877             function moveAnnotation(entity) {
38878                 return t('operations.move.annotation.' + entity.geometry(context.graph()));
38879             }
38880
38881
38882             function connectAnnotation(nodeEntity, targetEntity) {
38883                 var nodeGeometry = nodeEntity.geometry(context.graph());
38884                 var targetGeometry = targetEntity.geometry(context.graph());
38885                 if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
38886                     var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
38887                     var targetParentWayIDs = context.graph().parentWays(targetEntity);
38888                     var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
38889                     // if both vertices are part of the same way
38890                     if (sharedParentWays.length !== 0) {
38891                         // if the nodes are next to each other, they are merged
38892                         if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
38893                             return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
38894                         }
38895                         return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
38896                     }
38897                 }
38898                 return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
38899             }
38900
38901
38902             function shouldSnapToNode(target) {
38903                 if (!_activeEntity) return false;
38904                 return _activeEntity.geometry(context.graph()) !== 'vertex' ||
38905                     (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
38906             }
38907
38908
38909             function origin(entity) {
38910                 return context.projection(entity.loc);
38911             }
38912
38913
38914             function keydown() {
38915                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38916                     if (context.surface().classed('nope')) {
38917                         context.surface()
38918                             .classed('nope-suppressed', true);
38919                     }
38920                     context.surface()
38921                         .classed('nope', false)
38922                         .classed('nope-disabled', true);
38923                 }
38924             }
38925
38926
38927             function keyup() {
38928                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38929                     if (context.surface().classed('nope-suppressed')) {
38930                         context.surface()
38931                             .classed('nope', true);
38932                     }
38933                     context.surface()
38934                         .classed('nope-suppressed', false)
38935                         .classed('nope-disabled', false);
38936                 }
38937             }
38938
38939
38940             function start(entity) {
38941                 _wasMidpoint = entity.type === 'midpoint';
38942                 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
38943                 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
38944
38945
38946                 if (_isCancelled) {
38947                     if (hasHidden) {
38948                         uiFlash()
38949                             .duration(4000)
38950                             .text(t('modes.drag_node.connected_to_hidden'))();
38951                     }
38952                     return drag.cancel();
38953                 }
38954
38955                 if (_wasMidpoint) {
38956                     var midpoint = entity;
38957                     entity = osmNode();
38958                     context.perform(actionAddMidpoint(midpoint, entity));
38959                     entity = context.entity(entity.id);   // get post-action entity
38960
38961                     var vertex = context.surface().selectAll('.' + entity.id);
38962                     drag.target(vertex.node(), entity);
38963
38964                 } else {
38965                     context.perform(actionNoop());
38966                 }
38967
38968                 _activeEntity = entity;
38969                 _startLoc = entity.loc;
38970
38971                 hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
38972
38973                 context.surface().selectAll('.' + _activeEntity.id)
38974                     .classed('active', true);
38975
38976                 context.enter(mode);
38977             }
38978
38979
38980             // related code
38981             // - `behavior/draw.js` `datum()`
38982             function datum() {
38983                 var event$1 = event && event.sourceEvent;
38984                 if (!event$1 || event$1.altKey) {
38985                     return {};
38986                 } else {
38987                     // When dragging, snap only to touch targets..
38988                     // (this excludes area fills and active drawing elements)
38989                     var d = event$1.target.__data__;
38990                     return (d && d.properties && d.properties.target) ? d : {};
38991                 }
38992             }
38993
38994
38995             function doMove(entity, nudge) {
38996                 nudge = nudge || [0, 0];
38997
38998                 var currPoint = (event && event.point) || context.projection(_lastLoc);
38999                 var currMouse = geoVecSubtract(currPoint, nudge);
39000                 var loc = context.projection.invert(currMouse);
39001
39002                 if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
39003                     // related code
39004                     // - `mode/drag_node.js`     `doMode()`
39005                     // - `behavior/draw.js`      `click()`
39006                     // - `behavior/draw_way.js`  `move()`
39007                     var d = datum();
39008                     var target = d && d.properties && d.properties.entity;
39009                     var targetLoc = target && target.loc;
39010                     var targetNodes = d && d.properties && d.properties.nodes;
39011                     var edge;
39012
39013                     if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
39014                         if (shouldSnapToNode(target)) {
39015                             loc = targetLoc;
39016                         }
39017
39018                     } else if (targetNodes) {   // snap to way - a line target with `.nodes`
39019                         edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
39020                         if (edge) {
39021                             loc = edge.loc;
39022                         }
39023                     }
39024                 }
39025
39026                 context.replace(
39027                     actionMoveNode(entity.id, loc)
39028                 );
39029
39030                 // Below here: validations
39031                 var isInvalid = false;
39032
39033                 // Check if this connection to `target` could cause relations to break..
39034                 if (target) {
39035                     isInvalid = hasRelationConflict(entity, target, edge, context.graph());
39036                 }
39037
39038                 // Check if this drag causes the geometry to break..
39039                 if (!isInvalid) {
39040                     isInvalid = hasInvalidGeometry(entity, context.graph());
39041                 }
39042
39043
39044                 var nope = context.surface().classed('nope');
39045                 if (isInvalid === 'relation' || isInvalid === 'restriction') {
39046                     if (!nope) {   // about to nope - show hint
39047                         uiFlash()
39048                             .duration(4000)
39049                             .text(t('operations.connect.' + isInvalid,
39050                                 { relation: context.presets().item('type/restriction').name() }
39051                             ))();
39052                     }
39053                 } else {
39054                     if (nope) {   // about to un-nope, remove hint
39055                         uiFlash()
39056                             .duration(1)
39057                             .text('')();
39058                     }
39059                 }
39060
39061
39062                 var nopeDisabled = context.surface().classed('nope-disabled');
39063                 if (nopeDisabled) {
39064                     context.surface()
39065                         .classed('nope', false)
39066                         .classed('nope-suppressed', isInvalid);
39067                 } else {
39068                     context.surface()
39069                         .classed('nope', isInvalid)
39070                         .classed('nope-suppressed', false);
39071                 }
39072
39073                 _lastLoc = loc;
39074             }
39075
39076
39077             // Uses `actionConnect.disabled()` to know whether this connection is ok..
39078             function hasRelationConflict(entity, target, edge, graph) {
39079                 var testGraph = graph.update();  // copy
39080
39081                 // if snapping to way - add midpoint there and consider that the target..
39082                 if (edge) {
39083                     var midpoint = osmNode();
39084                     var action = actionAddMidpoint({
39085                         loc: edge.loc,
39086                         edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
39087                     }, midpoint);
39088
39089                     testGraph = action(testGraph);
39090                     target = midpoint;
39091                 }
39092
39093                 // can we connect to it?
39094                 var ids = [entity.id, target.id];
39095                 return actionConnect(ids).disabled(testGraph);
39096             }
39097
39098
39099             function hasInvalidGeometry(entity, graph) {
39100                 var parents = graph.parentWays(entity);
39101                 var i, j, k;
39102
39103                 for (i = 0; i < parents.length; i++) {
39104                     var parent = parents[i];
39105                     var nodes = [];
39106                     var activeIndex = null;    // which multipolygon ring contains node being dragged
39107
39108                     // test any parent multipolygons for valid geometry
39109                     var relations = graph.parentRelations(parent);
39110                     for (j = 0; j < relations.length; j++) {
39111                         if (!relations[j].isMultipolygon()) continue;
39112
39113                         var rings = osmJoinWays(relations[j].members, graph);
39114
39115                         // find active ring and test it for self intersections
39116                         for (k = 0; k < rings.length; k++) {
39117                             nodes = rings[k].nodes;
39118                             if (nodes.find(function(n) { return n.id === entity.id; })) {
39119                                 activeIndex = k;
39120                                 if (geoHasSelfIntersections(nodes, entity.id)) {
39121                                     return true;
39122                                 }
39123                             }
39124                             rings[k].coords = nodes.map(function(n) { return n.loc; });
39125                         }
39126
39127                         // test active ring for intersections with other rings in the multipolygon
39128                         for (k = 0; k < rings.length; k++) {
39129                             if (k === activeIndex) continue;
39130
39131                             // make sure active ring doesnt cross passive rings
39132                             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
39133                                 return true;
39134                             }
39135                         }
39136                     }
39137
39138
39139                     // If we still haven't tested this node's parent way for self-intersections.
39140                     // (because it's not a member of a multipolygon), test it now.
39141                     if (activeIndex === null) {
39142                         nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
39143                         if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
39144                             return true;
39145                         }
39146                     }
39147
39148                 }
39149
39150                 return false;
39151             }
39152
39153
39154             function move(entity) {
39155                 if (_isCancelled) return;
39156                 event.sourceEvent.stopPropagation();
39157
39158                 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
39159
39160                 _lastLoc = context.projection.invert(event.point);
39161
39162                 doMove(entity);
39163                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
39164                 if (nudge) {
39165                     startNudge(entity, nudge);
39166                 } else {
39167                     stopNudge();
39168                 }
39169             }
39170
39171             function end(entity) {
39172                 if (_isCancelled) return;
39173
39174                 var d = datum();
39175                 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
39176                 var target = d && d.properties && d.properties.entity;   // entity to snap to
39177
39178                 if (nope) {   // bounce back
39179                     context.perform(
39180                         _actionBounceBack(entity.id, _startLoc)
39181                     );
39182
39183                 } else if (target && target.type === 'way') {
39184                     var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39185                     context.replace(
39186                         actionAddMidpoint({
39187                             loc: choice.loc,
39188                             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39189                         }, entity),
39190                         connectAnnotation(entity, target)
39191                     );
39192
39193                 } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
39194                     context.replace(
39195                         actionConnect([target.id, entity.id]),
39196                         connectAnnotation(entity, target)
39197                     );
39198
39199                 } else if (_wasMidpoint) {
39200                     context.replace(
39201                         actionNoop(),
39202                         t('operations.add.annotation.vertex')
39203                     );
39204
39205                 } else {
39206                     context.replace(
39207                         actionNoop(),
39208                         moveAnnotation(entity)
39209                     );
39210                 }
39211
39212                 var reselection = _restoreSelectedIDs.filter(function(id) {
39213                     return context.graph().hasEntity(id);
39214                 });
39215
39216                 if (reselection.length) {
39217                     context.enter(modeSelect(context, reselection));
39218                 } else {
39219                     context.enter(modeBrowse(context));
39220                 }
39221             }
39222
39223
39224             function _actionBounceBack(nodeID, toLoc) {
39225                 var moveNode = actionMoveNode(nodeID, toLoc);
39226                 var action = function(graph, t) {
39227                     // last time through, pop off the bounceback perform.
39228                     // it will then overwrite the initial perform with a moveNode that does nothing
39229                     if (t === 1) context.pop();
39230                     return moveNode(graph, t);
39231                 };
39232                 action.transitionable = true;
39233                 return action;
39234             }
39235
39236
39237             function cancel() {
39238                 drag.cancel();
39239                 context.enter(modeBrowse(context));
39240             }
39241
39242
39243             var drag = behaviorDrag()
39244                 .selector('.layer-touch.points .target')
39245                 .surface(d3_select('#map').node())
39246                 .origin(origin)
39247                 .on('start', start)
39248                 .on('move', move)
39249                 .on('end', end);
39250
39251
39252             mode.enter = function() {
39253                 context.install(hover);
39254                 context.install(edit);
39255
39256                 d3_select(window)
39257                     .on('keydown.drawWay', keydown)
39258                     .on('keyup.drawWay', keyup);
39259
39260                 context.history()
39261                     .on('undone.drag-node', cancel);
39262             };
39263
39264
39265             mode.exit = function() {
39266                 context.ui().sidebar.hover.cancel();
39267                 context.uninstall(hover);
39268                 context.uninstall(edit);
39269
39270                 d3_select(window)
39271                     .on('keydown.hover', null)
39272                     .on('keyup.hover', null);
39273
39274                 context.history()
39275                     .on('undone.drag-node', null);
39276
39277                 _activeEntity = null;
39278
39279                 context.surface()
39280                     .classed('nope', false)
39281                     .classed('nope-suppressed', false)
39282                     .classed('nope-disabled', false)
39283                     .selectAll('.active')
39284                     .classed('active', false);
39285
39286                 stopNudge();
39287             };
39288
39289
39290             mode.selectedIDs = function() {
39291                 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39292                 // no assign
39293                 return mode;
39294             };
39295
39296
39297             mode.activeID = function() {
39298                 if (!arguments.length) return _activeEntity && _activeEntity.id;
39299                 // no assign
39300                 return mode;
39301             };
39302
39303
39304             mode.restoreSelectedIDs = function(_) {
39305                 if (!arguments.length) return _restoreSelectedIDs;
39306                 _restoreSelectedIDs = _;
39307                 return mode;
39308             };
39309
39310
39311             mode.behavior = drag;
39312
39313
39314             return mode;
39315         }
39316
39317         var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
39318         var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
39319
39320         var tiler = utilTiler();
39321         var dispatch$1 = dispatch('loaded');
39322
39323         var _krCache;
39324         var _krZoom = 14;
39325         var _krUrlRoot = 'https://www.keepright.at/';
39326
39327         var _krRuleset = [
39328             // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
39329             30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
39330             190, 191, 192, 193, 194, 195, 196, 197, 198,
39331             200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
39332             230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
39333             290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
39334             320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
39335         ];
39336
39337
39338         function abortRequest(controller) {
39339             if (controller) {
39340                 controller.abort();
39341             }
39342         }
39343
39344         function abortUnwantedRequests(cache, tiles) {
39345             Object.keys(cache.inflightTile).forEach(function(k) {
39346                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39347                 if (!wanted) {
39348                     abortRequest(cache.inflightTile[k]);
39349                     delete cache.inflightTile[k];
39350                 }
39351             });
39352         }
39353
39354
39355         function encodeErrorRtree(d) {
39356             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39357         }
39358
39359
39360         // replace or remove error from rtree
39361         function updateRtree(item, replace) {
39362             _krCache.rtree.remove(item, function isEql(a, b) {
39363                 return a.data.id === b.data.id;
39364             });
39365
39366             if (replace) {
39367                 _krCache.rtree.insert(item);
39368             }
39369         }
39370
39371
39372         function tokenReplacements(d) {
39373             if (!(d instanceof qaError)) return;
39374
39375             var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
39376             var replacements = {};
39377
39378             var errorTemplate = errorTypes[d.which_type];
39379             if (!errorTemplate) {
39380                 /* eslint-disable no-console */
39381                 console.log('No Template: ', d.which_type);
39382                 console.log('  ', d.description);
39383                 /* eslint-enable no-console */
39384                 return;
39385             }
39386
39387             // some descriptions are just fixed text
39388             if (!errorTemplate.regex) return;
39389
39390             // regex pattern should match description with variable details captured
39391             var errorRegex = new RegExp(errorTemplate.regex, 'i');
39392             var errorMatch = errorRegex.exec(d.description);
39393             if (!errorMatch) {
39394                 /* eslint-disable no-console */
39395                 console.log('Unmatched: ', d.which_type);
39396                 console.log('  ', d.description);
39397                 console.log('  ', errorRegex);
39398                 /* eslint-enable no-console */
39399                 return;
39400             }
39401
39402             for (var i = 1; i < errorMatch.length; i++) {   // skip first
39403                 var capture = errorMatch[i];
39404                 var idType;
39405
39406                 idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
39407                 if (idType && capture) {   // link IDs if present in the capture
39408                     capture = parseError(capture, idType);
39409                 } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
39410                     capture = '\\' +  capture + '\\';
39411                 } else {
39412                     var compare = capture.toLowerCase();
39413                     if (localizeStrings[compare]) {   // some replacement strings can be localized
39414                         capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39415                     }
39416                 }
39417
39418                 replacements['var' + i] = capture;
39419             }
39420
39421             return replacements;
39422         }
39423
39424
39425         function parseError(capture, idType) {
39426             var compare = capture.toLowerCase();
39427             if (localizeStrings[compare]) {   // some replacement strings can be localized
39428                 capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39429             }
39430
39431             switch (idType) {
39432                 // link a string like "this node"
39433                 case 'this':
39434                     capture = linkErrorObject(capture);
39435                     break;
39436
39437                 case 'url':
39438                     capture = linkURL(capture);
39439                     break;
39440
39441                 // link an entity ID
39442                 case 'n':
39443                 case 'w':
39444                 case 'r':
39445                     capture = linkEntity(idType + capture);
39446                     break;
39447
39448                 // some errors have more complex ID lists/variance
39449                 case '20':
39450                     capture = parse20(capture);
39451                     break;
39452                 case '211':
39453                     capture = parse211(capture);
39454                     break;
39455                 case '231':
39456                     capture = parse231(capture);
39457                     break;
39458                 case '294':
39459                     capture = parse294(capture);
39460                     break;
39461                 case '370':
39462                     capture = parse370(capture);
39463                     break;
39464             }
39465
39466             return capture;
39467
39468
39469             function linkErrorObject(d) {
39470                 return '<a class="error_object_link">' + d + '</a>';
39471             }
39472
39473             function linkEntity(d) {
39474                 return '<a class="error_entity_link">' + d + '</a>';
39475             }
39476
39477             function linkURL(d) {
39478                 return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
39479             }
39480
39481             // arbitrary node list of form: #ID, #ID, #ID...
39482             function parse211(capture) {
39483                 var newList = [];
39484                 var items = capture.split(', ');
39485
39486                 items.forEach(function(item) {
39487                     // ID has # at the front
39488                     var id = linkEntity('n' + item.slice(1));
39489                     newList.push(id);
39490                 });
39491
39492                 return newList.join(', ');
39493             }
39494
39495             // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
39496             function parse231(capture) {
39497                 var newList = [];
39498                 // unfortunately 'layer' can itself contain commas, so we split on '),'
39499                 var items = capture.split('),');
39500
39501                 items.forEach(function(item) {
39502                     var match = item.match(/\#(\d+)\((.+)\)?/);
39503                     if (match !== null && match.length > 2) {
39504                         newList.push(linkEntity('w' + match[1]) + ' ' +
39505                             t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
39506                         );
39507                     }
39508                 });
39509
39510                 return newList.join(', ');
39511             }
39512
39513             // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
39514             function parse294(capture) {
39515                 var newList = [];
39516                 var items = capture.split(',');
39517
39518                 items.forEach(function(item) {
39519                     var role;
39520                     var idType;
39521                     var id;
39522
39523                     // item of form "from/to node/relation #ID"
39524                     item = item.split(' ');
39525
39526                     // to/from role is more clear in quotes
39527                     role = '"' + item[0] + '"';
39528
39529                     // first letter of node/relation provides the type
39530                     idType = item[1].slice(0,1);
39531
39532                     // ID has # at the front
39533                     id = item[2].slice(1);
39534                     id = linkEntity(idType + id);
39535
39536                     item = [role, item[1], id].join(' ');
39537                     newList.push(item);
39538                 });
39539
39540                 return newList.join(', ');
39541             }
39542
39543             // may or may not include the string "(including the name 'name')"
39544             function parse370(capture) {
39545                 if (!capture) return '';
39546
39547                 var match = capture.match(/\(including the name (\'.+\')\)/);
39548                 if (match !== null && match.length) {
39549                     return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
39550                 }
39551                 return '';
39552             }
39553
39554             // arbitrary node list of form: #ID,#ID,#ID...
39555             function parse20(capture) {
39556                 var newList = [];
39557                 var items = capture.split(',');
39558
39559                 items.forEach(function(item) {
39560                     // ID has # at the front
39561                     var id = linkEntity('n' + item.slice(1));
39562                     newList.push(id);
39563                 });
39564
39565                 return newList.join(', ');
39566             }
39567         }
39568
39569
39570         var serviceKeepRight = {
39571             init: function() {
39572                 if (!_krCache) {
39573                     this.reset();
39574                 }
39575
39576                 this.event = utilRebind(this, dispatch$1, 'on');
39577             },
39578
39579             reset: function() {
39580                 if (_krCache) {
39581                     Object.values(_krCache.inflightTile).forEach(abortRequest);
39582                 }
39583
39584                 _krCache = {
39585                     data: {},
39586                     loadedTile: {},
39587                     inflightTile: {},
39588                     inflightPost: {},
39589                     closed: {},
39590                     rtree: rbush_1()
39591                 };
39592             },
39593
39594
39595             // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
39596             loadErrors: function(projection) {
39597                 var options = { format: 'geojson' };
39598                 var rules = _krRuleset.join();
39599
39600                 // determine the needed tiles to cover the view
39601                 var tiles = tiler
39602                     .zoomExtent([_krZoom, _krZoom])
39603                     .getTiles(projection);
39604
39605                 // abort inflight requests that are no longer needed
39606                 abortUnwantedRequests(_krCache, tiles);
39607
39608                 // issue new requests..
39609                 tiles.forEach(function(tile) {
39610                     if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
39611
39612                     var rect = tile.extent.rectangle();
39613                     var params = Object.assign({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
39614                     var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
39615
39616                     var controller = new AbortController();
39617                     _krCache.inflightTile[tile.id] = controller;
39618
39619                     d3_json(url, { signal: controller.signal })
39620                         .then(function(data) {
39621                             delete _krCache.inflightTile[tile.id];
39622                             _krCache.loadedTile[tile.id] = true;
39623                             if (!data || !data.features || !data.features.length) {
39624                                 throw new Error('No Data');
39625                             }
39626
39627                             data.features.forEach(function(feature) {
39628                                 var loc = feature.geometry.coordinates;
39629                                 var props = feature.properties;
39630
39631                                 // if there is a parent, save its error type e.g.:
39632                                 //  Error 191 = "highway-highway"
39633                                 //  Error 190 = "intersections without junctions"  (parent)
39634                                 var errorType = props.error_type;
39635                                 var errorTemplate = errorTypes[errorType];
39636                                 var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
39637
39638                                 // try to handle error type directly, fallback to parent error type.
39639                                 var whichType = errorTemplate ? errorType : parentErrorType;
39640                                 var whichTemplate = errorTypes[whichType];
39641
39642                                 // Rewrite a few of the errors at this point..
39643                                 // This is done to make them easier to linkify and translate.
39644                                 switch (whichType) {
39645                                     case '170':
39646                                         props.description = 'This feature has a FIXME tag: ' + props.description;
39647                                         break;
39648                                     case '292':
39649                                     case '293':
39650                                         props.description = props.description.replace('A turn-', 'This turn-');
39651                                         break;
39652                                     case '294':
39653                                     case '295':
39654                                     case '296':
39655                                     case '297':
39656                                     case '298':
39657                                         props.description = 'This turn-restriction~' + props.description;
39658                                         break;
39659                                     case '300':
39660                                         props.description = 'This highway is missing a maxspeed tag';
39661                                         break;
39662                                     case '411':
39663                                     case '412':
39664                                     case '413':
39665                                         props.description = 'This feature~' + props.description;
39666                                         break;
39667                                 }
39668
39669                                 // - move markers slightly so it doesn't obscure the geometry,
39670                                 // - then move markers away from other coincident markers
39671                                 var coincident = false;
39672                                 do {
39673                                     // first time, move marker up. after that, move marker right.
39674                                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
39675                                     loc = geoVecAdd(loc, delta);
39676                                     var bbox = geoExtent(loc).bbox();
39677                                     coincident = _krCache.rtree.search(bbox).length;
39678                                 } while (coincident);
39679
39680                                 var d = new qaError({
39681                                     // Required values
39682                                     loc: loc,
39683                                     service: 'keepRight',
39684                                     error_type: errorType,
39685                                     // Extra values for this service
39686                                     id: props.error_id,
39687                                     comment: props.comment || null,
39688                                     description: props.description || '',
39689                                     error_id: props.error_id,
39690                                     which_type: whichType,
39691                                     parent_error_type: parentErrorType,
39692                                     severity: whichTemplate.severity || 'error',
39693                                     object_id: props.object_id,
39694                                     object_type: props.object_type,
39695                                     schema: props.schema,
39696                                     title: props.title
39697                                 });
39698
39699                                 d.replacements = tokenReplacements(d);
39700
39701                                 _krCache.data[d.id] = d;
39702                                 _krCache.rtree.insert(encodeErrorRtree(d));
39703                             });
39704
39705                             dispatch$1.call('loaded');
39706                         })
39707                         .catch(function() {
39708                             delete _krCache.inflightTile[tile.id];
39709                             _krCache.loadedTile[tile.id] = true;
39710                         });
39711
39712                 });
39713             },
39714
39715
39716             postKeepRightUpdate: function(d, callback) {
39717                 if (_krCache.inflightPost[d.id]) {
39718                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39719                 }
39720
39721                 var that = this;
39722                 var params = { schema: d.schema, id: d.error_id };
39723
39724                 if (d.state) {
39725                     params.st = d.state;
39726                 }
39727                 if (d.newComment !== undefined) {
39728                     params.co = d.newComment;
39729                 }
39730
39731                 // NOTE: This throws a CORS err, but it seems successful.
39732                 // We don't care too much about the response, so this is fine.
39733                 var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
39734
39735                 var controller = new AbortController();
39736                 _krCache.inflightPost[d.id] = controller;
39737
39738                 fetch(url, { method: 'POST', signal: controller.signal })
39739                     .then(function(response) {
39740                         delete _krCache.inflightPost[d.id];
39741                         if (!response.ok) {
39742                             throw new Error(response.status + ' ' + response.statusText);
39743                         }
39744
39745                         if (d.state === 'ignore') {   // ignore permanently (false positive)
39746                             that.removeError(d);
39747
39748                         } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
39749                             that.removeError(d);
39750                             _krCache.closed[d.schema + ':' + d.error_id] = true;
39751
39752                         } else {
39753                             d = that.replaceError(d.update({
39754                                 comment: d.newComment,
39755                                 newComment: undefined,
39756                                 state: undefined
39757                             }));
39758                         }
39759
39760                         if (callback) callback(null, d);
39761                     })
39762                     .catch(function(err) {
39763                         delete _krCache.inflightPost[d.id];
39764                         if (callback) callback(err.message);
39765                     });
39766             },
39767
39768
39769             // get all cached errors covering the viewport
39770             getErrors: function(projection) {
39771                 var viewport = projection.clipExtent();
39772                 var min = [viewport[0][0], viewport[1][1]];
39773                 var max = [viewport[1][0], viewport[0][1]];
39774                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
39775
39776                 return _krCache.rtree.search(bbox).map(function(d) {
39777                     return d.data;
39778                 });
39779             },
39780
39781
39782             // get a single error from the cache
39783             getError: function(id) {
39784                 return _krCache.data[id];
39785             },
39786
39787
39788             // replace a single error in the cache
39789             replaceError: function(error) {
39790                 if (!(error instanceof qaError) || !error.id) return;
39791
39792                 _krCache.data[error.id] = error;
39793                 updateRtree(encodeErrorRtree(error), true); // true = replace
39794                 return error;
39795             },
39796
39797
39798             // remove a single error from the cache
39799             removeError: function(error) {
39800                 if (!(error instanceof qaError) || !error.id) return;
39801
39802                 delete _krCache.data[error.id];
39803                 updateRtree(encodeErrorRtree(error), false); // false = remove
39804             },
39805
39806
39807             errorURL: function(error) {
39808                 return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
39809             },
39810
39811
39812             // Get an array of errors closed during this session.
39813             // Used to populate `closed:keepright` changeset tag
39814             getClosedIDs: function() {
39815                 return Object.keys(_krCache.closed).sort();
39816             }
39817
39818         };
39819
39820         var tiler$1 = utilTiler();
39821         var dispatch$2 = dispatch('loaded');
39822
39823         var _erCache;
39824         var _erZoom = 14;
39825
39826         var _impOsmUrls = {
39827             ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
39828             mr: 'https://missingroads.skobbler.net/missingGeoService',
39829             tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
39830         };
39831
39832         function abortRequest$1(i) {
39833             Object.values(i).forEach(function(controller) {
39834                 if (controller) {
39835                     controller.abort();
39836                 }
39837             });
39838         }
39839
39840         function abortUnwantedRequests$1(cache, tiles) {
39841             Object.keys(cache.inflightTile).forEach(function(k) {
39842                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39843                 if (!wanted) {
39844                     abortRequest$1(cache.inflightTile[k]);
39845                     delete cache.inflightTile[k];
39846                 }
39847             });
39848         }
39849
39850
39851         function encodeErrorRtree$1(d) {
39852             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39853         }
39854
39855
39856         // replace or remove error from rtree
39857         function updateRtree$1(item, replace) {
39858             _erCache.rtree.remove(item, function isEql(a, b) {
39859                 return a.data.id === b.data.id;
39860             });
39861
39862             if (replace) {
39863                 _erCache.rtree.insert(item);
39864             }
39865         }
39866
39867         function linkErrorObject(d) {
39868             return '<a class="error_object_link">' + d + '</a>';
39869         }
39870
39871         function linkEntity(d) {
39872             return '<a class="error_entity_link">' + d + '</a>';
39873         }
39874
39875         function pointAverage(points) {
39876             if (points.length) {
39877                 var sum = points.reduce(function(acc, point) {
39878                     return geoVecAdd(acc, [point.lon, point.lat]);
39879                 }, [0,0]);
39880                 return geoVecScale(sum, 1 / points.length);
39881             } else {
39882                 return [0,0];
39883             }
39884         }
39885
39886         function relativeBearing(p1, p2) {
39887             var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
39888             if (angle < 0) {
39889                 angle += 2 * Math.PI;
39890             }
39891
39892             // Return degrees
39893             return angle * 180 / Math.PI;
39894         }
39895
39896         // Assuming range [0,360)
39897         function cardinalDirection(bearing) {
39898             var dir = 45 * Math.round(bearing / 45);
39899             var compass = {
39900                 0: 'north',
39901                 45: 'northeast',
39902                 90: 'east',
39903                 135: 'southeast',
39904                 180: 'south',
39905                 225: 'southwest',
39906                 270: 'west',
39907                 315: 'northwest',
39908                 360: 'north'
39909             };
39910
39911             return t('QA.improveOSM.directions.' + compass[dir]);
39912         }
39913
39914         // Errors shouldn't obscure eachother
39915         function preventCoincident(loc, bumpUp) {
39916             var coincident = false;
39917             do {
39918                 // first time, move marker up. after that, move marker right.
39919                 var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
39920                 loc = geoVecAdd(loc, delta);
39921                 var bbox = geoExtent(loc).bbox();
39922                 coincident = _erCache.rtree.search(bbox).length;
39923             } while (coincident);
39924
39925             return loc;
39926         }
39927
39928         var serviceImproveOSM = {
39929             init: function() {
39930                 if (!_erCache) {
39931                     this.reset();
39932                 }
39933
39934                 this.event = utilRebind(this, dispatch$2, 'on');
39935             },
39936
39937             reset: function() {
39938                 if (_erCache) {
39939                     Object.values(_erCache.inflightTile).forEach(abortRequest$1);
39940                 }
39941                 _erCache = {
39942                     data: {},
39943                     loadedTile: {},
39944                     inflightTile: {},
39945                     inflightPost: {},
39946                     closed: {},
39947                     rtree: rbush_1()
39948                 };
39949             },
39950
39951             loadErrors: function(projection) {
39952                 var options = {
39953                     client: 'iD',
39954                     status: 'OPEN',
39955                     zoom: '19' // Use a high zoom so that clusters aren't returned
39956                 };
39957
39958                 // determine the needed tiles to cover the view
39959                 var tiles = tiler$1
39960                     .zoomExtent([_erZoom, _erZoom])
39961                     .getTiles(projection);
39962
39963                 // abort inflight requests that are no longer needed
39964                 abortUnwantedRequests$1(_erCache, tiles);
39965
39966                 // issue new requests..
39967                 tiles.forEach(function(tile) {
39968                     if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
39969
39970                     var rect = tile.extent.rectangle();
39971                     var params = Object.assign({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
39972
39973                     // 3 separate requests to store for each tile
39974                     var requests = {};
39975
39976                     Object.keys(_impOsmUrls).forEach(function(k) {
39977                         var v = _impOsmUrls[k];
39978                         // We exclude WATER from missing geometry as it doesn't seem useful
39979                         // We use most confident one-way and turn restrictions only, still have false positives
39980                         var kParams = Object.assign({},
39981                             params,
39982                             (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
39983                         );
39984                         var url = v + '/search?' + utilQsString(kParams);
39985
39986                         var controller = new AbortController();
39987                         requests[k] = controller;
39988
39989                         d3_json(url, { signal: controller.signal })
39990                             .then(function(data) {
39991                                 delete _erCache.inflightTile[tile.id][k];
39992                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39993                                     delete _erCache.inflightTile[tile.id];
39994                                     _erCache.loadedTile[tile.id] = true;
39995                                 }
39996
39997                                 // Road segments at high zoom == oneways
39998                                 if (data.roadSegments) {
39999                                     data.roadSegments.forEach(function(feature) {
40000                                         // Position error at the approximate middle of the segment
40001                                         var points = feature.points;
40002                                         var mid = points.length / 2;
40003                                         var loc;
40004
40005                                         // Even number of points, find midpoint of the middle two
40006                                         // Odd number of points, use position of very middle point
40007                                         if (mid % 1 === 0) {
40008                                             loc = pointAverage([points[mid - 1], points[mid]]);
40009                                         } else {
40010                                             mid = points[Math.floor(mid)];
40011                                             loc = [mid.lon, mid.lat];
40012                                         }
40013
40014                                         // One-ways can land on same segment in opposite direction
40015                                         loc = preventCoincident(loc, false);
40016
40017                                         var d = new qaError({
40018                                             // Info required for every error
40019                                             loc: loc,
40020                                             service: 'improveOSM',
40021                                             error_type: k,
40022                                             // Extra details needed for this service
40023                                             error_key: k,
40024                                             identifier: { // this is used to post changes to the error
40025                                                 wayId: feature.wayId,
40026                                                 fromNodeId: feature.fromNodeId,
40027                                                 toNodeId: feature.toNodeId
40028                                             },
40029                                             object_id: feature.wayId,
40030                                             object_type: 'way',
40031                                             status: feature.status
40032                                         });
40033
40034                                         // Variables used in the description
40035                                         d.replacements = {
40036                                             percentage: feature.percentOfTrips,
40037                                             num_trips: feature.numberOfTrips,
40038                                             highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
40039                                             from_node: linkEntity('n' + feature.fromNodeId),
40040                                             to_node: linkEntity('n' + feature.toNodeId)
40041                                         };
40042
40043                                         _erCache.data[d.id] = d;
40044                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
40045                                     });
40046                                 }
40047
40048                                 // Tiles at high zoom == missing roads
40049                                 if (data.tiles) {
40050                                     data.tiles.forEach(function(feature) {
40051                                         var geoType = feature.type.toLowerCase();
40052
40053                                         // Average of recorded points should land on the missing geometry
40054                                         // Missing geometry could happen to land on another error
40055                                         var loc = pointAverage(feature.points);
40056                                         loc = preventCoincident(loc, false);
40057
40058                                         var d = new qaError({
40059                                             // Info required for every error
40060                                             loc: loc,
40061                                             service: 'improveOSM',
40062                                             error_type: k + '-' + geoType,
40063                                             // Extra details needed for this service
40064                                             error_key: k,
40065                                             identifier: { x: feature.x, y: feature.y },
40066                                             status: feature.status
40067                                         });
40068
40069                                         d.replacements = {
40070                                             num_trips: feature.numberOfTrips,
40071                                             geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
40072                                         };
40073
40074                                         // -1 trips indicates data came from a 3rd party
40075                                         if (feature.numberOfTrips === -1) {
40076                                             d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
40077                                         }
40078
40079                                         _erCache.data[d.id] = d;
40080                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
40081                                     });
40082                                 }
40083
40084                                 // Entities at high zoom == turn restrictions
40085                                 if (data.entities) {
40086                                     data.entities.forEach(function(feature) {
40087                                         // Turn restrictions could be missing at same junction
40088                                         // We also want to bump the error up so node is accessible
40089                                         var loc = feature.point;
40090                                         loc = preventCoincident([loc.lon, loc.lat], true);
40091
40092                                         // Elements are presented in a strange way
40093                                         var ids = feature.id.split(',');
40094                                         var from_way = ids[0];
40095                                         var via_node = ids[3];
40096                                         var to_way = ids[2].split(':')[1];
40097
40098                                         var d = new qaError({
40099                                             // Info required for every error
40100                                             loc: loc,
40101                                             service: 'improveOSM',
40102                                             error_type: k,
40103                                             // Extra details needed for this service
40104                                             error_key: k,
40105                                             identifier: feature.id,
40106                                             object_id: via_node,
40107                                             object_type: 'node',
40108                                             status: feature.status
40109                                         });
40110
40111                                         // Travel direction along from_way clarifies the turn restriction
40112                                         var p1 = feature.segments[0].points[0];
40113                                         var p2 = feature.segments[0].points[1];
40114
40115                                         var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
40116
40117                                         // Variables used in the description
40118                                         d.replacements = {
40119                                             num_passed: feature.numberOfPasses,
40120                                             num_trips: feature.segments[0].numberOfTrips,
40121                                             turn_restriction: feature.turnType.toLowerCase(),
40122                                             from_way: linkEntity('w' + from_way),
40123                                             to_way: linkEntity('w' + to_way),
40124                                             travel_direction: dir_of_travel,
40125                                             junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
40126                                         };
40127
40128                                         _erCache.data[d.id] = d;
40129                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
40130                                         dispatch$2.call('loaded');
40131                                     });
40132                                 }
40133                             })
40134                             .catch(function() {
40135                                 delete _erCache.inflightTile[tile.id][k];
40136                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
40137                                     delete _erCache.inflightTile[tile.id];
40138                                     _erCache.loadedTile[tile.id] = true;
40139                                 }
40140                             });
40141                     });
40142
40143                     _erCache.inflightTile[tile.id] = requests;
40144                 });
40145             },
40146
40147             getComments: function(d, callback) {
40148                 // If comments already retrieved no need to do so again
40149                 if (d.comments !== undefined) {
40150                     if (callback) callback({}, d);
40151                     return;
40152                 }
40153
40154                 var key = d.error_key;
40155                 var qParams = {};
40156
40157                 if (key === 'ow') {
40158                     qParams = d.identifier;
40159                 } else if (key === 'mr') {
40160                     qParams.tileX = d.identifier.x;
40161                     qParams.tileY = d.identifier.y;
40162                 } else if (key === 'tr') {
40163                     qParams.targetId = d.identifier;
40164                 }
40165
40166                 var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
40167
40168                 var that = this;
40169                 d3_json(url)
40170                     .then(function(data) {
40171                         // comments are served newest to oldest
40172                         var comments = data.comments ? data.comments.reverse() : [];
40173                         that.replaceError(d.update({ comments: comments }));
40174                         if (callback) callback(null, d);
40175                     })
40176                     .catch(function(err) {
40177                         if (callback) callback(err.message);
40178                     });
40179             },
40180
40181             postUpdate: function(d, callback) {
40182                 if (!serviceOsm.authenticated()) { // Username required in payload
40183                     return callback({ message: 'Not Authenticated', status: -3}, d);
40184                 }
40185                 if (_erCache.inflightPost[d.id]) {
40186                     return callback({ message: 'Error update already inflight', status: -2 }, d);
40187                 }
40188
40189                 var that = this;
40190
40191                 // Payload can only be sent once username is established
40192                 serviceOsm.userDetails(sendPayload);
40193
40194                 function sendPayload(err, user) {
40195                     if (err) { return callback(err, d); }
40196
40197                     var key = d.error_key;
40198                     var url = _impOsmUrls[key] + '/comment';
40199                     var payload = {
40200                         username: user.display_name
40201                     };
40202
40203                     // Each error type has different data for identification
40204                     if (key === 'ow') {
40205                         payload.roadSegments = [ d.identifier ];
40206                     } else if (key === 'mr') {
40207                         payload.tiles = [ d.identifier ];
40208                     } else if (key === 'tr') {
40209                         payload.targetIds = [ d.identifier ];
40210                     }
40211
40212                     if (d.newStatus !== undefined) {
40213                         payload.status = d.newStatus;
40214                         payload.text = 'status changed';
40215                     }
40216
40217                     // Comment take place of default text
40218                     if (d.newComment !== undefined) {
40219                         payload.text = d.newComment;
40220                     }
40221
40222                     var controller = new AbortController();
40223                     _erCache.inflightPost[d.id] = controller;
40224
40225                     var options = {
40226                         method: 'POST',
40227                         signal: controller.signal,
40228                         body: JSON.stringify(payload)
40229                     };
40230
40231                      d3_json(url, options)
40232                         .then(function() {
40233                             delete _erCache.inflightPost[d.id];
40234
40235                             // Just a comment, update error in cache
40236                             if (d.newStatus === undefined) {
40237                                 var now = new Date();
40238                                 var comments = d.comments ? d.comments : [];
40239
40240                                 comments.push({
40241                                     username: payload.username,
40242                                     text: payload.text,
40243                                     timestamp: now.getTime() / 1000
40244                                 });
40245
40246                                 that.replaceError(d.update({
40247                                     comments: comments,
40248                                     newComment: undefined
40249                                 }));
40250                             } else {
40251                                 that.removeError(d);
40252                                 if (d.newStatus === 'SOLVED') {
40253                                     // No pretty identifier, so we just use coordinates
40254                                     var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
40255                                     _erCache.closed[key + ':' + closedID] = true;
40256                                 }
40257                             }
40258                             if (callback) callback(null, d);
40259                         })
40260                         .catch(function(err) {
40261                             delete _erCache.inflightPost[d.id];
40262                             if (callback) callback(err.message);
40263                         });
40264                 }
40265             },
40266
40267
40268             // get all cached errors covering the viewport
40269             getErrors: function(projection) {
40270                 var viewport = projection.clipExtent();
40271                 var min = [viewport[0][0], viewport[1][1]];
40272                 var max = [viewport[1][0], viewport[0][1]];
40273                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40274
40275                 return _erCache.rtree.search(bbox).map(function(d) {
40276                     return d.data;
40277                 });
40278             },
40279
40280             // get a single error from the cache
40281             getError: function(id) {
40282                 return _erCache.data[id];
40283             },
40284
40285             // replace a single error in the cache
40286             replaceError: function(error) {
40287                 if (!(error instanceof qaError) || !error.id) return;
40288
40289                 _erCache.data[error.id] = error;
40290                 updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
40291                 return error;
40292             },
40293
40294             // remove a single error from the cache
40295             removeError: function(error) {
40296                 if (!(error instanceof qaError) || !error.id) return;
40297
40298                 delete _erCache.data[error.id];
40299                 updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
40300             },
40301
40302             // Used to populate `closed:improveosm` changeset tag
40303             getClosedIDs: function() {
40304                 return Object.keys(_erCache.closed).sort();
40305             }
40306         };
40307
40308         /*
40309             A standalone SVG element that contains only a `defs` sub-element. To be
40310             used once globally, since defs IDs must be unique within a document.
40311         */
40312         function svgDefs(context) {
40313
40314             function drawDefs(selection) {
40315                 var defs = selection.append('defs');
40316
40317                 // add markers
40318                 defs
40319                     .append('marker')
40320                     .attr('id', 'oneway-marker')
40321                     .attr('viewBox', '0 0 10 5')
40322                     .attr('refX', 2.5)
40323                     .attr('refY', 2.5)
40324                     .attr('markerWidth', 2)
40325                     .attr('markerHeight', 2)
40326                     .attr('markerUnits', 'strokeWidth')
40327                     .attr('orient', 'auto')
40328                     .append('path')
40329                     .attr('class', 'oneway-marker-path')
40330                     .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
40331                     .attr('stroke', 'none')
40332                     .attr('fill', '#000')
40333                     .attr('opacity', '0.75');
40334
40335                 // SVG markers have to be given a colour where they're defined
40336                 // (they can't inherit it from the line they're attached to),
40337                 // so we need to manually define markers for each color of tag
40338                 // (also, it's slightly nicer if we can control the
40339                 // positioning for different tags)
40340                 function addSidedMarker(name, color, offset) {
40341                     defs
40342                         .append('marker')
40343                         .attr('id', 'sided-marker-' + name)
40344                         .attr('viewBox', '0 0 2 2')
40345                         .attr('refX', 1)
40346                         .attr('refY', -offset)
40347                         .attr('markerWidth', 1.5)
40348                         .attr('markerHeight', 1.5)
40349                         .attr('markerUnits', 'strokeWidth')
40350                         .attr('orient', 'auto')
40351                         .append('path')
40352                         .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
40353                         .attr('d', 'M 0,0 L 1,1 L 2,0 z')
40354                         .attr('stroke', 'none')
40355                         .attr('fill', color);
40356                 }
40357                 addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
40358                 // for a coastline, the arrows are (somewhat unintuitively) on
40359                 // the water side, so let's color them blue (with a gap) to
40360                 // give a stronger indication
40361                 addSidedMarker('coastline', '#77dede', 1);
40362                 addSidedMarker('waterway', '#77dede', 1);
40363                 // barriers have a dashed line, and separating the triangle
40364                 // from the line visually suits that
40365                 addSidedMarker('barrier', '#ddd', 1);
40366                 addSidedMarker('man_made', '#fff', 0);
40367
40368                 defs
40369                     .append('marker')
40370                     .attr('id', 'viewfield-marker')
40371                     .attr('viewBox', '0 0 16 16')
40372                     .attr('refX', 8)
40373                     .attr('refY', 16)
40374                     .attr('markerWidth', 4)
40375                     .attr('markerHeight', 4)
40376                     .attr('markerUnits', 'strokeWidth')
40377                     .attr('orient', 'auto')
40378                     .append('path')
40379                     .attr('class', 'viewfield-marker-path')
40380                     .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
40381                     .attr('fill', '#333')
40382                     .attr('fill-opacity', '0.75')
40383                     .attr('stroke', '#fff')
40384                     .attr('stroke-width', '0.5px')
40385                     .attr('stroke-opacity', '0.75');
40386
40387                 defs
40388                     .append('marker')
40389                     .attr('id', 'viewfield-marker-wireframe')
40390                     .attr('viewBox', '0 0 16 16')
40391                     .attr('refX', 8)
40392                     .attr('refY', 16)
40393                     .attr('markerWidth', 4)
40394                     .attr('markerHeight', 4)
40395                     .attr('markerUnits', 'strokeWidth')
40396                     .attr('orient', 'auto')
40397                     .append('path')
40398                     .attr('class', 'viewfield-marker-path')
40399                     .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
40400                     .attr('fill', 'none')
40401                     .attr('stroke', '#fff')
40402                     .attr('stroke-width', '0.5px')
40403                     .attr('stroke-opacity', '0.75');
40404
40405                 // add patterns
40406                 var patterns = defs.selectAll('pattern')
40407                     .data([
40408                         // pattern name, pattern image name
40409                         ['beach', 'dots'],
40410                         ['construction', 'construction'],
40411                         ['cemetery', 'cemetery'],
40412                         ['cemetery_christian', 'cemetery_christian'],
40413                         ['cemetery_buddhist', 'cemetery_buddhist'],
40414                         ['cemetery_muslim', 'cemetery_muslim'],
40415                         ['cemetery_jewish', 'cemetery_jewish'],
40416                         ['farmland', 'farmland'],
40417                         ['farmyard', 'farmyard'],
40418                         ['forest', 'forest'],
40419                         ['forest_broadleaved', 'forest_broadleaved'],
40420                         ['forest_needleleaved', 'forest_needleleaved'],
40421                         ['forest_leafless', 'forest_leafless'],
40422                         ['grass', 'grass'],
40423                         ['landfill', 'landfill'],
40424                         ['meadow', 'grass'],
40425                         ['orchard', 'orchard'],
40426                         ['pond', 'pond'],
40427                         ['quarry', 'quarry'],
40428                         ['scrub', 'bushes'],
40429                         ['vineyard', 'vineyard'],
40430                         ['water_standing', 'lines'],
40431                         ['waves', 'waves'],
40432                         ['wetland', 'wetland'],
40433                         ['wetland_marsh', 'wetland_marsh'],
40434                         ['wetland_swamp', 'wetland_swamp'],
40435                         ['wetland_bog', 'wetland_bog'],
40436                         ['wetland_reedbed', 'wetland_reedbed']
40437                     ])
40438                     .enter()
40439                     .append('pattern')
40440                     .attr('id', function (d) { return 'pattern-' + d[0]; })
40441                     .attr('width', 32)
40442                     .attr('height', 32)
40443                     .attr('patternUnits', 'userSpaceOnUse');
40444
40445                 patterns
40446                     .append('rect')
40447                     .attr('x', 0)
40448                     .attr('y', 0)
40449                     .attr('width', 32)
40450                     .attr('height', 32)
40451                     .attr('class', function (d) { return 'pattern-color-' + d[0]; });
40452
40453                 patterns
40454                     .append('image')
40455                     .attr('x', 0)
40456                     .attr('y', 0)
40457                     .attr('width', 32)
40458                     .attr('height', 32)
40459                     .attr('xlink:href', function (d) {
40460                         return context.imagePath('pattern/' + d[1] + '.png');
40461                     });
40462
40463                 // add clip paths
40464                 defs.selectAll('clipPath')
40465                     .data([12, 18, 20, 32, 45])
40466                     .enter()
40467                     .append('clipPath')
40468                     .attr('id', function (d) { return 'clip-square-' + d; })
40469                     .append('rect')
40470                     .attr('x', 0)
40471                     .attr('y', 0)
40472                     .attr('width', function (d) { return d; })
40473                     .attr('height', function (d) { return d; });
40474
40475                 // add symbol spritesheets
40476                 defs
40477                     .call(drawDefs.addSprites, [
40478                         'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite'
40479                     ], true);
40480             }
40481
40482
40483             drawDefs.addSprites = function(selection, ids, overrideColors) {
40484                 var spritesheets = selection.selectAll('.spritesheet');
40485                 var currData = spritesheets.data();
40486                 var data = utilArrayUniq(currData.concat(ids));
40487
40488                 spritesheets
40489                     .data(data)
40490                     .enter()
40491                     .append('g')
40492                     .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
40493                     .each(function(d) {
40494                         var url = context.imagePath(d + '.svg');
40495                         var node = d3_select(this).node();
40496
40497                         svg(url)
40498                             .then(function(svg) {
40499                                 node.appendChild(
40500                                     d3_select(svg.documentElement).attr('id', d).node()
40501                                 );
40502                                 if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
40503                                     d3_select(node).selectAll('path')
40504                                         .attr('fill', 'currentColor');
40505                                 }
40506                             })
40507                             .catch(function() {
40508                                 /* ignore */
40509                             });
40510                     });
40511             };
40512
40513
40514             return drawDefs;
40515         }
40516
40517         /* global Mapillary:false */
40518
40519
40520         var apibase = 'https://a.mapillary.com/v3/';
40521         var viewercss = 'mapillary-js/mapillary.min.css';
40522         var viewerjs = 'mapillary-js/mapillary.min.js';
40523         var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
40524         var maxResults = 1000;
40525         var tileZoom = 14;
40526         var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
40527         var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
40528         var _mlyFallback = false;
40529         var _mlyCache;
40530         var _mlyClicks;
40531         var _mlySelectedImage;
40532         var _mlyViewer;
40533
40534
40535         function abortRequest$2(controller) {
40536             controller.abort();
40537         }
40538
40539
40540         function maxPageAtZoom(z) {
40541             if (z < 15)   return 2;
40542             if (z === 15) return 5;
40543             if (z === 16) return 10;
40544             if (z === 17) return 20;
40545             if (z === 18) return 40;
40546             if (z > 18)   return 80;
40547         }
40548
40549
40550         function loadTiles(which, url, projection) {
40551             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
40552             var tiles = tiler$2.getTiles(projection);
40553
40554             // abort inflight requests that are no longer needed
40555             var cache = _mlyCache[which];
40556             Object.keys(cache.inflight).forEach(function(k) {
40557                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
40558                 if (!wanted) {
40559                     abortRequest$2(cache.inflight[k]);
40560                     delete cache.inflight[k];
40561                 }
40562             });
40563
40564             tiles.forEach(function(tile) {
40565                 loadNextTilePage(which, currZoom, url, tile);
40566             });
40567         }
40568
40569
40570         function loadNextTilePage(which, currZoom, url, tile) {
40571             var cache = _mlyCache[which];
40572             var rect = tile.extent.rectangle();
40573             var maxPages = maxPageAtZoom(currZoom);
40574             var nextPage = cache.nextPage[tile.id] || 0;
40575             var nextURL = cache.nextURL[tile.id] || url +
40576                 utilQsString({
40577                     per_page: maxResults,
40578                     page: nextPage,
40579                     client_id: clientId,
40580                     bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
40581                 });
40582
40583             if (nextPage > maxPages) return;
40584
40585             var id = tile.id + ',' + String(nextPage);
40586             if (cache.loaded[id] || cache.inflight[id]) return;
40587
40588             var controller = new AbortController();
40589             cache.inflight[id] = controller;
40590
40591             var options = {
40592                 method: 'GET',
40593                 signal: controller.signal,
40594                 headers: { 'Content-Type': 'application/json' }
40595             };
40596
40597             fetch(nextURL, options)
40598                 .then(function(response) {
40599                     if (!response.ok) {
40600                         throw new Error(response.status + ' ' + response.statusText);
40601                     }
40602                     var linkHeader = response.headers.get('Link');
40603                     if (linkHeader) {
40604                         var pagination = parsePagination(linkHeader);
40605                         if (pagination.next) {
40606                             cache.nextURL[tile.id] = pagination.next;
40607                         }
40608                     }
40609                     return response.json();
40610                 })
40611                 .then(function(data) {
40612                     cache.loaded[id] = true;
40613                     delete cache.inflight[id];
40614                     if (!data || !data.features || !data.features.length) {
40615                         throw new Error('No Data');
40616                     }
40617
40618                     var features = data.features.map(function(feature) {
40619                         var loc = feature.geometry.coordinates;
40620                         var d;
40621
40622                         // An image (shown as a green dot on the map) is a single street photo with extra
40623                         // information such as location, camera angle (CA), camera model, and so on.
40624                         // Each image feature is a GeoJSON Point
40625                         if (which === 'images') {
40626                             d = {
40627                                 loc: loc,
40628                                 key: feature.properties.key,
40629                                 ca: feature.properties.ca,
40630                                 captured_at: feature.properties.captured_at,
40631                                 captured_by: feature.properties.username,
40632                                 pano: feature.properties.pano
40633                             };
40634
40635                             cache.forImageKey[d.key] = d;     // cache imageKey -> image
40636
40637                         // Mapillary organizes images as sequences. A sequence of images are continuously captured
40638                         // by a user at a give time. Sequences are shown on the map as green lines.
40639                         // Each sequence feature is a GeoJSON LineString
40640                         } else if (which === 'sequences') {
40641                             var sequenceKey = feature.properties.key;
40642                             cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
40643                             feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
40644                                 cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
40645                             });
40646                             return false;    // because no `d` data worth loading into an rbush
40647
40648                         // An image detection is a semantic pixel area on an image. The area could indicate
40649                         // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
40650                         // Each image_detection feature is a GeoJSON Point (located where the image was taken)
40651                         } else if (which === 'image_detections') {
40652                             d = {
40653                                 key: feature.properties.key,
40654                                 image_key: feature.properties.image_key,
40655                                 value: feature.properties.value,
40656                                 package: feature.properties.package,
40657                                 shape: feature.properties.shape
40658                             };
40659
40660                             // cache imageKey -> image_detections
40661                             if (!cache.forImageKey[d.image_key]) {
40662                                 cache.forImageKey[d.image_key] = [];
40663                             }
40664                             cache.forImageKey[d.image_key].push(d);
40665                             return false;    // because no `d` data worth loading into an rbush
40666
40667
40668                         // A map feature is a real world object that can be shown on a map. It could be any object
40669                         // recognized from images, manually added in images, or added on the map.
40670                         // Each map feature is a GeoJSON Point (located where the feature is)
40671                         } else if (which === 'map_features') {
40672                             d = {
40673                                 loc: loc,
40674                                 key: feature.properties.key,
40675                                 value: feature.properties.value,
40676                                 package: feature.properties.package,
40677                                 detections: feature.properties.detections
40678                             };
40679                         }
40680
40681                         return {
40682                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40683                         };
40684
40685                     }).filter(Boolean);
40686
40687                     if (cache.rtree && features) {
40688                         cache.rtree.load(features);
40689                     }
40690
40691                     if (data.features.length === maxResults) {  // more pages to load
40692                         cache.nextPage[tile.id] = nextPage + 1;
40693                         loadNextTilePage(which, currZoom, url, tile);
40694                     } else {
40695                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
40696                     }
40697
40698                     if (which === 'images' || which === 'sequences') {
40699                         dispatch$3.call('loadedImages');
40700                     } else if (which === 'map_features') {
40701                         dispatch$3.call('loadedSigns');
40702                     }
40703                 })
40704                 .catch(function() {
40705                     cache.loaded[id] = true;
40706                     delete cache.inflight[id];
40707                 });
40708         }
40709
40710         // extract links to pages of API results
40711         function parsePagination(links) {
40712             return links.split(',').map(function(rel) {
40713                 var elements = rel.split(';');
40714                 if (elements.length === 2) {
40715                     return [
40716                         /<(.+)>/.exec(elements[0])[1],
40717                         /rel="(.+)"/.exec(elements[1])[1]
40718                     ];
40719                 } else {
40720                     return ['',''];
40721                 }
40722             }).reduce(function(pagination, val) {
40723                 pagination[val[1]] = val[0];
40724                 return pagination;
40725             }, {});
40726         }
40727
40728
40729         // partition viewport into higher zoom tiles
40730         function partitionViewport(projection) {
40731             var z = geoScaleToZoom(projection.scale());
40732             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
40733             var tiler = utilTiler().zoomExtent([z2, z2]);
40734
40735             return tiler.getTiles(projection)
40736                 .map(function(tile) { return tile.extent; });
40737         }
40738
40739
40740         // no more than `limit` results per partition.
40741         function searchLimited(limit, projection, rtree) {
40742             limit = limit || 5;
40743
40744             return partitionViewport(projection)
40745                 .reduce(function(result, extent) {
40746                     var found = rtree.search(extent.bbox())
40747                         .slice(0, limit)
40748                         .map(function(d) { return d.data; });
40749
40750                     return (found.length ? result.concat(found) : result);
40751                 }, []);
40752         }
40753
40754
40755
40756         var serviceMapillary = {
40757
40758             init: function() {
40759                 if (!_mlyCache) {
40760                     this.reset();
40761                 }
40762
40763                 this.event = utilRebind(this, dispatch$3, 'on');
40764             },
40765
40766             reset: function() {
40767                 if (_mlyCache) {
40768                     Object.values(_mlyCache.images.inflight).forEach(abortRequest$2);
40769                     Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$2);
40770                     Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$2);
40771                     Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$2);
40772                 }
40773
40774                 _mlyCache = {
40775                     images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
40776                     image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
40777                     map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
40778                     sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
40779                 };
40780
40781                 _mlySelectedImage = null;
40782                 _mlyClicks = [];
40783             },
40784
40785
40786             images: function(projection) {
40787                 var limit = 5;
40788                 return searchLimited(limit, projection, _mlyCache.images.rtree);
40789             },
40790
40791
40792             signs: function(projection) {
40793                 var limit = 5;
40794                 return searchLimited(limit, projection, _mlyCache.map_features.rtree);
40795             },
40796
40797
40798             cachedImage: function(imageKey) {
40799                 return _mlyCache.images.forImageKey[imageKey];
40800             },
40801
40802
40803             sequences: function(projection) {
40804                 var viewport = projection.clipExtent();
40805                 var min = [viewport[0][0], viewport[1][1]];
40806                 var max = [viewport[1][0], viewport[0][1]];
40807                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40808                 var sequenceKeys = {};
40809
40810                 // all sequences for images in viewport
40811                 _mlyCache.images.rtree.search(bbox)
40812                     .forEach(function(d) {
40813                         var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
40814                         if (sequenceKey) {
40815                             sequenceKeys[sequenceKey] = true;
40816                         }
40817                     });
40818
40819                 // Return lineStrings for the sequences
40820                 return Object.keys(sequenceKeys).map(function(sequenceKey) {
40821                     return _mlyCache.sequences.lineString[sequenceKey];
40822                 });
40823             },
40824
40825
40826             signsSupported: function() {
40827                 return true;
40828             },
40829
40830
40831             loadImages: function(projection) {
40832                 loadTiles('images', apibase + 'images?', projection);
40833                 loadTiles('sequences', apibase + 'sequences?', projection);
40834             },
40835
40836
40837             loadSigns: function(projection) {
40838                 // if we are looking at signs, we'll actually need to fetch images too
40839                 loadTiles('images', apibase + 'images?', projection);
40840                 loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
40841                 loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
40842             },
40843
40844
40845             loadViewer: function(context) {
40846                 // add mly-wrapper
40847                 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
40848                     .data([0]);
40849
40850                 wrap.enter()
40851                     .append('div')
40852                     .attr('id', 'mly')
40853                     .attr('class', 'photo-wrapper mly-wrapper')
40854                     .classed('hide', true);
40855
40856                 // load mapillary-viewercss
40857                 d3_select('head').selectAll('#mapillary-viewercss')
40858                     .data([0])
40859                     .enter()
40860                     .append('link')
40861                     .attr('id', 'mapillary-viewercss')
40862                     .attr('rel', 'stylesheet')
40863                     .attr('href', context.asset(viewercss));
40864
40865                 // load mapillary-viewerjs
40866                 d3_select('head').selectAll('#mapillary-viewerjs')
40867                     .data([0])
40868                     .enter()
40869                     .append('script')
40870                     .attr('id', 'mapillary-viewerjs')
40871                     .attr('src', context.asset(viewerjs));
40872
40873                 // load mapillary signs sprite
40874                 var defs = context.container().select('defs');
40875                 defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
40876
40877                 // Register viewer resize handler
40878                 context.ui().photoviewer.on('resize', function() {
40879                     if (_mlyViewer) {
40880                         _mlyViewer.resize();
40881                     }
40882                 });
40883             },
40884
40885
40886             showViewer: function() {
40887                 var wrap = d3_select('#photoviewer')
40888                     .classed('hide', false);
40889
40890                 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
40891
40892                 if (isHidden && _mlyViewer) {
40893                     wrap
40894                         .selectAll('.photo-wrapper:not(.mly-wrapper)')
40895                         .classed('hide', true);
40896
40897                     wrap
40898                         .selectAll('.photo-wrapper.mly-wrapper')
40899                         .classed('hide', false);
40900
40901                     _mlyViewer.resize();
40902                 }
40903
40904                 return this;
40905             },
40906
40907
40908             hideViewer: function() {
40909                 _mlySelectedImage = null;
40910
40911                 if (!_mlyFallback && _mlyViewer) {
40912                     _mlyViewer.getComponent('sequence').stop();
40913                 }
40914
40915                 var viewer = d3_select('#photoviewer');
40916                 if (!viewer.empty()) viewer.datum(null);
40917
40918                 viewer
40919                     .classed('hide', true)
40920                     .selectAll('.photo-wrapper')
40921                     .classed('hide', true);
40922
40923                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40924                     .classed('currentView', false);
40925
40926                 return this.setStyles(null, true);
40927             },
40928
40929
40930             parsePagination: parsePagination,
40931
40932
40933             updateViewer: function(imageKey, context) {
40934                 if (!imageKey) return this;
40935
40936                 if (!_mlyViewer) {
40937                     this.initViewer(imageKey, context);
40938                 } else {
40939                     _mlyViewer.moveToKey(imageKey)
40940                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40941                 }
40942
40943                 return this;
40944             },
40945
40946
40947             initViewer: function(imageKey, context) {
40948                 var that = this;
40949                 if (window.Mapillary && imageKey) {
40950                     var opts = {
40951                         baseImageSize: 320,
40952                         component: {
40953                             cover: false,
40954                             keyboard: false,
40955                             tag: true
40956                         }
40957                     };
40958
40959                     // Disable components requiring WebGL support
40960                     if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
40961                         _mlyFallback = true;
40962                         opts.component = {
40963                             cover: false,
40964                             direction: false,
40965                             imagePlane: false,
40966                             keyboard: false,
40967                             mouse: false,
40968                             sequence: false,
40969                             tag: false,
40970                             image: true,        // fallback
40971                             navigation: true    // fallback
40972                         };
40973                     }
40974
40975                     _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
40976                     _mlyViewer.on('nodechanged', nodeChanged);
40977                     _mlyViewer.on('bearingchanged', bearingChanged);
40978                     _mlyViewer.moveToKey(imageKey)
40979                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40980                 }
40981
40982                 // nodeChanged: called after the viewer has changed images and is ready.
40983                 //
40984                 // There is some logic here to batch up clicks into a _mlyClicks array
40985                 // because the user might click on a lot of markers quickly and nodechanged
40986                 // may be called out of order asychronously.
40987                 //
40988                 // Clicks are added to the array in `selectedImage` and removed here.
40989                 //
40990                 function nodeChanged(node) {
40991                     if (!_mlyFallback) {
40992                         _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
40993                     }
40994
40995                     var clicks = _mlyClicks;
40996                     var index = clicks.indexOf(node.key);
40997                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
40998
40999                     if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
41000                         clicks.splice(index, 1);   // remove the click
41001                         // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
41002                         // one more time to update the detections and attribution..
41003                         if (node.key === selectedKey) {
41004                             that.selectImage(_mlySelectedImage, node.key, true);
41005                         }
41006                     } else {             // `nodechanged` initiated from the Mapillary viewer controls..
41007                         var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
41008                         context.map().centerEase(loc);
41009                         that.selectImage(undefined, node.key, true);
41010                     }
41011                 }
41012
41013                 function bearingChanged(e) {
41014                     dispatch$3.call('bearingChanged', undefined, e);
41015                 }
41016             },
41017
41018
41019             // Pass the image datum itself in `d` or the `imageKey` string.
41020             // This allows images to be selected from places that dont have access
41021             // to the full image datum (like the street signs layer or the js viewer)
41022             selectImage: function(d, imageKey, fromViewer) {
41023                 if (!d && imageKey) {
41024                     // If the user clicked on something that's not an image marker, we
41025                     // might get in here.. Cache lookup can fail, e.g. if the user
41026                     // clicked a streetsign, but images are loading slowly asynchronously.
41027                     // We'll try to carry on anyway if there is no datum.  There just
41028                     // might be a delay before user sees detections, captured_at, etc.
41029                     d = _mlyCache.images.forImageKey[imageKey];
41030                 }
41031
41032                 _mlySelectedImage = d;
41033                 var viewer = d3_select('#photoviewer');
41034                 if (!viewer.empty()) viewer.datum(d);
41035
41036                 imageKey = (d && d.key) || imageKey;
41037                 if (!fromViewer && imageKey) {
41038                     _mlyClicks.push(imageKey);
41039                 }
41040
41041                 this.setStyles(null, true);
41042
41043                 // if signs signs are shown, highlight the ones that appear in this image
41044                 d3_selectAll('.layer-mapillary-signs .icon-sign')
41045                     .classed('currentView', function(d) {
41046                         return d.detections.some(function(detection) {
41047                             return detection.image_key === imageKey;
41048                         });
41049                     });
41050
41051                 if (d) {
41052                     this.updateDetections(d);
41053                 }
41054
41055                 return this;
41056             },
41057
41058
41059             getSelectedImage: function() {
41060                 return _mlySelectedImage;
41061             },
41062
41063
41064             getSequenceKeyForImage: function(d) {
41065                 var imageKey = d && d.key;
41066                 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
41067             },
41068
41069
41070             // Updates the currently highlighted sequence and selected bubble.
41071             // Reset is only necessary when interacting with the viewport because
41072             // this implicitly changes the currently selected bubble/sequence
41073             setStyles: function(hovered, reset) {
41074                 if (reset) {  // reset all layers
41075                     d3_selectAll('.viewfield-group')
41076                         .classed('highlighted', false)
41077                         .classed('hovered', false)
41078                         .classed('currentView', false);
41079
41080                     d3_selectAll('.sequence')
41081                         .classed('highlighted', false)
41082                         .classed('currentView', false);
41083                 }
41084
41085                 var hoveredImageKey = hovered && hovered.key;
41086                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
41087                 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
41088                 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
41089
41090                 var viewer = d3_select('#photoviewer');
41091                 var selected = viewer.empty() ? undefined : viewer.datum();
41092                 var selectedImageKey = selected && selected.key;
41093                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
41094                 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
41095                 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
41096
41097                 // highlight sibling viewfields on either the selected or the hovered sequences
41098                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
41099
41100                 d3_selectAll('.layer-mapillary .viewfield-group')
41101                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
41102                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
41103                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
41104
41105                 d3_selectAll('.layer-mapillary .sequence')
41106                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
41107                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
41108
41109                 // update viewfields if needed
41110                 d3_selectAll('.viewfield-group .viewfield')
41111                     .attr('d', viewfieldPath);
41112
41113                 function viewfieldPath() {
41114                     var d = this.parentNode.__data__;
41115                     if (d.pano && d.key !== selectedImageKey) {
41116                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
41117                     } else {
41118                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
41119                     }
41120                 }
41121
41122                 return this;
41123             },
41124
41125
41126             updateDetections: function(d) {
41127                 if (!_mlyViewer || _mlyFallback) return;
41128
41129                 var imageKey = d && d.key;
41130                 if (!imageKey) return;
41131
41132                 var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
41133                 detections.forEach(function(data) {
41134                     var tag = makeTag(data);
41135                     if (tag) {
41136                         var tagComponent = _mlyViewer.getComponent('tag');
41137                         tagComponent.add([tag]);
41138                     }
41139                 });
41140
41141                 function makeTag(data) {
41142                     var valueParts = data.value.split('--');
41143                     if (valueParts.length !== 3) return;
41144
41145                     var text = valueParts[1].replace(/-/g, ' ');
41146                     var tag;
41147
41148                     // Currently only two shapes <Polygon|Point>
41149                     if (data.shape.type === 'Polygon') {
41150                         var polygonGeometry = new Mapillary
41151                             .TagComponent
41152                             .PolygonGeometry(data.shape.coordinates[0]);
41153
41154                         tag = new Mapillary.TagComponent.OutlineTag(
41155                             data.key,
41156                             polygonGeometry,
41157                             {
41158                                 text: text,
41159                                 textColor: 0xffff00,
41160                                 lineColor: 0xffff00,
41161                                 lineWidth: 2,
41162                                 fillColor: 0xffff00,
41163                                 fillOpacity: 0.3,
41164                             }
41165                         );
41166
41167                     } else if (data.shape.type === 'Point') {
41168                         var pointGeometry = new Mapillary
41169                             .TagComponent
41170                             .PointGeometry(data.shape.coordinates[0]);
41171
41172                         tag = new Mapillary.TagComponent.SpotTag(
41173                             data.key,
41174                             pointGeometry,
41175                             {
41176                                 text: text,
41177                                 color: 0xffff00,
41178                                 textColor: 0xffff00
41179                             }
41180                         );
41181                     }
41182
41183                     return tag;
41184                 }
41185             },
41186
41187
41188             cache: function() {
41189                 return _mlyCache;
41190             }
41191
41192         };
41193
41194         function validationIssue(attrs) {
41195             this.type = attrs.type;                // required - name of rule that created the issue (e.g. 'missing_tag')
41196             this.subtype = attrs.subtype;          // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
41197             this.severity = attrs.severity;        // required - 'warning' or 'error'
41198             this.message = attrs.message;          // required - function returning localized string
41199             this.reference = attrs.reference;      // optional - function(selection) to render reference information
41200             this.entityIds = attrs.entityIds;      // optional - array of IDs of entities involved in the issue
41201             this.loc = attrs.loc;                  // optional - [lon, lat] to zoom in on to see the issue
41202             this.data = attrs.data;                // optional - object containing extra data for the fixes
41203             this.fixes = attrs.fixes || [];              // optional - array of validationIssueFix objects
41204             this.hash = attrs.hash;                // optional - string to further differentiate the issue
41205
41206             this.id = generateID.apply(this);      // generated - see below
41207             this.autoFix = null;                   // generated - if autofix exists, will be set below
41208
41209             // A unique, deterministic string hash.
41210             // Issues with identical id values are considered identical.
41211             function generateID() {
41212                 var parts = [this.type];
41213
41214                 if (this.hash) {   // subclasses can pass in their own differentiator
41215                     parts.push(this.hash);
41216                 }
41217
41218                 if (this.subtype) {
41219                     parts.push(this.subtype);
41220                 }
41221
41222                 // include the entities this issue is for
41223                 // (sort them so the id is deterministic)
41224                 if (this.entityIds) {
41225                     var entityKeys = this.entityIds.slice().sort();
41226                     parts.push.apply(parts, entityKeys);
41227                 }
41228
41229                 return parts.join(':');
41230             }
41231
41232             this.extent = function(resolver) {
41233                 if (this.loc) {
41234                     return geoExtent(this.loc);
41235                 }
41236                 if (this.entityIds && this.entityIds.length) {
41237                     return this.entityIds.reduce(function(extent, entityId) {
41238                         return extent.extend(resolver.entity(entityId).extent(resolver));
41239                     }, geoExtent());
41240                 }
41241                 return null;
41242             };
41243
41244
41245             if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
41246                 for (var i = 0; i < this.fixes.length; i++) {
41247                     var fix = this.fixes[i];
41248                     fix.issue = this;
41249                     if (fix.autoArgs) {
41250                         this.autoFix = fix;
41251                     }
41252                 }
41253             }
41254         }
41255
41256
41257         function validationIssueFix(attrs) {
41258             this.title = attrs.title;                 // Required
41259             this.onClick = attrs.onClick;             // Required
41260             this.icon = attrs.icon;                   // Optional - shows 'iD-icon-wrench' if not set
41261             this.entityIds = attrs.entityIds || [];   // Optional - Used for hover-higlighting.
41262             this.autoArgs = attrs.autoArgs;           // Optional - pass [actions, annotation] arglist if this fix can automatically run
41263
41264             this.issue = null;    // Generated link - added by ValidationIssue constructor
41265         }
41266
41267         var buildRuleChecks = function() {
41268             return {
41269                 equals: function (equals) {
41270                     return function(tags) {
41271                         return Object.keys(equals).every(function(k) {
41272                             return equals[k] === tags[k];
41273                         });
41274                     };
41275                 },
41276                 notEquals: function (notEquals) {
41277                     return function(tags) {
41278                         return Object.keys(notEquals).some(function(k) {
41279                             return notEquals[k] !== tags[k];
41280                         });
41281                     };
41282                 },
41283                 absence: function(absence) {
41284                     return function(tags) {
41285                         return Object.keys(tags).indexOf(absence) === -1;
41286                     };
41287                 },
41288                 presence: function(presence) {
41289                     return function(tags) {
41290                         return Object.keys(tags).indexOf(presence) > -1;
41291                     };
41292                 },
41293                 greaterThan: function(greaterThan) {
41294                     var key = Object.keys(greaterThan)[0];
41295                     var value = greaterThan[key];
41296
41297                     return function(tags) {
41298                         return tags[key] > value;
41299                     };
41300                 },
41301                 greaterThanEqual: function(greaterThanEqual) {
41302                     var key = Object.keys(greaterThanEqual)[0];
41303                     var value = greaterThanEqual[key];
41304
41305                     return function(tags) {
41306                         return tags[key] >= value;
41307                     };
41308                 },
41309                 lessThan: function(lessThan) {
41310                     var key = Object.keys(lessThan)[0];
41311                     var value = lessThan[key];
41312
41313                     return function(tags) {
41314                         return tags[key] < value;
41315                     };
41316                 },
41317                 lessThanEqual: function(lessThanEqual) {
41318                     var key = Object.keys(lessThanEqual)[0];
41319                     var value = lessThanEqual[key];
41320
41321                     return function(tags) {
41322                         return tags[key] <= value;
41323                     };
41324                 },
41325                 positiveRegex: function(positiveRegex) {
41326                     var tagKey = Object.keys(positiveRegex)[0];
41327                     var expression = positiveRegex[tagKey].join('|');
41328                     var regex = new RegExp(expression);
41329
41330                     return function(tags) {
41331                         return regex.test(tags[tagKey]);
41332                     };
41333                 },
41334                 negativeRegex: function(negativeRegex) {
41335                     var tagKey = Object.keys(negativeRegex)[0];
41336                     var expression = negativeRegex[tagKey].join('|');
41337                     var regex = new RegExp(expression);
41338
41339                     return function(tags) {
41340                         return !regex.test(tags[tagKey]);
41341                     };
41342                 }
41343             };
41344         };
41345
41346         var buildLineKeys = function() {
41347             return {
41348                 highway: {
41349                     rest_area: true,
41350                     services: true
41351                 },
41352                 railway: {
41353                     roundhouse: true,
41354                     station: true,
41355                     traverser: true,
41356                     turntable: true,
41357                     wash: true
41358                 }
41359             };
41360         };
41361
41362         var serviceMapRules = {
41363             init: function() {
41364                 this._ruleChecks  = buildRuleChecks();
41365                 this._validationRules = [];
41366                 this._areaKeys = osmAreaKeys;
41367                 this._lineKeys = buildLineKeys();
41368             },
41369
41370             // list of rules only relevant to tag checks...
41371             filterRuleChecks: function(selector) {
41372                 var _ruleChecks = this._ruleChecks;
41373                 return Object.keys(selector).reduce(function(rules, key) {
41374                     if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
41375                         rules.push(_ruleChecks[key](selector[key]));
41376                     }
41377                     return rules;
41378                 }, []);
41379             },
41380
41381             // builds tagMap from mapcss-parse selector object...
41382             buildTagMap: function(selector) {
41383                 var getRegexValues = function(regexes) {
41384                     return regexes.map(function(regex) {
41385                         return regex.replace(/\$|\^/g, '');
41386                     });
41387                 };
41388
41389                 var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
41390                     var values;
41391                     var isRegex = /regex/gi.test(key);
41392                     var isEqual = /equals/gi.test(key);
41393
41394                     if (isRegex || isEqual) {
41395                         Object.keys(selector[key]).forEach(function(selectorKey) {
41396                             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
41397
41398                             if (expectedTags.hasOwnProperty(selectorKey)) {
41399                                 values = values.concat(expectedTags[selectorKey]);
41400                             }
41401
41402                             expectedTags[selectorKey] = values;
41403                         });
41404
41405                     } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
41406                         var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
41407
41408                         values = [selector[key][tagKey]];
41409
41410                         if (expectedTags.hasOwnProperty(tagKey)) {
41411                             values = values.concat(expectedTags[tagKey]);
41412                         }
41413
41414                         expectedTags[tagKey] = values;
41415                     }
41416
41417                     return expectedTags;
41418                 }, {});
41419
41420                 return tagMap;
41421             },
41422
41423             // inspired by osmWay#isArea()
41424             inferGeometry: function(tagMap) {
41425                 var _lineKeys = this._lineKeys;
41426                 var _areaKeys = this._areaKeys;
41427
41428                 var isAreaKeyBlackList = function(key) {
41429                     return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
41430                 };
41431                 var isLineKeysWhiteList = function(key) {
41432                     return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
41433                 };
41434
41435                 if (tagMap.hasOwnProperty('area')) {
41436                     if (tagMap.area.indexOf('yes') > -1) {
41437                         return 'area';
41438                     }
41439                     if (tagMap.area.indexOf('no') > -1) {
41440                         return 'line';
41441                     }
41442                 }
41443
41444                 for (var key in tagMap) {
41445                     if (key in _areaKeys && !isAreaKeyBlackList(key)) {
41446                         return 'area';
41447                     }
41448                     if (key in _lineKeys && isLineKeysWhiteList(key)) {
41449                         return 'area';
41450                     }
41451                 }
41452
41453                 return 'line';
41454             },
41455
41456             // adds from mapcss-parse selector check...
41457             addRule: function(selector) {
41458                 var rule = {
41459                     // checks relevant to mapcss-selector
41460                     checks: this.filterRuleChecks(selector),
41461                     // true if all conditions for a tag error are true..
41462                     matches: function(entity) {
41463                         return this.checks.every(function(check) {
41464                             return check(entity.tags);
41465                         });
41466                     },
41467                     // borrowed from Way#isArea()
41468                     inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
41469                     geometryMatches: function(entity, graph) {
41470                         if (entity.type === 'node' || entity.type === 'relation') {
41471                             return selector.geometry === entity.type;
41472                         } else if (entity.type === 'way') {
41473                             return this.inferredGeometry === entity.geometry(graph);
41474                         }
41475                     },
41476                     // when geometries match and tag matches are present, return a warning...
41477                     findIssues: function (entity, graph, issues) {
41478                         if (this.geometryMatches(entity, graph) && this.matches(entity)) {
41479                             var severity = Object.keys(selector).indexOf('error') > -1
41480                                     ? 'error'
41481                                     : 'warning';
41482                             var message = selector[severity];
41483                             issues.push(new validationIssue({
41484                                 type: 'maprules',
41485                                 severity: severity,
41486                                 message: function() {
41487                                     return message;
41488                                 },
41489                                 entityIds: [entity.id]
41490                             }));
41491                         }
41492                     }
41493                 };
41494                 this._validationRules.push(rule);
41495             },
41496
41497             clearRules: function() { this._validationRules = []; },
41498
41499             // returns validationRules...
41500             validationRules: function() { return this._validationRules; },
41501
41502             // returns ruleChecks
41503             ruleChecks: function() { return this._ruleChecks; }
41504         };
41505
41506         var apibase$1 = 'https://nominatim.openstreetmap.org/';
41507         var _inflight = {};
41508         var _nominatimCache;
41509
41510
41511         var serviceNominatim = {
41512
41513             init: function() {
41514                 _inflight = {};
41515                 _nominatimCache = rbush_1();
41516             },
41517
41518             reset: function() {
41519                 Object.values(_inflight).forEach(function(controller) { controller.abort(); });
41520                 _inflight = {};
41521                 _nominatimCache = rbush_1();
41522             },
41523
41524
41525             countryCode: function (location, callback) {
41526                 this.reverse(location, function(err, result) {
41527                     if (err) {
41528                         return callback(err);
41529                     } else if (result.address) {
41530                         return callback(null, result.address.country_code);
41531                     } else {
41532                         return callback('Unable to geocode', null);
41533                     }
41534                 });
41535             },
41536
41537
41538             reverse: function (loc, callback) {
41539                 var cached = _nominatimCache.search(
41540                     { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
41541                 );
41542
41543                 if (cached.length > 0) {
41544                     if (callback) callback(null, cached[0].data);
41545                     return;
41546                 }
41547
41548                 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
41549                 var url = apibase$1 + 'reverse?' + utilQsString(params);
41550
41551                 if (_inflight[url]) return;
41552                 var controller = new AbortController();
41553                 _inflight[url] = controller;
41554
41555                 d3_json(url, { signal: controller.signal })
41556                     .then(function(result) {
41557                         delete _inflight[url];
41558                         if (result && result.error) {
41559                             throw new Error(result.error);
41560                         }
41561                         var extent = geoExtent(loc).padByMeters(200);
41562                         _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
41563                         if (callback) callback(null, result);
41564                     })
41565                     .catch(function(err) {
41566                         delete _inflight[url];
41567                         if (err.name === 'AbortError') return;
41568                         if (callback) callback(err.message);
41569                     });
41570             },
41571
41572
41573             search: function (val, callback) {
41574                 var searchVal = encodeURIComponent(val);
41575                 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
41576
41577                 if (_inflight[url]) return;
41578                 var controller = new AbortController();
41579                 _inflight[url] = controller;
41580
41581                 d3_json(url, { signal: controller.signal })
41582                     .then(function(result) {
41583                         delete _inflight[url];
41584                         if (result && result.error) {
41585                             throw new Error(result.error);
41586                         }
41587                         if (callback) callback(null, result);
41588                     })
41589                     .catch(function(err) {
41590                         delete _inflight[url];
41591                         if (err.name === 'AbortError') return;
41592                         if (callback) callback(err.message);
41593                     });
41594             }
41595
41596         };
41597
41598         var apibase$2 = 'https://openstreetcam.org';
41599         var maxResults$1 = 1000;
41600         var tileZoom$1 = 14;
41601         var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
41602         var dispatch$4 = dispatch('loadedImages');
41603         var imgZoom = d3_zoom()
41604             .extent([[0, 0], [320, 240]])
41605             .translateExtent([[0, 0], [320, 240]])
41606             .scaleExtent([1, 15])
41607             .on('zoom', zoomPan);
41608         var _oscCache;
41609         var _oscSelectedImage;
41610
41611
41612         function abortRequest$3(controller) {
41613             controller.abort();
41614         }
41615
41616
41617         function maxPageAtZoom$1(z) {
41618             if (z < 15)   return 2;
41619             if (z === 15) return 5;
41620             if (z === 16) return 10;
41621             if (z === 17) return 20;
41622             if (z === 18) return 40;
41623             if (z > 18)   return 80;
41624         }
41625
41626
41627         function loadTiles$1(which, url, projection) {
41628             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41629             var tiles = tiler$3.getTiles(projection);
41630
41631             // abort inflight requests that are no longer needed
41632             var cache = _oscCache[which];
41633             Object.keys(cache.inflight).forEach(function(k) {
41634                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
41635                 if (!wanted) {
41636                     abortRequest$3(cache.inflight[k]);
41637                     delete cache.inflight[k];
41638                 }
41639             });
41640
41641             tiles.forEach(function(tile) {
41642                 loadNextTilePage$1(which, currZoom, url, tile);
41643             });
41644         }
41645
41646
41647         function loadNextTilePage$1(which, currZoom, url, tile) {
41648             var cache = _oscCache[which];
41649             var bbox = tile.extent.bbox();
41650             var maxPages = maxPageAtZoom$1(currZoom);
41651             var nextPage = cache.nextPage[tile.id] || 1;
41652             var params = utilQsString({
41653                 ipp: maxResults$1,
41654                 page: nextPage,
41655                 // client_id: clientId,
41656                 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
41657                 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
41658             }, true);
41659
41660             if (nextPage > maxPages) return;
41661
41662             var id = tile.id + ',' + String(nextPage);
41663             if (cache.loaded[id] || cache.inflight[id]) return;
41664
41665             var controller = new AbortController();
41666             cache.inflight[id] = controller;
41667
41668             var options = {
41669                 method: 'POST',
41670                 signal: controller.signal,
41671                 body: params,
41672                 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
41673             };
41674
41675             d3_json(url, options)
41676                 .then(function(data) {
41677                     cache.loaded[id] = true;
41678                     delete cache.inflight[id];
41679                     if (!data || !data.currentPageItems || !data.currentPageItems.length) {
41680                         throw new Error('No Data');
41681                     }
41682
41683                     var features = data.currentPageItems.map(function(item) {
41684                         var loc = [+item.lng, +item.lat];
41685                         var d;
41686
41687                         if (which === 'images') {
41688                             d = {
41689                                 loc: loc,
41690                                 key: item.id,
41691                                 ca: +item.heading,
41692                                 captured_at: (item.shot_date || item.date_added),
41693                                 captured_by: item.username,
41694                                 imagePath: item.lth_name,
41695                                 sequence_id: item.sequence_id,
41696                                 sequence_index: +item.sequence_index
41697                             };
41698
41699                             // cache sequence info
41700                             var seq = _oscCache.sequences[d.sequence_id];
41701                             if (!seq) {
41702                                 seq = { rotation: 0, images: [] };
41703                                 _oscCache.sequences[d.sequence_id] = seq;
41704                             }
41705                             seq.images[d.sequence_index] = d;
41706                         }
41707
41708                         return {
41709                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
41710                         };
41711                     });
41712
41713                     cache.rtree.load(features);
41714
41715                     if (data.currentPageItems.length === maxResults$1) {  // more pages to load
41716                         cache.nextPage[tile.id] = nextPage + 1;
41717                         loadNextTilePage$1(which, currZoom, url, tile);
41718                     } else {
41719                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
41720                     }
41721
41722                     if (which === 'images') {
41723                         dispatch$4.call('loadedImages');
41724                     }
41725                 })
41726                 .catch(function() {
41727                     cache.loaded[id] = true;
41728                     delete cache.inflight[id];
41729                 });
41730         }
41731
41732
41733         // partition viewport into higher zoom tiles
41734         function partitionViewport$1(projection) {
41735             var z = geoScaleToZoom(projection.scale());
41736             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
41737             var tiler = utilTiler().zoomExtent([z2, z2]);
41738
41739             return tiler.getTiles(projection)
41740                 .map(function(tile) { return tile.extent; });
41741         }
41742
41743
41744         // no more than `limit` results per partition.
41745         function searchLimited$1(limit, projection, rtree) {
41746             limit = limit || 5;
41747
41748             return partitionViewport$1(projection)
41749                 .reduce(function(result, extent) {
41750                     var found = rtree.search(extent.bbox())
41751                         .slice(0, limit)
41752                         .map(function(d) { return d.data; });
41753
41754                     return (found.length ? result.concat(found) : result);
41755                 }, []);
41756         }
41757
41758
41759         function zoomPan() {
41760             var t = event.transform;
41761             d3_select('#photoviewer .osc-image-wrap')
41762                 .call(utilSetTransform, t.x, t.y, t.k);
41763         }
41764
41765
41766         var serviceOpenstreetcam = {
41767
41768             init: function() {
41769                 if (!_oscCache) {
41770                     this.reset();
41771                 }
41772
41773                 this.event = utilRebind(this, dispatch$4, 'on');
41774             },
41775
41776             reset: function() {
41777                 if (_oscCache) {
41778                     Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
41779                 }
41780
41781                 _oscCache = {
41782                     images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
41783                     sequences: {}
41784                 };
41785
41786                 _oscSelectedImage = null;
41787             },
41788
41789
41790             images: function(projection) {
41791                 var limit = 5;
41792                 return searchLimited$1(limit, projection, _oscCache.images.rtree);
41793             },
41794
41795
41796             sequences: function(projection) {
41797                 var viewport = projection.clipExtent();
41798                 var min = [viewport[0][0], viewport[1][1]];
41799                 var max = [viewport[1][0], viewport[0][1]];
41800                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
41801                 var sequenceKeys = {};
41802
41803                 // all sequences for images in viewport
41804                 _oscCache.images.rtree.search(bbox)
41805                     .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
41806
41807                 // make linestrings from those sequences
41808                 var lineStrings = [];
41809                 Object.keys(sequenceKeys)
41810                     .forEach(function(sequenceKey) {
41811                         var seq = _oscCache.sequences[sequenceKey];
41812                         var images = seq && seq.images;
41813                         if (images) {
41814                             lineStrings.push({
41815                                 type: 'LineString',
41816                                 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
41817                                 properties: { key: sequenceKey }
41818                             });
41819                         }
41820                     });
41821                 return lineStrings;
41822             },
41823
41824
41825             loadImages: function(projection) {
41826                 var url = apibase$2 + '/1.0/list/nearby-photos/';
41827                 loadTiles$1('images', url, projection);
41828             },
41829
41830
41831             loadViewer: function(context) {
41832                 var that = this;
41833
41834                 // add osc-wrapper
41835                 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
41836                     .data([0]);
41837
41838                 var wrapEnter = wrap.enter()
41839                     .append('div')
41840                     .attr('class', 'photo-wrapper osc-wrapper')
41841                     .classed('hide', true)
41842                     .call(imgZoom)
41843                     .on('dblclick.zoom', null);
41844
41845                 wrapEnter
41846                     .append('div')
41847                     .attr('class', 'photo-attribution fillD');
41848
41849                 var controlsEnter = wrapEnter
41850                     .append('div')
41851                     .attr('class', 'photo-controls-wrap')
41852                     .append('div')
41853                     .attr('class', 'photo-controls');
41854
41855                 controlsEnter
41856                     .append('button')
41857                     .on('click.back', step(-1))
41858                     .text('◄');
41859
41860                 controlsEnter
41861                     .append('button')
41862                     .on('click.rotate-ccw', rotate(-90))
41863                     .text('⤿');
41864
41865                 controlsEnter
41866                     .append('button')
41867                     .on('click.rotate-cw', rotate(90))
41868                     .text('⤾');
41869
41870                 controlsEnter
41871                     .append('button')
41872                     .on('click.forward', step(1))
41873                     .text('►');
41874
41875                 wrapEnter
41876                     .append('div')
41877                     .attr('class', 'osc-image-wrap');
41878
41879
41880                 // Register viewer resize handler
41881                 context.ui().photoviewer.on('resize', function(dimensions) {
41882                     imgZoom = d3_zoom()
41883                         .extent([[0, 0], dimensions])
41884                         .translateExtent([[0, 0], dimensions])
41885                         .scaleExtent([1, 15])
41886                         .on('zoom', zoomPan);
41887                 });
41888
41889
41890                 function rotate(deg) {
41891                     return function() {
41892                         if (!_oscSelectedImage) return;
41893                         var sequenceKey = _oscSelectedImage.sequence_id;
41894                         var sequence = _oscCache.sequences[sequenceKey];
41895                         if (!sequence) return;
41896
41897                         var r = sequence.rotation || 0;
41898                         r += deg;
41899
41900                         if (r > 180) r -= 360;
41901                         if (r < -180) r += 360;
41902                         sequence.rotation = r;
41903
41904                         var wrap = d3_select('#photoviewer .osc-wrapper');
41905
41906                         wrap
41907                             .transition()
41908                             .duration(100)
41909                             .call(imgZoom.transform, identity$8);
41910
41911                         wrap.selectAll('.osc-image')
41912                             .transition()
41913                             .duration(100)
41914                             .style('transform', 'rotate(' + r + 'deg)');
41915                     };
41916                 }
41917
41918                 function step(stepBy) {
41919                     return function() {
41920                         if (!_oscSelectedImage) return;
41921                         var sequenceKey = _oscSelectedImage.sequence_id;
41922                         var sequence = _oscCache.sequences[sequenceKey];
41923                         if (!sequence) return;
41924
41925                         var nextIndex = _oscSelectedImage.sequence_index + stepBy;
41926                         var nextImage = sequence.images[nextIndex];
41927                         if (!nextImage) return;
41928
41929                         context.map().centerEase(nextImage.loc);
41930
41931                         that
41932                             .selectImage(nextImage)
41933                             .updateViewer(nextImage);
41934                     };
41935                 }
41936             },
41937
41938
41939             showViewer: function() {
41940                 var viewer = d3_select('#photoviewer')
41941                     .classed('hide', false);
41942
41943                 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
41944
41945                 if (isHidden) {
41946                     viewer
41947                         .selectAll('.photo-wrapper:not(.osc-wrapper)')
41948                         .classed('hide', true);
41949
41950                     viewer
41951                         .selectAll('.photo-wrapper.osc-wrapper')
41952                         .classed('hide', false);
41953                 }
41954
41955                 return this;
41956             },
41957
41958
41959             hideViewer: function() {
41960                 _oscSelectedImage = null;
41961
41962                 var viewer = d3_select('#photoviewer');
41963                 if (!viewer.empty()) viewer.datum(null);
41964
41965                 viewer
41966                     .classed('hide', true)
41967                     .selectAll('.photo-wrapper')
41968                     .classed('hide', true);
41969
41970                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
41971                     .classed('currentView', false);
41972
41973                 return this.setStyles(null, true);
41974             },
41975
41976
41977             updateViewer: function(d) {
41978                 var wrap = d3_select('#photoviewer .osc-wrapper');
41979                 var imageWrap = wrap.selectAll('.osc-image-wrap');
41980                 var attribution = wrap.selectAll('.photo-attribution').html('');
41981
41982                 wrap
41983                     .transition()
41984                     .duration(100)
41985                     .call(imgZoom.transform, identity$8);
41986
41987                 imageWrap
41988                     .selectAll('.osc-image')
41989                     .remove();
41990
41991                 if (d) {
41992                     var sequence = _oscCache.sequences[d.sequence_id];
41993                     var r = (sequence && sequence.rotation) || 0;
41994
41995                     imageWrap
41996                         .append('img')
41997                         .attr('class', 'osc-image')
41998                         .attr('src', apibase$2 + '/' + d.imagePath)
41999                         .style('transform', 'rotate(' + r + 'deg)');
42000
42001                     if (d.captured_by) {
42002                         attribution
42003                             .append('a')
42004                             .attr('class', 'captured_by')
42005                             .attr('target', '_blank')
42006                             .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
42007                             .text('@' + d.captured_by);
42008
42009                         attribution
42010                             .append('span')
42011                             .text('|');
42012                     }
42013
42014                     if (d.captured_at) {
42015                         attribution
42016                             .append('span')
42017                             .attr('class', 'captured_at')
42018                             .text(localeDateString(d.captured_at));
42019
42020                         attribution
42021                             .append('span')
42022                             .text('|');
42023                     }
42024
42025                     attribution
42026                         .append('a')
42027                         .attr('class', 'image-link')
42028                         .attr('target', '_blank')
42029                         .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
42030                         .text('openstreetcam.org');
42031                 }
42032
42033                 return this;
42034
42035
42036                 function localeDateString(s) {
42037                     if (!s) return null;
42038                     var detected = utilDetect();
42039                     var options = { day: 'numeric', month: 'short', year: 'numeric' };
42040                     var d = new Date(s);
42041                     if (isNaN(d.getTime())) return null;
42042                     return d.toLocaleDateString(detected.locale, options);
42043                 }
42044             },
42045
42046
42047             selectImage: function(d) {
42048                 _oscSelectedImage = d;
42049                 var viewer = d3_select('#photoviewer');
42050                 if (!viewer.empty()) viewer.datum(d);
42051
42052                 this.setStyles(null, true);
42053
42054                 d3_selectAll('.icon-sign')
42055                     .classed('currentView', false);
42056
42057                 return this;
42058             },
42059
42060
42061             getSelectedImage: function() {
42062                 return _oscSelectedImage;
42063             },
42064
42065
42066             getSequenceKeyForImage: function(d) {
42067                 return d && d.sequence_id;
42068             },
42069
42070
42071             // Updates the currently highlighted sequence and selected bubble.
42072             // Reset is only necessary when interacting with the viewport because
42073             // this implicitly changes the currently selected bubble/sequence
42074             setStyles: function(hovered, reset) {
42075                 if (reset) {  // reset all layers
42076                     d3_selectAll('.viewfield-group')
42077                         .classed('highlighted', false)
42078                         .classed('hovered', false)
42079                         .classed('currentView', false);
42080
42081                     d3_selectAll('.sequence')
42082                         .classed('highlighted', false)
42083                         .classed('currentView', false);
42084                 }
42085
42086                 var hoveredImageKey = hovered && hovered.key;
42087                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
42088                 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
42089                 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
42090
42091                 var viewer = d3_select('#photoviewer');
42092                 var selected = viewer.empty() ? undefined : viewer.datum();
42093                 var selectedImageKey = selected && selected.key;
42094                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
42095                 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
42096                 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
42097
42098                 // highlight sibling viewfields on either the selected or the hovered sequences
42099                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
42100
42101                 d3_selectAll('.layer-openstreetcam .viewfield-group')
42102                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
42103                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
42104                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
42105
42106                 d3_selectAll('.layer-openstreetcam .sequence')
42107                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
42108                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
42109
42110                 // update viewfields if needed
42111                 d3_selectAll('.viewfield-group .viewfield')
42112                     .attr('d', viewfieldPath);
42113
42114                 function viewfieldPath() {
42115                     var d = this.parentNode.__data__;
42116                     if (d.pano && d.key !== selectedImageKey) {
42117                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
42118                     } else {
42119                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
42120                     }
42121                 }
42122
42123                 return this;
42124             },
42125
42126
42127             cache: function() {
42128                 return _oscCache;
42129             }
42130
42131         };
42132
42133         /**
42134          * Checks if `value` is the
42135          * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
42136          * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
42137          *
42138          * @static
42139          * @memberOf _
42140          * @since 0.1.0
42141          * @category Lang
42142          * @param {*} value The value to check.
42143          * @returns {boolean} Returns `true` if `value` is an object, else `false`.
42144          * @example
42145          *
42146          * _.isObject({});
42147          * // => true
42148          *
42149          * _.isObject([1, 2, 3]);
42150          * // => true
42151          *
42152          * _.isObject(_.noop);
42153          * // => true
42154          *
42155          * _.isObject(null);
42156          * // => false
42157          */
42158         function isObject$1(value) {
42159           var type = typeof value;
42160           return value != null && (type == 'object' || type == 'function');
42161         }
42162
42163         /** Detect free variable `global` from Node.js. */
42164         var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
42165
42166         /** Detect free variable `self`. */
42167         var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
42168
42169         /** Used as a reference to the global object. */
42170         var root$3 = freeGlobal || freeSelf || Function('return this')();
42171
42172         /**
42173          * Gets the timestamp of the number of milliseconds that have elapsed since
42174          * the Unix epoch (1 January 1970 00:00:00 UTC).
42175          *
42176          * @static
42177          * @memberOf _
42178          * @since 2.4.0
42179          * @category Date
42180          * @returns {number} Returns the timestamp.
42181          * @example
42182          *
42183          * _.defer(function(stamp) {
42184          *   console.log(_.now() - stamp);
42185          * }, _.now());
42186          * // => Logs the number of milliseconds it took for the deferred invocation.
42187          */
42188         var now$1 = function() {
42189           return root$3.Date.now();
42190         };
42191
42192         /** Built-in value references. */
42193         var Symbol$1 = root$3.Symbol;
42194
42195         /** Used for built-in method references. */
42196         var objectProto = Object.prototype;
42197
42198         /** Used to check objects for own properties. */
42199         var hasOwnProperty$2 = objectProto.hasOwnProperty;
42200
42201         /**
42202          * Used to resolve the
42203          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42204          * of values.
42205          */
42206         var nativeObjectToString = objectProto.toString;
42207
42208         /** Built-in value references. */
42209         var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
42210
42211         /**
42212          * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
42213          *
42214          * @private
42215          * @param {*} value The value to query.
42216          * @returns {string} Returns the raw `toStringTag`.
42217          */
42218         function getRawTag(value) {
42219           var isOwn = hasOwnProperty$2.call(value, symToStringTag),
42220               tag = value[symToStringTag];
42221
42222           try {
42223             value[symToStringTag] = undefined;
42224             var unmasked = true;
42225           } catch (e) {}
42226
42227           var result = nativeObjectToString.call(value);
42228           if (unmasked) {
42229             if (isOwn) {
42230               value[symToStringTag] = tag;
42231             } else {
42232               delete value[symToStringTag];
42233             }
42234           }
42235           return result;
42236         }
42237
42238         /** Used for built-in method references. */
42239         var objectProto$1 = Object.prototype;
42240
42241         /**
42242          * Used to resolve the
42243          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42244          * of values.
42245          */
42246         var nativeObjectToString$1 = objectProto$1.toString;
42247
42248         /**
42249          * Converts `value` to a string using `Object.prototype.toString`.
42250          *
42251          * @private
42252          * @param {*} value The value to convert.
42253          * @returns {string} Returns the converted string.
42254          */
42255         function objectToString$1(value) {
42256           return nativeObjectToString$1.call(value);
42257         }
42258
42259         /** `Object#toString` result references. */
42260         var nullTag = '[object Null]',
42261             undefinedTag = '[object Undefined]';
42262
42263         /** Built-in value references. */
42264         var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
42265
42266         /**
42267          * The base implementation of `getTag` without fallbacks for buggy environments.
42268          *
42269          * @private
42270          * @param {*} value The value to query.
42271          * @returns {string} Returns the `toStringTag`.
42272          */
42273         function baseGetTag(value) {
42274           if (value == null) {
42275             return value === undefined ? undefinedTag : nullTag;
42276           }
42277           return (symToStringTag$1 && symToStringTag$1 in Object(value))
42278             ? getRawTag(value)
42279             : objectToString$1(value);
42280         }
42281
42282         /**
42283          * Checks if `value` is object-like. A value is object-like if it's not `null`
42284          * and has a `typeof` result of "object".
42285          *
42286          * @static
42287          * @memberOf _
42288          * @since 4.0.0
42289          * @category Lang
42290          * @param {*} value The value to check.
42291          * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
42292          * @example
42293          *
42294          * _.isObjectLike({});
42295          * // => true
42296          *
42297          * _.isObjectLike([1, 2, 3]);
42298          * // => true
42299          *
42300          * _.isObjectLike(_.noop);
42301          * // => false
42302          *
42303          * _.isObjectLike(null);
42304          * // => false
42305          */
42306         function isObjectLike(value) {
42307           return value != null && typeof value == 'object';
42308         }
42309
42310         /** `Object#toString` result references. */
42311         var symbolTag = '[object Symbol]';
42312
42313         /**
42314          * Checks if `value` is classified as a `Symbol` primitive or object.
42315          *
42316          * @static
42317          * @memberOf _
42318          * @since 4.0.0
42319          * @category Lang
42320          * @param {*} value The value to check.
42321          * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
42322          * @example
42323          *
42324          * _.isSymbol(Symbol.iterator);
42325          * // => true
42326          *
42327          * _.isSymbol('abc');
42328          * // => false
42329          */
42330         function isSymbol$2(value) {
42331           return typeof value == 'symbol' ||
42332             (isObjectLike(value) && baseGetTag(value) == symbolTag);
42333         }
42334
42335         /** Used as references for various `Number` constants. */
42336         var NAN = 0 / 0;
42337
42338         /** Used to match leading and trailing whitespace. */
42339         var reTrim = /^\s+|\s+$/g;
42340
42341         /** Used to detect bad signed hexadecimal string values. */
42342         var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
42343
42344         /** Used to detect binary string values. */
42345         var reIsBinary = /^0b[01]+$/i;
42346
42347         /** Used to detect octal string values. */
42348         var reIsOctal = /^0o[0-7]+$/i;
42349
42350         /** Built-in method references without a dependency on `root`. */
42351         var freeParseInt = parseInt;
42352
42353         /**
42354          * Converts `value` to a number.
42355          *
42356          * @static
42357          * @memberOf _
42358          * @since 4.0.0
42359          * @category Lang
42360          * @param {*} value The value to process.
42361          * @returns {number} Returns the number.
42362          * @example
42363          *
42364          * _.toNumber(3.2);
42365          * // => 3.2
42366          *
42367          * _.toNumber(Number.MIN_VALUE);
42368          * // => 5e-324
42369          *
42370          * _.toNumber(Infinity);
42371          * // => Infinity
42372          *
42373          * _.toNumber('3.2');
42374          * // => 3.2
42375          */
42376         function toNumber(value) {
42377           if (typeof value == 'number') {
42378             return value;
42379           }
42380           if (isSymbol$2(value)) {
42381             return NAN;
42382           }
42383           if (isObject$1(value)) {
42384             var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
42385             value = isObject$1(other) ? (other + '') : other;
42386           }
42387           if (typeof value != 'string') {
42388             return value === 0 ? value : +value;
42389           }
42390           value = value.replace(reTrim, '');
42391           var isBinary = reIsBinary.test(value);
42392           return (isBinary || reIsOctal.test(value))
42393             ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
42394             : (reIsBadHex.test(value) ? NAN : +value);
42395         }
42396
42397         /** Error message constants. */
42398         var FUNC_ERROR_TEXT = 'Expected a function';
42399
42400         /* Built-in method references for those with the same name as other `lodash` methods. */
42401         var nativeMax = Math.max,
42402             nativeMin = Math.min;
42403
42404         /**
42405          * Creates a debounced function that delays invoking `func` until after `wait`
42406          * milliseconds have elapsed since the last time the debounced function was
42407          * invoked. The debounced function comes with a `cancel` method to cancel
42408          * delayed `func` invocations and a `flush` method to immediately invoke them.
42409          * Provide `options` to indicate whether `func` should be invoked on the
42410          * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
42411          * with the last arguments provided to the debounced function. Subsequent
42412          * calls to the debounced function return the result of the last `func`
42413          * invocation.
42414          *
42415          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42416          * invoked on the trailing edge of the timeout only if the debounced function
42417          * is invoked more than once during the `wait` timeout.
42418          *
42419          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42420          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42421          *
42422          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42423          * for details over the differences between `_.debounce` and `_.throttle`.
42424          *
42425          * @static
42426          * @memberOf _
42427          * @since 0.1.0
42428          * @category Function
42429          * @param {Function} func The function to debounce.
42430          * @param {number} [wait=0] The number of milliseconds to delay.
42431          * @param {Object} [options={}] The options object.
42432          * @param {boolean} [options.leading=false]
42433          *  Specify invoking on the leading edge of the timeout.
42434          * @param {number} [options.maxWait]
42435          *  The maximum time `func` is allowed to be delayed before it's invoked.
42436          * @param {boolean} [options.trailing=true]
42437          *  Specify invoking on the trailing edge of the timeout.
42438          * @returns {Function} Returns the new debounced function.
42439          * @example
42440          *
42441          * // Avoid costly calculations while the window size is in flux.
42442          * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
42443          *
42444          * // Invoke `sendMail` when clicked, debouncing subsequent calls.
42445          * jQuery(element).on('click', _.debounce(sendMail, 300, {
42446          *   'leading': true,
42447          *   'trailing': false
42448          * }));
42449          *
42450          * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
42451          * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
42452          * var source = new EventSource('/stream');
42453          * jQuery(source).on('message', debounced);
42454          *
42455          * // Cancel the trailing debounced invocation.
42456          * jQuery(window).on('popstate', debounced.cancel);
42457          */
42458         function debounce(func, wait, options) {
42459           var lastArgs,
42460               lastThis,
42461               maxWait,
42462               result,
42463               timerId,
42464               lastCallTime,
42465               lastInvokeTime = 0,
42466               leading = false,
42467               maxing = false,
42468               trailing = true;
42469
42470           if (typeof func != 'function') {
42471             throw new TypeError(FUNC_ERROR_TEXT);
42472           }
42473           wait = toNumber(wait) || 0;
42474           if (isObject$1(options)) {
42475             leading = !!options.leading;
42476             maxing = 'maxWait' in options;
42477             maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
42478             trailing = 'trailing' in options ? !!options.trailing : trailing;
42479           }
42480
42481           function invokeFunc(time) {
42482             var args = lastArgs,
42483                 thisArg = lastThis;
42484
42485             lastArgs = lastThis = undefined;
42486             lastInvokeTime = time;
42487             result = func.apply(thisArg, args);
42488             return result;
42489           }
42490
42491           function leadingEdge(time) {
42492             // Reset any `maxWait` timer.
42493             lastInvokeTime = time;
42494             // Start the timer for the trailing edge.
42495             timerId = setTimeout(timerExpired, wait);
42496             // Invoke the leading edge.
42497             return leading ? invokeFunc(time) : result;
42498           }
42499
42500           function remainingWait(time) {
42501             var timeSinceLastCall = time - lastCallTime,
42502                 timeSinceLastInvoke = time - lastInvokeTime,
42503                 timeWaiting = wait - timeSinceLastCall;
42504
42505             return maxing
42506               ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
42507               : timeWaiting;
42508           }
42509
42510           function shouldInvoke(time) {
42511             var timeSinceLastCall = time - lastCallTime,
42512                 timeSinceLastInvoke = time - lastInvokeTime;
42513
42514             // Either this is the first call, activity has stopped and we're at the
42515             // trailing edge, the system time has gone backwards and we're treating
42516             // it as the trailing edge, or we've hit the `maxWait` limit.
42517             return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
42518               (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
42519           }
42520
42521           function timerExpired() {
42522             var time = now$1();
42523             if (shouldInvoke(time)) {
42524               return trailingEdge(time);
42525             }
42526             // Restart the timer.
42527             timerId = setTimeout(timerExpired, remainingWait(time));
42528           }
42529
42530           function trailingEdge(time) {
42531             timerId = undefined;
42532
42533             // Only invoke if we have `lastArgs` which means `func` has been
42534             // debounced at least once.
42535             if (trailing && lastArgs) {
42536               return invokeFunc(time);
42537             }
42538             lastArgs = lastThis = undefined;
42539             return result;
42540           }
42541
42542           function cancel() {
42543             if (timerId !== undefined) {
42544               clearTimeout(timerId);
42545             }
42546             lastInvokeTime = 0;
42547             lastArgs = lastCallTime = lastThis = timerId = undefined;
42548           }
42549
42550           function flush() {
42551             return timerId === undefined ? result : trailingEdge(now$1());
42552           }
42553
42554           function debounced() {
42555             var time = now$1(),
42556                 isInvoking = shouldInvoke(time);
42557
42558             lastArgs = arguments;
42559             lastThis = this;
42560             lastCallTime = time;
42561
42562             if (isInvoking) {
42563               if (timerId === undefined) {
42564                 return leadingEdge(lastCallTime);
42565               }
42566               if (maxing) {
42567                 // Handle invocations in a tight loop.
42568                 clearTimeout(timerId);
42569                 timerId = setTimeout(timerExpired, wait);
42570                 return invokeFunc(lastCallTime);
42571               }
42572             }
42573             if (timerId === undefined) {
42574               timerId = setTimeout(timerExpired, wait);
42575             }
42576             return result;
42577           }
42578           debounced.cancel = cancel;
42579           debounced.flush = flush;
42580           return debounced;
42581         }
42582
42583         /** Error message constants. */
42584         var FUNC_ERROR_TEXT$1 = 'Expected a function';
42585
42586         /**
42587          * Creates a throttled function that only invokes `func` at most once per
42588          * every `wait` milliseconds. The throttled function comes with a `cancel`
42589          * method to cancel delayed `func` invocations and a `flush` method to
42590          * immediately invoke them. Provide `options` to indicate whether `func`
42591          * should be invoked on the leading and/or trailing edge of the `wait`
42592          * timeout. The `func` is invoked with the last arguments provided to the
42593          * throttled function. Subsequent calls to the throttled function return the
42594          * result of the last `func` invocation.
42595          *
42596          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42597          * invoked on the trailing edge of the timeout only if the throttled function
42598          * is invoked more than once during the `wait` timeout.
42599          *
42600          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42601          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42602          *
42603          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42604          * for details over the differences between `_.throttle` and `_.debounce`.
42605          *
42606          * @static
42607          * @memberOf _
42608          * @since 0.1.0
42609          * @category Function
42610          * @param {Function} func The function to throttle.
42611          * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
42612          * @param {Object} [options={}] The options object.
42613          * @param {boolean} [options.leading=true]
42614          *  Specify invoking on the leading edge of the timeout.
42615          * @param {boolean} [options.trailing=true]
42616          *  Specify invoking on the trailing edge of the timeout.
42617          * @returns {Function} Returns the new throttled function.
42618          * @example
42619          *
42620          * // Avoid excessively updating the position while scrolling.
42621          * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
42622          *
42623          * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
42624          * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
42625          * jQuery(element).on('click', throttled);
42626          *
42627          * // Cancel the trailing throttled invocation.
42628          * jQuery(window).on('popstate', throttled.cancel);
42629          */
42630         function throttle(func, wait, options) {
42631           var leading = true,
42632               trailing = true;
42633
42634           if (typeof func != 'function') {
42635             throw new TypeError(FUNC_ERROR_TEXT$1);
42636           }
42637           if (isObject$1(options)) {
42638             leading = 'leading' in options ? !!options.leading : leading;
42639             trailing = 'trailing' in options ? !!options.trailing : trailing;
42640           }
42641           return debounce(func, wait, {
42642             'leading': leading,
42643             'maxWait': wait,
42644             'trailing': trailing
42645           });
42646         }
42647
42648         var hashes = createCommonjsModule(function (module, exports) {
42649         /**
42650          * jshashes - https://github.com/h2non/jshashes
42651          * Released under the "New BSD" license
42652          *
42653          * Algorithms specification:
42654          *
42655          * MD5 - http://www.ietf.org/rfc/rfc1321.txt
42656          * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
42657          * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42658          * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42659          * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42660          * HMAC - http://www.ietf.org/rfc/rfc2104.txt
42661          */
42662         (function() {
42663           var Hashes;
42664
42665           function utf8Encode(str) {
42666             var x, y, output = '',
42667               i = -1,
42668               l;
42669
42670             if (str && str.length) {
42671               l = str.length;
42672               while ((i += 1) < l) {
42673                 /* Decode utf-16 surrogate pairs */
42674                 x = str.charCodeAt(i);
42675                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
42676                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
42677                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
42678                   i += 1;
42679                 }
42680                 /* Encode output as utf-8 */
42681                 if (x <= 0x7F) {
42682                   output += String.fromCharCode(x);
42683                 } else if (x <= 0x7FF) {
42684                   output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
42685                     0x80 | (x & 0x3F));
42686                 } else if (x <= 0xFFFF) {
42687                   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
42688                     0x80 | ((x >>> 6) & 0x3F),
42689                     0x80 | (x & 0x3F));
42690                 } else if (x <= 0x1FFFFF) {
42691                   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
42692                     0x80 | ((x >>> 12) & 0x3F),
42693                     0x80 | ((x >>> 6) & 0x3F),
42694                     0x80 | (x & 0x3F));
42695                 }
42696               }
42697             }
42698             return output;
42699           }
42700
42701           function utf8Decode(str) {
42702             var i, ac, c1, c2, c3, arr = [],
42703               l;
42704             i = ac = c1 = c2 = c3 = 0;
42705
42706             if (str && str.length) {
42707               l = str.length;
42708               str += '';
42709
42710               while (i < l) {
42711                 c1 = str.charCodeAt(i);
42712                 ac += 1;
42713                 if (c1 < 128) {
42714                   arr[ac] = String.fromCharCode(c1);
42715                   i += 1;
42716                 } else if (c1 > 191 && c1 < 224) {
42717                   c2 = str.charCodeAt(i + 1);
42718                   arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
42719                   i += 2;
42720                 } else {
42721                   c2 = str.charCodeAt(i + 1);
42722                   c3 = str.charCodeAt(i + 2);
42723                   arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
42724                   i += 3;
42725                 }
42726               }
42727             }
42728             return arr.join('');
42729           }
42730
42731           /**
42732            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
42733            * to work around bugs in some JS interpreters.
42734            */
42735
42736           function safe_add(x, y) {
42737             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
42738               msw = (x >> 16) + (y >> 16) + (lsw >> 16);
42739             return (msw << 16) | (lsw & 0xFFFF);
42740           }
42741
42742           /**
42743            * Bitwise rotate a 32-bit number to the left.
42744            */
42745
42746           function bit_rol(num, cnt) {
42747             return (num << cnt) | (num >>> (32 - cnt));
42748           }
42749
42750           /**
42751            * Convert a raw string to a hex string
42752            */
42753
42754           function rstr2hex(input, hexcase) {
42755             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
42756               output = '',
42757               x, i = 0,
42758               l = input.length;
42759             for (; i < l; i += 1) {
42760               x = input.charCodeAt(i);
42761               output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
42762             }
42763             return output;
42764           }
42765
42766           /**
42767            * Convert an array of big-endian words to a string
42768            */
42769
42770           function binb2rstr(input) {
42771             var i, l = input.length * 32,
42772               output = '';
42773             for (i = 0; i < l; i += 8) {
42774               output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
42775             }
42776             return output;
42777           }
42778
42779           /**
42780            * Convert an array of little-endian words to a string
42781            */
42782
42783           function binl2rstr(input) {
42784             var i, l = input.length * 32,
42785               output = '';
42786             for (i = 0; i < l; i += 8) {
42787               output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42788             }
42789             return output;
42790           }
42791
42792           /**
42793            * Convert a raw string to an array of little-endian words
42794            * Characters >255 have their high-byte silently ignored.
42795            */
42796
42797           function rstr2binl(input) {
42798             var i, l = input.length * 8,
42799               output = Array(input.length >> 2),
42800               lo = output.length;
42801             for (i = 0; i < lo; i += 1) {
42802               output[i] = 0;
42803             }
42804             for (i = 0; i < l; i += 8) {
42805               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
42806             }
42807             return output;
42808           }
42809
42810           /**
42811            * Convert a raw string to an array of big-endian words
42812            * Characters >255 have their high-byte silently ignored.
42813            */
42814
42815           function rstr2binb(input) {
42816             var i, l = input.length * 8,
42817               output = Array(input.length >> 2),
42818               lo = output.length;
42819             for (i = 0; i < lo; i += 1) {
42820               output[i] = 0;
42821             }
42822             for (i = 0; i < l; i += 8) {
42823               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
42824             }
42825             return output;
42826           }
42827
42828           /**
42829            * Convert a raw string to an arbitrary string encoding
42830            */
42831
42832           function rstr2any(input, encoding) {
42833             var divisor = encoding.length,
42834               remainders = Array(),
42835               i, q, x, ld, quotient, dividend, output, full_length;
42836
42837             /* Convert to an array of 16-bit big-endian values, forming the dividend */
42838             dividend = Array(Math.ceil(input.length / 2));
42839             ld = dividend.length;
42840             for (i = 0; i < ld; i += 1) {
42841               dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
42842             }
42843
42844             /**
42845              * Repeatedly perform a long division. The binary array forms the dividend,
42846              * the length of the encoding is the divisor. Once computed, the quotient
42847              * forms the dividend for the next step. We stop when the dividend is zerHashes.
42848              * All remainders are stored for later use.
42849              */
42850             while (dividend.length > 0) {
42851               quotient = Array();
42852               x = 0;
42853               for (i = 0; i < dividend.length; i += 1) {
42854                 x = (x << 16) + dividend[i];
42855                 q = Math.floor(x / divisor);
42856                 x -= q * divisor;
42857                 if (quotient.length > 0 || q > 0) {
42858                   quotient[quotient.length] = q;
42859                 }
42860               }
42861               remainders[remainders.length] = x;
42862               dividend = quotient;
42863             }
42864
42865             /* Convert the remainders to the output string */
42866             output = '';
42867             for (i = remainders.length - 1; i >= 0; i--) {
42868               output += encoding.charAt(remainders[i]);
42869             }
42870
42871             /* Append leading zero equivalents */
42872             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
42873             for (i = output.length; i < full_length; i += 1) {
42874               output = encoding[0] + output;
42875             }
42876             return output;
42877           }
42878
42879           /**
42880            * Convert a raw string to a base-64 string
42881            */
42882
42883           function rstr2b64(input, b64pad) {
42884             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42885               output = '',
42886               len = input.length,
42887               i, j, triplet;
42888             b64pad = b64pad || '=';
42889             for (i = 0; i < len; i += 3) {
42890               triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42891               for (j = 0; j < 4; j += 1) {
42892                 if (i * 8 + j * 6 > input.length * 8) {
42893                   output += b64pad;
42894                 } else {
42895                   output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42896                 }
42897               }
42898             }
42899             return output;
42900           }
42901
42902           Hashes = {
42903             /**
42904              * @property {String} version
42905              * @readonly
42906              */
42907             VERSION: '1.0.6',
42908             /**
42909              * @member Hashes
42910              * @class Base64
42911              * @constructor
42912              */
42913             Base64: function() {
42914               // private properties
42915               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42916                 pad = '=', // default pad according with the RFC standard
42917                 utf8 = true; // by default enable UTF-8 support encoding
42918
42919               // public method for encoding
42920               this.encode = function(input) {
42921                 var i, j, triplet,
42922                   output = '',
42923                   len = input.length;
42924
42925                 pad = pad || '=';
42926                 input = (utf8) ? utf8Encode(input) : input;
42927
42928                 for (i = 0; i < len; i += 3) {
42929                   triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42930                   for (j = 0; j < 4; j += 1) {
42931                     if (i * 8 + j * 6 > len * 8) {
42932                       output += pad;
42933                     } else {
42934                       output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42935                     }
42936                   }
42937                 }
42938                 return output;
42939               };
42940
42941               // public method for decoding
42942               this.decode = function(input) {
42943                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
42944                 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
42945                   dec = '',
42946                   arr = [];
42947                 if (!input) {
42948                   return input;
42949                 }
42950
42951                 i = ac = 0;
42952                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
42953                 //input += '';
42954
42955                 do { // unpack four hexets into three octets using index points in b64
42956                   h1 = tab.indexOf(input.charAt(i += 1));
42957                   h2 = tab.indexOf(input.charAt(i += 1));
42958                   h3 = tab.indexOf(input.charAt(i += 1));
42959                   h4 = tab.indexOf(input.charAt(i += 1));
42960
42961                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
42962
42963                   o1 = bits >> 16 & 0xff;
42964                   o2 = bits >> 8 & 0xff;
42965                   o3 = bits & 0xff;
42966                   ac += 1;
42967
42968                   if (h3 === 64) {
42969                     arr[ac] = String.fromCharCode(o1);
42970                   } else if (h4 === 64) {
42971                     arr[ac] = String.fromCharCode(o1, o2);
42972                   } else {
42973                     arr[ac] = String.fromCharCode(o1, o2, o3);
42974                   }
42975                 } while (i < input.length);
42976
42977                 dec = arr.join('');
42978                 dec = (utf8) ? utf8Decode(dec) : dec;
42979
42980                 return dec;
42981               };
42982
42983               // set custom pad string
42984               this.setPad = function(str) {
42985                 pad = str || pad;
42986                 return this;
42987               };
42988               // set custom tab string characters
42989               this.setTab = function(str) {
42990                 tab = str || tab;
42991                 return this;
42992               };
42993               this.setUTF8 = function(bool) {
42994                 if (typeof bool === 'boolean') {
42995                   utf8 = bool;
42996                 }
42997                 return this;
42998               };
42999             },
43000
43001             /**
43002              * CRC-32 calculation
43003              * @member Hashes
43004              * @method CRC32
43005              * @static
43006              * @param {String} str Input String
43007              * @return {String}
43008              */
43009             CRC32: function(str) {
43010               var crc = 0,
43011                 x = 0,
43012                 y = 0,
43013                 table, i, iTop;
43014               str = utf8Encode(str);
43015
43016               table = [
43017                 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
43018                 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
43019                 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
43020                 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
43021                 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
43022                 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
43023                 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
43024                 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
43025                 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
43026                 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
43027                 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
43028                 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
43029                 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
43030                 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
43031                 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
43032                 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
43033                 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
43034                 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
43035                 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
43036                 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
43037                 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
43038                 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
43039                 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
43040                 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
43041                 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
43042                 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
43043               ].join('');
43044
43045               crc = crc ^ (-1);
43046               for (i = 0, iTop = str.length; i < iTop; i += 1) {
43047                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
43048                 x = '0x' + table.substr(y * 9, 8);
43049                 crc = (crc >>> 8) ^ x;
43050               }
43051               // always return a positive number (that's what >>> 0 does)
43052               return (crc ^ (-1)) >>> 0;
43053             },
43054             /**
43055              * @member Hashes
43056              * @class MD5
43057              * @constructor
43058              * @param {Object} [config]
43059              *
43060              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
43061              * Digest Algorithm, as defined in RFC 1321.
43062              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
43063              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43064              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
43065              */
43066             MD5: function(options) {
43067               /**
43068                * Private config properties. You may need to tweak these to be compatible with
43069                * the server-side, but the defaults work in most cases.
43070                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43071                */
43072               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43073                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43074                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43075
43076               // privileged (public) methods
43077               this.hex = function(s) {
43078                 return rstr2hex(rstr(s), hexcase);
43079               };
43080               this.b64 = function(s) {
43081                 return rstr2b64(rstr(s), b64pad);
43082               };
43083               this.any = function(s, e) {
43084                 return rstr2any(rstr(s), e);
43085               };
43086               this.raw = function(s) {
43087                 return rstr(s);
43088               };
43089               this.hex_hmac = function(k, d) {
43090                 return rstr2hex(rstr_hmac(k, d), hexcase);
43091               };
43092               this.b64_hmac = function(k, d) {
43093                 return rstr2b64(rstr_hmac(k, d), b64pad);
43094               };
43095               this.any_hmac = function(k, d, e) {
43096                 return rstr2any(rstr_hmac(k, d), e);
43097               };
43098               /**
43099                * Perform a simple self-test to see if the VM is working
43100                * @return {String} Hexadecimal hash sample
43101                */
43102               this.vm_test = function() {
43103                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43104               };
43105               /**
43106                * Enable/disable uppercase hexadecimal returned string
43107                * @param {Boolean}
43108                * @return {Object} this
43109                */
43110               this.setUpperCase = function(a) {
43111                 if (typeof a === 'boolean') {
43112                   hexcase = a;
43113                 }
43114                 return this;
43115               };
43116               /**
43117                * Defines a base64 pad string
43118                * @param {String} Pad
43119                * @return {Object} this
43120                */
43121               this.setPad = function(a) {
43122                 b64pad = a || b64pad;
43123                 return this;
43124               };
43125               /**
43126                * Defines a base64 pad string
43127                * @param {Boolean}
43128                * @return {Object} [this]
43129                */
43130               this.setUTF8 = function(a) {
43131                 if (typeof a === 'boolean') {
43132                   utf8 = a;
43133                 }
43134                 return this;
43135               };
43136
43137               // private methods
43138
43139               /**
43140                * Calculate the MD5 of a raw string
43141                */
43142
43143               function rstr(s) {
43144                 s = (utf8) ? utf8Encode(s) : s;
43145                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
43146               }
43147
43148               /**
43149                * Calculate the HMAC-MD5, of a key and some data (raw strings)
43150                */
43151
43152               function rstr_hmac(key, data) {
43153                 var bkey, ipad, opad, hash, i;
43154
43155                 key = (utf8) ? utf8Encode(key) : key;
43156                 data = (utf8) ? utf8Encode(data) : data;
43157                 bkey = rstr2binl(key);
43158                 if (bkey.length > 16) {
43159                   bkey = binl(bkey, key.length * 8);
43160                 }
43161
43162                 ipad = Array(16), opad = Array(16);
43163                 for (i = 0; i < 16; i += 1) {
43164                   ipad[i] = bkey[i] ^ 0x36363636;
43165                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43166                 }
43167                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
43168                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
43169               }
43170
43171               /**
43172                * Calculate the MD5 of an array of little-endian words, and a bit length.
43173                */
43174
43175               function binl(x, len) {
43176                 var i, olda, oldb, oldc, oldd,
43177                   a = 1732584193,
43178                   b = -271733879,
43179                   c = -1732584194,
43180                   d = 271733878;
43181
43182                 /* append padding */
43183                 x[len >> 5] |= 0x80 << ((len) % 32);
43184                 x[(((len + 64) >>> 9) << 4) + 14] = len;
43185
43186                 for (i = 0; i < x.length; i += 16) {
43187                   olda = a;
43188                   oldb = b;
43189                   oldc = c;
43190                   oldd = d;
43191
43192                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
43193                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
43194                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
43195                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
43196                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
43197                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
43198                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
43199                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
43200                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
43201                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
43202                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
43203                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
43204                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
43205                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
43206                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
43207                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
43208
43209                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
43210                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
43211                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
43212                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
43213                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
43214                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
43215                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
43216                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
43217                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
43218                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
43219                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
43220                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
43221                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
43222                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
43223                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
43224                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
43225
43226                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
43227                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
43228                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
43229                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
43230                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
43231                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
43232                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
43233                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
43234                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
43235                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
43236                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
43237                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
43238                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
43239                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
43240                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
43241                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
43242
43243                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
43244                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
43245                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
43246                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
43247                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
43248                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
43249                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
43250                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
43251                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
43252                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
43253                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
43254                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
43255                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
43256                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
43257                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
43258                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
43259
43260                   a = safe_add(a, olda);
43261                   b = safe_add(b, oldb);
43262                   c = safe_add(c, oldc);
43263                   d = safe_add(d, oldd);
43264                 }
43265                 return Array(a, b, c, d);
43266               }
43267
43268               /**
43269                * These functions implement the four basic operations the algorithm uses.
43270                */
43271
43272               function md5_cmn(q, a, b, x, s, t) {
43273                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
43274               }
43275
43276               function md5_ff(a, b, c, d, x, s, t) {
43277                 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
43278               }
43279
43280               function md5_gg(a, b, c, d, x, s, t) {
43281                 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
43282               }
43283
43284               function md5_hh(a, b, c, d, x, s, t) {
43285                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
43286               }
43287
43288               function md5_ii(a, b, c, d, x, s, t) {
43289                 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
43290               }
43291             },
43292             /**
43293              * @member Hashes
43294              * @class Hashes.SHA1
43295              * @param {Object} [config]
43296              * @constructor
43297              *
43298              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
43299              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
43300              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43301              * See http://pajhome.org.uk/crypt/md5 for details.
43302              */
43303             SHA1: function(options) {
43304               /**
43305                * Private config properties. You may need to tweak these to be compatible with
43306                * the server-side, but the defaults work in most cases.
43307                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43308                */
43309               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43310                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43311                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43312
43313               // public methods
43314               this.hex = function(s) {
43315                 return rstr2hex(rstr(s), hexcase);
43316               };
43317               this.b64 = function(s) {
43318                 return rstr2b64(rstr(s), b64pad);
43319               };
43320               this.any = function(s, e) {
43321                 return rstr2any(rstr(s), e);
43322               };
43323               this.raw = function(s) {
43324                 return rstr(s);
43325               };
43326               this.hex_hmac = function(k, d) {
43327                 return rstr2hex(rstr_hmac(k, d));
43328               };
43329               this.b64_hmac = function(k, d) {
43330                 return rstr2b64(rstr_hmac(k, d), b64pad);
43331               };
43332               this.any_hmac = function(k, d, e) {
43333                 return rstr2any(rstr_hmac(k, d), e);
43334               };
43335               /**
43336                * Perform a simple self-test to see if the VM is working
43337                * @return {String} Hexadecimal hash sample
43338                * @public
43339                */
43340               this.vm_test = function() {
43341                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43342               };
43343               /**
43344                * @description Enable/disable uppercase hexadecimal returned string
43345                * @param {boolean}
43346                * @return {Object} this
43347                * @public
43348                */
43349               this.setUpperCase = function(a) {
43350                 if (typeof a === 'boolean') {
43351                   hexcase = a;
43352                 }
43353                 return this;
43354               };
43355               /**
43356                * @description Defines a base64 pad string
43357                * @param {string} Pad
43358                * @return {Object} this
43359                * @public
43360                */
43361               this.setPad = function(a) {
43362                 b64pad = a || b64pad;
43363                 return this;
43364               };
43365               /**
43366                * @description Defines a base64 pad string
43367                * @param {boolean}
43368                * @return {Object} this
43369                * @public
43370                */
43371               this.setUTF8 = function(a) {
43372                 if (typeof a === 'boolean') {
43373                   utf8 = a;
43374                 }
43375                 return this;
43376               };
43377
43378               // private methods
43379
43380               /**
43381                * Calculate the SHA-512 of a raw string
43382                */
43383
43384               function rstr(s) {
43385                 s = (utf8) ? utf8Encode(s) : s;
43386                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43387               }
43388
43389               /**
43390                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
43391                */
43392
43393               function rstr_hmac(key, data) {
43394                 var bkey, ipad, opad, i, hash;
43395                 key = (utf8) ? utf8Encode(key) : key;
43396                 data = (utf8) ? utf8Encode(data) : data;
43397                 bkey = rstr2binb(key);
43398
43399                 if (bkey.length > 16) {
43400                   bkey = binb(bkey, key.length * 8);
43401                 }
43402                 ipad = Array(16), opad = Array(16);
43403                 for (i = 0; i < 16; i += 1) {
43404                   ipad[i] = bkey[i] ^ 0x36363636;
43405                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43406                 }
43407                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43408                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
43409               }
43410
43411               /**
43412                * Calculate the SHA-1 of an array of big-endian words, and a bit length
43413                */
43414
43415               function binb(x, len) {
43416                 var i, j, t, olda, oldb, oldc, oldd, olde,
43417                   w = Array(80),
43418                   a = 1732584193,
43419                   b = -271733879,
43420                   c = -1732584194,
43421                   d = 271733878,
43422                   e = -1009589776;
43423
43424                 /* append padding */
43425                 x[len >> 5] |= 0x80 << (24 - len % 32);
43426                 x[((len + 64 >> 9) << 4) + 15] = len;
43427
43428                 for (i = 0; i < x.length; i += 16) {
43429                   olda = a;
43430                   oldb = b;
43431                   oldc = c;
43432                   oldd = d;
43433                   olde = e;
43434
43435                   for (j = 0; j < 80; j += 1) {
43436                     if (j < 16) {
43437                       w[j] = x[i + j];
43438                     } else {
43439                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
43440                     }
43441                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
43442                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
43443                     e = d;
43444                     d = c;
43445                     c = bit_rol(b, 30);
43446                     b = a;
43447                     a = t;
43448                   }
43449
43450                   a = safe_add(a, olda);
43451                   b = safe_add(b, oldb);
43452                   c = safe_add(c, oldc);
43453                   d = safe_add(d, oldd);
43454                   e = safe_add(e, olde);
43455                 }
43456                 return Array(a, b, c, d, e);
43457               }
43458
43459               /**
43460                * Perform the appropriate triplet combination function for the current
43461                * iteration
43462                */
43463
43464               function sha1_ft(t, b, c, d) {
43465                 if (t < 20) {
43466                   return (b & c) | ((~b) & d);
43467                 }
43468                 if (t < 40) {
43469                   return b ^ c ^ d;
43470                 }
43471                 if (t < 60) {
43472                   return (b & c) | (b & d) | (c & d);
43473                 }
43474                 return b ^ c ^ d;
43475               }
43476
43477               /**
43478                * Determine the appropriate additive constant for the current iteration
43479                */
43480
43481               function sha1_kt(t) {
43482                 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
43483                   (t < 60) ? -1894007588 : -899497514;
43484               }
43485             },
43486             /**
43487              * @class Hashes.SHA256
43488              * @param {config}
43489              *
43490              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
43491              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
43492              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43493              * See http://pajhome.org.uk/crypt/md5 for details.
43494              * Also http://anmar.eu.org/projects/jssha2/
43495              */
43496             SHA256: function(options) {
43497               /**
43498                * Private properties configuration variables. You may need to tweak these to be compatible with
43499                * the server-side, but the defaults work in most cases.
43500                * @see this.setUpperCase() method
43501                * @see this.setPad() method
43502                */
43503               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
43504                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43505                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43506                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43507                 /* enable/disable utf8 encoding */
43508                 sha256_K;
43509
43510               /* privileged (public) methods */
43511               this.hex = function(s) {
43512                 return rstr2hex(rstr(s, utf8));
43513               };
43514               this.b64 = function(s) {
43515                 return rstr2b64(rstr(s, utf8), b64pad);
43516               };
43517               this.any = function(s, e) {
43518                 return rstr2any(rstr(s, utf8), e);
43519               };
43520               this.raw = function(s) {
43521                 return rstr(s, utf8);
43522               };
43523               this.hex_hmac = function(k, d) {
43524                 return rstr2hex(rstr_hmac(k, d));
43525               };
43526               this.b64_hmac = function(k, d) {
43527                 return rstr2b64(rstr_hmac(k, d), b64pad);
43528               };
43529               this.any_hmac = function(k, d, e) {
43530                 return rstr2any(rstr_hmac(k, d), e);
43531               };
43532               /**
43533                * Perform a simple self-test to see if the VM is working
43534                * @return {String} Hexadecimal hash sample
43535                * @public
43536                */
43537               this.vm_test = function() {
43538                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43539               };
43540               /**
43541                * Enable/disable uppercase hexadecimal returned string
43542                * @param {boolean}
43543                * @return {Object} this
43544                * @public
43545                */
43546               this.setUpperCase = function(a) {
43547                 if (typeof a === 'boolean') {
43548                   hexcase = a;
43549                 }
43550                 return this;
43551               };
43552               /**
43553                * @description Defines a base64 pad string
43554                * @param {string} Pad
43555                * @return {Object} this
43556                * @public
43557                */
43558               this.setPad = function(a) {
43559                 b64pad = a || b64pad;
43560                 return this;
43561               };
43562               /**
43563                * Defines a base64 pad string
43564                * @param {boolean}
43565                * @return {Object} this
43566                * @public
43567                */
43568               this.setUTF8 = function(a) {
43569                 if (typeof a === 'boolean') {
43570                   utf8 = a;
43571                 }
43572                 return this;
43573               };
43574
43575               // private methods
43576
43577               /**
43578                * Calculate the SHA-512 of a raw string
43579                */
43580
43581               function rstr(s, utf8) {
43582                 s = (utf8) ? utf8Encode(s) : s;
43583                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43584               }
43585
43586               /**
43587                * Calculate the HMAC-sha256 of a key and some data (raw strings)
43588                */
43589
43590               function rstr_hmac(key, data) {
43591                 key = (utf8) ? utf8Encode(key) : key;
43592                 data = (utf8) ? utf8Encode(data) : data;
43593                 var hash, i = 0,
43594                   bkey = rstr2binb(key),
43595                   ipad = Array(16),
43596                   opad = Array(16);
43597
43598                 if (bkey.length > 16) {
43599                   bkey = binb(bkey, key.length * 8);
43600                 }
43601
43602                 for (; i < 16; i += 1) {
43603                   ipad[i] = bkey[i] ^ 0x36363636;
43604                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43605                 }
43606
43607                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43608                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
43609               }
43610
43611               /*
43612                * Main sha256 function, with its support functions
43613                */
43614
43615               function sha256_S(X, n) {
43616                 return (X >>> n) | (X << (32 - n));
43617               }
43618
43619               function sha256_R(X, n) {
43620                 return (X >>> n);
43621               }
43622
43623               function sha256_Ch(x, y, z) {
43624                 return ((x & y) ^ ((~x) & z));
43625               }
43626
43627               function sha256_Maj(x, y, z) {
43628                 return ((x & y) ^ (x & z) ^ (y & z));
43629               }
43630
43631               function sha256_Sigma0256(x) {
43632                 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
43633               }
43634
43635               function sha256_Sigma1256(x) {
43636                 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
43637               }
43638
43639               function sha256_Gamma0256(x) {
43640                 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
43641               }
43642
43643               function sha256_Gamma1256(x) {
43644                 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
43645               }
43646
43647               sha256_K = [
43648                 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
43649                 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
43650                 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
43651                 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
43652                 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
43653                 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
43654                 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
43655               ];
43656
43657               function binb(m, l) {
43658                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
43659                   1359893119, -1694144372, 528734635, 1541459225
43660                 ];
43661                 var W = new Array(64);
43662                 var a, b, c, d, e, f, g, h;
43663                 var i, j, T1, T2;
43664
43665                 /* append padding */
43666                 m[l >> 5] |= 0x80 << (24 - l % 32);
43667                 m[((l + 64 >> 9) << 4) + 15] = l;
43668
43669                 for (i = 0; i < m.length; i += 16) {
43670                   a = HASH[0];
43671                   b = HASH[1];
43672                   c = HASH[2];
43673                   d = HASH[3];
43674                   e = HASH[4];
43675                   f = HASH[5];
43676                   g = HASH[6];
43677                   h = HASH[7];
43678
43679                   for (j = 0; j < 64; j += 1) {
43680                     if (j < 16) {
43681                       W[j] = m[j + i];
43682                     } else {
43683                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
43684                         sha256_Gamma0256(W[j - 15])), W[j - 16]);
43685                     }
43686
43687                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
43688                       sha256_K[j]), W[j]);
43689                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
43690                     h = g;
43691                     g = f;
43692                     f = e;
43693                     e = safe_add(d, T1);
43694                     d = c;
43695                     c = b;
43696                     b = a;
43697                     a = safe_add(T1, T2);
43698                   }
43699
43700                   HASH[0] = safe_add(a, HASH[0]);
43701                   HASH[1] = safe_add(b, HASH[1]);
43702                   HASH[2] = safe_add(c, HASH[2]);
43703                   HASH[3] = safe_add(d, HASH[3]);
43704                   HASH[4] = safe_add(e, HASH[4]);
43705                   HASH[5] = safe_add(f, HASH[5]);
43706                   HASH[6] = safe_add(g, HASH[6]);
43707                   HASH[7] = safe_add(h, HASH[7]);
43708                 }
43709                 return HASH;
43710               }
43711
43712             },
43713
43714             /**
43715              * @class Hashes.SHA512
43716              * @param {config}
43717              *
43718              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
43719              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
43720              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43721              * See http://pajhome.org.uk/crypt/md5 for details.
43722              */
43723             SHA512: function(options) {
43724               /**
43725                * Private properties configuration variables. You may need to tweak these to be compatible with
43726                * the server-side, but the defaults work in most cases.
43727                * @see this.setUpperCase() method
43728                * @see this.setPad() method
43729                */
43730               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43731                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43732                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43733                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43734                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43735                 /* enable/disable utf8 encoding */
43736                 sha512_k;
43737
43738               /* privileged (public) methods */
43739               this.hex = function(s) {
43740                 return rstr2hex(rstr(s));
43741               };
43742               this.b64 = function(s) {
43743                 return rstr2b64(rstr(s), b64pad);
43744               };
43745               this.any = function(s, e) {
43746                 return rstr2any(rstr(s), e);
43747               };
43748               this.raw = function(s) {
43749                 return rstr(s);
43750               };
43751               this.hex_hmac = function(k, d) {
43752                 return rstr2hex(rstr_hmac(k, d));
43753               };
43754               this.b64_hmac = function(k, d) {
43755                 return rstr2b64(rstr_hmac(k, d), b64pad);
43756               };
43757               this.any_hmac = function(k, d, e) {
43758                 return rstr2any(rstr_hmac(k, d), e);
43759               };
43760               /**
43761                * Perform a simple self-test to see if the VM is working
43762                * @return {String} Hexadecimal hash sample
43763                * @public
43764                */
43765               this.vm_test = function() {
43766                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43767               };
43768               /**
43769                * @description Enable/disable uppercase hexadecimal returned string
43770                * @param {boolean}
43771                * @return {Object} this
43772                * @public
43773                */
43774               this.setUpperCase = function(a) {
43775                 if (typeof a === 'boolean') {
43776                   hexcase = a;
43777                 }
43778                 return this;
43779               };
43780               /**
43781                * @description Defines a base64 pad string
43782                * @param {string} Pad
43783                * @return {Object} this
43784                * @public
43785                */
43786               this.setPad = function(a) {
43787                 b64pad = a || b64pad;
43788                 return this;
43789               };
43790               /**
43791                * @description Defines a base64 pad string
43792                * @param {boolean}
43793                * @return {Object} this
43794                * @public
43795                */
43796               this.setUTF8 = function(a) {
43797                 if (typeof a === 'boolean') {
43798                   utf8 = a;
43799                 }
43800                 return this;
43801               };
43802
43803               /* private methods */
43804
43805               /**
43806                * Calculate the SHA-512 of a raw string
43807                */
43808
43809               function rstr(s) {
43810                 s = (utf8) ? utf8Encode(s) : s;
43811                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43812               }
43813               /*
43814                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
43815                */
43816
43817               function rstr_hmac(key, data) {
43818                 key = (utf8) ? utf8Encode(key) : key;
43819                 data = (utf8) ? utf8Encode(data) : data;
43820
43821                 var hash, i = 0,
43822                   bkey = rstr2binb(key),
43823                   ipad = Array(32),
43824                   opad = Array(32);
43825
43826                 if (bkey.length > 32) {
43827                   bkey = binb(bkey, key.length * 8);
43828                 }
43829
43830                 for (; i < 32; i += 1) {
43831                   ipad[i] = bkey[i] ^ 0x36363636;
43832                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43833                 }
43834
43835                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
43836                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
43837               }
43838
43839               /**
43840                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
43841                */
43842
43843               function binb(x, len) {
43844                 var j, i, l,
43845                   W = new Array(80),
43846                   hash = new Array(16),
43847                   //Initial hash values
43848                   H = [
43849                     new int64(0x6a09e667, -205731576),
43850                     new int64(-1150833019, -2067093701),
43851                     new int64(0x3c6ef372, -23791573),
43852                     new int64(-1521486534, 0x5f1d36f1),
43853                     new int64(0x510e527f, -1377402159),
43854                     new int64(-1694144372, 0x2b3e6c1f),
43855                     new int64(0x1f83d9ab, -79577749),
43856                     new int64(0x5be0cd19, 0x137e2179)
43857                   ],
43858                   T1 = new int64(0, 0),
43859                   T2 = new int64(0, 0),
43860                   a = new int64(0, 0),
43861                   b = new int64(0, 0),
43862                   c = new int64(0, 0),
43863                   d = new int64(0, 0),
43864                   e = new int64(0, 0),
43865                   f = new int64(0, 0),
43866                   g = new int64(0, 0),
43867                   h = new int64(0, 0),
43868                   //Temporary variables not specified by the document
43869                   s0 = new int64(0, 0),
43870                   s1 = new int64(0, 0),
43871                   Ch = new int64(0, 0),
43872                   Maj = new int64(0, 0),
43873                   r1 = new int64(0, 0),
43874                   r2 = new int64(0, 0),
43875                   r3 = new int64(0, 0);
43876
43877                 if (sha512_k === undefined) {
43878                   //SHA512 constants
43879                   sha512_k = [
43880                     new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
43881                     new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
43882                     new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
43883                     new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
43884                     new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
43885                     new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
43886                     new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
43887                     new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
43888                     new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
43889                     new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
43890                     new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
43891                     new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
43892                     new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
43893                     new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
43894                     new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
43895                     new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
43896                     new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
43897                     new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
43898                     new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
43899                     new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
43900                     new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
43901                     new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
43902                     new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
43903                     new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
43904                     new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
43905                     new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
43906                     new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
43907                     new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
43908                     new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
43909                     new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
43910                     new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
43911                     new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
43912                     new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
43913                     new int64(-354779690, -840897762), new int64(-176337025, -294727304),
43914                     new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
43915                     new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
43916                     new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
43917                     new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
43918                     new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
43919                     new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
43920                   ];
43921                 }
43922
43923                 for (i = 0; i < 80; i += 1) {
43924                   W[i] = new int64(0, 0);
43925                 }
43926
43927                 // append padding to the source string. The format is described in the FIPS.
43928                 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
43929                 x[((len + 128 >> 10) << 5) + 31] = len;
43930                 l = x.length;
43931                 for (i = 0; i < l; i += 32) { //32 dwords is the block size
43932                   int64copy(a, H[0]);
43933                   int64copy(b, H[1]);
43934                   int64copy(c, H[2]);
43935                   int64copy(d, H[3]);
43936                   int64copy(e, H[4]);
43937                   int64copy(f, H[5]);
43938                   int64copy(g, H[6]);
43939                   int64copy(h, H[7]);
43940
43941                   for (j = 0; j < 16; j += 1) {
43942                     W[j].h = x[i + 2 * j];
43943                     W[j].l = x[i + 2 * j + 1];
43944                   }
43945
43946                   for (j = 16; j < 80; j += 1) {
43947                     //sigma1
43948                     int64rrot(r1, W[j - 2], 19);
43949                     int64revrrot(r2, W[j - 2], 29);
43950                     int64shr(r3, W[j - 2], 6);
43951                     s1.l = r1.l ^ r2.l ^ r3.l;
43952                     s1.h = r1.h ^ r2.h ^ r3.h;
43953                     //sigma0
43954                     int64rrot(r1, W[j - 15], 1);
43955                     int64rrot(r2, W[j - 15], 8);
43956                     int64shr(r3, W[j - 15], 7);
43957                     s0.l = r1.l ^ r2.l ^ r3.l;
43958                     s0.h = r1.h ^ r2.h ^ r3.h;
43959
43960                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
43961                   }
43962
43963                   for (j = 0; j < 80; j += 1) {
43964                     //Ch
43965                     Ch.l = (e.l & f.l) ^ (~e.l & g.l);
43966                     Ch.h = (e.h & f.h) ^ (~e.h & g.h);
43967
43968                     //Sigma1
43969                     int64rrot(r1, e, 14);
43970                     int64rrot(r2, e, 18);
43971                     int64revrrot(r3, e, 9);
43972                     s1.l = r1.l ^ r2.l ^ r3.l;
43973                     s1.h = r1.h ^ r2.h ^ r3.h;
43974
43975                     //Sigma0
43976                     int64rrot(r1, a, 28);
43977                     int64revrrot(r2, a, 2);
43978                     int64revrrot(r3, a, 7);
43979                     s0.l = r1.l ^ r2.l ^ r3.l;
43980                     s0.h = r1.h ^ r2.h ^ r3.h;
43981
43982                     //Maj
43983                     Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
43984                     Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
43985
43986                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
43987                     int64add(T2, s0, Maj);
43988
43989                     int64copy(h, g);
43990                     int64copy(g, f);
43991                     int64copy(f, e);
43992                     int64add(e, d, T1);
43993                     int64copy(d, c);
43994                     int64copy(c, b);
43995                     int64copy(b, a);
43996                     int64add(a, T1, T2);
43997                   }
43998                   int64add(H[0], H[0], a);
43999                   int64add(H[1], H[1], b);
44000                   int64add(H[2], H[2], c);
44001                   int64add(H[3], H[3], d);
44002                   int64add(H[4], H[4], e);
44003                   int64add(H[5], H[5], f);
44004                   int64add(H[6], H[6], g);
44005                   int64add(H[7], H[7], h);
44006                 }
44007
44008                 //represent the hash as an array of 32-bit dwords
44009                 for (i = 0; i < 8; i += 1) {
44010                   hash[2 * i] = H[i].h;
44011                   hash[2 * i + 1] = H[i].l;
44012                 }
44013                 return hash;
44014               }
44015
44016               //A constructor for 64-bit numbers
44017
44018               function int64(h, l) {
44019                 this.h = h;
44020                 this.l = l;
44021                 //this.toString = int64toString;
44022               }
44023
44024               //Copies src into dst, assuming both are 64-bit numbers
44025
44026               function int64copy(dst, src) {
44027                 dst.h = src.h;
44028                 dst.l = src.l;
44029               }
44030
44031               //Right-rotates a 64-bit number by shift
44032               //Won't handle cases of shift>=32
44033               //The function revrrot() is for that
44034
44035               function int64rrot(dst, x, shift) {
44036                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
44037                 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
44038               }
44039
44040               //Reverses the dwords of the source and then rotates right by shift.
44041               //This is equivalent to rotation by 32+shift
44042
44043               function int64revrrot(dst, x, shift) {
44044                 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
44045                 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
44046               }
44047
44048               //Bitwise-shifts right a 64-bit number by shift
44049               //Won't handle shift>=32, but it's never needed in SHA512
44050
44051               function int64shr(dst, x, shift) {
44052                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
44053                 dst.h = (x.h >>> shift);
44054               }
44055
44056               //Adds two 64-bit numbers
44057               //Like the original implementation, does not rely on 32-bit operations
44058
44059               function int64add(dst, x, y) {
44060                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
44061                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
44062                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
44063                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
44064                 dst.l = (w0 & 0xffff) | (w1 << 16);
44065                 dst.h = (w2 & 0xffff) | (w3 << 16);
44066               }
44067
44068               //Same, except with 4 addends. Works faster than adding them one by one.
44069
44070               function int64add4(dst, a, b, c, d) {
44071                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
44072                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
44073                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
44074                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
44075                 dst.l = (w0 & 0xffff) | (w1 << 16);
44076                 dst.h = (w2 & 0xffff) | (w3 << 16);
44077               }
44078
44079               //Same, except with 5 addends
44080
44081               function int64add5(dst, a, b, c, d, e) {
44082                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
44083                   w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
44084                   w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
44085                   w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
44086                 dst.l = (w0 & 0xffff) | (w1 << 16);
44087                 dst.h = (w2 & 0xffff) | (w3 << 16);
44088               }
44089             },
44090             /**
44091              * @class Hashes.RMD160
44092              * @constructor
44093              * @param {Object} [config]
44094              *
44095              * A JavaScript implementation of the RIPEMD-160 Algorithm
44096              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
44097              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
44098              * See http://pajhome.org.uk/crypt/md5 for details.
44099              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
44100              */
44101             RMD160: function(options) {
44102               /**
44103                * Private properties configuration variables. You may need to tweak these to be compatible with
44104                * the server-side, but the defaults work in most cases.
44105                * @see this.setUpperCase() method
44106                * @see this.setPad() method
44107                */
44108               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
44109                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
44110                 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
44111                 /* base-64 pad character. Default '=' for strict RFC compliance   */
44112                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
44113                 /* enable/disable utf8 encoding */
44114                 rmd160_r1 = [
44115                   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
44116                   7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
44117                   3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
44118                   1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
44119                   4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
44120                 ],
44121                 rmd160_r2 = [
44122                   5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
44123                   6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
44124                   15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
44125                   8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
44126                   12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
44127                 ],
44128                 rmd160_s1 = [
44129                   11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
44130                   7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
44131                   11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
44132                   11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
44133                   9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
44134                 ],
44135                 rmd160_s2 = [
44136                   8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
44137                   9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
44138                   9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
44139                   15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
44140                   8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
44141                 ];
44142
44143               /* privileged (public) methods */
44144               this.hex = function(s) {
44145                 return rstr2hex(rstr(s));
44146               };
44147               this.b64 = function(s) {
44148                 return rstr2b64(rstr(s), b64pad);
44149               };
44150               this.any = function(s, e) {
44151                 return rstr2any(rstr(s), e);
44152               };
44153               this.raw = function(s) {
44154                 return rstr(s);
44155               };
44156               this.hex_hmac = function(k, d) {
44157                 return rstr2hex(rstr_hmac(k, d));
44158               };
44159               this.b64_hmac = function(k, d) {
44160                 return rstr2b64(rstr_hmac(k, d), b64pad);
44161               };
44162               this.any_hmac = function(k, d, e) {
44163                 return rstr2any(rstr_hmac(k, d), e);
44164               };
44165               /**
44166                * Perform a simple self-test to see if the VM is working
44167                * @return {String} Hexadecimal hash sample
44168                * @public
44169                */
44170               this.vm_test = function() {
44171                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
44172               };
44173               /**
44174                * @description Enable/disable uppercase hexadecimal returned string
44175                * @param {boolean}
44176                * @return {Object} this
44177                * @public
44178                */
44179               this.setUpperCase = function(a) {
44180                 if (typeof a === 'boolean') {
44181                   hexcase = a;
44182                 }
44183                 return this;
44184               };
44185               /**
44186                * @description Defines a base64 pad string
44187                * @param {string} Pad
44188                * @return {Object} this
44189                * @public
44190                */
44191               this.setPad = function(a) {
44192                 if (typeof a !== 'undefined') {
44193                   b64pad = a;
44194                 }
44195                 return this;
44196               };
44197               /**
44198                * @description Defines a base64 pad string
44199                * @param {boolean}
44200                * @return {Object} this
44201                * @public
44202                */
44203               this.setUTF8 = function(a) {
44204                 if (typeof a === 'boolean') {
44205                   utf8 = a;
44206                 }
44207                 return this;
44208               };
44209
44210               /* private methods */
44211
44212               /**
44213                * Calculate the rmd160 of a raw string
44214                */
44215
44216               function rstr(s) {
44217                 s = (utf8) ? utf8Encode(s) : s;
44218                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
44219               }
44220
44221               /**
44222                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
44223                */
44224
44225               function rstr_hmac(key, data) {
44226                 key = (utf8) ? utf8Encode(key) : key;
44227                 data = (utf8) ? utf8Encode(data) : data;
44228                 var i, hash,
44229                   bkey = rstr2binl(key),
44230                   ipad = Array(16),
44231                   opad = Array(16);
44232
44233                 if (bkey.length > 16) {
44234                   bkey = binl(bkey, key.length * 8);
44235                 }
44236
44237                 for (i = 0; i < 16; i += 1) {
44238                   ipad[i] = bkey[i] ^ 0x36363636;
44239                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
44240                 }
44241                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
44242                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
44243               }
44244
44245               /**
44246                * Convert an array of little-endian words to a string
44247                */
44248
44249               function binl2rstr(input) {
44250                 var i, output = '',
44251                   l = input.length * 32;
44252                 for (i = 0; i < l; i += 8) {
44253                   output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
44254                 }
44255                 return output;
44256               }
44257
44258               /**
44259                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
44260                */
44261
44262               function binl(x, len) {
44263                 var T, j, i, l,
44264                   h0 = 0x67452301,
44265                   h1 = 0xefcdab89,
44266                   h2 = 0x98badcfe,
44267                   h3 = 0x10325476,
44268                   h4 = 0xc3d2e1f0,
44269                   A1, B1, C1, D1, E1,
44270                   A2, B2, C2, D2, E2;
44271
44272                 /* append padding */
44273                 x[len >> 5] |= 0x80 << (len % 32);
44274                 x[(((len + 64) >>> 9) << 4) + 14] = len;
44275                 l = x.length;
44276
44277                 for (i = 0; i < l; i += 16) {
44278                   A1 = A2 = h0;
44279                   B1 = B2 = h1;
44280                   C1 = C2 = h2;
44281                   D1 = D2 = h3;
44282                   E1 = E2 = h4;
44283                   for (j = 0; j <= 79; j += 1) {
44284                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
44285                     T = safe_add(T, x[i + rmd160_r1[j]]);
44286                     T = safe_add(T, rmd160_K1(j));
44287                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
44288                     A1 = E1;
44289                     E1 = D1;
44290                     D1 = bit_rol(C1, 10);
44291                     C1 = B1;
44292                     B1 = T;
44293                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
44294                     T = safe_add(T, x[i + rmd160_r2[j]]);
44295                     T = safe_add(T, rmd160_K2(j));
44296                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
44297                     A2 = E2;
44298                     E2 = D2;
44299                     D2 = bit_rol(C2, 10);
44300                     C2 = B2;
44301                     B2 = T;
44302                   }
44303
44304                   T = safe_add(h1, safe_add(C1, D2));
44305                   h1 = safe_add(h2, safe_add(D1, E2));
44306                   h2 = safe_add(h3, safe_add(E1, A2));
44307                   h3 = safe_add(h4, safe_add(A1, B2));
44308                   h4 = safe_add(h0, safe_add(B1, C2));
44309                   h0 = T;
44310                 }
44311                 return [h0, h1, h2, h3, h4];
44312               }
44313
44314               // specific algorithm methods
44315
44316               function rmd160_f(j, x, y, z) {
44317                 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
44318                   (16 <= j && j <= 31) ? (x & y) | (~x & z) :
44319                   (32 <= j && j <= 47) ? (x | ~y) ^ z :
44320                   (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
44321                   (64 <= j && j <= 79) ? x ^ (y | ~z) :
44322                   'rmd160_f: j out of range';
44323               }
44324
44325               function rmd160_K1(j) {
44326                 return (0 <= j && j <= 15) ? 0x00000000 :
44327                   (16 <= j && j <= 31) ? 0x5a827999 :
44328                   (32 <= j && j <= 47) ? 0x6ed9eba1 :
44329                   (48 <= j && j <= 63) ? 0x8f1bbcdc :
44330                   (64 <= j && j <= 79) ? 0xa953fd4e :
44331                   'rmd160_K1: j out of range';
44332               }
44333
44334               function rmd160_K2(j) {
44335                 return (0 <= j && j <= 15) ? 0x50a28be6 :
44336                   (16 <= j && j <= 31) ? 0x5c4dd124 :
44337                   (32 <= j && j <= 47) ? 0x6d703ef3 :
44338                   (48 <= j && j <= 63) ? 0x7a6d76e9 :
44339                   (64 <= j && j <= 79) ? 0x00000000 :
44340                   'rmd160_K2: j out of range';
44341               }
44342             }
44343           };
44344
44345           // exposes Hashes
44346           (function(window, undefined$1) {
44347             var freeExports = false;
44348             {
44349               freeExports = exports;
44350               if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
44351                 window = commonjsGlobal;
44352               }
44353             }
44354
44355             if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
44356               // define as an anonymous module, so, through path mapping, it can be aliased
44357               undefined$1(function() {
44358                 return Hashes;
44359               });
44360             } else if (freeExports) {
44361               // in Node.js or RingoJS v0.8.0+
44362               if ( module && module.exports === freeExports) {
44363                 module.exports = Hashes;
44364               }
44365               // in Narwhal or RingoJS v0.7.0-
44366               else {
44367                 freeExports.Hashes = Hashes;
44368               }
44369             } else {
44370               // in a browser or Rhino
44371               window.Hashes = Hashes;
44372             }
44373           }(this));
44374         }()); // IIFE
44375         });
44376
44377         var immutable = extend$2;
44378
44379         var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
44380
44381         function extend$2() {
44382             var target = {};
44383
44384             for (var i = 0; i < arguments.length; i++) {
44385                 var source = arguments[i];
44386
44387                 for (var key in source) {
44388                     if (hasOwnProperty$3.call(source, key)) {
44389                         target[key] = source[key];
44390                     }
44391                 }
44392             }
44393
44394             return target
44395         }
44396
44397         var sha1 = new hashes.SHA1();
44398
44399         var ohauth = {};
44400
44401         ohauth.qsString = function(obj) {
44402             return Object.keys(obj).sort().map(function(key) {
44403                 return ohauth.percentEncode(key) + '=' +
44404                     ohauth.percentEncode(obj[key]);
44405             }).join('&');
44406         };
44407
44408         ohauth.stringQs = function(str) {
44409             return str.split('&').filter(function (pair) {
44410                 return pair !== '';
44411             }).reduce(function(obj, pair){
44412                 var parts = pair.split('=');
44413                 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
44414                     '' : decodeURIComponent(parts[1]);
44415                 return obj;
44416             }, {});
44417         };
44418
44419         ohauth.rawxhr = function(method, url, data, headers, callback) {
44420             var xhr = new XMLHttpRequest(),
44421                 twoHundred = /^20\d$/;
44422             xhr.onreadystatechange = function() {
44423                 if (4 === xhr.readyState && 0 !== xhr.status) {
44424                     if (twoHundred.test(xhr.status)) callback(null, xhr);
44425                     else return callback(xhr, null);
44426                 }
44427             };
44428             xhr.onerror = function(e) { return callback(e, null); };
44429             xhr.open(method, url, true);
44430             for (var h in headers) xhr.setRequestHeader(h, headers[h]);
44431             xhr.send(data);
44432             return xhr;
44433         };
44434
44435         ohauth.xhr = function(method, url, auth, data, options, callback) {
44436             var headers = (options && options.header) || {
44437                 'Content-Type': 'application/x-www-form-urlencoded'
44438             };
44439             headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
44440             return ohauth.rawxhr(method, url, data, headers, callback);
44441         };
44442
44443         ohauth.nonce = function() {
44444             for (var o = ''; o.length < 6;) {
44445                 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
44446             }
44447             return o;
44448         };
44449
44450         ohauth.authHeader = function(obj) {
44451             return Object.keys(obj).sort().map(function(key) {
44452                 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
44453             }).join(', ');
44454         };
44455
44456         ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
44457
44458         ohauth.percentEncode = function(s) {
44459             return encodeURIComponent(s)
44460                 .replace(/\!/g, '%21').replace(/\'/g, '%27')
44461                 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
44462         };
44463
44464         ohauth.baseString = function(method, url, params) {
44465             if (params.oauth_signature) delete params.oauth_signature;
44466             return [
44467                 method,
44468                 ohauth.percentEncode(url),
44469                 ohauth.percentEncode(ohauth.qsString(params))].join('&');
44470         };
44471
44472         ohauth.signature = function(oauth_secret, token_secret, baseString) {
44473             return sha1.b64_hmac(
44474                 ohauth.percentEncode(oauth_secret) + '&' +
44475                 ohauth.percentEncode(token_secret),
44476                 baseString);
44477         };
44478
44479         /**
44480          * Takes an options object for configuration (consumer_key,
44481          * consumer_secret, version, signature_method, token, token_secret)
44482          * and returns a function that generates the Authorization header
44483          * for given data.
44484          *
44485          * The returned function takes these parameters:
44486          * - method: GET/POST/...
44487          * - uri: full URI with protocol, port, path and query string
44488          * - extra_params: any extra parameters (that are passed in the POST data),
44489          *   can be an object or a from-urlencoded string.
44490          *
44491          * Returned function returns full OAuth header with "OAuth" string in it.
44492          */
44493
44494         ohauth.headerGenerator = function(options) {
44495             options = options || {};
44496             var consumer_key = options.consumer_key || '',
44497                 consumer_secret = options.consumer_secret || '',
44498                 signature_method = options.signature_method || 'HMAC-SHA1',
44499                 version = options.version || '1.0',
44500                 token = options.token || '',
44501                 token_secret = options.token_secret || '';
44502
44503             return function(method, uri, extra_params) {
44504                 method = method.toUpperCase();
44505                 if (typeof extra_params === 'string' && extra_params.length > 0) {
44506                     extra_params = ohauth.stringQs(extra_params);
44507                 }
44508
44509                 var uri_parts = uri.split('?', 2),
44510                 base_uri = uri_parts[0];
44511
44512                 var query_params = uri_parts.length === 2 ?
44513                     ohauth.stringQs(uri_parts[1]) : {};
44514
44515                 var oauth_params = {
44516                     oauth_consumer_key: consumer_key,
44517                     oauth_signature_method: signature_method,
44518                     oauth_version: version,
44519                     oauth_timestamp: ohauth.timestamp(),
44520                     oauth_nonce: ohauth.nonce()
44521                 };
44522
44523                 if (token) oauth_params.oauth_token = token;
44524
44525                 var all_params = immutable({}, oauth_params, query_params, extra_params),
44526                     base_str = ohauth.baseString(method, base_uri, all_params);
44527
44528                 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
44529
44530                 return 'OAuth ' + ohauth.authHeader(oauth_params);
44531             };
44532         };
44533
44534         var ohauth_1 = ohauth;
44535
44536         var resolveUrl = createCommonjsModule(function (module, exports) {
44537         // Copyright 2014 Simon Lydell
44538         // X11 (“MIT”) Licensed. (See LICENSE.)
44539
44540         void (function(root, factory) {
44541           {
44542             module.exports = factory();
44543           }
44544         }(commonjsGlobal, function() {
44545
44546           function resolveUrl(/* ...urls */) {
44547             var numUrls = arguments.length;
44548
44549             if (numUrls === 0) {
44550               throw new Error("resolveUrl requires at least one argument; got none.")
44551             }
44552
44553             var base = document.createElement("base");
44554             base.href = arguments[0];
44555
44556             if (numUrls === 1) {
44557               return base.href
44558             }
44559
44560             var head = document.getElementsByTagName("head")[0];
44561             head.insertBefore(base, head.firstChild);
44562
44563             var a = document.createElement("a");
44564             var resolved;
44565
44566             for (var index = 1; index < numUrls; index++) {
44567               a.href = arguments[index];
44568               resolved = a.href;
44569               base.href = resolved;
44570             }
44571
44572             head.removeChild(base);
44573
44574             return resolved
44575           }
44576
44577           return resolveUrl
44578
44579         }));
44580         });
44581
44582         var assign$2 = make_assign();
44583         var create$7 = make_create();
44584         var trim$1 = make_trim();
44585         var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
44586
44587         var util = {
44588                 assign: assign$2,
44589                 create: create$7,
44590                 trim: trim$1,
44591                 bind: bind$3,
44592                 slice: slice$b,
44593                 each: each,
44594                 map: map$5,
44595                 pluck: pluck,
44596                 isList: isList,
44597                 isFunction: isFunction$2,
44598                 isObject: isObject$2,
44599                 Global: Global
44600         };
44601
44602         function make_assign() {
44603                 if (Object.assign) {
44604                         return Object.assign
44605                 } else {
44606                         return function shimAssign(obj, props1, props2, etc) {
44607                                 for (var i = 1; i < arguments.length; i++) {
44608                                         each(Object(arguments[i]), function(val, key) {
44609                                                 obj[key] = val;
44610                                         });
44611                                 }                       
44612                                 return obj
44613                         }
44614                 }
44615         }
44616
44617         function make_create() {
44618                 if (Object.create) {
44619                         return function create(obj, assignProps1, assignProps2, etc) {
44620                                 var assignArgsList = slice$b(arguments, 1);
44621                                 return assign$2.apply(this, [Object.create(obj)].concat(assignArgsList))
44622                         }
44623                 } else {
44624                         function F() {} // eslint-disable-line no-inner-declarations
44625                         return function create(obj, assignProps1, assignProps2, etc) {
44626                                 var assignArgsList = slice$b(arguments, 1);
44627                                 F.prototype = obj;
44628                                 return assign$2.apply(this, [new F()].concat(assignArgsList))
44629                         }
44630                 }
44631         }
44632
44633         function make_trim() {
44634                 if (String.prototype.trim) {
44635                         return function trim(str) {
44636                                 return String.prototype.trim.call(str)
44637                         }
44638                 } else {
44639                         return function trim(str) {
44640                                 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
44641                         }
44642                 }
44643         }
44644
44645         function bind$3(obj, fn) {
44646                 return function() {
44647                         return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
44648                 }
44649         }
44650
44651         function slice$b(arr, index) {
44652                 return Array.prototype.slice.call(arr, index || 0)
44653         }
44654
44655         function each(obj, fn) {
44656                 pluck(obj, function(val, key) {
44657                         fn(val, key);
44658                         return false
44659                 });
44660         }
44661
44662         function map$5(obj, fn) {
44663                 var res = (isList(obj) ? [] : {});
44664                 pluck(obj, function(v, k) {
44665                         res[k] = fn(v, k);
44666                         return false
44667                 });
44668                 return res
44669         }
44670
44671         function pluck(obj, fn) {
44672                 if (isList(obj)) {
44673                         for (var i=0; i<obj.length; i++) {
44674                                 if (fn(obj[i], i)) {
44675                                         return obj[i]
44676                                 }
44677                         }
44678                 } else {
44679                         for (var key in obj) {
44680                                 if (obj.hasOwnProperty(key)) {
44681                                         if (fn(obj[key], key)) {
44682                                                 return obj[key]
44683                                         }
44684                                 }
44685                         }
44686                 }
44687         }
44688
44689         function isList(val) {
44690                 return (val != null && typeof val != 'function' && typeof val.length == 'number')
44691         }
44692
44693         function isFunction$2(val) {
44694                 return val && {}.toString.call(val) === '[object Function]'
44695         }
44696
44697         function isObject$2(val) {
44698                 return val && {}.toString.call(val) === '[object Object]'
44699         }
44700
44701         var slice$c = util.slice;
44702         var pluck$1 = util.pluck;
44703         var each$1 = util.each;
44704         var bind$4 = util.bind;
44705         var create$8 = util.create;
44706         var isList$1 = util.isList;
44707         var isFunction$3 = util.isFunction;
44708         var isObject$3 = util.isObject;
44709
44710         var storeEngine = {
44711                 createStore: createStore
44712         };
44713
44714         var storeAPI = {
44715                 version: '2.0.12',
44716                 enabled: false,
44717                 
44718                 // get returns the value of the given key. If that value
44719                 // is undefined, it returns optionalDefaultValue instead.
44720                 get: function(key, optionalDefaultValue) {
44721                         var data = this.storage.read(this._namespacePrefix + key);
44722                         return this._deserialize(data, optionalDefaultValue)
44723                 },
44724
44725                 // set will store the given value at key and returns value.
44726                 // Calling set with value === undefined is equivalent to calling remove.
44727                 set: function(key, value) {
44728                         if (value === undefined) {
44729                                 return this.remove(key)
44730                         }
44731                         this.storage.write(this._namespacePrefix + key, this._serialize(value));
44732                         return value
44733                 },
44734
44735                 // remove deletes the key and value stored at the given key.
44736                 remove: function(key) {
44737                         this.storage.remove(this._namespacePrefix + key);
44738                 },
44739
44740                 // each will call the given callback once for each key-value pair
44741                 // in this store.
44742                 each: function(callback) {
44743                         var self = this;
44744                         this.storage.each(function(val, namespacedKey) {
44745                                 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
44746                         });
44747                 },
44748
44749                 // clearAll will remove all the stored key-value pairs in this store.
44750                 clearAll: function() {
44751                         this.storage.clearAll();
44752                 },
44753
44754                 // additional functionality that can't live in plugins
44755                 // ---------------------------------------------------
44756
44757                 // hasNamespace returns true if this store instance has the given namespace.
44758                 hasNamespace: function(namespace) {
44759                         return (this._namespacePrefix == '__storejs_'+namespace+'_')
44760                 },
44761
44762                 // createStore creates a store.js instance with the first
44763                 // functioning storage in the list of storage candidates,
44764                 // and applies the the given mixins to the instance.
44765                 createStore: function() {
44766                         return createStore.apply(this, arguments)
44767                 },
44768                 
44769                 addPlugin: function(plugin) {
44770                         this._addPlugin(plugin);
44771                 },
44772                 
44773                 namespace: function(namespace) {
44774                         return createStore(this.storage, this.plugins, namespace)
44775                 }
44776         };
44777
44778         function _warn() {
44779                 var _console = (typeof console == 'undefined' ? null : console);
44780                 if (!_console) { return }
44781                 var fn = (_console.warn ? _console.warn : _console.log);
44782                 fn.apply(_console, arguments);
44783         }
44784
44785         function createStore(storages, plugins, namespace) {
44786                 if (!namespace) {
44787                         namespace = '';
44788                 }
44789                 if (storages && !isList$1(storages)) {
44790                         storages = [storages];
44791                 }
44792                 if (plugins && !isList$1(plugins)) {
44793                         plugins = [plugins];
44794                 }
44795
44796                 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
44797                 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
44798                 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
44799                 if (!legalNamespaces.test(namespace)) {
44800                         throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
44801                 }
44802                 
44803                 var _privateStoreProps = {
44804                         _namespacePrefix: namespacePrefix,
44805                         _namespaceRegexp: namespaceRegexp,
44806
44807                         _testStorage: function(storage) {
44808                                 try {
44809                                         var testStr = '__storejs__test__';
44810                                         storage.write(testStr, testStr);
44811                                         var ok = (storage.read(testStr) === testStr);
44812                                         storage.remove(testStr);
44813                                         return ok
44814                                 } catch(e) {
44815                                         return false
44816                                 }
44817                         },
44818
44819                         _assignPluginFnProp: function(pluginFnProp, propName) {
44820                                 var oldFn = this[propName];
44821                                 this[propName] = function pluginFn() {
44822                                         var args = slice$c(arguments, 0);
44823                                         var self = this;
44824
44825                                         // super_fn calls the old function which was overwritten by
44826                                         // this mixin.
44827                                         function super_fn() {
44828                                                 if (!oldFn) { return }
44829                                                 each$1(arguments, function(arg, i) {
44830                                                         args[i] = arg;
44831                                                 });
44832                                                 return oldFn.apply(self, args)
44833                                         }
44834
44835                                         // Give mixing function access to super_fn by prefixing all mixin function
44836                                         // arguments with super_fn.
44837                                         var newFnArgs = [super_fn].concat(args);
44838
44839                                         return pluginFnProp.apply(self, newFnArgs)
44840                                 };
44841                         },
44842
44843                         _serialize: function(obj) {
44844                                 return JSON.stringify(obj)
44845                         },
44846
44847                         _deserialize: function(strVal, defaultVal) {
44848                                 if (!strVal) { return defaultVal }
44849                                 // It is possible that a raw string value has been previously stored
44850                                 // in a storage without using store.js, meaning it will be a raw
44851                                 // string value instead of a JSON serialized string. By defaulting
44852                                 // to the raw string value in case of a JSON parse error, we allow
44853                                 // for past stored values to be forwards-compatible with store.js
44854                                 var val = '';
44855                                 try { val = JSON.parse(strVal); }
44856                                 catch(e) { val = strVal; }
44857
44858                                 return (val !== undefined ? val : defaultVal)
44859                         },
44860                         
44861                         _addStorage: function(storage) {
44862                                 if (this.enabled) { return }
44863                                 if (this._testStorage(storage)) {
44864                                         this.storage = storage;
44865                                         this.enabled = true;
44866                                 }
44867                         },
44868
44869                         _addPlugin: function(plugin) {
44870                                 var self = this;
44871
44872                                 // If the plugin is an array, then add all plugins in the array.
44873                                 // This allows for a plugin to depend on other plugins.
44874                                 if (isList$1(plugin)) {
44875                                         each$1(plugin, function(plugin) {
44876                                                 self._addPlugin(plugin);
44877                                         });
44878                                         return
44879                                 }
44880
44881                                 // Keep track of all plugins we've seen so far, so that we
44882                                 // don't add any of them twice.
44883                                 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
44884                                         return (plugin === seenPlugin)
44885                                 });
44886                                 if (seenPlugin) {
44887                                         return
44888                                 }
44889                                 this.plugins.push(plugin);
44890
44891                                 // Check that the plugin is properly formed
44892                                 if (!isFunction$3(plugin)) {
44893                                         throw new Error('Plugins must be function values that return objects')
44894                                 }
44895
44896                                 var pluginProperties = plugin.call(this);
44897                                 if (!isObject$3(pluginProperties)) {
44898                                         throw new Error('Plugins must return an object of function properties')
44899                                 }
44900
44901                                 // Add the plugin function properties to this store instance.
44902                                 each$1(pluginProperties, function(pluginFnProp, propName) {
44903                                         if (!isFunction$3(pluginFnProp)) {
44904                                                 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
44905                                         }
44906                                         self._assignPluginFnProp(pluginFnProp, propName);
44907                                 });
44908                         },
44909                         
44910                         // Put deprecated properties in the private API, so as to not expose it to accidential
44911                         // discovery through inspection of the store object.
44912                         
44913                         // Deprecated: addStorage
44914                         addStorage: function(storage) {
44915                                 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
44916                                 this._addStorage(storage);
44917                         }
44918                 };
44919
44920                 var store = create$8(_privateStoreProps, storeAPI, {
44921                         plugins: []
44922                 });
44923                 store.raw = {};
44924                 each$1(store, function(prop, propName) {
44925                         if (isFunction$3(prop)) {
44926                                 store.raw[propName] = bind$4(store, prop);                      
44927                         }
44928                 });
44929                 each$1(storages, function(storage) {
44930                         store._addStorage(storage);
44931                 });
44932                 each$1(plugins, function(plugin) {
44933                         store._addPlugin(plugin);
44934                 });
44935                 return store
44936         }
44937
44938         var Global$1 = util.Global;
44939
44940         var localStorage_1 = {
44941                 name: 'localStorage',
44942                 read: read,
44943                 write: write,
44944                 each: each$2,
44945                 remove: remove$2,
44946                 clearAll: clearAll,
44947         };
44948
44949         function localStorage$1() {
44950                 return Global$1.localStorage
44951         }
44952
44953         function read(key) {
44954                 return localStorage$1().getItem(key)
44955         }
44956
44957         function write(key, data) {
44958                 return localStorage$1().setItem(key, data)
44959         }
44960
44961         function each$2(fn) {
44962                 for (var i = localStorage$1().length - 1; i >= 0; i--) {
44963                         var key = localStorage$1().key(i);
44964                         fn(read(key), key);
44965                 }
44966         }
44967
44968         function remove$2(key) {
44969                 return localStorage$1().removeItem(key)
44970         }
44971
44972         function clearAll() {
44973                 return localStorage$1().clear()
44974         }
44975
44976         // oldFF-globalStorage provides storage for Firefox
44977         // versions 6 and 7, where no localStorage, etc
44978         // is available.
44979
44980
44981         var Global$2 = util.Global;
44982
44983         var oldFFGlobalStorage = {
44984                 name: 'oldFF-globalStorage',
44985                 read: read$1,
44986                 write: write$1,
44987                 each: each$3,
44988                 remove: remove$3,
44989                 clearAll: clearAll$1,
44990         };
44991
44992         var globalStorage = Global$2.globalStorage;
44993
44994         function read$1(key) {
44995                 return globalStorage[key]
44996         }
44997
44998         function write$1(key, data) {
44999                 globalStorage[key] = data;
45000         }
45001
45002         function each$3(fn) {
45003                 for (var i = globalStorage.length - 1; i >= 0; i--) {
45004                         var key = globalStorage.key(i);
45005                         fn(globalStorage[key], key);
45006                 }
45007         }
45008
45009         function remove$3(key) {
45010                 return globalStorage.removeItem(key)
45011         }
45012
45013         function clearAll$1() {
45014                 each$3(function(key, _) {
45015                         delete globalStorage[key];
45016                 });
45017         }
45018
45019         // oldIE-userDataStorage provides storage for Internet Explorer
45020         // versions 6 and 7, where no localStorage, sessionStorage, etc
45021         // is available.
45022
45023
45024         var Global$3 = util.Global;
45025
45026         var oldIEUserDataStorage = {
45027                 name: 'oldIE-userDataStorage',
45028                 write: write$2,
45029                 read: read$2,
45030                 each: each$4,
45031                 remove: remove$4,
45032                 clearAll: clearAll$2,
45033         };
45034
45035         var storageName = 'storejs';
45036         var doc = Global$3.document;
45037         var _withStorageEl = _makeIEStorageElFunction();
45038         var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
45039
45040         function write$2(unfixedKey, data) {
45041                 if (disable) { return }
45042                 var fixedKey = fixKey(unfixedKey);
45043                 _withStorageEl(function(storageEl) {
45044                         storageEl.setAttribute(fixedKey, data);
45045                         storageEl.save(storageName);
45046                 });
45047         }
45048
45049         function read$2(unfixedKey) {
45050                 if (disable) { return }
45051                 var fixedKey = fixKey(unfixedKey);
45052                 var res = null;
45053                 _withStorageEl(function(storageEl) {
45054                         res = storageEl.getAttribute(fixedKey);
45055                 });
45056                 return res
45057         }
45058
45059         function each$4(callback) {
45060                 _withStorageEl(function(storageEl) {
45061                         var attributes = storageEl.XMLDocument.documentElement.attributes;
45062                         for (var i=attributes.length-1; i>=0; i--) {
45063                                 var attr = attributes[i];
45064                                 callback(storageEl.getAttribute(attr.name), attr.name);
45065                         }
45066                 });
45067         }
45068
45069         function remove$4(unfixedKey) {
45070                 var fixedKey = fixKey(unfixedKey);
45071                 _withStorageEl(function(storageEl) {
45072                         storageEl.removeAttribute(fixedKey);
45073                         storageEl.save(storageName);
45074                 });
45075         }
45076
45077         function clearAll$2() {
45078                 _withStorageEl(function(storageEl) {
45079                         var attributes = storageEl.XMLDocument.documentElement.attributes;
45080                         storageEl.load(storageName);
45081                         for (var i=attributes.length-1; i>=0; i--) {
45082                                 storageEl.removeAttribute(attributes[i].name);
45083                         }
45084                         storageEl.save(storageName);
45085                 });
45086         }
45087
45088         // Helpers
45089         //////////
45090
45091         // In IE7, keys cannot start with a digit or contain certain chars.
45092         // See https://github.com/marcuswestin/store.js/issues/40
45093         // See https://github.com/marcuswestin/store.js/issues/83
45094         var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
45095         function fixKey(key) {
45096                 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
45097         }
45098
45099         function _makeIEStorageElFunction() {
45100                 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
45101                         return null
45102                 }
45103                 var scriptTag = 'script',
45104                         storageOwner,
45105                         storageContainer,
45106                         storageEl;
45107
45108                 // Since #userData storage applies only to specific paths, we need to
45109                 // somehow link our data to a specific path.  We choose /favicon.ico
45110                 // as a pretty safe option, since all browsers already make a request to
45111                 // this URL anyway and being a 404 will not hurt us here.  We wrap an
45112                 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
45113                 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
45114                 // since the iframe access rules appear to allow direct access and
45115                 // manipulation of the document element, even for a 404 page.  This
45116                 // document can be used instead of the current document (which would
45117                 // have been limited to the current path) to perform #userData storage.
45118                 try {
45119                         /* global ActiveXObject */
45120                         storageContainer = new ActiveXObject('htmlfile');
45121                         storageContainer.open();
45122                         storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
45123                         storageContainer.close();
45124                         storageOwner = storageContainer.w.frames[0].document;
45125                         storageEl = storageOwner.createElement('div');
45126                 } catch(e) {
45127                         // somehow ActiveXObject instantiation failed (perhaps some special
45128                         // security settings or otherwse), fall back to per-path storage
45129                         storageEl = doc.createElement('div');
45130                         storageOwner = doc.body;
45131                 }
45132
45133                 return function(storeFunction) {
45134                         var args = [].slice.call(arguments, 0);
45135                         args.unshift(storageEl);
45136                         // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
45137                         // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
45138                         storageOwner.appendChild(storageEl);
45139                         storageEl.addBehavior('#default#userData');
45140                         storageEl.load(storageName);
45141                         storeFunction.apply(this, args);
45142                         storageOwner.removeChild(storageEl);
45143                         return
45144                 }
45145         }
45146
45147         // cookieStorage is useful Safari private browser mode, where localStorage
45148         // doesn't work but cookies do. This implementation is adopted from
45149         // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
45150
45151
45152         var Global$4 = util.Global;
45153         var trim$2 = util.trim;
45154
45155         var cookieStorage = {
45156                 name: 'cookieStorage',
45157                 read: read$3,
45158                 write: write$3,
45159                 each: each$5,
45160                 remove: remove$5,
45161                 clearAll: clearAll$3,
45162         };
45163
45164         var doc$1 = Global$4.document;
45165
45166         function read$3(key) {
45167                 if (!key || !_has(key)) { return null }
45168                 var regexpStr = "(?:^|.*;\\s*)" +
45169                         escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
45170                         "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
45171                 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
45172         }
45173
45174         function each$5(callback) {
45175                 var cookies = doc$1.cookie.split(/; ?/g);
45176                 for (var i = cookies.length - 1; i >= 0; i--) {
45177                         if (!trim$2(cookies[i])) {
45178                                 continue
45179                         }
45180                         var kvp = cookies[i].split('=');
45181                         var key = unescape(kvp[0]);
45182                         var val = unescape(kvp[1]);
45183                         callback(val, key);
45184                 }
45185         }
45186
45187         function write$3(key, data) {
45188                 if(!key) { return }
45189                 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
45190         }
45191
45192         function remove$5(key) {
45193                 if (!key || !_has(key)) {
45194                         return
45195                 }
45196                 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
45197         }
45198
45199         function clearAll$3() {
45200                 each$5(function(_, key) {
45201                         remove$5(key);
45202                 });
45203         }
45204
45205         function _has(key) {
45206                 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
45207         }
45208
45209         var Global$5 = util.Global;
45210
45211         var sessionStorage_1 = {
45212                 name: 'sessionStorage',
45213                 read: read$4,
45214                 write: write$4,
45215                 each: each$6,
45216                 remove: remove$6,
45217                 clearAll: clearAll$4
45218         };
45219
45220         function sessionStorage() {
45221                 return Global$5.sessionStorage
45222         }
45223
45224         function read$4(key) {
45225                 return sessionStorage().getItem(key)
45226         }
45227
45228         function write$4(key, data) {
45229                 return sessionStorage().setItem(key, data)
45230         }
45231
45232         function each$6(fn) {
45233                 for (var i = sessionStorage().length - 1; i >= 0; i--) {
45234                         var key = sessionStorage().key(i);
45235                         fn(read$4(key), key);
45236                 }
45237         }
45238
45239         function remove$6(key) {
45240                 return sessionStorage().removeItem(key)
45241         }
45242
45243         function clearAll$4() {
45244                 return sessionStorage().clear()
45245         }
45246
45247         // memoryStorage is a useful last fallback to ensure that the store
45248         // is functions (meaning store.get(), store.set(), etc will all function).
45249         // However, stored values will not persist when the browser navigates to
45250         // a new page or reloads the current page.
45251
45252         var memoryStorage_1 = {
45253                 name: 'memoryStorage',
45254                 read: read$5,
45255                 write: write$5,
45256                 each: each$7,
45257                 remove: remove$7,
45258                 clearAll: clearAll$5,
45259         };
45260
45261         var memoryStorage = {};
45262
45263         function read$5(key) {
45264                 return memoryStorage[key]
45265         }
45266
45267         function write$5(key, data) {
45268                 memoryStorage[key] = data;
45269         }
45270
45271         function each$7(callback) {
45272                 for (var key in memoryStorage) {
45273                         if (memoryStorage.hasOwnProperty(key)) {
45274                                 callback(memoryStorage[key], key);
45275                         }
45276                 }
45277         }
45278
45279         function remove$7(key) {
45280                 delete memoryStorage[key];
45281         }
45282
45283         function clearAll$5(key) {
45284                 memoryStorage = {};
45285         }
45286
45287         var all = [
45288                 // Listed in order of usage preference
45289                 localStorage_1,
45290                 oldFFGlobalStorage,
45291                 oldIEUserDataStorage,
45292                 cookieStorage,
45293                 sessionStorage_1,
45294                 memoryStorage_1
45295         ];
45296
45297         /* eslint-disable */
45298
45299         //  json2.js
45300         //  2016-10-28
45301         //  Public Domain.
45302         //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
45303         //  See http://www.JSON.org/js.html
45304         //  This code should be minified before deployment.
45305         //  See http://javascript.crockford.com/jsmin.html
45306
45307         //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
45308         //  NOT CONTROL.
45309
45310         //  This file creates a global JSON object containing two methods: stringify
45311         //  and parse. This file provides the ES5 JSON capability to ES3 systems.
45312         //  If a project might run on IE8 or earlier, then this file should be included.
45313         //  This file does nothing on ES5 systems.
45314
45315         //      JSON.stringify(value, replacer, space)
45316         //          value       any JavaScript value, usually an object or array.
45317         //          replacer    an optional parameter that determines how object
45318         //                      values are stringified for objects. It can be a
45319         //                      function or an array of strings.
45320         //          space       an optional parameter that specifies the indentation
45321         //                      of nested structures. If it is omitted, the text will
45322         //                      be packed without extra whitespace. If it is a number,
45323         //                      it will specify the number of spaces to indent at each
45324         //                      level. If it is a string (such as "\t" or "&nbsp;"),
45325         //                      it contains the characters used to indent at each level.
45326         //          This method produces a JSON text from a JavaScript value.
45327         //          When an object value is found, if the object contains a toJSON
45328         //          method, its toJSON method will be called and the result will be
45329         //          stringified. A toJSON method does not serialize: it returns the
45330         //          value represented by the name/value pair that should be serialized,
45331         //          or undefined if nothing should be serialized. The toJSON method
45332         //          will be passed the key associated with the value, and this will be
45333         //          bound to the value.
45334
45335         //          For example, this would serialize Dates as ISO strings.
45336
45337         //              Date.prototype.toJSON = function (key) {
45338         //                  function f(n) {
45339         //                      // Format integers to have at least two digits.
45340         //                      return (n < 10)
45341         //                          ? "0" + n
45342         //                          : n;
45343         //                  }
45344         //                  return this.getUTCFullYear()   + "-" +
45345         //                       f(this.getUTCMonth() + 1) + "-" +
45346         //                       f(this.getUTCDate())      + "T" +
45347         //                       f(this.getUTCHours())     + ":" +
45348         //                       f(this.getUTCMinutes())   + ":" +
45349         //                       f(this.getUTCSeconds())   + "Z";
45350         //              };
45351
45352         //          You can provide an optional replacer method. It will be passed the
45353         //          key and value of each member, with this bound to the containing
45354         //          object. The value that is returned from your method will be
45355         //          serialized. If your method returns undefined, then the member will
45356         //          be excluded from the serialization.
45357
45358         //          If the replacer parameter is an array of strings, then it will be
45359         //          used to select the members to be serialized. It filters the results
45360         //          such that only members with keys listed in the replacer array are
45361         //          stringified.
45362
45363         //          Values that do not have JSON representations, such as undefined or
45364         //          functions, will not be serialized. Such values in objects will be
45365         //          dropped; in arrays they will be replaced with null. You can use
45366         //          a replacer function to replace those with JSON values.
45367
45368         //          JSON.stringify(undefined) returns undefined.
45369
45370         //          The optional space parameter produces a stringification of the
45371         //          value that is filled with line breaks and indentation to make it
45372         //          easier to read.
45373
45374         //          If the space parameter is a non-empty string, then that string will
45375         //          be used for indentation. If the space parameter is a number, then
45376         //          the indentation will be that many spaces.
45377
45378         //          Example:
45379
45380         //          text = JSON.stringify(["e", {pluribus: "unum"}]);
45381         //          // text is '["e",{"pluribus":"unum"}]'
45382
45383         //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
45384         //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
45385
45386         //          text = JSON.stringify([new Date()], function (key, value) {
45387         //              return this[key] instanceof Date
45388         //                  ? "Date(" + this[key] + ")"
45389         //                  : value;
45390         //          });
45391         //          // text is '["Date(---current time---)"]'
45392
45393         //      JSON.parse(text, reviver)
45394         //          This method parses a JSON text to produce an object or array.
45395         //          It can throw a SyntaxError exception.
45396
45397         //          The optional reviver parameter is a function that can filter and
45398         //          transform the results. It receives each of the keys and values,
45399         //          and its return value is used instead of the original value.
45400         //          If it returns what it received, then the structure is not modified.
45401         //          If it returns undefined then the member is deleted.
45402
45403         //          Example:
45404
45405         //          // Parse the text. Values that look like ISO date strings will
45406         //          // be converted to Date objects.
45407
45408         //          myData = JSON.parse(text, function (key, value) {
45409         //              var a;
45410         //              if (typeof value === "string") {
45411         //                  a =
45412         //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
45413         //                  if (a) {
45414         //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
45415         //                          +a[5], +a[6]));
45416         //                  }
45417         //              }
45418         //              return value;
45419         //          });
45420
45421         //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
45422         //              var d;
45423         //              if (typeof value === "string" &&
45424         //                      value.slice(0, 5) === "Date(" &&
45425         //                      value.slice(-1) === ")") {
45426         //                  d = new Date(value.slice(5, -1));
45427         //                  if (d) {
45428         //                      return d;
45429         //                  }
45430         //              }
45431         //              return value;
45432         //          });
45433
45434         //  This is a reference implementation. You are free to copy, modify, or
45435         //  redistribute.
45436
45437         /*jslint
45438             eval, for, this
45439         */
45440
45441         /*property
45442             JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
45443             getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
45444             lastIndex, length, parse, prototype, push, replace, slice, stringify,
45445             test, toJSON, toString, valueOf
45446         */
45447
45448
45449         // Create a JSON object only if one does not already exist. We create the
45450         // methods in a closure to avoid creating global variables.
45451
45452         if (typeof JSON !== "object") {
45453             JSON = {};
45454         }
45455
45456         (function () {
45457
45458             var rx_one = /^[\],:{}\s]*$/;
45459             var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
45460             var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
45461             var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
45462             var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45463             var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45464
45465             function f(n) {
45466                 // Format integers to have at least two digits.
45467                 return n < 10
45468                     ? "0" + n
45469                     : n;
45470             }
45471
45472             function this_value() {
45473                 return this.valueOf();
45474             }
45475
45476             if (typeof Date.prototype.toJSON !== "function") {
45477
45478                 Date.prototype.toJSON = function () {
45479
45480                     return isFinite(this.valueOf())
45481                         ? this.getUTCFullYear() + "-" +
45482                                 f(this.getUTCMonth() + 1) + "-" +
45483                                 f(this.getUTCDate()) + "T" +
45484                                 f(this.getUTCHours()) + ":" +
45485                                 f(this.getUTCMinutes()) + ":" +
45486                                 f(this.getUTCSeconds()) + "Z"
45487                         : null;
45488                 };
45489
45490                 Boolean.prototype.toJSON = this_value;
45491                 Number.prototype.toJSON = this_value;
45492                 String.prototype.toJSON = this_value;
45493             }
45494
45495             var gap;
45496             var indent;
45497             var meta;
45498             var rep;
45499
45500
45501             function quote(string) {
45502
45503         // If the string contains no control characters, no quote characters, and no
45504         // backslash characters, then we can safely slap some quotes around it.
45505         // Otherwise we must also replace the offending characters with safe escape
45506         // sequences.
45507
45508                 rx_escapable.lastIndex = 0;
45509                 return rx_escapable.test(string)
45510                     ? "\"" + string.replace(rx_escapable, function (a) {
45511                         var c = meta[a];
45512                         return typeof c === "string"
45513                             ? c
45514                             : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45515                     }) + "\""
45516                     : "\"" + string + "\"";
45517             }
45518
45519
45520             function str(key, holder) {
45521
45522         // Produce a string from holder[key].
45523
45524                 var i;          // The loop counter.
45525                 var k;          // The member key.
45526                 var v;          // The member value.
45527                 var length;
45528                 var mind = gap;
45529                 var partial;
45530                 var value = holder[key];
45531
45532         // If the value has a toJSON method, call it to obtain a replacement value.
45533
45534                 if (value && typeof value === "object" &&
45535                         typeof value.toJSON === "function") {
45536                     value = value.toJSON(key);
45537                 }
45538
45539         // If we were called with a replacer function, then call the replacer to
45540         // obtain a replacement value.
45541
45542                 if (typeof rep === "function") {
45543                     value = rep.call(holder, key, value);
45544                 }
45545
45546         // What happens next depends on the value's type.
45547
45548                 switch (typeof value) {
45549                 case "string":
45550                     return quote(value);
45551
45552                 case "number":
45553
45554         // JSON numbers must be finite. Encode non-finite numbers as null.
45555
45556                     return isFinite(value)
45557                         ? String(value)
45558                         : "null";
45559
45560                 case "boolean":
45561                 case "null":
45562
45563         // If the value is a boolean or null, convert it to a string. Note:
45564         // typeof null does not produce "null". The case is included here in
45565         // the remote chance that this gets fixed someday.
45566
45567                     return String(value);
45568
45569         // If the type is "object", we might be dealing with an object or an array or
45570         // null.
45571
45572                 case "object":
45573
45574         // Due to a specification blunder in ECMAScript, typeof null is "object",
45575         // so watch out for that case.
45576
45577                     if (!value) {
45578                         return "null";
45579                     }
45580
45581         // Make an array to hold the partial results of stringifying this object value.
45582
45583                     gap += indent;
45584                     partial = [];
45585
45586         // Is the value an array?
45587
45588                     if (Object.prototype.toString.apply(value) === "[object Array]") {
45589
45590         // The value is an array. Stringify every element. Use null as a placeholder
45591         // for non-JSON values.
45592
45593                         length = value.length;
45594                         for (i = 0; i < length; i += 1) {
45595                             partial[i] = str(i, value) || "null";
45596                         }
45597
45598         // Join all of the elements together, separated with commas, and wrap them in
45599         // brackets.
45600
45601                         v = partial.length === 0
45602                             ? "[]"
45603                             : gap
45604                                 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
45605                                 : "[" + partial.join(",") + "]";
45606                         gap = mind;
45607                         return v;
45608                     }
45609
45610         // If the replacer is an array, use it to select the members to be stringified.
45611
45612                     if (rep && typeof rep === "object") {
45613                         length = rep.length;
45614                         for (i = 0; i < length; i += 1) {
45615                             if (typeof rep[i] === "string") {
45616                                 k = rep[i];
45617                                 v = str(k, value);
45618                                 if (v) {
45619                                     partial.push(quote(k) + (
45620                                         gap
45621                                             ? ": "
45622                                             : ":"
45623                                     ) + v);
45624                                 }
45625                             }
45626                         }
45627                     } else {
45628
45629         // Otherwise, iterate through all of the keys in the object.
45630
45631                         for (k in value) {
45632                             if (Object.prototype.hasOwnProperty.call(value, k)) {
45633                                 v = str(k, value);
45634                                 if (v) {
45635                                     partial.push(quote(k) + (
45636                                         gap
45637                                             ? ": "
45638                                             : ":"
45639                                     ) + v);
45640                                 }
45641                             }
45642                         }
45643                     }
45644
45645         // Join all of the member texts together, separated with commas,
45646         // and wrap them in braces.
45647
45648                     v = partial.length === 0
45649                         ? "{}"
45650                         : gap
45651                             ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
45652                             : "{" + partial.join(",") + "}";
45653                     gap = mind;
45654                     return v;
45655                 }
45656             }
45657
45658         // If the JSON object does not yet have a stringify method, give it one.
45659
45660             if (typeof JSON.stringify !== "function") {
45661                 meta = {    // table of character substitutions
45662                     "\b": "\\b",
45663                     "\t": "\\t",
45664                     "\n": "\\n",
45665                     "\f": "\\f",
45666                     "\r": "\\r",
45667                     "\"": "\\\"",
45668                     "\\": "\\\\"
45669                 };
45670                 JSON.stringify = function (value, replacer, space) {
45671
45672         // The stringify method takes a value and an optional replacer, and an optional
45673         // space parameter, and returns a JSON text. The replacer can be a function
45674         // that can replace values, or an array of strings that will select the keys.
45675         // A default replacer method can be provided. Use of the space parameter can
45676         // produce text that is more easily readable.
45677
45678                     var i;
45679                     gap = "";
45680                     indent = "";
45681
45682         // If the space parameter is a number, make an indent string containing that
45683         // many spaces.
45684
45685                     if (typeof space === "number") {
45686                         for (i = 0; i < space; i += 1) {
45687                             indent += " ";
45688                         }
45689
45690         // If the space parameter is a string, it will be used as the indent string.
45691
45692                     } else if (typeof space === "string") {
45693                         indent = space;
45694                     }
45695
45696         // If there is a replacer, it must be a function or an array.
45697         // Otherwise, throw an error.
45698
45699                     rep = replacer;
45700                     if (replacer && typeof replacer !== "function" &&
45701                             (typeof replacer !== "object" ||
45702                             typeof replacer.length !== "number")) {
45703                         throw new Error("JSON.stringify");
45704                     }
45705
45706         // Make a fake root object containing our value under the key of "".
45707         // Return the result of stringifying the value.
45708
45709                     return str("", {"": value});
45710                 };
45711             }
45712
45713
45714         // If the JSON object does not yet have a parse method, give it one.
45715
45716             if (typeof JSON.parse !== "function") {
45717                 JSON.parse = function (text, reviver) {
45718
45719         // The parse method takes a text and an optional reviver function, and returns
45720         // a JavaScript value if the text is a valid JSON text.
45721
45722                     var j;
45723
45724                     function walk(holder, key) {
45725
45726         // The walk method is used to recursively walk the resulting structure so
45727         // that modifications can be made.
45728
45729                         var k;
45730                         var v;
45731                         var value = holder[key];
45732                         if (value && typeof value === "object") {
45733                             for (k in value) {
45734                                 if (Object.prototype.hasOwnProperty.call(value, k)) {
45735                                     v = walk(value, k);
45736                                     if (v !== undefined) {
45737                                         value[k] = v;
45738                                     } else {
45739                                         delete value[k];
45740                                     }
45741                                 }
45742                             }
45743                         }
45744                         return reviver.call(holder, key, value);
45745                     }
45746
45747
45748         // Parsing happens in four stages. In the first stage, we replace certain
45749         // Unicode characters with escape sequences. JavaScript handles many characters
45750         // incorrectly, either silently deleting them, or treating them as line endings.
45751
45752                     text = String(text);
45753                     rx_dangerous.lastIndex = 0;
45754                     if (rx_dangerous.test(text)) {
45755                         text = text.replace(rx_dangerous, function (a) {
45756                             return "\\u" +
45757                                     ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45758                         });
45759                     }
45760
45761         // In the second stage, we run the text against regular expressions that look
45762         // for non-JSON patterns. We are especially concerned with "()" and "new"
45763         // because they can cause invocation, and "=" because it can cause mutation.
45764         // But just to be safe, we want to reject all unexpected forms.
45765
45766         // We split the second stage into 4 regexp operations in order to work around
45767         // crippling inefficiencies in IE's and Safari's regexp engines. First we
45768         // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
45769         // replace all simple value tokens with "]" characters. Third, we delete all
45770         // open brackets that follow a colon or comma or that begin the text. Finally,
45771         // we look to see that the remaining characters are only whitespace or "]" or
45772         // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
45773
45774                     if (
45775                         rx_one.test(
45776                             text
45777                                 .replace(rx_two, "@")
45778                                 .replace(rx_three, "]")
45779                                 .replace(rx_four, "")
45780                         )
45781                     ) {
45782
45783         // In the third stage we use the eval function to compile the text into a
45784         // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
45785         // in JavaScript: it can begin a block or an object literal. We wrap the text
45786         // in parens to eliminate the ambiguity.
45787
45788                         j = eval("(" + text + ")");
45789
45790         // In the optional fourth stage, we recursively walk the new structure, passing
45791         // each name/value pair to a reviver function for possible transformation.
45792
45793                         return (typeof reviver === "function")
45794                             ? walk({"": j}, "")
45795                             : j;
45796                     }
45797
45798         // If the text is not JSON parseable, then a SyntaxError is thrown.
45799
45800                     throw new SyntaxError("JSON.parse");
45801                 };
45802             }
45803         }());
45804
45805         var json2 = json2Plugin;
45806
45807         function json2Plugin() {
45808                 
45809                 return {}
45810         }
45811
45812         var plugins = [json2];
45813
45814         var store_legacy = storeEngine.createStore(all, plugins);
45815
45816         // # osm-auth
45817         //
45818         // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
45819         // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
45820         // does not support custom headers, which this uses everywhere.
45821         var osmAuth = function(o) {
45822
45823             var oauth = {};
45824
45825             // authenticated users will also have a request token secret, but it's
45826             // not used in transactions with the server
45827             oauth.authenticated = function() {
45828                 return !!(token('oauth_token') && token('oauth_token_secret'));
45829             };
45830
45831             oauth.logout = function() {
45832                 token('oauth_token', '');
45833                 token('oauth_token_secret', '');
45834                 token('oauth_request_token_secret', '');
45835                 return oauth;
45836             };
45837
45838             // TODO: detect lack of click event
45839             oauth.authenticate = function(callback) {
45840                 if (oauth.authenticated()) return callback();
45841
45842                 oauth.logout();
45843
45844                 // ## Getting a request token
45845                 var params = timenonce(getAuth(o)),
45846                     url = o.url + '/oauth/request_token';
45847
45848                 params.oauth_signature = ohauth_1.signature(
45849                     o.oauth_secret, '',
45850                     ohauth_1.baseString('POST', url, params));
45851
45852                 if (!o.singlepage) {
45853                     // Create a 600x550 popup window in the center of the screen
45854                     var w = 600, h = 550,
45855                         settings = [
45856                             ['width', w], ['height', h],
45857                             ['left', screen.width / 2 - w / 2],
45858                             ['top', screen.height / 2 - h / 2]].map(function(x) {
45859                                 return x.join('=');
45860                             }).join(','),
45861                         popup = window.open('about:blank', 'oauth_window', settings);
45862                 }
45863
45864                 // Request a request token. When this is complete, the popup
45865                 // window is redirected to OSM's authorization page.
45866                 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
45867                 o.loading();
45868
45869                 function reqTokenDone(err, xhr) {
45870                     o.done();
45871                     if (err) return callback(err);
45872                     var resp = ohauth_1.stringQs(xhr.response);
45873                     token('oauth_request_token_secret', resp.oauth_token_secret);
45874                     var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
45875                         oauth_token: resp.oauth_token,
45876                         oauth_callback: resolveUrl(o.landing)
45877                     });
45878
45879                     if (o.singlepage) {
45880                         location.href = authorize_url;
45881                     } else {
45882                         popup.location = authorize_url;
45883                     }
45884                 }
45885
45886                 // Called by a function in a landing page, in the popup window. The
45887                 // window closes itself.
45888                 window.authComplete = function(token) {
45889                     var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
45890                     get_access_token(oauth_token.oauth_token);
45891                     delete window.authComplete;
45892                 };
45893
45894                 // ## Getting an request token
45895                 //
45896                 // At this point we have an `oauth_token`, brought in from a function
45897                 // call on a landing page popup.
45898                 function get_access_token(oauth_token) {
45899                     var url = o.url + '/oauth/access_token',
45900                         params = timenonce(getAuth(o)),
45901                         request_token_secret = token('oauth_request_token_secret');
45902                     params.oauth_token = oauth_token;
45903                     params.oauth_signature = ohauth_1.signature(
45904                         o.oauth_secret,
45905                         request_token_secret,
45906                         ohauth_1.baseString('POST', url, params));
45907
45908                     // ## Getting an access token
45909                     //
45910                     // The final token required for authentication. At this point
45911                     // we have a `request token secret`
45912                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45913                     o.loading();
45914                 }
45915
45916                 function accessTokenDone(err, xhr) {
45917                     o.done();
45918                     if (err) return callback(err);
45919                     var access_token = ohauth_1.stringQs(xhr.response);
45920                     token('oauth_token', access_token.oauth_token);
45921                     token('oauth_token_secret', access_token.oauth_token_secret);
45922                     callback(null, oauth);
45923                 }
45924             };
45925
45926             oauth.bootstrapToken = function(oauth_token, callback) {
45927                 // ## Getting an request token
45928                 // At this point we have an `oauth_token`, brought in from a function
45929                 // call on a landing page popup.
45930                 function get_access_token(oauth_token) {
45931                     var url = o.url + '/oauth/access_token',
45932                         params = timenonce(getAuth(o)),
45933                         request_token_secret = token('oauth_request_token_secret');
45934                     params.oauth_token = oauth_token;
45935                     params.oauth_signature = ohauth_1.signature(
45936                         o.oauth_secret,
45937                         request_token_secret,
45938                         ohauth_1.baseString('POST', url, params));
45939
45940                     // ## Getting an access token
45941                     // The final token required for authentication. At this point
45942                     // we have a `request token secret`
45943                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45944                     o.loading();
45945                 }
45946
45947                 function accessTokenDone(err, xhr) {
45948                     o.done();
45949                     if (err) return callback(err);
45950                     var access_token = ohauth_1.stringQs(xhr.response);
45951                     token('oauth_token', access_token.oauth_token);
45952                     token('oauth_token_secret', access_token.oauth_token_secret);
45953                     callback(null, oauth);
45954                 }
45955
45956                 get_access_token(oauth_token);
45957             };
45958
45959             // # xhr
45960             //
45961             // A single XMLHttpRequest wrapper that does authenticated calls if the
45962             // user has logged in.
45963             oauth.xhr = function(options, callback) {
45964                 if (!oauth.authenticated()) {
45965                     if (o.auto) {
45966                         return oauth.authenticate(run);
45967                     } else {
45968                         callback('not authenticated', null);
45969                         return;
45970                     }
45971                 } else {
45972                     return run();
45973                 }
45974
45975                 function run() {
45976                     var params = timenonce(getAuth(o)),
45977                         oauth_token_secret = token('oauth_token_secret'),
45978                         url = (options.prefix !== false) ? o.url + options.path : options.path,
45979                         url_parts = url.replace(/#.*$/, '').split('?', 2),
45980                         base_url = url_parts[0],
45981                         query = (url_parts.length === 2) ? url_parts[1] : '';
45982
45983                     // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
45984                     if ((!options.options || !options.options.header ||
45985                         options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
45986                         options.content) {
45987                         params = immutable(params, ohauth_1.stringQs(options.content));
45988                     }
45989
45990                     params.oauth_token = token('oauth_token');
45991                     params.oauth_signature = ohauth_1.signature(
45992                         o.oauth_secret,
45993                         oauth_token_secret,
45994                         ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
45995                     );
45996
45997                     return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
45998                 }
45999
46000                 function done(err, xhr) {
46001                     if (err) return callback(err);
46002                     else if (xhr.responseXML) return callback(err, xhr.responseXML);
46003                     else return callback(err, xhr.response);
46004                 }
46005             };
46006
46007             // pre-authorize this object, if we can just get a token and token_secret
46008             // from the start
46009             oauth.preauth = function(c) {
46010                 if (!c) return;
46011                 if (c.oauth_token) token('oauth_token', c.oauth_token);
46012                 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
46013                 return oauth;
46014             };
46015
46016             oauth.options = function(_) {
46017                 if (!arguments.length) return o;
46018
46019                 o = _;
46020                 o.url = o.url || 'https://www.openstreetmap.org';
46021                 o.landing = o.landing || 'land.html';
46022                 o.singlepage = o.singlepage || false;
46023
46024                 // Optional loading and loading-done functions for nice UI feedback.
46025                 // by default, no-ops
46026                 o.loading = o.loading || function() {};
46027                 o.done = o.done || function() {};
46028
46029                 return oauth.preauth(o);
46030             };
46031
46032             // 'stamp' an authentication object from `getAuth()`
46033             // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
46034             // and timestamp
46035             function timenonce(o) {
46036                 o.oauth_timestamp = ohauth_1.timestamp();
46037                 o.oauth_nonce = ohauth_1.nonce();
46038                 return o;
46039             }
46040
46041             // get/set tokens. These are prefixed with the base URL so that `osm-auth`
46042             // can be used with multiple APIs and the keys in `localStorage`
46043             // will not clash
46044             var token;
46045
46046             if (store_legacy.enabled) {
46047                 token = function (x, y) {
46048                     if (arguments.length === 1) return store_legacy.get(o.url + x);
46049                     else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
46050                 };
46051             } else {
46052                 var storage = {};
46053                 token = function (x, y) {
46054                     if (arguments.length === 1) return storage[o.url + x];
46055                     else if (arguments.length === 2) return storage[o.url + x] = y;
46056                 };
46057             }
46058
46059             // Get an authentication object. If you just add and remove properties
46060             // from a single object, you'll need to use `delete` to make sure that
46061             // it doesn't contain undesired properties for authentication
46062             function getAuth(o) {
46063                 return {
46064                     oauth_consumer_key: o.oauth_consumer_key,
46065                     oauth_signature_method: 'HMAC-SHA1'
46066                 };
46067             }
46068
46069             // potentially pre-authorize
46070             oauth.options(o);
46071
46072             return oauth;
46073         };
46074
46075         var JXON = new (function () {
46076           var
46077             sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
46078             aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
46079
46080           function parseText (sValue) {
46081             if (rIsNull.test(sValue)) { return null; }
46082             if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
46083             if (isFinite(sValue)) { return parseFloat(sValue); }
46084             if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
46085             return sValue;
46086           }
46087
46088           function EmptyTree () { }
46089           EmptyTree.prototype.toString = function () { return 'null'; };
46090           EmptyTree.prototype.valueOf = function () { return null; };
46091
46092           function objectify (vValue) {
46093             return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
46094           }
46095
46096           function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
46097             var
46098               nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
46099               bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
46100
46101             var
46102               sProp, vContent, nLength = 0, sCollectedTxt = '',
46103               vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
46104
46105             if (bChildren) {
46106               for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
46107                 oNode = oParentNode.childNodes.item(nItem);
46108                 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
46109                 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
46110                 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
46111               }
46112             }
46113
46114             var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
46115
46116             if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
46117
46118             for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
46119               sProp = aCache[nElId].nodeName.toLowerCase();
46120               vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
46121               if (vResult.hasOwnProperty(sProp)) {
46122                 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
46123                 vResult[sProp].push(vContent);
46124               } else {
46125                 vResult[sProp] = vContent;
46126                 nLength++;
46127               }
46128             }
46129
46130             if (bAttributes) {
46131               var
46132                 nAttrLen = oParentNode.attributes.length,
46133                 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
46134
46135               for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
46136                 oAttrib = oParentNode.attributes.item(nAttrib);
46137                 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
46138               }
46139
46140               if (bNesteAttr) {
46141                 if (bFreeze) { Object.freeze(oAttrParent); }
46142                 vResult[sAttributesProp] = oAttrParent;
46143                 nLength -= nAttrLen - 1;
46144               }
46145             }
46146
46147             if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
46148               vResult[sValueProp] = vBuiltVal;
46149             } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
46150               vResult = vBuiltVal;
46151             }
46152
46153             if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
46154
46155             aCache.length = nLevelStart;
46156
46157             return vResult;
46158           }
46159
46160           function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
46161             var vValue, oChild;
46162
46163             if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
46164               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
46165             } else if (oParentObj.constructor === Date) {
46166               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
46167             }
46168
46169             for (var sName in oParentObj) {
46170               vValue = oParentObj[sName];
46171               if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
46172               if (sName === sValueProp) {
46173                 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
46174               } else if (sName === sAttributesProp) { /* verbosity level is 3 */
46175                 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
46176               } else if (sName.charAt(0) === sAttrPref) {
46177                 oParentEl.setAttribute(sName.slice(1), vValue);
46178               } else if (vValue.constructor === Array) {
46179                 for (var nItem = 0; nItem < vValue.length; nItem++) {
46180                   oChild = oXMLDoc.createElement(sName);
46181                   loadObjTree(oXMLDoc, oChild, vValue[nItem]);
46182                   oParentEl.appendChild(oChild);
46183                 }
46184               } else {
46185                 oChild = oXMLDoc.createElement(sName);
46186                 if (vValue instanceof Object) {
46187                   loadObjTree(oXMLDoc, oChild, vValue);
46188                 } else if (vValue !== null && vValue !== true) {
46189                   oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
46190                 }
46191                 oParentEl.appendChild(oChild);
46192              }
46193            }
46194           }
46195
46196           this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
46197             var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
46198             return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
46199           };
46200
46201           this.unbuild = function (oObjTree) {    
46202             var oNewDoc = document.implementation.createDocument('', '', null);
46203             loadObjTree(oNewDoc, oNewDoc, oObjTree);
46204             return oNewDoc;
46205           };
46206
46207           this.stringify = function (oObjTree) {
46208             return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
46209           };
46210         })();
46211
46212         // var myObject = JXON.build(doc);
46213         // we got our javascript object! try: alert(JSON.stringify(myObject));
46214
46215         // var newDoc = JXON.unbuild(myObject);
46216         // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
46217
46218         var tiler$4 = utilTiler();
46219         var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
46220         var urlroot = 'https://www.openstreetmap.org';
46221         var oauth = osmAuth({
46222             url: urlroot,
46223             oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
46224             oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
46225             loading: authLoading,
46226             done: authDone
46227         });
46228
46229         var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
46230         var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46231         var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46232         var _userCache = { toLoad: {}, user: {} };
46233         var _changeset = {};
46234
46235         var _deferred = new Set();
46236         var _connectionID = 1;
46237         var _tileZoom = 16;
46238         var _noteZoom = 12;
46239         var _rateLimitError;
46240         var _userChangesets;
46241         var _userDetails;
46242         var _off;
46243
46244
46245         function authLoading() {
46246             dispatch$5.call('authLoading');
46247         }
46248
46249
46250         function authDone() {
46251             dispatch$5.call('authDone');
46252         }
46253
46254
46255         function abortRequest$4(controllerOrXHR) {
46256             if (controllerOrXHR) {
46257                 controllerOrXHR.abort();
46258             }
46259         }
46260
46261
46262         function hasInflightRequests(cache) {
46263             return Object.keys(cache.inflight).length;
46264         }
46265
46266
46267         function abortUnwantedRequests$2(cache, visibleTiles) {
46268             Object.keys(cache.inflight).forEach(function(k) {
46269                 if (cache.toLoad[k]) return;
46270                 if (visibleTiles.find(function(tile) { return k === tile.id; })) return;
46271
46272                 abortRequest$4(cache.inflight[k]);
46273                 delete cache.inflight[k];
46274             });
46275         }
46276
46277
46278         function getLoc(attrs) {
46279             var lon = attrs.lon && attrs.lon.value;
46280             var lat = attrs.lat && attrs.lat.value;
46281             return [parseFloat(lon), parseFloat(lat)];
46282         }
46283
46284
46285         function getNodes(obj) {
46286             var elems = obj.getElementsByTagName('nd');
46287             var nodes = new Array(elems.length);
46288             for (var i = 0, l = elems.length; i < l; i++) {
46289                 nodes[i] = 'n' + elems[i].attributes.ref.value;
46290             }
46291             return nodes;
46292         }
46293
46294
46295         function getTags(obj) {
46296             var elems = obj.getElementsByTagName('tag');
46297             var tags = {};
46298             for (var i = 0, l = elems.length; i < l; i++) {
46299                 var attrs = elems[i].attributes;
46300                 tags[attrs.k.value] = attrs.v.value;
46301             }
46302
46303             return tags;
46304         }
46305
46306
46307         function getMembers(obj) {
46308             var elems = obj.getElementsByTagName('member');
46309             var members = new Array(elems.length);
46310             for (var i = 0, l = elems.length; i < l; i++) {
46311                 var attrs = elems[i].attributes;
46312                 members[i] = {
46313                     id: attrs.type.value[0] + attrs.ref.value,
46314                     type: attrs.type.value,
46315                     role: attrs.role.value
46316                 };
46317             }
46318             return members;
46319         }
46320
46321
46322         function getVisible(attrs) {
46323             return (!attrs.visible || attrs.visible.value !== 'false');
46324         }
46325
46326
46327         function parseComments(comments) {
46328             var parsedComments = [];
46329
46330             // for each comment
46331             for (var i = 0; i < comments.length; i++) {
46332                 var comment = comments[i];
46333                 if (comment.nodeName === 'comment') {
46334                     var childNodes = comment.childNodes;
46335                     var parsedComment = {};
46336
46337                     for (var j = 0; j < childNodes.length; j++) {
46338                         var node = childNodes[j];
46339                         var nodeName = node.nodeName;
46340                         if (nodeName === '#text') continue;
46341                         parsedComment[nodeName] = node.textContent;
46342
46343                         if (nodeName === 'uid') {
46344                             var uid = node.textContent;
46345                             if (uid && !_userCache.user[uid]) {
46346                                 _userCache.toLoad[uid] = true;
46347                             }
46348                         }
46349                     }
46350
46351                     if (parsedComment) {
46352                         parsedComments.push(parsedComment);
46353                     }
46354                 }
46355             }
46356             return parsedComments;
46357         }
46358
46359
46360         function encodeNoteRtree(note) {
46361             return {
46362                 minX: note.loc[0],
46363                 minY: note.loc[1],
46364                 maxX: note.loc[0],
46365                 maxY: note.loc[1],
46366                 data: note
46367             };
46368         }
46369
46370
46371         var parsers = {
46372             node: function nodeData(obj, uid) {
46373                 var attrs = obj.attributes;
46374                 return new osmNode({
46375                     id: uid,
46376                     visible: getVisible(attrs),
46377                     version: attrs.version.value,
46378                     changeset: attrs.changeset && attrs.changeset.value,
46379                     timestamp: attrs.timestamp && attrs.timestamp.value,
46380                     user: attrs.user && attrs.user.value,
46381                     uid: attrs.uid && attrs.uid.value,
46382                     loc: getLoc(attrs),
46383                     tags: getTags(obj)
46384                 });
46385             },
46386
46387             way: function wayData(obj, uid) {
46388                 var attrs = obj.attributes;
46389                 return new osmWay({
46390                     id: uid,
46391                     visible: getVisible(attrs),
46392                     version: attrs.version.value,
46393                     changeset: attrs.changeset && attrs.changeset.value,
46394                     timestamp: attrs.timestamp && attrs.timestamp.value,
46395                     user: attrs.user && attrs.user.value,
46396                     uid: attrs.uid && attrs.uid.value,
46397                     tags: getTags(obj),
46398                     nodes: getNodes(obj),
46399                 });
46400             },
46401
46402             relation: function relationData(obj, uid) {
46403                 var attrs = obj.attributes;
46404                 return new osmRelation({
46405                     id: uid,
46406                     visible: getVisible(attrs),
46407                     version: attrs.version.value,
46408                     changeset: attrs.changeset && attrs.changeset.value,
46409                     timestamp: attrs.timestamp && attrs.timestamp.value,
46410                     user: attrs.user && attrs.user.value,
46411                     uid: attrs.uid && attrs.uid.value,
46412                     tags: getTags(obj),
46413                     members: getMembers(obj)
46414                 });
46415             },
46416
46417             note: function parseNote(obj, uid) {
46418                 var attrs = obj.attributes;
46419                 var childNodes = obj.childNodes;
46420                 var props = {};
46421
46422                 props.id = uid;
46423                 props.loc = getLoc(attrs);
46424
46425                 // if notes are coincident, move them apart slightly
46426                 var coincident = false;
46427                 var epsilon = 0.00001;
46428                 do {
46429                     if (coincident) {
46430                         props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
46431                     }
46432                     var bbox = geoExtent(props.loc).bbox();
46433                     coincident = _noteCache.rtree.search(bbox).length;
46434                 } while (coincident);
46435
46436                 // parse note contents
46437                 for (var i = 0; i < childNodes.length; i++) {
46438                     var node = childNodes[i];
46439                     var nodeName = node.nodeName;
46440                     if (nodeName === '#text') continue;
46441
46442                     // if the element is comments, parse the comments
46443                     if (nodeName === 'comments') {
46444                         props[nodeName] = parseComments(node.childNodes);
46445                     } else {
46446                         props[nodeName] = node.textContent;
46447                     }
46448                 }
46449
46450                 var note = new osmNote(props);
46451                 var item = encodeNoteRtree(note);
46452                 _noteCache.note[note.id] = note;
46453                 _noteCache.rtree.insert(item);
46454
46455                 return note;
46456             },
46457
46458             user: function parseUser(obj, uid) {
46459                 var attrs = obj.attributes;
46460                 var user = {
46461                     id: uid,
46462                     display_name: attrs.display_name && attrs.display_name.value,
46463                     account_created: attrs.account_created && attrs.account_created.value,
46464                     changesets_count: 0
46465                 };
46466
46467                 var img = obj.getElementsByTagName('img');
46468                 if (img && img[0] && img[0].getAttribute('href')) {
46469                     user.image_url = img[0].getAttribute('href');
46470                 }
46471
46472                 var changesets = obj.getElementsByTagName('changesets');
46473                 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
46474                     user.changesets_count = changesets[0].getAttribute('count');
46475                 }
46476
46477                 _userCache.user[uid] = user;
46478                 delete _userCache.toLoad[uid];
46479                 return user;
46480             }
46481         };
46482
46483
46484         function parseXML(xml, callback, options) {
46485             options = Object.assign({ skipSeen: true }, options);
46486             if (!xml || !xml.childNodes) {
46487                 return callback({ message: 'No XML', status: -1 });
46488             }
46489
46490             var root = xml.childNodes[0];
46491             var children = root.childNodes;
46492
46493             var handle = window.requestIdleCallback(function() {
46494                 var results = [];
46495                 var result;
46496                 for (var i = 0; i < children.length; i++) {
46497                     result = parseChild(children[i]);
46498                     if (result) results.push(result);
46499                 }
46500                 callback(null, results);
46501             });
46502
46503             _deferred.add(handle);
46504
46505
46506             function parseChild(child) {
46507                 var parser = parsers[child.nodeName];
46508                 if (!parser) return null;
46509
46510                 var uid;
46511                 if (child.nodeName === 'user') {
46512                     uid = child.attributes.id.value;
46513                     if (options.skipSeen && _userCache.user[uid]) {
46514                         delete _userCache.toLoad[uid];
46515                         return null;
46516                     }
46517
46518                 } else if (child.nodeName === 'note') {
46519                     uid = child.getElementsByTagName('id')[0].textContent;
46520
46521                 } else {
46522                     uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
46523                     if (options.skipSeen) {
46524                         if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
46525                         _tileCache.seen[uid] = true;
46526                     }
46527                 }
46528
46529                 return parser(child, uid);
46530             }
46531         }
46532
46533
46534         // replace or remove note from rtree
46535         function updateRtree$2(item, replace) {
46536             _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
46537
46538             if (replace) {
46539                 _noteCache.rtree.insert(item);
46540             }
46541         }
46542
46543
46544         function wrapcb(thisArg, callback, cid) {
46545             return function(err, result) {
46546                 if (err) {
46547                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
46548                     if (err.status === 400 || err.status === 401 || err.status === 403) {
46549                         thisArg.logout();
46550                     }
46551                     return callback.call(thisArg, err);
46552
46553                 } else if (thisArg.getConnectionId() !== cid) {
46554                     return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
46555
46556                 } else {
46557                     return callback.call(thisArg, err, result);
46558                 }
46559             };
46560         }
46561
46562
46563         var serviceOsm = {
46564
46565             init: function() {
46566                 utilRebind(this, dispatch$5, 'on');
46567             },
46568
46569
46570             reset: function() {
46571                 Array.from(_deferred).forEach(function(handle) {
46572                     window.cancelIdleCallback(handle);
46573                     _deferred.delete(handle);
46574                 });
46575
46576                 _connectionID++;
46577                 _userChangesets = undefined;
46578                 _userDetails = undefined;
46579                 _rateLimitError = undefined;
46580
46581                 Object.values(_tileCache.inflight).forEach(abortRequest$4);
46582                 Object.values(_noteCache.inflight).forEach(abortRequest$4);
46583                 Object.values(_noteCache.inflightPost).forEach(abortRequest$4);
46584                 if (_changeset.inflight) abortRequest$4(_changeset.inflight);
46585
46586                 _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46587                 _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46588                 _userCache = { toLoad: {}, user: {} };
46589                 _changeset = {};
46590
46591                 return this;
46592             },
46593
46594
46595             getConnectionId: function() {
46596                 return _connectionID;
46597             },
46598
46599
46600             changesetURL: function(changesetID) {
46601                 return urlroot + '/changeset/' + changesetID;
46602             },
46603
46604
46605             changesetsURL: function(center, zoom) {
46606                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
46607                 return urlroot + '/history#map=' +
46608                     Math.floor(zoom) + '/' +
46609                     center[1].toFixed(precision) + '/' +
46610                     center[0].toFixed(precision);
46611             },
46612
46613
46614             entityURL: function(entity) {
46615                 return urlroot + '/' + entity.type + '/' + entity.osmId();
46616             },
46617
46618
46619             historyURL: function(entity) {
46620                 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
46621             },
46622
46623
46624             userURL: function(username) {
46625                 return urlroot + '/user/' + username;
46626             },
46627
46628
46629             noteURL: function(note) {
46630                 return urlroot + '/note/' + note.id;
46631             },
46632
46633
46634             noteReportURL: function(note) {
46635                 return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
46636             },
46637
46638
46639             // Generic method to load data from the OSM API
46640             // Can handle either auth or unauth calls.
46641             loadFromAPI: function(path, callback, options) {
46642                 options = Object.assign({ skipSeen: true }, options);
46643                 var that = this;
46644                 var cid = _connectionID;
46645
46646                 function done(err, xml) {
46647                     if (that.getConnectionId() !== cid) {
46648                         if (callback) callback({ message: 'Connection Switched', status: -1 });
46649                         return;
46650                     }
46651
46652                     var isAuthenticated = that.authenticated();
46653
46654                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden
46655                     // Logout and retry the request..
46656                     if (isAuthenticated && err && err.status &&
46657                             (err.status === 400 || err.status === 401 || err.status === 403)) {
46658                         that.logout();
46659                         that.loadFromAPI(path, callback, options);
46660
46661                     // else, no retry..
46662                     } else {
46663                         // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
46664                         // Set the rateLimitError flag and trigger a warning..
46665                         if (!isAuthenticated && !_rateLimitError && err && err.status &&
46666                                 (err.status === 509 || err.status === 429)) {
46667                             _rateLimitError = err;
46668                             dispatch$5.call('change');
46669                         }
46670
46671                         if (callback) {
46672                             if (err) {
46673                                 return callback(err);
46674                             } else {
46675                                 return parseXML(xml, callback, options);
46676                             }
46677                         }
46678                     }
46679                 }
46680
46681                 if (this.authenticated()) {
46682                     return oauth.xhr({ method: 'GET', path: path }, done);
46683                 } else {
46684                     var url = urlroot + path;
46685                     var controller = new AbortController();
46686                     d3_xml(url, { signal: controller.signal })
46687                         .then(function(data) {
46688                             done(null, data);
46689                         })
46690                         .catch(function(err) {
46691                             if (err.name === 'AbortError') return;
46692                             // d3-fetch includes status in the error message,
46693                             // but we can't access the response itself
46694                             // https://github.com/d3/d3-fetch/issues/27
46695                             var match = err.message.match(/^\d{3}/);
46696                             if (match) {
46697                                 done({ status: +match[0], statusText: err.message });
46698                             } else {
46699                                 done(err.message);
46700                             }
46701                         });
46702                     return controller;
46703                 }
46704             },
46705
46706
46707             // Load a single entity by id (ways and relations use the `/full` call)
46708             // GET /api/0.6/node/#id
46709             // GET /api/0.6/[way|relation]/#id/full
46710             loadEntity: function(id, callback) {
46711                 var type = osmEntity.id.type(id);
46712                 var osmID = osmEntity.id.toOSM(id);
46713                 var options = { skipSeen: false };
46714
46715                 this.loadFromAPI(
46716                     '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
46717                     function(err, entities) {
46718                         if (callback) callback(err, { data: entities });
46719                     },
46720                     options
46721                 );
46722             },
46723
46724
46725             // Load a single entity with a specific version
46726             // GET /api/0.6/[node|way|relation]/#id/#version
46727             loadEntityVersion: function(id, version, callback) {
46728                 var type = osmEntity.id.type(id);
46729                 var osmID = osmEntity.id.toOSM(id);
46730                 var options = { skipSeen: false };
46731
46732                 this.loadFromAPI(
46733                     '/api/0.6/' + type + '/' + osmID + '/' + version,
46734                     function(err, entities) {
46735                         if (callback) callback(err, { data: entities });
46736                     },
46737                     options
46738                 );
46739             },
46740
46741
46742             // Load multiple entities in chunks
46743             // (note: callback may be called multiple times)
46744             // GET /api/0.6/[nodes|ways|relations]?#parameters
46745             loadMultiple: function(ids, callback) {
46746                 var that = this;
46747                 var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
46748
46749                 Object.keys(groups).forEach(function(k) {
46750                     var type = k + 's';   // nodes, ways, relations
46751                     var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); });
46752                     var options = { skipSeen: false };
46753
46754                     utilArrayChunk(osmIDs, 150).forEach(function(arr) {
46755                         that.loadFromAPI(
46756                             '/api/0.6/' + type + '?' + type + '=' + arr.join(),
46757                             function(err, entities) {
46758                                 if (callback) callback(err, { data: entities });
46759                             },
46760                             options
46761                         );
46762                     });
46763                 });
46764             },
46765
46766
46767             // Create, upload, and close a changeset
46768             // PUT /api/0.6/changeset/create
46769             // POST /api/0.6/changeset/#id/upload
46770             // PUT /api/0.6/changeset/#id/close
46771             putChangeset: function(changeset, changes, callback) {
46772                 var cid = _connectionID;
46773
46774                 if (_changeset.inflight) {
46775                     return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
46776
46777                 } else if (_changeset.open) {   // reuse existing open changeset..
46778                     return createdChangeset.call(this, null, _changeset.open);
46779
46780                 } else {   // Open a new changeset..
46781                     var options = {
46782                         method: 'PUT',
46783                         path: '/api/0.6/changeset/create',
46784                         options: { header: { 'Content-Type': 'text/xml' } },
46785                         content: JXON.stringify(changeset.asJXON())
46786                     };
46787                     _changeset.inflight = oauth.xhr(
46788                         options,
46789                         wrapcb(this, createdChangeset, cid)
46790                     );
46791                 }
46792
46793
46794                 function createdChangeset(err, changesetID) {
46795                     _changeset.inflight = null;
46796                     if (err) { return callback(err, changeset); }
46797
46798                     _changeset.open = changesetID;
46799                     changeset = changeset.update({ id: changesetID });
46800
46801                     // Upload the changeset..
46802                     var options = {
46803                         method: 'POST',
46804                         path: '/api/0.6/changeset/' + changesetID + '/upload',
46805                         options: { header: { 'Content-Type': 'text/xml' } },
46806                         content: JXON.stringify(changeset.osmChangeJXON(changes))
46807                     };
46808                     _changeset.inflight = oauth.xhr(
46809                         options,
46810                         wrapcb(this, uploadedChangeset, cid)
46811                     );
46812                 }
46813
46814
46815                 function uploadedChangeset(err) {
46816                     _changeset.inflight = null;
46817                     if (err) return callback(err, changeset);
46818
46819                     // Upload was successful, safe to call the callback.
46820                     // Add delay to allow for postgres replication #1646 #2678
46821                     window.setTimeout(function() { callback(null, changeset); }, 2500);
46822                     _changeset.open = null;
46823
46824                     // At this point, we don't really care if the connection was switched..
46825                     // Only try to close the changeset if we're still talking to the same server.
46826                     if (this.getConnectionId() === cid) {
46827                         // Still attempt to close changeset, but ignore response because #2667
46828                         oauth.xhr({
46829                             method: 'PUT',
46830                             path: '/api/0.6/changeset/' + changeset.id + '/close',
46831                             options: { header: { 'Content-Type': 'text/xml' } }
46832                         }, function() { return true; });
46833                     }
46834                 }
46835             },
46836
46837
46838             // Load multiple users in chunks
46839             // (note: callback may be called multiple times)
46840             // GET /api/0.6/users?users=#id1,#id2,...,#idn
46841             loadUsers: function(uids, callback) {
46842                 var toLoad = [];
46843                 var cached = [];
46844
46845                 utilArrayUniq(uids).forEach(function(uid) {
46846                     if (_userCache.user[uid]) {
46847                         delete _userCache.toLoad[uid];
46848                         cached.push(_userCache.user[uid]);
46849                     } else {
46850                         toLoad.push(uid);
46851                     }
46852                 });
46853
46854                 if (cached.length || !this.authenticated()) {
46855                     callback(undefined, cached);
46856                     if (!this.authenticated()) return;  // require auth
46857                 }
46858
46859                 utilArrayChunk(toLoad, 150).forEach(function(arr) {
46860                     oauth.xhr(
46861                         { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
46862                         wrapcb(this, done, _connectionID)
46863                     );
46864                 }.bind(this));
46865
46866                 function done(err, xml) {
46867                     if (err) { return callback(err); }
46868
46869                     var options = { skipSeen: true };
46870                     return parseXML(xml, function(err, results) {
46871                         if (err) {
46872                             return callback(err);
46873                         } else {
46874                             return callback(undefined, results);
46875                         }
46876                     }, options);
46877                 }
46878             },
46879
46880
46881             // Load a given user by id
46882             // GET /api/0.6/user/#id
46883             loadUser: function(uid, callback) {
46884                 if (_userCache.user[uid] || !this.authenticated()) {   // require auth
46885                     delete _userCache.toLoad[uid];
46886                     return callback(undefined, _userCache.user[uid]);
46887                 }
46888
46889                 oauth.xhr(
46890                     { method: 'GET', path: '/api/0.6/user/' + uid },
46891                     wrapcb(this, done, _connectionID)
46892                 );
46893
46894                 function done(err, xml) {
46895                     if (err) { return callback(err); }
46896
46897                     var options = { skipSeen: true };
46898                     return parseXML(xml, function(err, results) {
46899                         if (err) {
46900                             return callback(err);
46901                         } else {
46902                             return callback(undefined, results[0]);
46903                         }
46904                     }, options);
46905                 }
46906             },
46907
46908
46909             // Load the details of the logged-in user
46910             // GET /api/0.6/user/details
46911             userDetails: function(callback) {
46912                 if (_userDetails) {    // retrieve cached
46913                     return callback(undefined, _userDetails);
46914                 }
46915
46916                 oauth.xhr(
46917                     { method: 'GET', path: '/api/0.6/user/details' },
46918                     wrapcb(this, done, _connectionID)
46919                 );
46920
46921                 function done(err, xml) {
46922                     if (err) { return callback(err); }
46923
46924                     var options = { skipSeen: false };
46925                     return parseXML(xml, function(err, results) {
46926                         if (err) {
46927                             return callback(err);
46928                         } else {
46929                             _userDetails = results[0];
46930                             return callback(undefined, _userDetails);
46931                         }
46932                     }, options);
46933                 }
46934             },
46935
46936
46937             // Load previous changesets for the logged in user
46938             // GET /api/0.6/changesets?user=#id
46939             userChangesets: function(callback) {
46940                 if (_userChangesets) {    // retrieve cached
46941                     return callback(undefined, _userChangesets);
46942                 }
46943
46944                 this.userDetails(
46945                     wrapcb(this, gotDetails, _connectionID)
46946                 );
46947
46948
46949                 function gotDetails(err, user) {
46950                     if (err) { return callback(err); }
46951
46952                     oauth.xhr(
46953                         { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
46954                         wrapcb(this, done, _connectionID)
46955                     );
46956                 }
46957
46958                 function done(err, xml) {
46959                     if (err) { return callback(err); }
46960
46961                     _userChangesets = Array.prototype.map.call(
46962                         xml.getElementsByTagName('changeset'),
46963                         function (changeset) { return { tags: getTags(changeset) }; }
46964                     ).filter(function (changeset) {
46965                         var comment = changeset.tags.comment;
46966                         return comment && comment !== '';
46967                     });
46968
46969                     return callback(undefined, _userChangesets);
46970                 }
46971             },
46972
46973
46974             // Fetch the status of the OSM API
46975             // GET /api/capabilities
46976             status: function(callback) {
46977                 var url = urlroot + '/api/capabilities';
46978                 var errback = wrapcb(this, done, _connectionID);
46979                 d3_xml(url)
46980                     .then(function(data) { errback(null, data); })
46981                     .catch(function(err) { errback(err.message); });
46982
46983                 function done(err, xml) {
46984                     if (err) { return callback(err); }
46985
46986                     // update blacklists
46987                     var elements = xml.getElementsByTagName('blacklist');
46988                     var regexes = [];
46989                     for (var i = 0; i < elements.length; i++) {
46990                         var regex = elements[i].getAttribute('regex');  // needs unencode?
46991                         if (regex) {
46992                             regexes.push(regex);
46993                         }
46994                     }
46995                     if (regexes.length) {
46996                         _blacklists = regexes;
46997                     }
46998
46999                     if (_rateLimitError) {
47000                         return callback(_rateLimitError, 'rateLimited');
47001                     } else {
47002                         var apiStatus = xml.getElementsByTagName('status');
47003                         var val = apiStatus[0].getAttribute('api');
47004                         return callback(undefined, val);
47005                     }
47006                 }
47007             },
47008
47009
47010             // Load data (entities) from the API in tiles
47011             // GET /api/0.6/map?bbox=
47012             loadTiles: function(projection, callback) {
47013                 if (_off) return;
47014
47015                 // determine the needed tiles to cover the view
47016                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
47017
47018                 // abort inflight requests that are no longer needed
47019                 var hadRequests = hasInflightRequests(_tileCache);
47020                 abortUnwantedRequests$2(_tileCache, tiles);
47021                 if (hadRequests && !hasInflightRequests(_tileCache)) {
47022                     dispatch$5.call('loaded');    // stop the spinner
47023                 }
47024
47025                 // issue new requests..
47026                 tiles.forEach(function(tile) {
47027                     this.loadTile(tile, callback);
47028                 }, this);
47029             },
47030
47031
47032             // Load a single data tile
47033             // GET /api/0.6/map?bbox=
47034             loadTile: function(tile, callback) {
47035                 if (_off) return;
47036                 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
47037
47038                 if (!hasInflightRequests(_tileCache)) {
47039                     dispatch$5.call('loading');   // start the spinner
47040                 }
47041
47042                 var path = '/api/0.6/map?bbox=';
47043                 var options = { skipSeen: true };
47044
47045                 _tileCache.inflight[tile.id] = this.loadFromAPI(
47046                     path + tile.extent.toParam(),
47047                     function(err, parsed) {
47048                         delete _tileCache.inflight[tile.id];
47049                         if (!err) {
47050                             delete _tileCache.toLoad[tile.id];
47051                             _tileCache.loaded[tile.id] = true;
47052                             var bbox = tile.extent.bbox();
47053                             bbox.id = tile.id;
47054                             _tileCache.rtree.insert(bbox);
47055                         }
47056                         if (callback) {
47057                             callback(err, Object.assign({ data: parsed }, tile));
47058                         }
47059                         if (!hasInflightRequests(_tileCache)) {
47060                             dispatch$5.call('loaded');     // stop the spinner
47061                         }
47062                     },
47063                     options
47064                 );
47065             },
47066
47067
47068             isDataLoaded: function(loc) {
47069                 var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
47070                 return _tileCache.rtree.collides(bbox);
47071             },
47072
47073
47074             // load the tile that covers the given `loc`
47075             loadTileAtLoc: function(loc, callback) {
47076                 // Back off if the toLoad queue is filling up.. re #6417
47077                 // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to
47078                 // let users safely edit geometries which extend to unloaded tiles.  We can drop some.)
47079                 if (Object.keys(_tileCache.toLoad).length > 50) return;
47080
47081                 var k = geoZoomToScale(_tileZoom + 1);
47082                 var offset = geoRawMercator().scale(k)(loc);
47083                 var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] });
47084                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
47085
47086                 tiles.forEach(function(tile) {
47087                     if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
47088
47089                     _tileCache.toLoad[tile.id] = true;
47090                     this.loadTile(tile, callback);
47091                 }, this);
47092             },
47093
47094
47095             // Load notes from the API in tiles
47096             // GET /api/0.6/notes?bbox=
47097             loadNotes: function(projection, noteOptions) {
47098                 noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
47099                 if (_off) return;
47100
47101                 var that = this;
47102                 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
47103                 var throttleLoadUsers = throttle(function() {
47104                     var uids = Object.keys(_userCache.toLoad);
47105                     if (!uids.length) return;
47106                     that.loadUsers(uids, function() {});  // eagerly load user details
47107                 }, 750);
47108
47109                 // determine the needed tiles to cover the view
47110                 var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
47111
47112                 // abort inflight requests that are no longer needed
47113                 abortUnwantedRequests$2(_noteCache, tiles);
47114
47115                 // issue new requests..
47116                 tiles.forEach(function(tile) {
47117                     if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
47118
47119                     var options = { skipSeen: false };
47120                     _noteCache.inflight[tile.id] = that.loadFromAPI(
47121                         path + tile.extent.toParam(),
47122                         function(err) {
47123                             delete _noteCache.inflight[tile.id];
47124                             if (!err) {
47125                                 _noteCache.loaded[tile.id] = true;
47126                             }
47127                             throttleLoadUsers();
47128                             dispatch$5.call('loadedNotes');
47129                         },
47130                         options
47131                     );
47132                 });
47133             },
47134
47135
47136             // Create a note
47137             // POST /api/0.6/notes?params
47138             postNoteCreate: function(note, callback) {
47139                 if (!this.authenticated()) {
47140                     return callback({ message: 'Not Authenticated', status: -3 }, note);
47141                 }
47142                 if (_noteCache.inflightPost[note.id]) {
47143                     return callback({ message: 'Note update already inflight', status: -2 }, note);
47144                 }
47145
47146                 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
47147
47148                 var comment = note.newComment;
47149                 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
47150
47151                 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
47152
47153                 _noteCache.inflightPost[note.id] = oauth.xhr(
47154                     { method: 'POST', path: path },
47155                     wrapcb(this, done, _connectionID)
47156                 );
47157
47158
47159                 function done(err, xml) {
47160                     delete _noteCache.inflightPost[note.id];
47161                     if (err) { return callback(err); }
47162
47163                     // we get the updated note back, remove from caches and reparse..
47164                     this.removeNote(note);
47165
47166                     var options = { skipSeen: false };
47167                     return parseXML(xml, function(err, results) {
47168                         if (err) {
47169                             return callback(err);
47170                         } else {
47171                             return callback(undefined, results[0]);
47172                         }
47173                     }, options);
47174                 }
47175             },
47176
47177
47178             // Update a note
47179             // POST /api/0.6/notes/#id/comment?text=comment
47180             // POST /api/0.6/notes/#id/close?text=comment
47181             // POST /api/0.6/notes/#id/reopen?text=comment
47182             postNoteUpdate: function(note, newStatus, callback) {
47183                 if (!this.authenticated()) {
47184                     return callback({ message: 'Not Authenticated', status: -3 }, note);
47185                 }
47186                 if (_noteCache.inflightPost[note.id]) {
47187                     return callback({ message: 'Note update already inflight', status: -2 }, note);
47188                 }
47189
47190                 var action;
47191                 if (note.status !== 'closed' && newStatus === 'closed') {
47192                     action = 'close';
47193                 } else if (note.status !== 'open' && newStatus === 'open') {
47194                     action = 'reopen';
47195                 } else {
47196                     action = 'comment';
47197                     if (!note.newComment) return; // when commenting, comment required
47198                 }
47199
47200                 var path = '/api/0.6/notes/' + note.id + '/' + action;
47201                 if (note.newComment) {
47202                     path += '?' + utilQsString({ text: note.newComment });
47203                 }
47204
47205                 _noteCache.inflightPost[note.id] = oauth.xhr(
47206                     { method: 'POST', path: path },
47207                     wrapcb(this, done, _connectionID)
47208                 );
47209
47210
47211                 function done(err, xml) {
47212                     delete _noteCache.inflightPost[note.id];
47213                     if (err) { return callback(err); }
47214
47215                     // we get the updated note back, remove from caches and reparse..
47216                     this.removeNote(note);
47217
47218                     // update closed note cache - used to populate `closed:note` changeset tag
47219                     if (action === 'close') {
47220                         _noteCache.closed[note.id] = true;
47221                     } else if (action === 'reopen') {
47222                         delete _noteCache.closed[note.id];
47223                     }
47224
47225                     var options = { skipSeen: false };
47226                     return parseXML(xml, function(err, results) {
47227                         if (err) {
47228                             return callback(err);
47229                         } else {
47230                             return callback(undefined, results[0]);
47231                         }
47232                     }, options);
47233                 }
47234             },
47235
47236
47237             switch: function(options) {
47238                 urlroot = options.urlroot;
47239
47240                 oauth.options(Object.assign({
47241                     url: urlroot,
47242                     loading: authLoading,
47243                     done: authDone
47244                 }, options));
47245
47246                 this.reset();
47247                 this.userChangesets(function() {});  // eagerly load user details/changesets
47248                 dispatch$5.call('change');
47249                 return this;
47250             },
47251
47252
47253             toggle: function(val) {
47254                 _off = !val;
47255                 return this;
47256             },
47257
47258
47259             isChangesetInflight: function() {
47260                 return !!_changeset.inflight;
47261             },
47262
47263
47264             // get/set cached data
47265             // This is used to save/restore the state when entering/exiting the walkthrough
47266             // Also used for testing purposes.
47267             caches: function(obj) {
47268                 function cloneCache(source) {
47269                     var target = {};
47270                     Object.keys(source).forEach(function(k) {
47271                         if (k === 'rtree') {
47272                             target.rtree = rbush_1().fromJSON(source.rtree.toJSON());  // clone rbush
47273                         } else if (k === 'note') {
47274                             target.note = {};
47275                             Object.keys(source.note).forEach(function(id) {
47276                                 target.note[id] = osmNote(source.note[id]);   // copy notes
47277                             });
47278                         } else {
47279                             target[k] = JSON.parse(JSON.stringify(source[k]));   // clone deep
47280                         }
47281                     });
47282                     return target;
47283                 }
47284
47285                 if (!arguments.length) {
47286                     return {
47287                         tile: cloneCache(_tileCache),
47288                         note: cloneCache(_noteCache),
47289                         user: cloneCache(_userCache)
47290                     };
47291                 }
47292
47293                 // access caches directly for testing (e.g., loading notes rtree)
47294                 if (obj === 'get') {
47295                     return {
47296                         tile: _tileCache,
47297                         note: _noteCache,
47298                         user: _userCache
47299                     };
47300                 }
47301
47302                 if (obj.tile) {
47303                     _tileCache = obj.tile;
47304                     _tileCache.inflight = {};
47305                 }
47306                 if (obj.note) {
47307                     _noteCache = obj.note;
47308                     _noteCache.inflight = {};
47309                     _noteCache.inflightPost = {};
47310                 }
47311                 if (obj.user) {
47312                     _userCache = obj.user;
47313                 }
47314
47315                 return this;
47316             },
47317
47318
47319             logout: function() {
47320                 _userChangesets = undefined;
47321                 _userDetails = undefined;
47322                 oauth.logout();
47323                 dispatch$5.call('change');
47324                 return this;
47325             },
47326
47327
47328             authenticated: function() {
47329                 return oauth.authenticated();
47330             },
47331
47332
47333             authenticate: function(callback) {
47334                 var that = this;
47335                 var cid = _connectionID;
47336                 _userChangesets = undefined;
47337                 _userDetails = undefined;
47338
47339                 function done(err, res) {
47340                     if (err) {
47341                         if (callback) callback(err);
47342                         return;
47343                     }
47344                     if (that.getConnectionId() !== cid) {
47345                         if (callback) callback({ message: 'Connection Switched', status: -1 });
47346                         return;
47347                     }
47348                     _rateLimitError = undefined;
47349                     dispatch$5.call('change');
47350                     if (callback) callback(err, res);
47351                     that.userChangesets(function() {});  // eagerly load user details/changesets
47352                 }
47353
47354                 return oauth.authenticate(done);
47355             },
47356
47357
47358             imageryBlacklists: function() {
47359                 return _blacklists;
47360             },
47361
47362
47363             tileZoom: function(val) {
47364                 if (!arguments.length) return _tileZoom;
47365                 _tileZoom = val;
47366                 return this;
47367             },
47368
47369
47370             // get all cached notes covering the viewport
47371             notes: function(projection) {
47372                 var viewport = projection.clipExtent();
47373                 var min = [viewport[0][0], viewport[1][1]];
47374                 var max = [viewport[1][0], viewport[0][1]];
47375                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
47376
47377                 return _noteCache.rtree.search(bbox)
47378                     .map(function(d) { return d.data; });
47379             },
47380
47381
47382             // get a single note from the cache
47383             getNote: function(id) {
47384                 return _noteCache.note[id];
47385             },
47386
47387
47388             // remove a single note from the cache
47389             removeNote: function(note) {
47390                 if (!(note instanceof osmNote) || !note.id) return;
47391
47392                 delete _noteCache.note[note.id];
47393                 updateRtree$2(encodeNoteRtree(note), false);  // false = remove
47394             },
47395
47396
47397             // replace a single note in the cache
47398             replaceNote: function(note) {
47399                 if (!(note instanceof osmNote) || !note.id) return;
47400
47401                 _noteCache.note[note.id] = note;
47402                 updateRtree$2(encodeNoteRtree(note), true);  // true = replace
47403                 return note;
47404             },
47405
47406
47407             // Get an array of note IDs closed during this session.
47408             // Used to populate `closed:note` changeset tag
47409             getClosedIDs: function() {
47410                 return Object.keys(_noteCache.closed).sort();
47411             }
47412
47413         };
47414
47415         var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
47416         var _inflight$1 = {};
47417         var _wikibaseCache = {};
47418         var _localeIDs = { en: false };
47419
47420
47421         var debouncedRequest = debounce(request, 500, { leading: false });
47422
47423         function request(url, callback) {
47424             if (_inflight$1[url]) return;
47425             var controller = new AbortController();
47426             _inflight$1[url] = controller;
47427
47428             d3_json(url, { signal: controller.signal })
47429                 .then(function(result) {
47430                     delete _inflight$1[url];
47431                     if (callback) callback(null, result);
47432                 })
47433                 .catch(function(err) {
47434                     delete _inflight$1[url];
47435                     if (err.name === 'AbortError') return;
47436                     if (callback) callback(err.message);
47437                 });
47438         }
47439
47440
47441         /**
47442          * Get the best string value from the descriptions/labels result
47443          * Note that if mediawiki doesn't recognize language code, it will return all values.
47444          * In that case, fallback to use English.
47445          * @param values object - either descriptions or labels
47446          * @param langCode String
47447          * @returns localized string
47448          */
47449         function localizedToString(values, langCode) {
47450             if (values) {
47451                 values = values[langCode] || values.en;
47452             }
47453             return values ? values.value : '';
47454         }
47455
47456
47457         var serviceOsmWikibase = {
47458
47459             init: function() {
47460                 _inflight$1 = {};
47461                 _wikibaseCache = {};
47462                 _localeIDs = {};
47463             },
47464
47465
47466             reset: function() {
47467                 Object.values(_inflight$1).forEach(function(controller) { controller.abort(); });
47468                 _inflight$1 = {};
47469             },
47470
47471
47472             /**
47473              * Get the best value for the property, or undefined if not found
47474              * @param entity object from wikibase
47475              * @param property string e.g. 'P4' for image
47476              * @param langCode string e.g. 'fr' for French
47477              */
47478             claimToValue: function(entity, property, langCode) {
47479                 if (!entity.claims[property]) return undefined;
47480                 var locale = _localeIDs[langCode];
47481                 var preferredPick, localePick;
47482
47483                 entity.claims[property].forEach(function(stmt) {
47484                     // If exists, use value limited to the needed language (has a qualifier P26 = locale)
47485                     // Or if not found, use the first value with the "preferred" rank
47486                     if (!preferredPick && stmt.rank === 'preferred') {
47487                         preferredPick = stmt;
47488                     }
47489                     if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
47490                         stmt.qualifiers.P26[0].datavalue.value.id === locale
47491                     ) {
47492                         localePick = stmt;
47493                     }
47494                 });
47495
47496                 var result = localePick || preferredPick;
47497                 if (result) {
47498                     var datavalue = result.mainsnak.datavalue;
47499                     return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
47500                 } else {
47501                     return undefined;
47502                 }
47503             },
47504
47505
47506             /**
47507              * Convert monolingual property into a key-value object (language -> value)
47508              * @param entity object from wikibase
47509              * @param property string e.g. 'P31' for monolingual wiki page title
47510              */
47511             monolingualClaimToValueObj: function(entity, property) {
47512                 if (!entity || !entity.claims[property]) return undefined;
47513
47514                 return entity.claims[property].reduce(function(acc, obj) {
47515                     var value = obj.mainsnak.datavalue.value;
47516                     acc[value.language] = value.text;
47517                     return acc;
47518                 }, {});
47519             },
47520
47521
47522             toSitelink: function(key, value) {
47523                 var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
47524                 return result.replace(/_/g, ' ').trim();
47525             },
47526
47527
47528             //
47529             // Pass params object of the form:
47530             // {
47531             //   key: 'string',
47532             //   value: 'string',
47533             //   rtype: 'string',
47534             //   langCode: 'string'
47535             // }
47536             //
47537             getEntity: function(params, callback) {
47538                 var doRequest = params.debounce ? debouncedRequest : request;
47539                 var that = this;
47540                 var titles = [];
47541                 var result = {};
47542                 var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
47543                 var keySitelink = params.key ? this.toSitelink(params.key) : false;
47544                 var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
47545                 var localeSitelink;
47546
47547                 if (params.langCode && _localeIDs[params.langCode] === undefined) {
47548                     // If this is the first time we are asking about this locale,
47549                     // fetch corresponding entity (if it exists), and cache it.
47550                     // If there is no such entry, cache `false` value to avoid re-requesting it.
47551                     localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
47552                     titles.push(localeSitelink);
47553                 }
47554
47555                 if (rtypeSitelink) {
47556                     if (_wikibaseCache[rtypeSitelink]) {
47557                         result.rtype = _wikibaseCache[rtypeSitelink];
47558                     } else {
47559                         titles.push(rtypeSitelink);
47560                     }
47561                 }
47562
47563                 if (keySitelink) {
47564                     if (_wikibaseCache[keySitelink]) {
47565                         result.key = _wikibaseCache[keySitelink];
47566                     } else {
47567                         titles.push(keySitelink);
47568                     }
47569                 }
47570
47571                 if (tagSitelink) {
47572                     if (_wikibaseCache[tagSitelink]) {
47573                         result.tag = _wikibaseCache[tagSitelink];
47574                     } else {
47575                         titles.push(tagSitelink);
47576                     }
47577                 }
47578
47579                 if (!titles.length) {
47580                     // Nothing to do, we already had everything in the cache
47581                     return callback(null, result);
47582                 }
47583
47584                 // Requesting just the user language code
47585                 // If backend recognizes the code, it will perform proper fallbacks,
47586                 // and the result will contain the requested code. If not, all values are returned:
47587                 // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
47588                 // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
47589                 var obj = {
47590                     action: 'wbgetentities',
47591                     sites: 'wiki',
47592                     titles: titles.join('|'),
47593                     languages: params.langCode,
47594                     languagefallback: 1,
47595                     origin: '*',
47596                     format: 'json',
47597                     // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
47598                     // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
47599                     // formatversion: 2,
47600                 };
47601
47602                 var url = apibase$3 + '?' + utilQsString(obj);
47603                 doRequest(url, function(err, d) {
47604                     if (err) {
47605                         callback(err);
47606                     } else if (!d.success || d.error) {
47607                         callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
47608                     } else {
47609                         var localeID = false;
47610                         Object.values(d.entities).forEach(function(res) {
47611                             if (res.missing !== '') {
47612                                 // Simplify access to the localized values
47613                                 res.description = localizedToString(res.descriptions, params.langCode);
47614                                 res.label = localizedToString(res.labels, params.langCode);
47615
47616                                 var title = res.sitelinks.wiki.title;
47617                                 if (title === rtypeSitelink) {
47618                                     _wikibaseCache[rtypeSitelink] = res;
47619                                     result.rtype = res;
47620                                 } else if (title === keySitelink) {
47621                                     _wikibaseCache[keySitelink] = res;
47622                                     result.key = res;
47623                                 } else if (title === tagSitelink) {
47624                                     _wikibaseCache[tagSitelink] = res;
47625                                     result.tag = res;
47626                                 } else if (title === localeSitelink) {
47627                                     localeID = res.id;
47628                                 } else {
47629                                     console.log('Unexpected title ' + title);  // eslint-disable-line no-console
47630                                 }
47631                             }
47632                         });
47633
47634                         if (localeSitelink) {
47635                             // If locale ID is not found, store false to prevent repeated queries
47636                             that.addLocale(params.langCode, localeID);
47637                         }
47638
47639                         callback(null, result);
47640                     }
47641                 });
47642             },
47643
47644
47645             //
47646             // Pass params object of the form:
47647             // {
47648             //   key: 'string',     // required
47649             //   value: 'string'    // optional
47650             // }
47651             //   -or-
47652             // {
47653             //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
47654             // }
47655             //
47656             // Get an result object used to display tag documentation
47657             // {
47658             //   title:        'string',
47659             //   description:  'string',
47660             //   editURL:      'string',
47661             //   imageURL:     'string',
47662             //   wiki:         { title: 'string', text: 'string', url: 'string' }
47663             // }
47664             //
47665             getDocs: function(params, callback) {
47666                 var that = this;
47667                 var langCode = utilDetect().locale.toLowerCase();
47668                 params.langCode = langCode;
47669
47670                 this.getEntity(params, function(err, data) {
47671                     if (err) {
47672                         callback(err);
47673                         return;
47674                     }
47675
47676                     var entity = data.rtype || data.tag || data.key;
47677                     if (!entity) {
47678                         callback('No entity');
47679                         return;
47680                     }
47681
47682                     // prepare result
47683                     var result = {
47684                         title: entity.title,
47685                         description: entity.description,
47686                         editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
47687                     };
47688
47689                     // add image
47690                     if (entity.claims) {
47691                         var imageroot;
47692                         var image = that.claimToValue(entity, 'P4', langCode);
47693                         if (image) {
47694                             imageroot = 'https://commons.wikimedia.org/w/index.php';
47695                         } else {
47696                             image = that.claimToValue(entity, 'P28', langCode);
47697                             if (image) {
47698                                 imageroot = 'https://wiki.openstreetmap.org/w/index.php';
47699                             }
47700                         }
47701                         if (imageroot && image) {
47702                             result.imageURL = imageroot + '?' + utilQsString({
47703                                 title: 'Special:Redirect/file/' + image,
47704                                 width: 400
47705                             });
47706                         }
47707                     }
47708
47709                     // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
47710                     // If neither tag nor key data item contain a wiki page in the needed language nor English,
47711                     // get the first found wiki page from either the tag or the key item.
47712                     var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
47713                     var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
47714                     var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
47715
47716                     // If exact language code does not exist, try to find the first part before the '-'
47717                     // BUG: in some cases, a more elaborate fallback logic might be needed
47718                     var langPrefix = langCode.split('-', 2)[0];
47719
47720                     // use the first acceptable wiki page
47721                     result.wiki =
47722                         getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
47723                         getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
47724                         getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
47725                         getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
47726                         getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
47727                         getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
47728                         getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
47729                         getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
47730                         getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
47731
47732                     callback(null, result);
47733
47734
47735                     // Helper method to get wiki info if a given language exists
47736                     function getWikiInfo(wiki, langCode, tKey) {
47737                         if (wiki && wiki[langCode]) {
47738                             return {
47739                                 title: wiki[langCode],
47740                                 text: tKey,
47741                                 url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
47742                             };
47743                         }
47744                     }
47745                 });
47746             },
47747
47748
47749             addLocale: function(langCode, qid) {
47750                 // Makes it easier to unit test
47751                 _localeIDs[langCode] = qid;
47752             },
47753
47754
47755             apibase: function(val) {
47756                 if (!arguments.length) return apibase$3;
47757                 apibase$3 = val;
47758                 return this;
47759             }
47760
47761         };
47762
47763         var jsonpCache = {};
47764         window.jsonpCache = jsonpCache;
47765
47766         function jsonpRequest(url, callback) {
47767             var request = {
47768                 abort: function() {}
47769             };
47770
47771             if (window.JSONP_FIX) {
47772                 if (window.JSONP_DELAY === 0) {
47773                     callback(window.JSONP_FIX);
47774                 } else {
47775                     var t = window.setTimeout(function() {
47776                         callback(window.JSONP_FIX);
47777                     }, window.JSONP_DELAY || 0);
47778
47779                     request.abort = function() { window.clearTimeout(t); };
47780                 }
47781
47782                 return request;
47783             }
47784
47785             function rand() {
47786                 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
47787                 var c = '';
47788                 var i = -1;
47789                 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
47790                 return c;
47791             }
47792
47793             function create(url) {
47794                 var e = url.match(/callback=(\w+)/);
47795                 var c = e ? e[1] : rand();
47796
47797                 jsonpCache[c] = function(data) {
47798                     if (jsonpCache[c]) {
47799                         callback(data);
47800                     }
47801                     finalize();
47802                 };
47803
47804                 function finalize() {
47805                     delete jsonpCache[c];
47806                     script.remove();
47807                 }
47808
47809                 request.abort = finalize;
47810                 return 'jsonpCache.' + c;
47811             }
47812
47813             var cb = create(url);
47814
47815             var script = d3_select('head')
47816                 .append('script')
47817                 .attr('type', 'text/javascript')
47818                 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
47819
47820             return request;
47821         }
47822
47823         var q = createCommonjsModule(function (module, exports) {
47824         // vim:ts=4:sts=4:sw=4:
47825         /*!
47826          *
47827          * Copyright 2009-2017 Kris Kowal under the terms of the MIT
47828          * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
47829          *
47830          * With parts by Tyler Close
47831          * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
47832          * at http://www.opensource.org/licenses/mit-license.html
47833          * Forked at ref_send.js version: 2009-05-11
47834          *
47835          * With parts by Mark Miller
47836          * Copyright (C) 2011 Google Inc.
47837          *
47838          * Licensed under the Apache License, Version 2.0 (the "License");
47839          * you may not use this file except in compliance with the License.
47840          * You may obtain a copy of the License at
47841          *
47842          * http://www.apache.org/licenses/LICENSE-2.0
47843          *
47844          * Unless required by applicable law or agreed to in writing, software
47845          * distributed under the License is distributed on an "AS IS" BASIS,
47846          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47847          * See the License for the specific language governing permissions and
47848          * limitations under the License.
47849          *
47850          */
47851
47852         (function (definition) {
47853
47854             // This file will function properly as a <script> tag, or a module
47855             // using CommonJS and NodeJS or RequireJS module formats.  In
47856             // Common/Node/RequireJS, the module exports the Q API and when
47857             // executed as a simple <script>, it creates a Q global instead.
47858
47859             // Montage Require
47860             if (typeof bootstrap === "function") {
47861                 bootstrap("promise", definition);
47862
47863             // CommonJS
47864             } else {
47865                 module.exports = definition();
47866
47867             // RequireJS
47868             }
47869
47870         })(function () {
47871
47872         var hasStacks = false;
47873         try {
47874             throw new Error();
47875         } catch (e) {
47876             hasStacks = !!e.stack;
47877         }
47878
47879         // All code after this point will be filtered from stack traces reported
47880         // by Q.
47881         var qStartingLine = captureLine();
47882         var qFileName;
47883
47884         // shims
47885
47886         // used for fallback in "allResolved"
47887         var noop = function () {};
47888
47889         // Use the fastest possible means to execute a task in a future turn
47890         // of the event loop.
47891         var nextTick =(function () {
47892             // linked list of tasks (single, with head node)
47893             var head = {task: void 0, next: null};
47894             var tail = head;
47895             var flushing = false;
47896             var requestTick = void 0;
47897             var isNodeJS = false;
47898             // queue for late tasks, used by unhandled rejection tracking
47899             var laterQueue = [];
47900
47901             function flush() {
47902                 /* jshint loopfunc: true */
47903                 var task, domain;
47904
47905                 while (head.next) {
47906                     head = head.next;
47907                     task = head.task;
47908                     head.task = void 0;
47909                     domain = head.domain;
47910
47911                     if (domain) {
47912                         head.domain = void 0;
47913                         domain.enter();
47914                     }
47915                     runSingle(task, domain);
47916
47917                 }
47918                 while (laterQueue.length) {
47919                     task = laterQueue.pop();
47920                     runSingle(task);
47921                 }
47922                 flushing = false;
47923             }
47924             // runs a single function in the async queue
47925             function runSingle(task, domain) {
47926                 try {
47927                     task();
47928
47929                 } catch (e) {
47930                     if (isNodeJS) {
47931                         // In node, uncaught exceptions are considered fatal errors.
47932                         // Re-throw them synchronously to interrupt flushing!
47933
47934                         // Ensure continuation if the uncaught exception is suppressed
47935                         // listening "uncaughtException" events (as domains does).
47936                         // Continue in next event to avoid tick recursion.
47937                         if (domain) {
47938                             domain.exit();
47939                         }
47940                         setTimeout(flush, 0);
47941                         if (domain) {
47942                             domain.enter();
47943                         }
47944
47945                         throw e;
47946
47947                     } else {
47948                         // In browsers, uncaught exceptions are not fatal.
47949                         // Re-throw them asynchronously to avoid slow-downs.
47950                         setTimeout(function () {
47951                             throw e;
47952                         }, 0);
47953                     }
47954                 }
47955
47956                 if (domain) {
47957                     domain.exit();
47958                 }
47959             }
47960
47961             nextTick = function (task) {
47962                 tail = tail.next = {
47963                     task: task,
47964                     domain: isNodeJS && process.domain,
47965                     next: null
47966                 };
47967
47968                 if (!flushing) {
47969                     flushing = true;
47970                     requestTick();
47971                 }
47972             };
47973
47974             if (typeof process === "object" &&
47975                 process.toString() === "[object process]" && process.nextTick) {
47976                 // Ensure Q is in a real Node environment, with a `process.nextTick`.
47977                 // To see through fake Node environments:
47978                 // * Mocha test runner - exposes a `process` global without a `nextTick`
47979                 // * Browserify - exposes a `process.nexTick` function that uses
47980                 //   `setTimeout`. In this case `setImmediate` is preferred because
47981                 //    it is faster. Browserify's `process.toString()` yields
47982                 //   "[object Object]", while in a real Node environment
47983                 //   `process.toString()` yields "[object process]".
47984                 isNodeJS = true;
47985
47986                 requestTick = function () {
47987                     process.nextTick(flush);
47988                 };
47989
47990             } else if (typeof setImmediate === "function") {
47991                 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
47992                 if (typeof window !== "undefined") {
47993                     requestTick = setImmediate.bind(window, flush);
47994                 } else {
47995                     requestTick = function () {
47996                         setImmediate(flush);
47997                     };
47998                 }
47999
48000             } else if (typeof MessageChannel !== "undefined") {
48001                 // modern browsers
48002                 // http://www.nonblocking.io/2011/06/windownexttick.html
48003                 var channel = new MessageChannel();
48004                 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
48005                 // working message ports the first time a page loads.
48006                 channel.port1.onmessage = function () {
48007                     requestTick = requestPortTick;
48008                     channel.port1.onmessage = flush;
48009                     flush();
48010                 };
48011                 var requestPortTick = function () {
48012                     // Opera requires us to provide a message payload, regardless of
48013                     // whether we use it.
48014                     channel.port2.postMessage(0);
48015                 };
48016                 requestTick = function () {
48017                     setTimeout(flush, 0);
48018                     requestPortTick();
48019                 };
48020
48021             } else {
48022                 // old browsers
48023                 requestTick = function () {
48024                     setTimeout(flush, 0);
48025                 };
48026             }
48027             // runs a task after all other tasks have been run
48028             // this is useful for unhandled rejection tracking that needs to happen
48029             // after all `then`d tasks have been run.
48030             nextTick.runAfter = function (task) {
48031                 laterQueue.push(task);
48032                 if (!flushing) {
48033                     flushing = true;
48034                     requestTick();
48035                 }
48036             };
48037             return nextTick;
48038         })();
48039
48040         // Attempt to make generics safe in the face of downstream
48041         // modifications.
48042         // There is no situation where this is necessary.
48043         // If you need a security guarantee, these primordials need to be
48044         // deeply frozen anyway, and if you don’t need a security guarantee,
48045         // this is just plain paranoid.
48046         // However, this **might** have the nice side-effect of reducing the size of
48047         // the minified code by reducing x.call() to merely x()
48048         // See Mark Miller’s explanation of what this does.
48049         // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
48050         var call = Function.call;
48051         function uncurryThis(f) {
48052             return function () {
48053                 return call.apply(f, arguments);
48054             };
48055         }
48056         // This is equivalent, but slower:
48057         // uncurryThis = Function_bind.bind(Function_bind.call);
48058         // http://jsperf.com/uncurrythis
48059
48060         var array_slice = uncurryThis(Array.prototype.slice);
48061
48062         var array_reduce = uncurryThis(
48063             Array.prototype.reduce || function (callback, basis) {
48064                 var index = 0,
48065                     length = this.length;
48066                 // concerning the initial value, if one is not provided
48067                 if (arguments.length === 1) {
48068                     // seek to the first value in the array, accounting
48069                     // for the possibility that is is a sparse array
48070                     do {
48071                         if (index in this) {
48072                             basis = this[index++];
48073                             break;
48074                         }
48075                         if (++index >= length) {
48076                             throw new TypeError();
48077                         }
48078                     } while (1);
48079                 }
48080                 // reduce
48081                 for (; index < length; index++) {
48082                     // account for the possibility that the array is sparse
48083                     if (index in this) {
48084                         basis = callback(basis, this[index], index);
48085                     }
48086                 }
48087                 return basis;
48088             }
48089         );
48090
48091         var array_indexOf = uncurryThis(
48092             Array.prototype.indexOf || function (value) {
48093                 // not a very good shim, but good enough for our one use of it
48094                 for (var i = 0; i < this.length; i++) {
48095                     if (this[i] === value) {
48096                         return i;
48097                     }
48098                 }
48099                 return -1;
48100             }
48101         );
48102
48103         var array_map = uncurryThis(
48104             Array.prototype.map || function (callback, thisp) {
48105                 var self = this;
48106                 var collect = [];
48107                 array_reduce(self, function (undefined$1, value, index) {
48108                     collect.push(callback.call(thisp, value, index, self));
48109                 }, void 0);
48110                 return collect;
48111             }
48112         );
48113
48114         var object_create = Object.create || function (prototype) {
48115             function Type() { }
48116             Type.prototype = prototype;
48117             return new Type();
48118         };
48119
48120         var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
48121             obj[prop] = descriptor.value;
48122             return obj;
48123         };
48124
48125         var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
48126
48127         var object_keys = Object.keys || function (object) {
48128             var keys = [];
48129             for (var key in object) {
48130                 if (object_hasOwnProperty(object, key)) {
48131                     keys.push(key);
48132                 }
48133             }
48134             return keys;
48135         };
48136
48137         var object_toString = uncurryThis(Object.prototype.toString);
48138
48139         function isObject(value) {
48140             return value === Object(value);
48141         }
48142
48143         // generator related shims
48144
48145         // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
48146         function isStopIteration(exception) {
48147             return (
48148                 object_toString(exception) === "[object StopIteration]" ||
48149                 exception instanceof QReturnValue
48150             );
48151         }
48152
48153         // FIXME: Remove this helper and Q.return once ES6 generators are in
48154         // SpiderMonkey.
48155         var QReturnValue;
48156         if (typeof ReturnValue !== "undefined") {
48157             QReturnValue = ReturnValue;
48158         } else {
48159             QReturnValue = function (value) {
48160                 this.value = value;
48161             };
48162         }
48163
48164         // long stack traces
48165
48166         var STACK_JUMP_SEPARATOR = "From previous event:";
48167
48168         function makeStackTraceLong(error, promise) {
48169             // If possible, transform the error stack trace by removing Node and Q
48170             // cruft, then concatenating with the stack trace of `promise`. See #57.
48171             if (hasStacks &&
48172                 promise.stack &&
48173                 typeof error === "object" &&
48174                 error !== null &&
48175                 error.stack
48176             ) {
48177                 var stacks = [];
48178                 for (var p = promise; !!p; p = p.source) {
48179                     if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
48180                         object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
48181                         stacks.unshift(p.stack);
48182                     }
48183                 }
48184                 stacks.unshift(error.stack);
48185
48186                 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
48187                 var stack = filterStackString(concatedStacks);
48188                 object_defineProperty(error, "stack", {value: stack, configurable: true});
48189             }
48190         }
48191
48192         function filterStackString(stackString) {
48193             var lines = stackString.split("\n");
48194             var desiredLines = [];
48195             for (var i = 0; i < lines.length; ++i) {
48196                 var line = lines[i];
48197
48198                 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
48199                     desiredLines.push(line);
48200                 }
48201             }
48202             return desiredLines.join("\n");
48203         }
48204
48205         function isNodeFrame(stackLine) {
48206             return stackLine.indexOf("(module.js:") !== -1 ||
48207                    stackLine.indexOf("(node.js:") !== -1;
48208         }
48209
48210         function getFileNameAndLineNumber(stackLine) {
48211             // Named functions: "at functionName (filename:lineNumber:columnNumber)"
48212             // In IE10 function name can have spaces ("Anonymous function") O_o
48213             var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
48214             if (attempt1) {
48215                 return [attempt1[1], Number(attempt1[2])];
48216             }
48217
48218             // Anonymous functions: "at filename:lineNumber:columnNumber"
48219             var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
48220             if (attempt2) {
48221                 return [attempt2[1], Number(attempt2[2])];
48222             }
48223
48224             // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
48225             var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
48226             if (attempt3) {
48227                 return [attempt3[1], Number(attempt3[2])];
48228             }
48229         }
48230
48231         function isInternalFrame(stackLine) {
48232             var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
48233
48234             if (!fileNameAndLineNumber) {
48235                 return false;
48236             }
48237
48238             var fileName = fileNameAndLineNumber[0];
48239             var lineNumber = fileNameAndLineNumber[1];
48240
48241             return fileName === qFileName &&
48242                 lineNumber >= qStartingLine &&
48243                 lineNumber <= qEndingLine;
48244         }
48245
48246         // discover own file name and line number range for filtering stack
48247         // traces
48248         function captureLine() {
48249             if (!hasStacks) {
48250                 return;
48251             }
48252
48253             try {
48254                 throw new Error();
48255             } catch (e) {
48256                 var lines = e.stack.split("\n");
48257                 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
48258                 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
48259                 if (!fileNameAndLineNumber) {
48260                     return;
48261                 }
48262
48263                 qFileName = fileNameAndLineNumber[0];
48264                 return fileNameAndLineNumber[1];
48265             }
48266         }
48267
48268         function deprecate(callback, name, alternative) {
48269             return function () {
48270                 if (typeof console !== "undefined" &&
48271                     typeof console.warn === "function") {
48272                     console.warn(name + " is deprecated, use " + alternative +
48273                                  " instead.", new Error("").stack);
48274                 }
48275                 return callback.apply(callback, arguments);
48276             };
48277         }
48278
48279         // end of shims
48280         // beginning of real work
48281
48282         /**
48283          * Constructs a promise for an immediate reference, passes promises through, or
48284          * coerces promises from different systems.
48285          * @param value immediate reference or promise
48286          */
48287         function Q(value) {
48288             // If the object is already a Promise, return it directly.  This enables
48289             // the resolve function to both be used to created references from objects,
48290             // but to tolerably coerce non-promises to promises.
48291             if (value instanceof Promise) {
48292                 return value;
48293             }
48294
48295             // assimilate thenables
48296             if (isPromiseAlike(value)) {
48297                 return coerce(value);
48298             } else {
48299                 return fulfill(value);
48300             }
48301         }
48302         Q.resolve = Q;
48303
48304         /**
48305          * Performs a task in a future turn of the event loop.
48306          * @param {Function} task
48307          */
48308         Q.nextTick = nextTick;
48309
48310         /**
48311          * Controls whether or not long stack traces will be on
48312          */
48313         Q.longStackSupport = false;
48314
48315         /**
48316          * The counter is used to determine the stopping point for building
48317          * long stack traces. In makeStackTraceLong we walk backwards through
48318          * the linked list of promises, only stacks which were created before
48319          * the rejection are concatenated.
48320          */
48321         var longStackCounter = 1;
48322
48323         // enable long stacks if Q_DEBUG is set
48324         if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
48325             Q.longStackSupport = true;
48326         }
48327
48328         /**
48329          * Constructs a {promise, resolve, reject} object.
48330          *
48331          * `resolve` is a callback to invoke with a more resolved value for the
48332          * promise. To fulfill the promise, invoke `resolve` with any value that is
48333          * not a thenable. To reject the promise, invoke `resolve` with a rejected
48334          * thenable, or invoke `reject` with the reason directly. To resolve the
48335          * promise to another thenable, thus putting it in the same state, invoke
48336          * `resolve` with that other thenable.
48337          */
48338         Q.defer = defer;
48339         function defer() {
48340             // if "messages" is an "Array", that indicates that the promise has not yet
48341             // been resolved.  If it is "undefined", it has been resolved.  Each
48342             // element of the messages array is itself an array of complete arguments to
48343             // forward to the resolved promise.  We coerce the resolution value to a
48344             // promise using the `resolve` function because it handles both fully
48345             // non-thenable values and other thenables gracefully.
48346             var messages = [], progressListeners = [], resolvedPromise;
48347
48348             var deferred = object_create(defer.prototype);
48349             var promise = object_create(Promise.prototype);
48350
48351             promise.promiseDispatch = function (resolve, op, operands) {
48352                 var args = array_slice(arguments);
48353                 if (messages) {
48354                     messages.push(args);
48355                     if (op === "when" && operands[1]) { // progress operand
48356                         progressListeners.push(operands[1]);
48357                     }
48358                 } else {
48359                     Q.nextTick(function () {
48360                         resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
48361                     });
48362                 }
48363             };
48364
48365             // XXX deprecated
48366             promise.valueOf = function () {
48367                 if (messages) {
48368                     return promise;
48369                 }
48370                 var nearerValue = nearer(resolvedPromise);
48371                 if (isPromise(nearerValue)) {
48372                     resolvedPromise = nearerValue; // shorten chain
48373                 }
48374                 return nearerValue;
48375             };
48376
48377             promise.inspect = function () {
48378                 if (!resolvedPromise) {
48379                     return { state: "pending" };
48380                 }
48381                 return resolvedPromise.inspect();
48382             };
48383
48384             if (Q.longStackSupport && hasStacks) {
48385                 try {
48386                     throw new Error();
48387                 } catch (e) {
48388                     // NOTE: don't try to use `Error.captureStackTrace` or transfer the
48389                     // accessor around; that causes memory leaks as per GH-111. Just
48390                     // reify the stack trace as a string ASAP.
48391                     //
48392                     // At the same time, cut off the first line; it's always just
48393                     // "[object Promise]\n", as per the `toString`.
48394                     promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
48395                     promise.stackCounter = longStackCounter++;
48396                 }
48397             }
48398
48399             // NOTE: we do the checks for `resolvedPromise` in each method, instead of
48400             // consolidating them into `become`, since otherwise we'd create new
48401             // promises with the lines `become(whatever(value))`. See e.g. GH-252.
48402
48403             function become(newPromise) {
48404                 resolvedPromise = newPromise;
48405
48406                 if (Q.longStackSupport && hasStacks) {
48407                     // Only hold a reference to the new promise if long stacks
48408                     // are enabled to reduce memory usage
48409                     promise.source = newPromise;
48410                 }
48411
48412                 array_reduce(messages, function (undefined$1, message) {
48413                     Q.nextTick(function () {
48414                         newPromise.promiseDispatch.apply(newPromise, message);
48415                     });
48416                 }, void 0);
48417
48418                 messages = void 0;
48419                 progressListeners = void 0;
48420             }
48421
48422             deferred.promise = promise;
48423             deferred.resolve = function (value) {
48424                 if (resolvedPromise) {
48425                     return;
48426                 }
48427
48428                 become(Q(value));
48429             };
48430
48431             deferred.fulfill = function (value) {
48432                 if (resolvedPromise) {
48433                     return;
48434                 }
48435
48436                 become(fulfill(value));
48437             };
48438             deferred.reject = function (reason) {
48439                 if (resolvedPromise) {
48440                     return;
48441                 }
48442
48443                 become(reject(reason));
48444             };
48445             deferred.notify = function (progress) {
48446                 if (resolvedPromise) {
48447                     return;
48448                 }
48449
48450                 array_reduce(progressListeners, function (undefined$1, progressListener) {
48451                     Q.nextTick(function () {
48452                         progressListener(progress);
48453                     });
48454                 }, void 0);
48455             };
48456
48457             return deferred;
48458         }
48459
48460         /**
48461          * Creates a Node-style callback that will resolve or reject the deferred
48462          * promise.
48463          * @returns a nodeback
48464          */
48465         defer.prototype.makeNodeResolver = function () {
48466             var self = this;
48467             return function (error, value) {
48468                 if (error) {
48469                     self.reject(error);
48470                 } else if (arguments.length > 2) {
48471                     self.resolve(array_slice(arguments, 1));
48472                 } else {
48473                     self.resolve(value);
48474                 }
48475             };
48476         };
48477
48478         /**
48479          * @param resolver {Function} a function that returns nothing and accepts
48480          * the resolve, reject, and notify functions for a deferred.
48481          * @returns a promise that may be resolved with the given resolve and reject
48482          * functions, or rejected by a thrown exception in resolver
48483          */
48484         Q.Promise = promise; // ES6
48485         Q.promise = promise;
48486         function promise(resolver) {
48487             if (typeof resolver !== "function") {
48488                 throw new TypeError("resolver must be a function.");
48489             }
48490             var deferred = defer();
48491             try {
48492                 resolver(deferred.resolve, deferred.reject, deferred.notify);
48493             } catch (reason) {
48494                 deferred.reject(reason);
48495             }
48496             return deferred.promise;
48497         }
48498
48499         promise.race = race; // ES6
48500         promise.all = all; // ES6
48501         promise.reject = reject; // ES6
48502         promise.resolve = Q; // ES6
48503
48504         // XXX experimental.  This method is a way to denote that a local value is
48505         // serializable and should be immediately dispatched to a remote upon request,
48506         // instead of passing a reference.
48507         Q.passByCopy = function (object) {
48508             //freeze(object);
48509             //passByCopies.set(object, true);
48510             return object;
48511         };
48512
48513         Promise.prototype.passByCopy = function () {
48514             //freeze(object);
48515             //passByCopies.set(object, true);
48516             return this;
48517         };
48518
48519         /**
48520          * If two promises eventually fulfill to the same value, promises that value,
48521          * but otherwise rejects.
48522          * @param x {Any*}
48523          * @param y {Any*}
48524          * @returns {Any*} a promise for x and y if they are the same, but a rejection
48525          * otherwise.
48526          *
48527          */
48528         Q.join = function (x, y) {
48529             return Q(x).join(y);
48530         };
48531
48532         Promise.prototype.join = function (that) {
48533             return Q([this, that]).spread(function (x, y) {
48534                 if (x === y) {
48535                     // TODO: "===" should be Object.is or equiv
48536                     return x;
48537                 } else {
48538                     throw new Error("Q can't join: not the same: " + x + " " + y);
48539                 }
48540             });
48541         };
48542
48543         /**
48544          * Returns a promise for the first of an array of promises to become settled.
48545          * @param answers {Array[Any*]} promises to race
48546          * @returns {Any*} the first promise to be settled
48547          */
48548         Q.race = race;
48549         function race(answerPs) {
48550             return promise(function (resolve, reject) {
48551                 // Switch to this once we can assume at least ES5
48552                 // answerPs.forEach(function (answerP) {
48553                 //     Q(answerP).then(resolve, reject);
48554                 // });
48555                 // Use this in the meantime
48556                 for (var i = 0, len = answerPs.length; i < len; i++) {
48557                     Q(answerPs[i]).then(resolve, reject);
48558                 }
48559             });
48560         }
48561
48562         Promise.prototype.race = function () {
48563             return this.then(Q.race);
48564         };
48565
48566         /**
48567          * Constructs a Promise with a promise descriptor object and optional fallback
48568          * function.  The descriptor contains methods like when(rejected), get(name),
48569          * set(name, value), post(name, args), and delete(name), which all
48570          * return either a value, a promise for a value, or a rejection.  The fallback
48571          * accepts the operation name, a resolver, and any further arguments that would
48572          * have been forwarded to the appropriate method above had a method been
48573          * provided with the proper name.  The API makes no guarantees about the nature
48574          * of the returned object, apart from that it is usable whereever promises are
48575          * bought and sold.
48576          */
48577         Q.makePromise = Promise;
48578         function Promise(descriptor, fallback, inspect) {
48579             if (fallback === void 0) {
48580                 fallback = function (op) {
48581                     return reject(new Error(
48582                         "Promise does not support operation: " + op
48583                     ));
48584                 };
48585             }
48586             if (inspect === void 0) {
48587                 inspect = function () {
48588                     return {state: "unknown"};
48589                 };
48590             }
48591
48592             var promise = object_create(Promise.prototype);
48593
48594             promise.promiseDispatch = function (resolve, op, args) {
48595                 var result;
48596                 try {
48597                     if (descriptor[op]) {
48598                         result = descriptor[op].apply(promise, args);
48599                     } else {
48600                         result = fallback.call(promise, op, args);
48601                     }
48602                 } catch (exception) {
48603                     result = reject(exception);
48604                 }
48605                 if (resolve) {
48606                     resolve(result);
48607                 }
48608             };
48609
48610             promise.inspect = inspect;
48611
48612             // XXX deprecated `valueOf` and `exception` support
48613             if (inspect) {
48614                 var inspected = inspect();
48615                 if (inspected.state === "rejected") {
48616                     promise.exception = inspected.reason;
48617                 }
48618
48619                 promise.valueOf = function () {
48620                     var inspected = inspect();
48621                     if (inspected.state === "pending" ||
48622                         inspected.state === "rejected") {
48623                         return promise;
48624                     }
48625                     return inspected.value;
48626                 };
48627             }
48628
48629             return promise;
48630         }
48631
48632         Promise.prototype.toString = function () {
48633             return "[object Promise]";
48634         };
48635
48636         Promise.prototype.then = function (fulfilled, rejected, progressed) {
48637             var self = this;
48638             var deferred = defer();
48639             var done = false;   // ensure the untrusted promise makes at most a
48640                                 // single call to one of the callbacks
48641
48642             function _fulfilled(value) {
48643                 try {
48644                     return typeof fulfilled === "function" ? fulfilled(value) : value;
48645                 } catch (exception) {
48646                     return reject(exception);
48647                 }
48648             }
48649
48650             function _rejected(exception) {
48651                 if (typeof rejected === "function") {
48652                     makeStackTraceLong(exception, self);
48653                     try {
48654                         return rejected(exception);
48655                     } catch (newException) {
48656                         return reject(newException);
48657                     }
48658                 }
48659                 return reject(exception);
48660             }
48661
48662             function _progressed(value) {
48663                 return typeof progressed === "function" ? progressed(value) : value;
48664             }
48665
48666             Q.nextTick(function () {
48667                 self.promiseDispatch(function (value) {
48668                     if (done) {
48669                         return;
48670                     }
48671                     done = true;
48672
48673                     deferred.resolve(_fulfilled(value));
48674                 }, "when", [function (exception) {
48675                     if (done) {
48676                         return;
48677                     }
48678                     done = true;
48679
48680                     deferred.resolve(_rejected(exception));
48681                 }]);
48682             });
48683
48684             // Progress propagator need to be attached in the current tick.
48685             self.promiseDispatch(void 0, "when", [void 0, function (value) {
48686                 var newValue;
48687                 var threw = false;
48688                 try {
48689                     newValue = _progressed(value);
48690                 } catch (e) {
48691                     threw = true;
48692                     if (Q.onerror) {
48693                         Q.onerror(e);
48694                     } else {
48695                         throw e;
48696                     }
48697                 }
48698
48699                 if (!threw) {
48700                     deferred.notify(newValue);
48701                 }
48702             }]);
48703
48704             return deferred.promise;
48705         };
48706
48707         Q.tap = function (promise, callback) {
48708             return Q(promise).tap(callback);
48709         };
48710
48711         /**
48712          * Works almost like "finally", but not called for rejections.
48713          * Original resolution value is passed through callback unaffected.
48714          * Callback may return a promise that will be awaited for.
48715          * @param {Function} callback
48716          * @returns {Q.Promise}
48717          * @example
48718          * doSomething()
48719          *   .then(...)
48720          *   .tap(console.log)
48721          *   .then(...);
48722          */
48723         Promise.prototype.tap = function (callback) {
48724             callback = Q(callback);
48725
48726             return this.then(function (value) {
48727                 return callback.fcall(value).thenResolve(value);
48728             });
48729         };
48730
48731         /**
48732          * Registers an observer on a promise.
48733          *
48734          * Guarantees:
48735          *
48736          * 1. that fulfilled and rejected will be called only once.
48737          * 2. that either the fulfilled callback or the rejected callback will be
48738          *    called, but not both.
48739          * 3. that fulfilled and rejected will not be called in this turn.
48740          *
48741          * @param value      promise or immediate reference to observe
48742          * @param fulfilled  function to be called with the fulfilled value
48743          * @param rejected   function to be called with the rejection exception
48744          * @param progressed function to be called on any progress notifications
48745          * @return promise for the return value from the invoked callback
48746          */
48747         Q.when = when;
48748         function when(value, fulfilled, rejected, progressed) {
48749             return Q(value).then(fulfilled, rejected, progressed);
48750         }
48751
48752         Promise.prototype.thenResolve = function (value) {
48753             return this.then(function () { return value; });
48754         };
48755
48756         Q.thenResolve = function (promise, value) {
48757             return Q(promise).thenResolve(value);
48758         };
48759
48760         Promise.prototype.thenReject = function (reason) {
48761             return this.then(function () { throw reason; });
48762         };
48763
48764         Q.thenReject = function (promise, reason) {
48765             return Q(promise).thenReject(reason);
48766         };
48767
48768         /**
48769          * If an object is not a promise, it is as "near" as possible.
48770          * If a promise is rejected, it is as "near" as possible too.
48771          * If it’s a fulfilled promise, the fulfillment value is nearer.
48772          * If it’s a deferred promise and the deferred has been resolved, the
48773          * resolution is "nearer".
48774          * @param object
48775          * @returns most resolved (nearest) form of the object
48776          */
48777
48778         // XXX should we re-do this?
48779         Q.nearer = nearer;
48780         function nearer(value) {
48781             if (isPromise(value)) {
48782                 var inspected = value.inspect();
48783                 if (inspected.state === "fulfilled") {
48784                     return inspected.value;
48785                 }
48786             }
48787             return value;
48788         }
48789
48790         /**
48791          * @returns whether the given object is a promise.
48792          * Otherwise it is a fulfilled value.
48793          */
48794         Q.isPromise = isPromise;
48795         function isPromise(object) {
48796             return object instanceof Promise;
48797         }
48798
48799         Q.isPromiseAlike = isPromiseAlike;
48800         function isPromiseAlike(object) {
48801             return isObject(object) && typeof object.then === "function";
48802         }
48803
48804         /**
48805          * @returns whether the given object is a pending promise, meaning not
48806          * fulfilled or rejected.
48807          */
48808         Q.isPending = isPending;
48809         function isPending(object) {
48810             return isPromise(object) && object.inspect().state === "pending";
48811         }
48812
48813         Promise.prototype.isPending = function () {
48814             return this.inspect().state === "pending";
48815         };
48816
48817         /**
48818          * @returns whether the given object is a value or fulfilled
48819          * promise.
48820          */
48821         Q.isFulfilled = isFulfilled;
48822         function isFulfilled(object) {
48823             return !isPromise(object) || object.inspect().state === "fulfilled";
48824         }
48825
48826         Promise.prototype.isFulfilled = function () {
48827             return this.inspect().state === "fulfilled";
48828         };
48829
48830         /**
48831          * @returns whether the given object is a rejected promise.
48832          */
48833         Q.isRejected = isRejected;
48834         function isRejected(object) {
48835             return isPromise(object) && object.inspect().state === "rejected";
48836         }
48837
48838         Promise.prototype.isRejected = function () {
48839             return this.inspect().state === "rejected";
48840         };
48841
48842         //// BEGIN UNHANDLED REJECTION TRACKING
48843
48844         // This promise library consumes exceptions thrown in handlers so they can be
48845         // handled by a subsequent promise.  The exceptions get added to this array when
48846         // they are created, and removed when they are handled.  Note that in ES6 or
48847         // shimmed environments, this would naturally be a `Set`.
48848         var unhandledReasons = [];
48849         var unhandledRejections = [];
48850         var reportedUnhandledRejections = [];
48851         var trackUnhandledRejections = true;
48852
48853         function resetUnhandledRejections() {
48854             unhandledReasons.length = 0;
48855             unhandledRejections.length = 0;
48856
48857             if (!trackUnhandledRejections) {
48858                 trackUnhandledRejections = true;
48859             }
48860         }
48861
48862         function trackRejection(promise, reason) {
48863             if (!trackUnhandledRejections) {
48864                 return;
48865             }
48866             if (typeof process === "object" && typeof process.emit === "function") {
48867                 Q.nextTick.runAfter(function () {
48868                     if (array_indexOf(unhandledRejections, promise) !== -1) {
48869                         process.emit("unhandledRejection", reason, promise);
48870                         reportedUnhandledRejections.push(promise);
48871                     }
48872                 });
48873             }
48874
48875             unhandledRejections.push(promise);
48876             if (reason && typeof reason.stack !== "undefined") {
48877                 unhandledReasons.push(reason.stack);
48878             } else {
48879                 unhandledReasons.push("(no stack) " + reason);
48880             }
48881         }
48882
48883         function untrackRejection(promise) {
48884             if (!trackUnhandledRejections) {
48885                 return;
48886             }
48887
48888             var at = array_indexOf(unhandledRejections, promise);
48889             if (at !== -1) {
48890                 if (typeof process === "object" && typeof process.emit === "function") {
48891                     Q.nextTick.runAfter(function () {
48892                         var atReport = array_indexOf(reportedUnhandledRejections, promise);
48893                         if (atReport !== -1) {
48894                             process.emit("rejectionHandled", unhandledReasons[at], promise);
48895                             reportedUnhandledRejections.splice(atReport, 1);
48896                         }
48897                     });
48898                 }
48899                 unhandledRejections.splice(at, 1);
48900                 unhandledReasons.splice(at, 1);
48901             }
48902         }
48903
48904         Q.resetUnhandledRejections = resetUnhandledRejections;
48905
48906         Q.getUnhandledReasons = function () {
48907             // Make a copy so that consumers can't interfere with our internal state.
48908             return unhandledReasons.slice();
48909         };
48910
48911         Q.stopUnhandledRejectionTracking = function () {
48912             resetUnhandledRejections();
48913             trackUnhandledRejections = false;
48914         };
48915
48916         resetUnhandledRejections();
48917
48918         //// END UNHANDLED REJECTION TRACKING
48919
48920         /**
48921          * Constructs a rejected promise.
48922          * @param reason value describing the failure
48923          */
48924         Q.reject = reject;
48925         function reject(reason) {
48926             var rejection = Promise({
48927                 "when": function (rejected) {
48928                     // note that the error has been handled
48929                     if (rejected) {
48930                         untrackRejection(this);
48931                     }
48932                     return rejected ? rejected(reason) : this;
48933                 }
48934             }, function fallback() {
48935                 return this;
48936             }, function inspect() {
48937                 return { state: "rejected", reason: reason };
48938             });
48939
48940             // Note that the reason has not been handled.
48941             trackRejection(rejection, reason);
48942
48943             return rejection;
48944         }
48945
48946         /**
48947          * Constructs a fulfilled promise for an immediate reference.
48948          * @param value immediate reference
48949          */
48950         Q.fulfill = fulfill;
48951         function fulfill(value) {
48952             return Promise({
48953                 "when": function () {
48954                     return value;
48955                 },
48956                 "get": function (name) {
48957                     return value[name];
48958                 },
48959                 "set": function (name, rhs) {
48960                     value[name] = rhs;
48961                 },
48962                 "delete": function (name) {
48963                     delete value[name];
48964                 },
48965                 "post": function (name, args) {
48966                     // Mark Miller proposes that post with no name should apply a
48967                     // promised function.
48968                     if (name === null || name === void 0) {
48969                         return value.apply(void 0, args);
48970                     } else {
48971                         return value[name].apply(value, args);
48972                     }
48973                 },
48974                 "apply": function (thisp, args) {
48975                     return value.apply(thisp, args);
48976                 },
48977                 "keys": function () {
48978                     return object_keys(value);
48979                 }
48980             }, void 0, function inspect() {
48981                 return { state: "fulfilled", value: value };
48982             });
48983         }
48984
48985         /**
48986          * Converts thenables to Q promises.
48987          * @param promise thenable promise
48988          * @returns a Q promise
48989          */
48990         function coerce(promise) {
48991             var deferred = defer();
48992             Q.nextTick(function () {
48993                 try {
48994                     promise.then(deferred.resolve, deferred.reject, deferred.notify);
48995                 } catch (exception) {
48996                     deferred.reject(exception);
48997                 }
48998             });
48999             return deferred.promise;
49000         }
49001
49002         /**
49003          * Annotates an object such that it will never be
49004          * transferred away from this process over any promise
49005          * communication channel.
49006          * @param object
49007          * @returns promise a wrapping of that object that
49008          * additionally responds to the "isDef" message
49009          * without a rejection.
49010          */
49011         Q.master = master;
49012         function master(object) {
49013             return Promise({
49014                 "isDef": function () {}
49015             }, function fallback(op, args) {
49016                 return dispatch(object, op, args);
49017             }, function () {
49018                 return Q(object).inspect();
49019             });
49020         }
49021
49022         /**
49023          * Spreads the values of a promised array of arguments into the
49024          * fulfillment callback.
49025          * @param fulfilled callback that receives variadic arguments from the
49026          * promised array
49027          * @param rejected callback that receives the exception if the promise
49028          * is rejected.
49029          * @returns a promise for the return value or thrown exception of
49030          * either callback.
49031          */
49032         Q.spread = spread;
49033         function spread(value, fulfilled, rejected) {
49034             return Q(value).spread(fulfilled, rejected);
49035         }
49036
49037         Promise.prototype.spread = function (fulfilled, rejected) {
49038             return this.all().then(function (array) {
49039                 return fulfilled.apply(void 0, array);
49040             }, rejected);
49041         };
49042
49043         /**
49044          * The async function is a decorator for generator functions, turning
49045          * them into asynchronous generators.  Although generators are only part
49046          * of the newest ECMAScript 6 drafts, this code does not cause syntax
49047          * errors in older engines.  This code should continue to work and will
49048          * in fact improve over time as the language improves.
49049          *
49050          * ES6 generators are currently part of V8 version 3.19 with the
49051          * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
49052          * for longer, but under an older Python-inspired form.  This function
49053          * works on both kinds of generators.
49054          *
49055          * Decorates a generator function such that:
49056          *  - it may yield promises
49057          *  - execution will continue when that promise is fulfilled
49058          *  - the value of the yield expression will be the fulfilled value
49059          *  - it returns a promise for the return value (when the generator
49060          *    stops iterating)
49061          *  - the decorated function returns a promise for the return value
49062          *    of the generator or the first rejected promise among those
49063          *    yielded.
49064          *  - if an error is thrown in the generator, it propagates through
49065          *    every following yield until it is caught, or until it escapes
49066          *    the generator function altogether, and is translated into a
49067          *    rejection for the promise returned by the decorated generator.
49068          */
49069         Q.async = async;
49070         function async(makeGenerator) {
49071             return function () {
49072                 // when verb is "send", arg is a value
49073                 // when verb is "throw", arg is an exception
49074                 function continuer(verb, arg) {
49075                     var result;
49076
49077                     // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
49078                     // engine that has a deployed base of browsers that support generators.
49079                     // However, SM's generators use the Python-inspired semantics of
49080                     // outdated ES6 drafts.  We would like to support ES6, but we'd also
49081                     // like to make it possible to use generators in deployed browsers, so
49082                     // we also support Python-style generators.  At some point we can remove
49083                     // this block.
49084
49085                     if (typeof StopIteration === "undefined") {
49086                         // ES6 Generators
49087                         try {
49088                             result = generator[verb](arg);
49089                         } catch (exception) {
49090                             return reject(exception);
49091                         }
49092                         if (result.done) {
49093                             return Q(result.value);
49094                         } else {
49095                             return when(result.value, callback, errback);
49096                         }
49097                     } else {
49098                         // SpiderMonkey Generators
49099                         // FIXME: Remove this case when SM does ES6 generators.
49100                         try {
49101                             result = generator[verb](arg);
49102                         } catch (exception) {
49103                             if (isStopIteration(exception)) {
49104                                 return Q(exception.value);
49105                             } else {
49106                                 return reject(exception);
49107                             }
49108                         }
49109                         return when(result, callback, errback);
49110                     }
49111                 }
49112                 var generator = makeGenerator.apply(this, arguments);
49113                 var callback = continuer.bind(continuer, "next");
49114                 var errback = continuer.bind(continuer, "throw");
49115                 return callback();
49116             };
49117         }
49118
49119         /**
49120          * The spawn function is a small wrapper around async that immediately
49121          * calls the generator and also ends the promise chain, so that any
49122          * unhandled errors are thrown instead of forwarded to the error
49123          * handler. This is useful because it's extremely common to run
49124          * generators at the top-level to work with libraries.
49125          */
49126         Q.spawn = spawn;
49127         function spawn(makeGenerator) {
49128             Q.done(Q.async(makeGenerator)());
49129         }
49130
49131         // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
49132         /**
49133          * Throws a ReturnValue exception to stop an asynchronous generator.
49134          *
49135          * This interface is a stop-gap measure to support generator return
49136          * values in older Firefox/SpiderMonkey.  In browsers that support ES6
49137          * generators like Chromium 29, just use "return" in your generator
49138          * functions.
49139          *
49140          * @param value the return value for the surrounding generator
49141          * @throws ReturnValue exception with the value.
49142          * @example
49143          * // ES6 style
49144          * Q.async(function* () {
49145          *      var foo = yield getFooPromise();
49146          *      var bar = yield getBarPromise();
49147          *      return foo + bar;
49148          * })
49149          * // Older SpiderMonkey style
49150          * Q.async(function () {
49151          *      var foo = yield getFooPromise();
49152          *      var bar = yield getBarPromise();
49153          *      Q.return(foo + bar);
49154          * })
49155          */
49156         Q["return"] = _return;
49157         function _return(value) {
49158             throw new QReturnValue(value);
49159         }
49160
49161         /**
49162          * The promised function decorator ensures that any promise arguments
49163          * are settled and passed as values (`this` is also settled and passed
49164          * as a value).  It will also ensure that the result of a function is
49165          * always a promise.
49166          *
49167          * @example
49168          * var add = Q.promised(function (a, b) {
49169          *     return a + b;
49170          * });
49171          * add(Q(a), Q(B));
49172          *
49173          * @param {function} callback The function to decorate
49174          * @returns {function} a function that has been decorated.
49175          */
49176         Q.promised = promised;
49177         function promised(callback) {
49178             return function () {
49179                 return spread([this, all(arguments)], function (self, args) {
49180                     return callback.apply(self, args);
49181                 });
49182             };
49183         }
49184
49185         /**
49186          * sends a message to a value in a future turn
49187          * @param object* the recipient
49188          * @param op the name of the message operation, e.g., "when",
49189          * @param args further arguments to be forwarded to the operation
49190          * @returns result {Promise} a promise for the result of the operation
49191          */
49192         Q.dispatch = dispatch;
49193         function dispatch(object, op, args) {
49194             return Q(object).dispatch(op, args);
49195         }
49196
49197         Promise.prototype.dispatch = function (op, args) {
49198             var self = this;
49199             var deferred = defer();
49200             Q.nextTick(function () {
49201                 self.promiseDispatch(deferred.resolve, op, args);
49202             });
49203             return deferred.promise;
49204         };
49205
49206         /**
49207          * Gets the value of a property in a future turn.
49208          * @param object    promise or immediate reference for target object
49209          * @param name      name of property to get
49210          * @return promise for the property value
49211          */
49212         Q.get = function (object, key) {
49213             return Q(object).dispatch("get", [key]);
49214         };
49215
49216         Promise.prototype.get = function (key) {
49217             return this.dispatch("get", [key]);
49218         };
49219
49220         /**
49221          * Sets the value of a property in a future turn.
49222          * @param object    promise or immediate reference for object object
49223          * @param name      name of property to set
49224          * @param value     new value of property
49225          * @return promise for the return value
49226          */
49227         Q.set = function (object, key, value) {
49228             return Q(object).dispatch("set", [key, value]);
49229         };
49230
49231         Promise.prototype.set = function (key, value) {
49232             return this.dispatch("set", [key, value]);
49233         };
49234
49235         /**
49236          * Deletes a property in a future turn.
49237          * @param object    promise or immediate reference for target object
49238          * @param name      name of property to delete
49239          * @return promise for the return value
49240          */
49241         Q.del = // XXX legacy
49242         Q["delete"] = function (object, key) {
49243             return Q(object).dispatch("delete", [key]);
49244         };
49245
49246         Promise.prototype.del = // XXX legacy
49247         Promise.prototype["delete"] = function (key) {
49248             return this.dispatch("delete", [key]);
49249         };
49250
49251         /**
49252          * Invokes a method in a future turn.
49253          * @param object    promise or immediate reference for target object
49254          * @param name      name of method to invoke
49255          * @param value     a value to post, typically an array of
49256          *                  invocation arguments for promises that
49257          *                  are ultimately backed with `resolve` values,
49258          *                  as opposed to those backed with URLs
49259          *                  wherein the posted value can be any
49260          *                  JSON serializable object.
49261          * @return promise for the return value
49262          */
49263         // bound locally because it is used by other methods
49264         Q.mapply = // XXX As proposed by "Redsandro"
49265         Q.post = function (object, name, args) {
49266             return Q(object).dispatch("post", [name, args]);
49267         };
49268
49269         Promise.prototype.mapply = // XXX As proposed by "Redsandro"
49270         Promise.prototype.post = function (name, args) {
49271             return this.dispatch("post", [name, args]);
49272         };
49273
49274         /**
49275          * Invokes a method in a future turn.
49276          * @param object    promise or immediate reference for target object
49277          * @param name      name of method to invoke
49278          * @param ...args   array of invocation arguments
49279          * @return promise for the return value
49280          */
49281         Q.send = // XXX Mark Miller's proposed parlance
49282         Q.mcall = // XXX As proposed by "Redsandro"
49283         Q.invoke = function (object, name /*...args*/) {
49284             return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
49285         };
49286
49287         Promise.prototype.send = // XXX Mark Miller's proposed parlance
49288         Promise.prototype.mcall = // XXX As proposed by "Redsandro"
49289         Promise.prototype.invoke = function (name /*...args*/) {
49290             return this.dispatch("post", [name, array_slice(arguments, 1)]);
49291         };
49292
49293         /**
49294          * Applies the promised function in a future turn.
49295          * @param object    promise or immediate reference for target function
49296          * @param args      array of application arguments
49297          */
49298         Q.fapply = function (object, args) {
49299             return Q(object).dispatch("apply", [void 0, args]);
49300         };
49301
49302         Promise.prototype.fapply = function (args) {
49303             return this.dispatch("apply", [void 0, args]);
49304         };
49305
49306         /**
49307          * Calls the promised function in a future turn.
49308          * @param object    promise or immediate reference for target function
49309          * @param ...args   array of application arguments
49310          */
49311         Q["try"] =
49312         Q.fcall = function (object /* ...args*/) {
49313             return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
49314         };
49315
49316         Promise.prototype.fcall = function (/*...args*/) {
49317             return this.dispatch("apply", [void 0, array_slice(arguments)]);
49318         };
49319
49320         /**
49321          * Binds the promised function, transforming return values into a fulfilled
49322          * promise and thrown errors into a rejected one.
49323          * @param object    promise or immediate reference for target function
49324          * @param ...args   array of application arguments
49325          */
49326         Q.fbind = function (object /*...args*/) {
49327             var promise = Q(object);
49328             var args = array_slice(arguments, 1);
49329             return function fbound() {
49330                 return promise.dispatch("apply", [
49331                     this,
49332                     args.concat(array_slice(arguments))
49333                 ]);
49334             };
49335         };
49336         Promise.prototype.fbind = function (/*...args*/) {
49337             var promise = this;
49338             var args = array_slice(arguments);
49339             return function fbound() {
49340                 return promise.dispatch("apply", [
49341                     this,
49342                     args.concat(array_slice(arguments))
49343                 ]);
49344             };
49345         };
49346
49347         /**
49348          * Requests the names of the owned properties of a promised
49349          * object in a future turn.
49350          * @param object    promise or immediate reference for target object
49351          * @return promise for the keys of the eventually settled object
49352          */
49353         Q.keys = function (object) {
49354             return Q(object).dispatch("keys", []);
49355         };
49356
49357         Promise.prototype.keys = function () {
49358             return this.dispatch("keys", []);
49359         };
49360
49361         /**
49362          * Turns an array of promises into a promise for an array.  If any of
49363          * the promises gets rejected, the whole array is rejected immediately.
49364          * @param {Array*} an array (or promise for an array) of values (or
49365          * promises for values)
49366          * @returns a promise for an array of the corresponding values
49367          */
49368         // By Mark Miller
49369         // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
49370         Q.all = all;
49371         function all(promises) {
49372             return when(promises, function (promises) {
49373                 var pendingCount = 0;
49374                 var deferred = defer();
49375                 array_reduce(promises, function (undefined$1, promise, index) {
49376                     var snapshot;
49377                     if (
49378                         isPromise(promise) &&
49379                         (snapshot = promise.inspect()).state === "fulfilled"
49380                     ) {
49381                         promises[index] = snapshot.value;
49382                     } else {
49383                         ++pendingCount;
49384                         when(
49385                             promise,
49386                             function (value) {
49387                                 promises[index] = value;
49388                                 if (--pendingCount === 0) {
49389                                     deferred.resolve(promises);
49390                                 }
49391                             },
49392                             deferred.reject,
49393                             function (progress) {
49394                                 deferred.notify({ index: index, value: progress });
49395                             }
49396                         );
49397                     }
49398                 }, void 0);
49399                 if (pendingCount === 0) {
49400                     deferred.resolve(promises);
49401                 }
49402                 return deferred.promise;
49403             });
49404         }
49405
49406         Promise.prototype.all = function () {
49407             return all(this);
49408         };
49409
49410         /**
49411          * Returns the first resolved promise of an array. Prior rejected promises are
49412          * ignored.  Rejects only if all promises are rejected.
49413          * @param {Array*} an array containing values or promises for values
49414          * @returns a promise fulfilled with the value of the first resolved promise,
49415          * or a rejected promise if all promises are rejected.
49416          */
49417         Q.any = any;
49418
49419         function any(promises) {
49420             if (promises.length === 0) {
49421                 return Q.resolve();
49422             }
49423
49424             var deferred = Q.defer();
49425             var pendingCount = 0;
49426             array_reduce(promises, function (prev, current, index) {
49427                 var promise = promises[index];
49428
49429                 pendingCount++;
49430
49431                 when(promise, onFulfilled, onRejected, onProgress);
49432                 function onFulfilled(result) {
49433                     deferred.resolve(result);
49434                 }
49435                 function onRejected(err) {
49436                     pendingCount--;
49437                     if (pendingCount === 0) {
49438                         var rejection = err || new Error("" + err);
49439
49440                         rejection.message = ("Q can't get fulfillment value from any promise, all " +
49441                             "promises were rejected. Last error message: " + rejection.message);
49442
49443                         deferred.reject(rejection);
49444                     }
49445                 }
49446                 function onProgress(progress) {
49447                     deferred.notify({
49448                         index: index,
49449                         value: progress
49450                     });
49451                 }
49452             }, undefined);
49453
49454             return deferred.promise;
49455         }
49456
49457         Promise.prototype.any = function () {
49458             return any(this);
49459         };
49460
49461         /**
49462          * Waits for all promises to be settled, either fulfilled or
49463          * rejected.  This is distinct from `all` since that would stop
49464          * waiting at the first rejection.  The promise returned by
49465          * `allResolved` will never be rejected.
49466          * @param promises a promise for an array (or an array) of promises
49467          * (or values)
49468          * @return a promise for an array of promises
49469          */
49470         Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
49471         function allResolved(promises) {
49472             return when(promises, function (promises) {
49473                 promises = array_map(promises, Q);
49474                 return when(all(array_map(promises, function (promise) {
49475                     return when(promise, noop, noop);
49476                 })), function () {
49477                     return promises;
49478                 });
49479             });
49480         }
49481
49482         Promise.prototype.allResolved = function () {
49483             return allResolved(this);
49484         };
49485
49486         /**
49487          * @see Promise#allSettled
49488          */
49489         Q.allSettled = allSettled;
49490         function allSettled(promises) {
49491             return Q(promises).allSettled();
49492         }
49493
49494         /**
49495          * Turns an array of promises into a promise for an array of their states (as
49496          * returned by `inspect`) when they have all settled.
49497          * @param {Array[Any*]} values an array (or promise for an array) of values (or
49498          * promises for values)
49499          * @returns {Array[State]} an array of states for the respective values.
49500          */
49501         Promise.prototype.allSettled = function () {
49502             return this.then(function (promises) {
49503                 return all(array_map(promises, function (promise) {
49504                     promise = Q(promise);
49505                     function regardless() {
49506                         return promise.inspect();
49507                     }
49508                     return promise.then(regardless, regardless);
49509                 }));
49510             });
49511         };
49512
49513         /**
49514          * Captures the failure of a promise, giving an oportunity to recover
49515          * with a callback.  If the given promise is fulfilled, the returned
49516          * promise is fulfilled.
49517          * @param {Any*} promise for something
49518          * @param {Function} callback to fulfill the returned promise if the
49519          * given promise is rejected
49520          * @returns a promise for the return value of the callback
49521          */
49522         Q.fail = // XXX legacy
49523         Q["catch"] = function (object, rejected) {
49524             return Q(object).then(void 0, rejected);
49525         };
49526
49527         Promise.prototype.fail = // XXX legacy
49528         Promise.prototype["catch"] = function (rejected) {
49529             return this.then(void 0, rejected);
49530         };
49531
49532         /**
49533          * Attaches a listener that can respond to progress notifications from a
49534          * promise's originating deferred. This listener receives the exact arguments
49535          * passed to ``deferred.notify``.
49536          * @param {Any*} promise for something
49537          * @param {Function} callback to receive any progress notifications
49538          * @returns the given promise, unchanged
49539          */
49540         Q.progress = progress;
49541         function progress(object, progressed) {
49542             return Q(object).then(void 0, void 0, progressed);
49543         }
49544
49545         Promise.prototype.progress = function (progressed) {
49546             return this.then(void 0, void 0, progressed);
49547         };
49548
49549         /**
49550          * Provides an opportunity to observe the settling of a promise,
49551          * regardless of whether the promise is fulfilled or rejected.  Forwards
49552          * the resolution to the returned promise when the callback is done.
49553          * The callback can return a promise to defer completion.
49554          * @param {Any*} promise
49555          * @param {Function} callback to observe the resolution of the given
49556          * promise, takes no arguments.
49557          * @returns a promise for the resolution of the given promise when
49558          * ``fin`` is done.
49559          */
49560         Q.fin = // XXX legacy
49561         Q["finally"] = function (object, callback) {
49562             return Q(object)["finally"](callback);
49563         };
49564
49565         Promise.prototype.fin = // XXX legacy
49566         Promise.prototype["finally"] = function (callback) {
49567             if (!callback || typeof callback.apply !== "function") {
49568                 throw new Error("Q can't apply finally callback");
49569             }
49570             callback = Q(callback);
49571             return this.then(function (value) {
49572                 return callback.fcall().then(function () {
49573                     return value;
49574                 });
49575             }, function (reason) {
49576                 // TODO attempt to recycle the rejection with "this".
49577                 return callback.fcall().then(function () {
49578                     throw reason;
49579                 });
49580             });
49581         };
49582
49583         /**
49584          * Terminates a chain of promises, forcing rejections to be
49585          * thrown as exceptions.
49586          * @param {Any*} promise at the end of a chain of promises
49587          * @returns nothing
49588          */
49589         Q.done = function (object, fulfilled, rejected, progress) {
49590             return Q(object).done(fulfilled, rejected, progress);
49591         };
49592
49593         Promise.prototype.done = function (fulfilled, rejected, progress) {
49594             var onUnhandledError = function (error) {
49595                 // forward to a future turn so that ``when``
49596                 // does not catch it and turn it into a rejection.
49597                 Q.nextTick(function () {
49598                     makeStackTraceLong(error, promise);
49599                     if (Q.onerror) {
49600                         Q.onerror(error);
49601                     } else {
49602                         throw error;
49603                     }
49604                 });
49605             };
49606
49607             // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
49608             var promise = fulfilled || rejected || progress ?
49609                 this.then(fulfilled, rejected, progress) :
49610                 this;
49611
49612             if (typeof process === "object" && process && process.domain) {
49613                 onUnhandledError = process.domain.bind(onUnhandledError);
49614             }
49615
49616             promise.then(void 0, onUnhandledError);
49617         };
49618
49619         /**
49620          * Causes a promise to be rejected if it does not get fulfilled before
49621          * some milliseconds time out.
49622          * @param {Any*} promise
49623          * @param {Number} milliseconds timeout
49624          * @param {Any*} custom error message or Error object (optional)
49625          * @returns a promise for the resolution of the given promise if it is
49626          * fulfilled before the timeout, otherwise rejected.
49627          */
49628         Q.timeout = function (object, ms, error) {
49629             return Q(object).timeout(ms, error);
49630         };
49631
49632         Promise.prototype.timeout = function (ms, error) {
49633             var deferred = defer();
49634             var timeoutId = setTimeout(function () {
49635                 if (!error || "string" === typeof error) {
49636                     error = new Error(error || "Timed out after " + ms + " ms");
49637                     error.code = "ETIMEDOUT";
49638                 }
49639                 deferred.reject(error);
49640             }, ms);
49641
49642             this.then(function (value) {
49643                 clearTimeout(timeoutId);
49644                 deferred.resolve(value);
49645             }, function (exception) {
49646                 clearTimeout(timeoutId);
49647                 deferred.reject(exception);
49648             }, deferred.notify);
49649
49650             return deferred.promise;
49651         };
49652
49653         /**
49654          * Returns a promise for the given value (or promised value), some
49655          * milliseconds after it resolved. Passes rejections immediately.
49656          * @param {Any*} promise
49657          * @param {Number} milliseconds
49658          * @returns a promise for the resolution of the given promise after milliseconds
49659          * time has elapsed since the resolution of the given promise.
49660          * If the given promise rejects, that is passed immediately.
49661          */
49662         Q.delay = function (object, timeout) {
49663             if (timeout === void 0) {
49664                 timeout = object;
49665                 object = void 0;
49666             }
49667             return Q(object).delay(timeout);
49668         };
49669
49670         Promise.prototype.delay = function (timeout) {
49671             return this.then(function (value) {
49672                 var deferred = defer();
49673                 setTimeout(function () {
49674                     deferred.resolve(value);
49675                 }, timeout);
49676                 return deferred.promise;
49677             });
49678         };
49679
49680         /**
49681          * Passes a continuation to a Node function, which is called with the given
49682          * arguments provided as an array, and returns a promise.
49683          *
49684          *      Q.nfapply(FS.readFile, [__filename])
49685          *      .then(function (content) {
49686          *      })
49687          *
49688          */
49689         Q.nfapply = function (callback, args) {
49690             return Q(callback).nfapply(args);
49691         };
49692
49693         Promise.prototype.nfapply = function (args) {
49694             var deferred = defer();
49695             var nodeArgs = array_slice(args);
49696             nodeArgs.push(deferred.makeNodeResolver());
49697             this.fapply(nodeArgs).fail(deferred.reject);
49698             return deferred.promise;
49699         };
49700
49701         /**
49702          * Passes a continuation to a Node function, which is called with the given
49703          * arguments provided individually, and returns a promise.
49704          * @example
49705          * Q.nfcall(FS.readFile, __filename)
49706          * .then(function (content) {
49707          * })
49708          *
49709          */
49710         Q.nfcall = function (callback /*...args*/) {
49711             var args = array_slice(arguments, 1);
49712             return Q(callback).nfapply(args);
49713         };
49714
49715         Promise.prototype.nfcall = function (/*...args*/) {
49716             var nodeArgs = array_slice(arguments);
49717             var deferred = defer();
49718             nodeArgs.push(deferred.makeNodeResolver());
49719             this.fapply(nodeArgs).fail(deferred.reject);
49720             return deferred.promise;
49721         };
49722
49723         /**
49724          * Wraps a NodeJS continuation passing function and returns an equivalent
49725          * version that returns a promise.
49726          * @example
49727          * Q.nfbind(FS.readFile, __filename)("utf-8")
49728          * .then(console.log)
49729          * .done()
49730          */
49731         Q.nfbind =
49732         Q.denodeify = function (callback /*...args*/) {
49733             if (callback === undefined) {
49734                 throw new Error("Q can't wrap an undefined function");
49735             }
49736             var baseArgs = array_slice(arguments, 1);
49737             return function () {
49738                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49739                 var deferred = defer();
49740                 nodeArgs.push(deferred.makeNodeResolver());
49741                 Q(callback).fapply(nodeArgs).fail(deferred.reject);
49742                 return deferred.promise;
49743             };
49744         };
49745
49746         Promise.prototype.nfbind =
49747         Promise.prototype.denodeify = function (/*...args*/) {
49748             var args = array_slice(arguments);
49749             args.unshift(this);
49750             return Q.denodeify.apply(void 0, args);
49751         };
49752
49753         Q.nbind = function (callback, thisp /*...args*/) {
49754             var baseArgs = array_slice(arguments, 2);
49755             return function () {
49756                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49757                 var deferred = defer();
49758                 nodeArgs.push(deferred.makeNodeResolver());
49759                 function bound() {
49760                     return callback.apply(thisp, arguments);
49761                 }
49762                 Q(bound).fapply(nodeArgs).fail(deferred.reject);
49763                 return deferred.promise;
49764             };
49765         };
49766
49767         Promise.prototype.nbind = function (/*thisp, ...args*/) {
49768             var args = array_slice(arguments, 0);
49769             args.unshift(this);
49770             return Q.nbind.apply(void 0, args);
49771         };
49772
49773         /**
49774          * Calls a method of a Node-style object that accepts a Node-style
49775          * callback with a given array of arguments, plus a provided callback.
49776          * @param object an object that has the named method
49777          * @param {String} name name of the method of object
49778          * @param {Array} args arguments to pass to the method; the callback
49779          * will be provided by Q and appended to these arguments.
49780          * @returns a promise for the value or error
49781          */
49782         Q.nmapply = // XXX As proposed by "Redsandro"
49783         Q.npost = function (object, name, args) {
49784             return Q(object).npost(name, args);
49785         };
49786
49787         Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
49788         Promise.prototype.npost = function (name, args) {
49789             var nodeArgs = array_slice(args || []);
49790             var deferred = defer();
49791             nodeArgs.push(deferred.makeNodeResolver());
49792             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49793             return deferred.promise;
49794         };
49795
49796         /**
49797          * Calls a method of a Node-style object that accepts a Node-style
49798          * callback, forwarding the given variadic arguments, plus a provided
49799          * callback argument.
49800          * @param object an object that has the named method
49801          * @param {String} name name of the method of object
49802          * @param ...args arguments to pass to the method; the callback will
49803          * be provided by Q and appended to these arguments.
49804          * @returns a promise for the value or error
49805          */
49806         Q.nsend = // XXX Based on Mark Miller's proposed "send"
49807         Q.nmcall = // XXX Based on "Redsandro's" proposal
49808         Q.ninvoke = function (object, name /*...args*/) {
49809             var nodeArgs = array_slice(arguments, 2);
49810             var deferred = defer();
49811             nodeArgs.push(deferred.makeNodeResolver());
49812             Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49813             return deferred.promise;
49814         };
49815
49816         Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
49817         Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
49818         Promise.prototype.ninvoke = function (name /*...args*/) {
49819             var nodeArgs = array_slice(arguments, 1);
49820             var deferred = defer();
49821             nodeArgs.push(deferred.makeNodeResolver());
49822             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49823             return deferred.promise;
49824         };
49825
49826         /**
49827          * If a function would like to support both Node continuation-passing-style and
49828          * promise-returning-style, it can end its internal promise chain with
49829          * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
49830          * elects to use a nodeback, the result will be sent there.  If they do not
49831          * pass a nodeback, they will receive the result promise.
49832          * @param object a result (or a promise for a result)
49833          * @param {Function} nodeback a Node.js-style callback
49834          * @returns either the promise or nothing
49835          */
49836         Q.nodeify = nodeify;
49837         function nodeify(object, nodeback) {
49838             return Q(object).nodeify(nodeback);
49839         }
49840
49841         Promise.prototype.nodeify = function (nodeback) {
49842             if (nodeback) {
49843                 this.then(function (value) {
49844                     Q.nextTick(function () {
49845                         nodeback(null, value);
49846                     });
49847                 }, function (error) {
49848                     Q.nextTick(function () {
49849                         nodeback(error);
49850                     });
49851                 });
49852             } else {
49853                 return this;
49854             }
49855         };
49856
49857         Q.noConflict = function() {
49858             throw new Error("Q.noConflict only works when Q is used as a global");
49859         };
49860
49861         // All code before this point will be filtered from stack traces.
49862         var qEndingLine = captureLine();
49863
49864         return Q;
49865
49866         });
49867         });
49868
49869         var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
49870         var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
49871         var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
49872         var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
49873         var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
49874         var maxResults$2 = 2000;
49875         var tileZoom$2 = 16.5;
49876         var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
49877         var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
49878         var minHfov = 10;         // zoom in degrees:  20, 10, 5
49879         var maxHfov = 90;         // zoom out degrees
49880         var defaultHfov = 45;
49881
49882         var _hires = false;
49883         var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
49884         var _currScene = 0;
49885         var _ssCache;
49886         var _pannellumViewer;
49887         var _sceneOptions;
49888         var _dataUrlArray = [];
49889
49890
49891         /**
49892          * abortRequest().
49893          */
49894         function abortRequest$5(i) {
49895             i.abort();
49896         }
49897
49898
49899         /**
49900          * localeTimeStamp().
49901          */
49902         function localeTimestamp(s) {
49903             if (!s) return null;
49904             var detected = utilDetect();
49905             var options = { day: 'numeric', month: 'short', year: 'numeric' };
49906             var d = new Date(s);
49907             if (isNaN(d.getTime())) return null;
49908             return d.toLocaleString(detected.locale, options);
49909         }
49910
49911
49912         /**
49913          * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
49914          */
49915         function loadTiles$2(which, url, projection, margin) {
49916             var tiles = tiler$5.margin(margin).getTiles(projection);
49917
49918             // abort inflight requests that are no longer needed
49919             var cache = _ssCache[which];
49920             Object.keys(cache.inflight).forEach(function(k) {
49921                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
49922                 if (!wanted) {
49923                     abortRequest$5(cache.inflight[k]);
49924                     delete cache.inflight[k];
49925                 }
49926             });
49927
49928             tiles.forEach(function (tile) {
49929                loadNextTilePage$2(which, url, tile);
49930             });
49931         }
49932
49933         /**
49934          * loadNextTilePage() load data for the next tile page in line.
49935          */
49936         function loadNextTilePage$2(which, url, tile) {
49937             var cache = _ssCache[which];
49938             var nextPage = cache.nextPage[tile.id] || 0;
49939             var id = tile.id + ',' + String(nextPage);
49940             if (cache.loaded[id] || cache.inflight[id]) return;
49941
49942             cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
49943                 cache.loaded[id] = true;
49944                 delete cache.inflight[id];
49945                 if (!bubbles) return;
49946
49947                 // [].shift() removes the first element, some statistics info, not a bubble point
49948                 bubbles.shift();
49949
49950                 var features = bubbles.map(function(bubble) {
49951                     if (cache.points[bubble.id]) return null;  // skip duplicates
49952
49953                     var loc = [bubble.lo, bubble.la];
49954                     var d = {
49955                         loc: loc,
49956                         key: bubble.id,
49957                         ca: bubble.he,
49958                         captured_at: bubble.cd,
49959                         captured_by: 'microsoft',
49960                         // nbn: bubble.nbn,
49961                         // pbn: bubble.pbn,
49962                         // ad: bubble.ad,
49963                         // rn: bubble.rn,
49964                         pr: bubble.pr,  // previous
49965                         ne: bubble.ne,  // next
49966                         pano: true,
49967                         sequenceKey: null
49968                     };
49969
49970                     cache.points[bubble.id] = d;
49971
49972                     // a sequence starts here
49973                     if (bubble.pr === undefined) {
49974                         cache.leaders.push(bubble.id);
49975                     }
49976
49977                     return {
49978                         minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
49979                     };
49980
49981                 }).filter(Boolean);
49982
49983                 cache.rtree.load(features);
49984
49985                 connectSequences();
49986
49987                 if (which === 'bubbles') {
49988                     dispatch$6.call('loadedBubbles');
49989                 }
49990             });
49991         }
49992
49993
49994         // call this sometimes to connect the bubbles into sequences
49995         function connectSequences() {
49996             var cache = _ssCache.bubbles;
49997             var keepLeaders = [];
49998
49999             for (var i = 0; i < cache.leaders.length; i++) {
50000                 var bubble = cache.points[cache.leaders[i]];
50001                 var seen = {};
50002
50003                 // try to make a sequence.. use the key of the leader bubble.
50004                 var sequence = { key: bubble.key, bubbles: [] };
50005                 var complete = false;
50006
50007                 do {
50008                     sequence.bubbles.push(bubble);
50009                     seen[bubble.key] = true;
50010
50011                     if (bubble.ne === undefined) {
50012                         complete = true;
50013                     } else {
50014                         bubble = cache.points[bubble.ne];  // advance to next
50015                     }
50016                 } while (bubble && !seen[bubble.key] && !complete);
50017
50018
50019                 if (complete) {
50020                     _ssCache.sequences[sequence.key] = sequence;
50021
50022                     // assign bubbles to the sequence
50023                     for (var j = 0; j < sequence.bubbles.length; j++) {
50024                         sequence.bubbles[j].sequenceKey = sequence.key;
50025                     }
50026
50027                     // create a GeoJSON LineString
50028                     sequence.geojson = {
50029                         type: 'LineString',
50030                         properties: { key: sequence.key },
50031                         coordinates: sequence.bubbles.map(function (d) { return d.loc; })
50032                     };
50033
50034                 } else {
50035                     keepLeaders.push(cache.leaders[i]);
50036                 }
50037             }
50038
50039             // couldn't complete these, save for later
50040             cache.leaders = keepLeaders;
50041         }
50042
50043         /**
50044          * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
50045          */
50046         function getBubbles(url, tile, callback) {
50047             var rect = tile.extent.rectangle();
50048             var urlForRequest = url + utilQsString({
50049                 n: rect[3],
50050                 s: rect[1],
50051                 e: rect[2],
50052                 w: rect[0],
50053                 c: maxResults$2,
50054                 appkey: bubbleAppKey,
50055                 jsCallback: '{callback}'
50056             });
50057
50058             return jsonpRequest(urlForRequest, function (data) {
50059                 if (!data || data.error) {
50060                     callback(null);
50061                 } else {
50062                     callback(data);
50063                 }
50064             });
50065         }
50066
50067
50068         // partition viewport into higher zoom tiles
50069         function partitionViewport$2(projection) {
50070             var z = geoScaleToZoom(projection.scale());
50071             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
50072             var tiler = utilTiler().zoomExtent([z2, z2]);
50073
50074             return tiler.getTiles(projection)
50075                 .map(function(tile) { return tile.extent; });
50076         }
50077
50078
50079         // no more than `limit` results per partition.
50080         function searchLimited$2(limit, projection, rtree) {
50081             limit = limit || 5;
50082
50083             return partitionViewport$2(projection)
50084                 .reduce(function(result, extent) {
50085                     var found = rtree.search(extent.bbox())
50086                         .slice(0, limit)
50087                         .map(function(d) { return d.data; });
50088
50089                     return (found.length ? result.concat(found) : result);
50090                 }, []);
50091         }
50092
50093
50094         /**
50095          * getImage()
50096          */
50097         function getImage(imgInfo) {
50098             var response = q.defer();
50099             var img = new Image();
50100
50101             img.onload = function() {
50102                 var canvas = document.getElementById('canvas' + imgInfo.face);
50103                 var ctx = canvas.getContext('2d');
50104                 ctx.drawImage(img, imgInfo.x, imgInfo.y);
50105                 response.resolve({imgInfo:imgInfo, status: 'ok'});
50106             };
50107             img.onerror = function() {
50108                 response.resolve({data: imgInfo, status: 'error'});
50109             };
50110             img.setAttribute('crossorigin', '');
50111             img.src = imgInfo.url;
50112
50113             return response.promise;
50114         }
50115
50116
50117         /**
50118          * loadCanvas()
50119          */
50120         function loadCanvas(imgInfoGroup) {
50121             var response = q.defer();
50122             var getImagePromises = imgInfoGroup.map(function(imgInfo) {
50123                 return getImage(imgInfo);
50124             });
50125
50126             q.all(getImagePromises).then(function(data) {
50127                 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
50128                 switch (data[0].imgInfo.face) {
50129                     case '01':
50130                         _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
50131                         break;
50132                     case '02':
50133                         _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
50134                         break;
50135                     case '03':
50136                         _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
50137                         break;
50138                     case '10':
50139                         _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
50140                         break;
50141                     case '11':
50142                         _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
50143                         break;
50144                     case '12':
50145                         _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
50146                         break;
50147                 }
50148                 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
50149             });
50150
50151             return response.promise;
50152         }
50153
50154
50155         function setupCanvas(selection, reset) {
50156             if (reset) {
50157                 selection.selectAll('#divForCanvasWork')
50158                     .remove();
50159             }
50160
50161             // Add the Streetside working canvases. These are used for 'stitching', or combining,
50162             // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
50163             selection.selectAll('#divForCanvasWork')
50164                 .data([0])
50165                 .enter()
50166                 .append('div')
50167                 .attr('id', 'divForCanvasWork')
50168                 .attr('display', 'none')
50169                 .selectAll('canvas')
50170                 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
50171                 .enter()
50172                 .append('canvas')
50173                 .attr('id', function(d) { return d; })
50174                 .attr('width', _resolution)
50175                 .attr('height', _resolution);
50176         }
50177
50178
50179         /**
50180          * processFaces()
50181          */
50182         function processFaces(imgFaceInfoGroups) {
50183             var response = q.defer();
50184             var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
50185                 return loadCanvas(faceImgGroup);
50186             });
50187
50188             q.all(loadCanvasPromises).then(function() {
50189                 response.resolve({status: 'processFaces done'});
50190             });
50191
50192             return response.promise;
50193         }
50194
50195
50196
50197         function qkToXY(qk) {
50198             var x = 0;
50199             var y = 0;
50200             var scale = 256;
50201             for (var i = qk.length; i > 0; i--) {
50202                 var key = qk[i-1];
50203                 x += (+(key === '1' || key === '3')) * scale;
50204                 y += (+(key === '2' || key === '3')) * scale;
50205                 scale *= 2;
50206             }
50207             return [x, y];
50208         }
50209
50210
50211         function getQuadKeys() {
50212             var dim = _resolution / 256;
50213             var quadKeys;
50214
50215             if (dim === 16) {
50216                 quadKeys = [
50217                     '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
50218                     '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
50219                     '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
50220                     '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
50221                     '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
50222                     '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
50223                     '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
50224                     '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
50225
50226                     '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
50227                     '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
50228                     '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
50229                     '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
50230                     '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
50231                     '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
50232                     '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
50233                     '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
50234                 ];
50235
50236             } else if (dim === 8) {
50237                 quadKeys = [
50238                     '000','001','010','011',  '100','101','110','111',
50239                     '002','003','012','013',  '102','103','112','113',
50240                     '020','021','030','031',  '120','121','130','131',
50241                     '022','023','032','033',  '122','123','132','133',
50242
50243                     '200','201','210','211',  '300','301','310','311',
50244                     '202','203','212','213',  '302','303','312','313',
50245                     '220','221','230','231',  '320','321','330','331',
50246                     '222','223','232','233',  '322','323','332','333'
50247                 ];
50248
50249             } else if (dim === 4) {
50250                 quadKeys = [
50251                     '00','01',  '10','11',
50252                     '02','03',  '12','13',
50253
50254                     '20','21',  '30','31',
50255                     '22','23',  '32','33'
50256                 ];
50257
50258             } else {  // dim === 2
50259                 quadKeys = [
50260                     '0', '1',
50261                     '2', '3'
50262                 ];
50263             }
50264
50265             return quadKeys;
50266         }
50267
50268
50269
50270         var serviceStreetside = {
50271             /**
50272              * init() initialize streetside.
50273              */
50274             init: function () {
50275                 if (!_ssCache) {
50276                     this.reset();
50277                 }
50278
50279                 this.event = utilRebind(this, dispatch$6, 'on');
50280             },
50281
50282             /**
50283              * reset() reset the cache.
50284              */
50285             reset: function () {
50286                 if (_ssCache) {
50287                     Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$5);
50288                 }
50289
50290                 _ssCache = {
50291                     bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
50292                     sequences: {}
50293                 };
50294             },
50295
50296             /**
50297              * bubbles()
50298              */
50299             bubbles: function (projection) {
50300                 var limit = 5;
50301                 return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
50302             },
50303
50304
50305             sequences: function(projection) {
50306                 var viewport = projection.clipExtent();
50307                 var min = [viewport[0][0], viewport[1][1]];
50308                 var max = [viewport[1][0], viewport[0][1]];
50309                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50310                 var seen = {};
50311                 var results = [];
50312
50313                 // all sequences for bubbles in viewport
50314                 _ssCache.bubbles.rtree.search(bbox)
50315                     .forEach(function(d) {
50316                         var key = d.data.sequenceKey;
50317                         if (key && !seen[key]) {
50318                             seen[key] = true;
50319                             results.push(_ssCache.sequences[key].geojson);
50320                         }
50321                     });
50322
50323                 return results;
50324             },
50325
50326
50327             /**
50328              * loadBubbles()
50329              */
50330             loadBubbles: function (projection, margin) {
50331                 // by default: request 2 nearby tiles so we can connect sequences.
50332                 if (margin === undefined) margin = 2;
50333
50334                 loadTiles$2('bubbles', bubbleApi, projection, margin);
50335             },
50336
50337
50338             viewer: function() {
50339                 return _pannellumViewer;
50340             },
50341
50342
50343             initViewer: function () {
50344                 if (!window.pannellum) return;
50345                 if (_pannellumViewer) return;
50346
50347                 var sceneID = ++_currScene + '';
50348                 var options = {
50349                     'default': { firstScene: sceneID },
50350                     scenes: {}
50351                 };
50352                 options.scenes[sceneID] = _sceneOptions;
50353
50354                 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
50355
50356                 _pannellumViewer
50357                     .on('mousedown', function() {
50358                         d3_select(window).on('mousemove.pannellum', function() {
50359                             dispatch$6.call('viewerChanged');
50360                         });
50361                     })
50362                     .on('mouseup', function() {
50363                         d3_select(window).on('mousemove.pannellum', null);
50364                         // continue dispatching events for a few seconds, in case viewer has inertia.
50365                         var t = timer(function(elapsed) {
50366                             dispatch$6.call('viewerChanged');
50367                             if (elapsed > 2000) {
50368                                 t.stop();
50369                             }
50370                         });
50371                     });
50372             },
50373
50374
50375             /**
50376              * loadViewer() create the streeside viewer.
50377              */
50378             loadViewer: function (context) {
50379                 var that = this;
50380
50381                 // create ms-wrapper, a photo wrapper class
50382                 var wrap = d3_select('#photoviewer').selectAll('.ms-wrapper')
50383                     .data([0]);
50384
50385                 // inject ms-wrapper into the photoviewer div
50386                 // (used by all to house each custom photo viewer)
50387                 var wrapEnter = wrap.enter()
50388                     .append('div')
50389                     .attr('id', 'ms')
50390                     .attr('class', 'photo-wrapper ms-wrapper')
50391                     .classed('hide', true);
50392
50393                 // inject div to support streetside viewer (pannellum) and attribution line
50394                 wrapEnter
50395                     .append('div')
50396                     .attr('id', 'viewer-streetside')
50397                     .append('div')
50398                     .attr('class', 'photo-attribution fillD');
50399
50400                 var controlsEnter = wrapEnter
50401                     .append('div')
50402                     .attr('class', 'photo-controls-wrap')
50403                     .append('div')
50404                     .attr('class', 'photo-controls');
50405
50406                 controlsEnter
50407                     .append('button')
50408                     .on('click.back', step(-1))
50409                     .text('◄');
50410
50411                 controlsEnter
50412                     .append('button')
50413                     .on('click.forward', step(1))
50414                     .text('►');
50415
50416
50417                 // create working canvas for stitching together images
50418                 wrap = wrap
50419                     .merge(wrapEnter)
50420                     .call(setupCanvas, true);
50421
50422                 // load streetside pannellum viewer css
50423                 d3_select('head').selectAll('#streetside-viewercss')
50424                     .data([0])
50425                     .enter()
50426                     .append('link')
50427                     .attr('id', 'streetside-viewercss')
50428                     .attr('rel', 'stylesheet')
50429                     .attr('href', context.asset(pannellumViewerCSS));
50430
50431                 // load streetside pannellum viewer js
50432                 d3_select('head').selectAll('#streetside-viewerjs')
50433                     .data([0])
50434                     .enter()
50435                     .append('script')
50436                     .attr('id', 'streetside-viewerjs')
50437                     .attr('src', context.asset(pannellumViewerJS));
50438
50439
50440                 // Register viewer resize handler
50441                 context.ui().photoviewer.on('resize', function() {
50442                     if (_pannellumViewer) {
50443                         _pannellumViewer.resize();
50444                     }
50445                 });
50446
50447
50448                 function step(stepBy) {
50449                     return function() {
50450                         var viewer = d3_select('#photoviewer');
50451                         var selected = viewer.empty() ? undefined : viewer.datum();
50452                         if (!selected) return;
50453
50454                         var nextID = (stepBy === 1 ? selected.ne : selected.pr);
50455                         var yaw = _pannellumViewer.getYaw();
50456                         var ca = selected.ca + yaw;
50457                         var origin = selected.loc;
50458
50459                         // construct a search trapezoid pointing out from current bubble
50460                         var meters = 35;
50461                         var p1 = [
50462                             origin[0] + geoMetersToLon(meters / 5, origin[1]),
50463                             origin[1]
50464                         ];
50465                         var p2 = [
50466                             origin[0] + geoMetersToLon(meters / 2, origin[1]),
50467                             origin[1] + geoMetersToLat(meters)
50468                         ];
50469                         var p3 = [
50470                             origin[0] - geoMetersToLon(meters / 2, origin[1]),
50471                             origin[1] + geoMetersToLat(meters)
50472                         ];
50473                         var p4 = [
50474                             origin[0] - geoMetersToLon(meters / 5, origin[1]),
50475                             origin[1]
50476                         ];
50477
50478                         var poly = [p1, p2, p3, p4, p1];
50479
50480                         // rotate it to face forward/backward
50481                         var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
50482                         poly = geoRotate(poly, -angle, origin);
50483
50484                         var extent = poly.reduce(function(extent, point) {
50485                             return extent.extend(geoExtent(point));
50486                         }, geoExtent());
50487
50488                         // find nearest other bubble in the search polygon
50489                         var minDist = Infinity;
50490                         _ssCache.bubbles.rtree.search(extent.bbox())
50491                             .forEach(function(d) {
50492                                 if (d.data.key === selected.key) return;
50493                                 if (!geoPointInPolygon(d.data.loc, poly)) return;
50494
50495                                 var dist = geoVecLength(d.data.loc, selected.loc);
50496                                 var theta = selected.ca - d.data.ca;
50497                                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
50498                                 if (minTheta > 20) {
50499                                     dist += 5;  // penalize distance if camera angles don't match
50500                                 }
50501
50502                                 if (dist < minDist) {
50503                                     nextID = d.data.key;
50504                                     minDist = dist;
50505                                 }
50506                             });
50507
50508                         var nextBubble = nextID && _ssCache.bubbles.points[nextID];
50509                         if (!nextBubble) return;
50510
50511                         context.map().centerEase(nextBubble.loc);
50512
50513                         that.selectImage(nextBubble)
50514                             .then(function(r) {
50515                                 if (r.status === 'ok') {
50516                                     _sceneOptions.yaw = yaw;
50517                                     that.showViewer();
50518                                 }
50519                             });
50520                     };
50521                 }
50522             },
50523
50524             /**
50525              * showViewer()
50526              */
50527             showViewer: function (yaw) {
50528                 if (!_sceneOptions) return;
50529
50530                 if (yaw !== undefined) {
50531                     _sceneOptions.yaw = yaw;
50532                 }
50533
50534                 if (!_pannellumViewer) {
50535                     this.initViewer();
50536                 } else {
50537                     // make a new scene
50538                     var sceneID = ++_currScene + '';
50539                     _pannellumViewer
50540                         .addScene(sceneID, _sceneOptions)
50541                         .loadScene(sceneID);
50542
50543                     // remove previous scene
50544                     if (_currScene > 2) {
50545                         sceneID = (_currScene - 1) + '';
50546                         _pannellumViewer
50547                             .removeScene(sceneID);
50548                     }
50549                 }
50550
50551                 var wrap = d3_select('#photoviewer')
50552                     .classed('hide', false);
50553
50554                 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
50555
50556                 if (isHidden) {
50557                     wrap
50558                         .selectAll('.photo-wrapper:not(.ms-wrapper)')
50559                         .classed('hide', true);
50560
50561                     wrap
50562                         .selectAll('.photo-wrapper.ms-wrapper')
50563                         .classed('hide', false);
50564                 }
50565
50566                 return this;
50567             },
50568
50569             /**
50570              * hideViewer()
50571              */
50572             hideViewer: function () {
50573                 var viewer = d3_select('#photoviewer');
50574                 if (!viewer.empty()) viewer.datum(null);
50575
50576                 viewer
50577                     .classed('hide', true)
50578                     .selectAll('.photo-wrapper')
50579                     .classed('hide', true);
50580
50581                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
50582                     .classed('currentView', false);
50583
50584                 return this.setStyles(null, true);
50585             },
50586
50587             /**
50588              * selectImage().
50589              */
50590             selectImage: function (d) {
50591                 var response = q.defer();
50592                 var that = this;
50593
50594                 var viewer = d3_select('#photoviewer');
50595                 if (!viewer.empty()) viewer.datum(d);
50596
50597                 this.setStyles(null, true);
50598
50599                 var wrap = d3_select('#photoviewer .ms-wrapper');
50600                 var attribution = wrap.selectAll('.photo-attribution').html('');
50601
50602                 wrap.selectAll('.pnlm-load-box')   // display "loading.."
50603                     .style('display', 'block');
50604
50605                 if (!d) {
50606                     response.resolve({status: 'ok'});
50607                     return response.promise;
50608                 }
50609
50610                 var line1 = attribution
50611                     .append('div')
50612                     .attr('class', 'attribution-row');
50613
50614                 // Add hires checkbox
50615                 var label = line1
50616                     .append('label')
50617                     .attr('class', 'streetside-hires');
50618
50619                 label
50620                     .append('input')
50621                     .attr('type', 'checkbox')
50622                     .attr('id', 'streetside-hires-input')
50623                     .property('checked', _hires)
50624                     .on('click', function() {
50625                         event.stopPropagation();
50626
50627                         _hires = !_hires;
50628                         _resolution = _hires ? 1024 : 512;
50629                         wrap.call(setupCanvas, true);
50630
50631                         var viewstate = {
50632                             yaw: _pannellumViewer.getYaw(),
50633                             pitch: _pannellumViewer.getPitch(),
50634                             hfov: _pannellumViewer.getHfov()
50635                         };
50636
50637                         that.selectImage(d)
50638                             .then(function(r) {
50639                                 if (r.status === 'ok') {
50640                                     _sceneOptions = Object.assign(_sceneOptions, viewstate);
50641                                     that.showViewer();
50642                                 }
50643                             });
50644                     });
50645
50646                 label
50647                     .append('span')
50648                     .text(t('streetside.hires'));
50649
50650
50651                 var captureInfo = line1
50652                     .append('div')
50653                     .attr('class', 'attribution-capture-info');
50654
50655                 // Add capture date
50656                 if (d.captured_by) {
50657                     var yyyy = (new Date()).getFullYear();
50658
50659                     captureInfo
50660                         .append('a')
50661                         .attr('class', 'captured_by')
50662                         .attr('target', '_blank')
50663                         .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
50664                         .text('©' + yyyy + ' Microsoft');
50665
50666                     captureInfo
50667                         .append('span')
50668                         .text('|');
50669                 }
50670
50671                 if (d.captured_at) {
50672                     captureInfo
50673                         .append('span')
50674                         .attr('class', 'captured_at')
50675                         .text(localeTimestamp(d.captured_at));
50676                 }
50677
50678                 // Add image links
50679                 var line2 = attribution
50680                     .append('div')
50681                     .attr('class', 'attribution-row');
50682
50683                 line2
50684                     .append('a')
50685                     .attr('class', 'image-view-link')
50686                     .attr('target', '_blank')
50687                     .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
50688                         '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
50689                     .text(t('streetside.view_on_bing'));
50690
50691                 line2
50692                     .append('a')
50693                     .attr('class', 'image-report-link')
50694                     .attr('target', '_blank')
50695                     .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
50696                         '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
50697                     .text(t('streetside.report'));
50698
50699
50700                 var bubbleIdQuadKey = d.key.toString(4);
50701                 var paddingNeeded = 16 - bubbleIdQuadKey.length;
50702                 for (var i = 0; i < paddingNeeded; i++) {
50703                     bubbleIdQuadKey = '0' + bubbleIdQuadKey;
50704                 }
50705                 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
50706                 var imgUrlSuffix = '.jpg?g=6338&n=z';
50707
50708                 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
50709                 var faceKeys = ['01','02','03','10','11','12'];
50710
50711                 // Map images to cube faces
50712                 var quadKeys = getQuadKeys();
50713                 var faces = faceKeys.map(function(faceKey) {
50714                     return quadKeys.map(function(quadKey) {
50715                         var xy = qkToXY(quadKey);
50716                         return {
50717                             face: faceKey,
50718                             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
50719                             x: xy[0],
50720                             y: xy[1]
50721                         };
50722                     });
50723                 });
50724
50725                 processFaces(faces).then(function() {
50726                     _sceneOptions = {
50727                         showFullscreenCtrl: false,
50728                         autoLoad: true,
50729                         compass: true,
50730                         northOffset: d.ca,
50731                         yaw: 0,
50732                         minHfov: minHfov,
50733                         maxHfov: maxHfov,
50734                         hfov: defaultHfov,
50735                         type: 'cubemap',
50736                         cubeMap: [
50737                             _dataUrlArray[0],
50738                             _dataUrlArray[1],
50739                             _dataUrlArray[2],
50740                             _dataUrlArray[3],
50741                             _dataUrlArray[4],
50742                             _dataUrlArray[5]
50743                         ]
50744                     };
50745                     response.resolve({status: 'ok'});
50746                 });
50747
50748                 return response.promise;
50749             },
50750
50751
50752             getSequenceKeyForBubble: function(d) {
50753                 return d && d.sequenceKey;
50754             },
50755
50756
50757             // Updates the currently highlighted sequence and selected bubble.
50758             // Reset is only necessary when interacting with the viewport because
50759             // this implicitly changes the currently selected bubble/sequence
50760             setStyles: function (hovered, reset) {
50761                 if (reset) {  // reset all layers
50762                     d3_selectAll('.viewfield-group')
50763                         .classed('highlighted', false)
50764                         .classed('hovered', false)
50765                         .classed('currentView', false);
50766
50767                     d3_selectAll('.sequence')
50768                         .classed('highlighted', false)
50769                         .classed('currentView', false);
50770                 }
50771
50772                 var hoveredBubbleKey = hovered && hovered.key;
50773                 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
50774                 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
50775                 var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
50776
50777                 var viewer = d3_select('#photoviewer');
50778                 var selected = viewer.empty() ? undefined : viewer.datum();
50779                 var selectedBubbleKey = selected && selected.key;
50780                 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
50781                 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
50782                 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
50783
50784                 // highlight sibling viewfields on either the selected or the hovered sequences
50785                 var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
50786
50787                 d3_selectAll('.layer-streetside-images .viewfield-group')
50788                     .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
50789                     .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
50790                     .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
50791
50792                 d3_selectAll('.layer-streetside-images .sequence')
50793                     .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
50794                     .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
50795
50796                 // update viewfields if needed
50797                 d3_selectAll('.viewfield-group .viewfield')
50798                     .attr('d', viewfieldPath);
50799
50800                 function viewfieldPath() {
50801                     var d = this.parentNode.__data__;
50802                     if (d.pano && d.key !== selectedBubbleKey) {
50803                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
50804                     } else {
50805                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
50806                     }
50807                 }
50808
50809                 return this;
50810             },
50811
50812             /**
50813              * cache().
50814              */
50815             cache: function () {
50816                 return _ssCache;
50817             }
50818         };
50819
50820         var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
50821         var _inflight$2 = {};
50822         var _popularKeys = {};
50823         var _taginfoCache = {};
50824
50825         var tag_sorts = {
50826             point: 'count_nodes',
50827             vertex: 'count_nodes',
50828             area: 'count_ways',
50829             line: 'count_ways'
50830         };
50831         var tag_sort_members = {
50832             point: 'count_node_members',
50833             vertex: 'count_node_members',
50834             area: 'count_way_members',
50835             line: 'count_way_members',
50836             relation: 'count_relation_members'
50837         };
50838         var tag_filters = {
50839             point: 'nodes',
50840             vertex: 'nodes',
50841             area: 'ways',
50842             line: 'ways'
50843         };
50844         var tag_members_fractions = {
50845             point: 'count_node_members_fraction',
50846             vertex: 'count_node_members_fraction',
50847             area: 'count_way_members_fraction',
50848             line: 'count_way_members_fraction',
50849             relation: 'count_relation_members_fraction'
50850         };
50851
50852
50853         function sets(params, n, o) {
50854             if (params.geometry && o[params.geometry]) {
50855                 params[n] = o[params.geometry];
50856             }
50857             return params;
50858         }
50859
50860
50861         function setFilter(params) {
50862             return sets(params, 'filter', tag_filters);
50863         }
50864
50865
50866         function setSort(params) {
50867             return sets(params, 'sortname', tag_sorts);
50868         }
50869
50870
50871         function setSortMembers(params) {
50872             return sets(params, 'sortname', tag_sort_members);
50873         }
50874
50875
50876         function clean(params) {
50877             return utilObjectOmit(params, ['geometry', 'debounce']);
50878         }
50879
50880
50881         function filterKeys(type) {
50882             var count_type = type ? 'count_' + type : 'count_all';
50883             return function(d) {
50884                 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
50885             };
50886         }
50887
50888
50889         function filterMultikeys(prefix) {
50890             return function(d) {
50891                 // d.key begins with prefix, and d.key contains no additional ':'s
50892                 var re = new RegExp('^' + prefix + '(.*)$');
50893                 var matches = d.key.match(re) || [];
50894                 return (matches.length === 2 && matches[1].indexOf(':') === -1);
50895             };
50896         }
50897
50898
50899         function filterValues(allowUpperCase) {
50900             return function(d) {
50901                 if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
50902                 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
50903                 return parseFloat(d.fraction) > 0.0;
50904             };
50905         }
50906
50907
50908         function filterRoles(geometry) {
50909             return function(d) {
50910                 if (d.role === '') return false; // exclude empty role
50911                 if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
50912                 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
50913             };
50914         }
50915
50916
50917         function valKey(d) {
50918             return {
50919                 value: d.key,
50920                 title: d.key
50921             };
50922         }
50923
50924
50925         function valKeyDescription(d) {
50926             return {
50927                 value: d.value,
50928                 title: d.description || d.value
50929             };
50930         }
50931
50932
50933         function roleKey(d) {
50934             return {
50935                 value: d.role,
50936                 title: d.role
50937             };
50938         }
50939
50940
50941         // sort keys with ':' lower than keys without ':'
50942         function sortKeys(a, b) {
50943             return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
50944                 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
50945                 : 0;
50946         }
50947
50948
50949         var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
50950
50951         function request$1(url, params, exactMatch, callback, loaded) {
50952             if (_inflight$2[url]) return;
50953
50954             if (checkCache(url, params, exactMatch, callback)) return;
50955
50956             var controller = new AbortController();
50957             _inflight$2[url] = controller;
50958
50959             d3_json(url, { signal: controller.signal })
50960                 .then(function(result) {
50961                     delete _inflight$2[url];
50962                     if (loaded) loaded(null, result);
50963                 })
50964                 .catch(function(err) {
50965                     delete _inflight$2[url];
50966                     if (err.name === 'AbortError') return;
50967                     if (loaded) loaded(err.message);
50968                 });
50969         }
50970
50971
50972         function checkCache(url, params, exactMatch, callback) {
50973             var rp = params.rp || 25;
50974             var testQuery = params.query || '';
50975             var testUrl = url;
50976
50977             do {
50978                 var hit = _taginfoCache[testUrl];
50979
50980                 // exact match, or shorter match yielding fewer than max results (rp)
50981                 if (hit && (url === testUrl || hit.length < rp)) {
50982                     callback(null, hit);
50983                     return true;
50984                 }
50985
50986                 // don't try to shorten the query
50987                 if (exactMatch || !testQuery.length) return false;
50988
50989                 // do shorten the query to see if we already have a cached result
50990                 // that has returned fewer than max results (rp)
50991                 testQuery = testQuery.slice(0, -1);
50992                 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
50993             } while (testQuery.length >= 0);
50994
50995             return false;
50996         }
50997
50998
50999         var serviceTaginfo = {
51000
51001             init: function() {
51002                 _inflight$2 = {};
51003                 _taginfoCache = {};
51004                 _popularKeys = {
51005                     postal_code: true   // #5377
51006                 };
51007
51008                 // Fetch popular keys.  We'll exclude these from `values`
51009                 // lookups because they stress taginfo, and they aren't likely
51010                 // to yield meaningful autocomplete results.. see #3955
51011                 var params = {
51012                     rp: 100,
51013                     sortname: 'values_all',
51014                     sortorder: 'desc',
51015                     page: 1,
51016                     debounce: false,
51017                     lang: currentLocale
51018                 };
51019                 this.keys(params, function(err, data) {
51020                     if (err) return;
51021                     data.forEach(function(d) {
51022                         if (d.value === 'opening_hours') return;  // exception
51023                         _popularKeys[d.value] = true;
51024                     });
51025                 });
51026             },
51027
51028
51029             reset: function() {
51030                 Object.values(_inflight$2).forEach(function(controller) { controller.abort(); });
51031                 _inflight$2 = {};
51032             },
51033
51034
51035             keys: function(params, callback) {
51036                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
51037                 params = clean(setSort(params));
51038                 params = Object.assign({
51039                     rp: 10,
51040                     sortname: 'count_all',
51041                     sortorder: 'desc',
51042                     page: 1,
51043                     lang: currentLocale
51044                 }, params);
51045
51046                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
51047                 doRequest(url, params, false, callback, function(err, d) {
51048                     if (err) {
51049                         callback(err);
51050                     } else {
51051                         var f = filterKeys(params.filter);
51052                         var result = d.data.filter(f).sort(sortKeys).map(valKey);
51053                         _taginfoCache[url] = result;
51054                         callback(null, result);
51055                     }
51056                 });
51057             },
51058
51059
51060             multikeys: function(params, callback) {
51061                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
51062                 params = clean(setSort(params));
51063                 params = Object.assign({
51064                     rp: 25,
51065                     sortname: 'count_all',
51066                     sortorder: 'desc',
51067                     page: 1,
51068                     lang: currentLocale
51069                 }, params);
51070
51071                 var prefix = params.query;
51072                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
51073                 doRequest(url, params, true, callback, function(err, d) {
51074                     if (err) {
51075                         callback(err);
51076                     } else {
51077                         var f = filterMultikeys(prefix);
51078                         var result = d.data.filter(f).map(valKey);
51079                         _taginfoCache[url] = result;
51080                         callback(null, result);
51081                     }
51082                 });
51083             },
51084
51085
51086             values: function(params, callback) {
51087                 // Exclude popular keys from values lookups.. see #3955
51088                 var key = params.key;
51089                 if (key && _popularKeys[key]) {
51090                     callback(null, []);
51091                     return;
51092                 }
51093
51094                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
51095                 params = clean(setSort(setFilter(params)));
51096                 params = Object.assign({
51097                     rp: 25,
51098                     sortname: 'count_all',
51099                     sortorder: 'desc',
51100                     page: 1,
51101                     lang: currentLocale
51102                 }, params);
51103
51104                 var url = apibase$4 + 'key/values?' + utilQsString(params);
51105                 doRequest(url, params, false, callback, function(err, d) {
51106                     if (err) {
51107                         callback(err);
51108                     } else {
51109                         // In most cases we prefer taginfo value results with lowercase letters.
51110                         // A few OSM keys expect values to contain uppercase values (see #3377).
51111                         // This is not an exhaustive list (e.g. `name` also has uppercase values)
51112                         // but these are the fields where taginfo value lookup is most useful.
51113                         var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer/;
51114                         var allowUpperCase = re.test(params.key);
51115                         var f = filterValues(allowUpperCase);
51116
51117                         var result = d.data.filter(f).map(valKeyDescription);
51118                         _taginfoCache[url] = result;
51119                         callback(null, result);
51120                     }
51121                 });
51122             },
51123
51124
51125             roles: function(params, callback) {
51126                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
51127                 var geometry = params.geometry;
51128                 params = clean(setSortMembers(params));
51129                 params = Object.assign({
51130                     rp: 25,
51131                     sortname: 'count_all_members',
51132                     sortorder: 'desc',
51133                     page: 1,
51134                     lang: currentLocale
51135                 }, params);
51136
51137                 var url = apibase$4 + 'relation/roles?' + utilQsString(params);
51138                 doRequest(url, params, true, callback, function(err, d) {
51139                     if (err) {
51140                         callback(err);
51141                     } else {
51142                         var f = filterRoles(geometry);
51143                         var result = d.data.filter(f).map(roleKey);
51144                         _taginfoCache[url] = result;
51145                         callback(null, result);
51146                     }
51147                 });
51148             },
51149
51150
51151             docs: function(params, callback) {
51152                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
51153                 params = clean(setSort(params));
51154
51155                 var path = 'key/wiki_pages?';
51156                 if (params.value) {
51157                     path = 'tag/wiki_pages?';
51158                 } else if (params.rtype) {
51159                     path = 'relation/wiki_pages?';
51160                 }
51161
51162                 var url = apibase$4 + path + utilQsString(params);
51163                 doRequest(url, params, true, callback, function(err, d) {
51164                     if (err) {
51165                         callback(err);
51166                     } else {
51167                         _taginfoCache[url] = d.data;
51168                         callback(null, d.data);
51169                     }
51170                 });
51171             },
51172
51173
51174             apibase: function(_) {
51175                 if (!arguments.length) return apibase$4;
51176                 apibase$4 = _;
51177                 return this;
51178             }
51179
51180         };
51181
51182         var helpers = createCommonjsModule(function (module, exports) {
51183         Object.defineProperty(exports, "__esModule", { value: true });
51184         /**
51185          * @module helpers
51186          */
51187         /**
51188          * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
51189          *
51190          * @memberof helpers
51191          * @type {number}
51192          */
51193         exports.earthRadius = 6371008.8;
51194         /**
51195          * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
51196          *
51197          * @memberof helpers
51198          * @type {Object}
51199          */
51200         exports.factors = {
51201             centimeters: exports.earthRadius * 100,
51202             centimetres: exports.earthRadius * 100,
51203             degrees: exports.earthRadius / 111325,
51204             feet: exports.earthRadius * 3.28084,
51205             inches: exports.earthRadius * 39.370,
51206             kilometers: exports.earthRadius / 1000,
51207             kilometres: exports.earthRadius / 1000,
51208             meters: exports.earthRadius,
51209             metres: exports.earthRadius,
51210             miles: exports.earthRadius / 1609.344,
51211             millimeters: exports.earthRadius * 1000,
51212             millimetres: exports.earthRadius * 1000,
51213             nauticalmiles: exports.earthRadius / 1852,
51214             radians: 1,
51215             yards: exports.earthRadius / 1.0936,
51216         };
51217         /**
51218          * Units of measurement factors based on 1 meter.
51219          *
51220          * @memberof helpers
51221          * @type {Object}
51222          */
51223         exports.unitsFactors = {
51224             centimeters: 100,
51225             centimetres: 100,
51226             degrees: 1 / 111325,
51227             feet: 3.28084,
51228             inches: 39.370,
51229             kilometers: 1 / 1000,
51230             kilometres: 1 / 1000,
51231             meters: 1,
51232             metres: 1,
51233             miles: 1 / 1609.344,
51234             millimeters: 1000,
51235             millimetres: 1000,
51236             nauticalmiles: 1 / 1852,
51237             radians: 1 / exports.earthRadius,
51238             yards: 1 / 1.0936,
51239         };
51240         /**
51241          * Area of measurement factors based on 1 square meter.
51242          *
51243          * @memberof helpers
51244          * @type {Object}
51245          */
51246         exports.areaFactors = {
51247             acres: 0.000247105,
51248             centimeters: 10000,
51249             centimetres: 10000,
51250             feet: 10.763910417,
51251             inches: 1550.003100006,
51252             kilometers: 0.000001,
51253             kilometres: 0.000001,
51254             meters: 1,
51255             metres: 1,
51256             miles: 3.86e-7,
51257             millimeters: 1000000,
51258             millimetres: 1000000,
51259             yards: 1.195990046,
51260         };
51261         /**
51262          * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
51263          *
51264          * @name feature
51265          * @param {Geometry} geometry input geometry
51266          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51267          * @param {Object} [options={}] Optional Parameters
51268          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51269          * @param {string|number} [options.id] Identifier associated with the Feature
51270          * @returns {Feature} a GeoJSON Feature
51271          * @example
51272          * var geometry = {
51273          *   "type": "Point",
51274          *   "coordinates": [110, 50]
51275          * };
51276          *
51277          * var feature = turf.feature(geometry);
51278          *
51279          * //=feature
51280          */
51281         function feature(geom, properties, options) {
51282             if (options === void 0) { options = {}; }
51283             var feat = { type: "Feature" };
51284             if (options.id === 0 || options.id) {
51285                 feat.id = options.id;
51286             }
51287             if (options.bbox) {
51288                 feat.bbox = options.bbox;
51289             }
51290             feat.properties = properties || {};
51291             feat.geometry = geom;
51292             return feat;
51293         }
51294         exports.feature = feature;
51295         /**
51296          * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
51297          * For GeometryCollection type use `helpers.geometryCollection`
51298          *
51299          * @name geometry
51300          * @param {string} type Geometry Type
51301          * @param {Array<any>} coordinates Coordinates
51302          * @param {Object} [options={}] Optional Parameters
51303          * @returns {Geometry} a GeoJSON Geometry
51304          * @example
51305          * var type = "Point";
51306          * var coordinates = [110, 50];
51307          * var geometry = turf.geometry(type, coordinates);
51308          * // => geometry
51309          */
51310         function geometry(type, coordinates, options) {
51311             switch (type) {
51312                 case "Point": return point(coordinates).geometry;
51313                 case "LineString": return lineString(coordinates).geometry;
51314                 case "Polygon": return polygon(coordinates).geometry;
51315                 case "MultiPoint": return multiPoint(coordinates).geometry;
51316                 case "MultiLineString": return multiLineString(coordinates).geometry;
51317                 case "MultiPolygon": return multiPolygon(coordinates).geometry;
51318                 default: throw new Error(type + " is invalid");
51319             }
51320         }
51321         exports.geometry = geometry;
51322         /**
51323          * Creates a {@link Point} {@link Feature} from a Position.
51324          *
51325          * @name point
51326          * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
51327          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51328          * @param {Object} [options={}] Optional Parameters
51329          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51330          * @param {string|number} [options.id] Identifier associated with the Feature
51331          * @returns {Feature<Point>} a Point feature
51332          * @example
51333          * var point = turf.point([-75.343, 39.984]);
51334          *
51335          * //=point
51336          */
51337         function point(coordinates, properties, options) {
51338             if (options === void 0) { options = {}; }
51339             var geom = {
51340                 type: "Point",
51341                 coordinates: coordinates,
51342             };
51343             return feature(geom, properties, options);
51344         }
51345         exports.point = point;
51346         /**
51347          * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
51348          *
51349          * @name points
51350          * @param {Array<Array<number>>} coordinates an array of Points
51351          * @param {Object} [properties={}] Translate these properties to each Feature
51352          * @param {Object} [options={}] Optional Parameters
51353          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51354          * associated with the FeatureCollection
51355          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51356          * @returns {FeatureCollection<Point>} Point Feature
51357          * @example
51358          * var points = turf.points([
51359          *   [-75, 39],
51360          *   [-80, 45],
51361          *   [-78, 50]
51362          * ]);
51363          *
51364          * //=points
51365          */
51366         function points(coordinates, properties, options) {
51367             if (options === void 0) { options = {}; }
51368             return featureCollection(coordinates.map(function (coords) {
51369                 return point(coords, properties);
51370             }), options);
51371         }
51372         exports.points = points;
51373         /**
51374          * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
51375          *
51376          * @name polygon
51377          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51378          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51379          * @param {Object} [options={}] Optional Parameters
51380          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51381          * @param {string|number} [options.id] Identifier associated with the Feature
51382          * @returns {Feature<Polygon>} Polygon Feature
51383          * @example
51384          * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
51385          *
51386          * //=polygon
51387          */
51388         function polygon(coordinates, properties, options) {
51389             if (options === void 0) { options = {}; }
51390             for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
51391                 var ring = coordinates_1[_i];
51392                 if (ring.length < 4) {
51393                     throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
51394                 }
51395                 for (var j = 0; j < ring[ring.length - 1].length; j++) {
51396                     // Check if first point of Polygon contains two numbers
51397                     if (ring[ring.length - 1][j] !== ring[0][j]) {
51398                         throw new Error("First and last Position are not equivalent.");
51399                     }
51400                 }
51401             }
51402             var geom = {
51403                 type: "Polygon",
51404                 coordinates: coordinates,
51405             };
51406             return feature(geom, properties, options);
51407         }
51408         exports.polygon = polygon;
51409         /**
51410          * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
51411          *
51412          * @name polygons
51413          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
51414          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51415          * @param {Object} [options={}] Optional Parameters
51416          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51417          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51418          * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
51419          * @example
51420          * var polygons = turf.polygons([
51421          *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
51422          *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
51423          * ]);
51424          *
51425          * //=polygons
51426          */
51427         function polygons(coordinates, properties, options) {
51428             if (options === void 0) { options = {}; }
51429             return featureCollection(coordinates.map(function (coords) {
51430                 return polygon(coords, properties);
51431             }), options);
51432         }
51433         exports.polygons = polygons;
51434         /**
51435          * Creates a {@link LineString} {@link Feature} from an Array of Positions.
51436          *
51437          * @name lineString
51438          * @param {Array<Array<number>>} coordinates an array of Positions
51439          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51440          * @param {Object} [options={}] Optional Parameters
51441          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51442          * @param {string|number} [options.id] Identifier associated with the Feature
51443          * @returns {Feature<LineString>} LineString Feature
51444          * @example
51445          * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
51446          * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
51447          *
51448          * //=linestring1
51449          * //=linestring2
51450          */
51451         function lineString(coordinates, properties, options) {
51452             if (options === void 0) { options = {}; }
51453             if (coordinates.length < 2) {
51454                 throw new Error("coordinates must be an array of two or more positions");
51455             }
51456             var geom = {
51457                 type: "LineString",
51458                 coordinates: coordinates,
51459             };
51460             return feature(geom, properties, options);
51461         }
51462         exports.lineString = lineString;
51463         /**
51464          * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
51465          *
51466          * @name lineStrings
51467          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51468          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51469          * @param {Object} [options={}] Optional Parameters
51470          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51471          * associated with the FeatureCollection
51472          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51473          * @returns {FeatureCollection<LineString>} LineString FeatureCollection
51474          * @example
51475          * var linestrings = turf.lineStrings([
51476          *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
51477          *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
51478          * ]);
51479          *
51480          * //=linestrings
51481          */
51482         function lineStrings(coordinates, properties, options) {
51483             if (options === void 0) { options = {}; }
51484             return featureCollection(coordinates.map(function (coords) {
51485                 return lineString(coords, properties);
51486             }), options);
51487         }
51488         exports.lineStrings = lineStrings;
51489         /**
51490          * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
51491          *
51492          * @name featureCollection
51493          * @param {Feature[]} features input features
51494          * @param {Object} [options={}] Optional Parameters
51495          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51496          * @param {string|number} [options.id] Identifier associated with the Feature
51497          * @returns {FeatureCollection} FeatureCollection of Features
51498          * @example
51499          * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
51500          * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
51501          * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
51502          *
51503          * var collection = turf.featureCollection([
51504          *   locationA,
51505          *   locationB,
51506          *   locationC
51507          * ]);
51508          *
51509          * //=collection
51510          */
51511         function featureCollection(features, options) {
51512             if (options === void 0) { options = {}; }
51513             var fc = { type: "FeatureCollection" };
51514             if (options.id) {
51515                 fc.id = options.id;
51516             }
51517             if (options.bbox) {
51518                 fc.bbox = options.bbox;
51519             }
51520             fc.features = features;
51521             return fc;
51522         }
51523         exports.featureCollection = featureCollection;
51524         /**
51525          * Creates a {@link Feature<MultiLineString>} based on a
51526          * coordinate array. Properties can be added optionally.
51527          *
51528          * @name multiLineString
51529          * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
51530          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51531          * @param {Object} [options={}] Optional Parameters
51532          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51533          * @param {string|number} [options.id] Identifier associated with the Feature
51534          * @returns {Feature<MultiLineString>} a MultiLineString feature
51535          * @throws {Error} if no coordinates are passed
51536          * @example
51537          * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
51538          *
51539          * //=multiLine
51540          */
51541         function multiLineString(coordinates, properties, options) {
51542             if (options === void 0) { options = {}; }
51543             var geom = {
51544                 type: "MultiLineString",
51545                 coordinates: coordinates,
51546             };
51547             return feature(geom, properties, options);
51548         }
51549         exports.multiLineString = multiLineString;
51550         /**
51551          * Creates a {@link Feature<MultiPoint>} based on a
51552          * coordinate array. Properties can be added optionally.
51553          *
51554          * @name multiPoint
51555          * @param {Array<Array<number>>} coordinates an array of Positions
51556          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51557          * @param {Object} [options={}] Optional Parameters
51558          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51559          * @param {string|number} [options.id] Identifier associated with the Feature
51560          * @returns {Feature<MultiPoint>} a MultiPoint feature
51561          * @throws {Error} if no coordinates are passed
51562          * @example
51563          * var multiPt = turf.multiPoint([[0,0],[10,10]]);
51564          *
51565          * //=multiPt
51566          */
51567         function multiPoint(coordinates, properties, options) {
51568             if (options === void 0) { options = {}; }
51569             var geom = {
51570                 type: "MultiPoint",
51571                 coordinates: coordinates,
51572             };
51573             return feature(geom, properties, options);
51574         }
51575         exports.multiPoint = multiPoint;
51576         /**
51577          * Creates a {@link Feature<MultiPolygon>} based on a
51578          * coordinate array. Properties can be added optionally.
51579          *
51580          * @name multiPolygon
51581          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
51582          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51583          * @param {Object} [options={}] Optional Parameters
51584          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51585          * @param {string|number} [options.id] Identifier associated with the Feature
51586          * @returns {Feature<MultiPolygon>} a multipolygon feature
51587          * @throws {Error} if no coordinates are passed
51588          * @example
51589          * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
51590          *
51591          * //=multiPoly
51592          *
51593          */
51594         function multiPolygon(coordinates, properties, options) {
51595             if (options === void 0) { options = {}; }
51596             var geom = {
51597                 type: "MultiPolygon",
51598                 coordinates: coordinates,
51599             };
51600             return feature(geom, properties, options);
51601         }
51602         exports.multiPolygon = multiPolygon;
51603         /**
51604          * Creates a {@link Feature<GeometryCollection>} based on a
51605          * coordinate array. Properties can be added optionally.
51606          *
51607          * @name geometryCollection
51608          * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
51609          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51610          * @param {Object} [options={}] Optional Parameters
51611          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51612          * @param {string|number} [options.id] Identifier associated with the Feature
51613          * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
51614          * @example
51615          * var pt = turf.geometry("Point", [100, 0]);
51616          * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
51617          * var collection = turf.geometryCollection([pt, line]);
51618          *
51619          * // => collection
51620          */
51621         function geometryCollection(geometries, properties, options) {
51622             if (options === void 0) { options = {}; }
51623             var geom = {
51624                 type: "GeometryCollection",
51625                 geometries: geometries,
51626             };
51627             return feature(geom, properties, options);
51628         }
51629         exports.geometryCollection = geometryCollection;
51630         /**
51631          * Round number to precision
51632          *
51633          * @param {number} num Number
51634          * @param {number} [precision=0] Precision
51635          * @returns {number} rounded number
51636          * @example
51637          * turf.round(120.4321)
51638          * //=120
51639          *
51640          * turf.round(120.4321, 2)
51641          * //=120.43
51642          */
51643         function round(num, precision) {
51644             if (precision === void 0) { precision = 0; }
51645             if (precision && !(precision >= 0)) {
51646                 throw new Error("precision must be a positive number");
51647             }
51648             var multiplier = Math.pow(10, precision || 0);
51649             return Math.round(num * multiplier) / multiplier;
51650         }
51651         exports.round = round;
51652         /**
51653          * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
51654          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51655          *
51656          * @name radiansToLength
51657          * @param {number} radians in radians across the sphere
51658          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51659          * meters, kilometres, kilometers.
51660          * @returns {number} distance
51661          */
51662         function radiansToLength(radians, units) {
51663             if (units === void 0) { units = "kilometers"; }
51664             var factor = exports.factors[units];
51665             if (!factor) {
51666                 throw new Error(units + " units is invalid");
51667             }
51668             return radians * factor;
51669         }
51670         exports.radiansToLength = radiansToLength;
51671         /**
51672          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
51673          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51674          *
51675          * @name lengthToRadians
51676          * @param {number} distance in real units
51677          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51678          * meters, kilometres, kilometers.
51679          * @returns {number} radians
51680          */
51681         function lengthToRadians(distance, units) {
51682             if (units === void 0) { units = "kilometers"; }
51683             var factor = exports.factors[units];
51684             if (!factor) {
51685                 throw new Error(units + " units is invalid");
51686             }
51687             return distance / factor;
51688         }
51689         exports.lengthToRadians = lengthToRadians;
51690         /**
51691          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
51692          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
51693          *
51694          * @name lengthToDegrees
51695          * @param {number} distance in real units
51696          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51697          * meters, kilometres, kilometers.
51698          * @returns {number} degrees
51699          */
51700         function lengthToDegrees(distance, units) {
51701             return radiansToDegrees(lengthToRadians(distance, units));
51702         }
51703         exports.lengthToDegrees = lengthToDegrees;
51704         /**
51705          * Converts any bearing angle from the north line direction (positive clockwise)
51706          * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
51707          *
51708          * @name bearingToAzimuth
51709          * @param {number} bearing angle, between -180 and +180 degrees
51710          * @returns {number} angle between 0 and 360 degrees
51711          */
51712         function bearingToAzimuth(bearing) {
51713             var angle = bearing % 360;
51714             if (angle < 0) {
51715                 angle += 360;
51716             }
51717             return angle;
51718         }
51719         exports.bearingToAzimuth = bearingToAzimuth;
51720         /**
51721          * Converts an angle in radians to degrees
51722          *
51723          * @name radiansToDegrees
51724          * @param {number} radians angle in radians
51725          * @returns {number} degrees between 0 and 360 degrees
51726          */
51727         function radiansToDegrees(radians) {
51728             var degrees = radians % (2 * Math.PI);
51729             return degrees * 180 / Math.PI;
51730         }
51731         exports.radiansToDegrees = radiansToDegrees;
51732         /**
51733          * Converts an angle in degrees to radians
51734          *
51735          * @name degreesToRadians
51736          * @param {number} degrees angle between 0 and 360 degrees
51737          * @returns {number} angle in radians
51738          */
51739         function degreesToRadians(degrees) {
51740             var radians = degrees % 360;
51741             return radians * Math.PI / 180;
51742         }
51743         exports.degreesToRadians = degreesToRadians;
51744         /**
51745          * Converts a length to the requested unit.
51746          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51747          *
51748          * @param {number} length to be converted
51749          * @param {Units} [originalUnit="kilometers"] of the length
51750          * @param {Units} [finalUnit="kilometers"] returned unit
51751          * @returns {number} the converted length
51752          */
51753         function convertLength(length, originalUnit, finalUnit) {
51754             if (originalUnit === void 0) { originalUnit = "kilometers"; }
51755             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51756             if (!(length >= 0)) {
51757                 throw new Error("length must be a positive number");
51758             }
51759             return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
51760         }
51761         exports.convertLength = convertLength;
51762         /**
51763          * Converts a area to the requested unit.
51764          * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
51765          * @param {number} area to be converted
51766          * @param {Units} [originalUnit="meters"] of the distance
51767          * @param {Units} [finalUnit="kilometers"] returned unit
51768          * @returns {number} the converted distance
51769          */
51770         function convertArea(area, originalUnit, finalUnit) {
51771             if (originalUnit === void 0) { originalUnit = "meters"; }
51772             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51773             if (!(area >= 0)) {
51774                 throw new Error("area must be a positive number");
51775             }
51776             var startFactor = exports.areaFactors[originalUnit];
51777             if (!startFactor) {
51778                 throw new Error("invalid original units");
51779             }
51780             var finalFactor = exports.areaFactors[finalUnit];
51781             if (!finalFactor) {
51782                 throw new Error("invalid final units");
51783             }
51784             return (area / startFactor) * finalFactor;
51785         }
51786         exports.convertArea = convertArea;
51787         /**
51788          * isNumber
51789          *
51790          * @param {*} num Number to validate
51791          * @returns {boolean} true/false
51792          * @example
51793          * turf.isNumber(123)
51794          * //=true
51795          * turf.isNumber('foo')
51796          * //=false
51797          */
51798         function isNumber(num) {
51799             return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
51800         }
51801         exports.isNumber = isNumber;
51802         /**
51803          * isObject
51804          *
51805          * @param {*} input variable to validate
51806          * @returns {boolean} true/false
51807          * @example
51808          * turf.isObject({elevation: 10})
51809          * //=true
51810          * turf.isObject('foo')
51811          * //=false
51812          */
51813         function isObject(input) {
51814             return (!!input) && (input.constructor === Object);
51815         }
51816         exports.isObject = isObject;
51817         /**
51818          * Validate BBox
51819          *
51820          * @private
51821          * @param {Array<number>} bbox BBox to validate
51822          * @returns {void}
51823          * @throws Error if BBox is not valid
51824          * @example
51825          * validateBBox([-180, -40, 110, 50])
51826          * //=OK
51827          * validateBBox([-180, -40])
51828          * //=Error
51829          * validateBBox('Foo')
51830          * //=Error
51831          * validateBBox(5)
51832          * //=Error
51833          * validateBBox(null)
51834          * //=Error
51835          * validateBBox(undefined)
51836          * //=Error
51837          */
51838         function validateBBox(bbox) {
51839             if (!bbox) {
51840                 throw new Error("bbox is required");
51841             }
51842             if (!Array.isArray(bbox)) {
51843                 throw new Error("bbox must be an Array");
51844             }
51845             if (bbox.length !== 4 && bbox.length !== 6) {
51846                 throw new Error("bbox must be an Array of 4 or 6 numbers");
51847             }
51848             bbox.forEach(function (num) {
51849                 if (!isNumber(num)) {
51850                     throw new Error("bbox must only contain numbers");
51851                 }
51852             });
51853         }
51854         exports.validateBBox = validateBBox;
51855         /**
51856          * Validate Id
51857          *
51858          * @private
51859          * @param {string|number} id Id to validate
51860          * @returns {void}
51861          * @throws Error if Id is not valid
51862          * @example
51863          * validateId([-180, -40, 110, 50])
51864          * //=Error
51865          * validateId([-180, -40])
51866          * //=Error
51867          * validateId('Foo')
51868          * //=OK
51869          * validateId(5)
51870          * //=OK
51871          * validateId(null)
51872          * //=Error
51873          * validateId(undefined)
51874          * //=Error
51875          */
51876         function validateId(id) {
51877             if (!id) {
51878                 throw new Error("id is required");
51879             }
51880             if (["string", "number"].indexOf(typeof id) === -1) {
51881                 throw new Error("id must be a number or a string");
51882             }
51883         }
51884         exports.validateId = validateId;
51885         // Deprecated methods
51886         function radians2degrees() {
51887             throw new Error("method has been renamed to `radiansToDegrees`");
51888         }
51889         exports.radians2degrees = radians2degrees;
51890         function degrees2radians() {
51891             throw new Error("method has been renamed to `degreesToRadians`");
51892         }
51893         exports.degrees2radians = degrees2radians;
51894         function distanceToDegrees() {
51895             throw new Error("method has been renamed to `lengthToDegrees`");
51896         }
51897         exports.distanceToDegrees = distanceToDegrees;
51898         function distanceToRadians() {
51899             throw new Error("method has been renamed to `lengthToRadians`");
51900         }
51901         exports.distanceToRadians = distanceToRadians;
51902         function radiansToDistance() {
51903             throw new Error("method has been renamed to `radiansToLength`");
51904         }
51905         exports.radiansToDistance = radiansToDistance;
51906         function bearingToAngle() {
51907             throw new Error("method has been renamed to `bearingToAzimuth`");
51908         }
51909         exports.bearingToAngle = bearingToAngle;
51910         function convertDistance() {
51911             throw new Error("method has been renamed to `convertLength`");
51912         }
51913         exports.convertDistance = convertDistance;
51914         });
51915
51916         unwrapExports(helpers);
51917         var helpers_1 = helpers.earthRadius;
51918         var helpers_2 = helpers.factors;
51919         var helpers_3 = helpers.unitsFactors;
51920         var helpers_4 = helpers.areaFactors;
51921         var helpers_5 = helpers.feature;
51922         var helpers_6 = helpers.geometry;
51923         var helpers_7 = helpers.point;
51924         var helpers_8 = helpers.points;
51925         var helpers_9 = helpers.polygon;
51926         var helpers_10 = helpers.polygons;
51927         var helpers_11 = helpers.lineString;
51928         var helpers_12 = helpers.lineStrings;
51929         var helpers_13 = helpers.featureCollection;
51930         var helpers_14 = helpers.multiLineString;
51931         var helpers_15 = helpers.multiPoint;
51932         var helpers_16 = helpers.multiPolygon;
51933         var helpers_17 = helpers.geometryCollection;
51934         var helpers_18 = helpers.round;
51935         var helpers_19 = helpers.radiansToLength;
51936         var helpers_20 = helpers.lengthToRadians;
51937         var helpers_21 = helpers.lengthToDegrees;
51938         var helpers_22 = helpers.bearingToAzimuth;
51939         var helpers_23 = helpers.radiansToDegrees;
51940         var helpers_24 = helpers.degreesToRadians;
51941         var helpers_25 = helpers.convertLength;
51942         var helpers_26 = helpers.convertArea;
51943         var helpers_27 = helpers.isNumber;
51944         var helpers_28 = helpers.isObject;
51945         var helpers_29 = helpers.validateBBox;
51946         var helpers_30 = helpers.validateId;
51947         var helpers_31 = helpers.radians2degrees;
51948         var helpers_32 = helpers.degrees2radians;
51949         var helpers_33 = helpers.distanceToDegrees;
51950         var helpers_34 = helpers.distanceToRadians;
51951         var helpers_35 = helpers.radiansToDistance;
51952         var helpers_36 = helpers.bearingToAngle;
51953         var helpers_37 = helpers.convertDistance;
51954
51955         var invariant = createCommonjsModule(function (module, exports) {
51956         Object.defineProperty(exports, "__esModule", { value: true });
51957
51958         /**
51959          * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
51960          *
51961          * @name getCoord
51962          * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
51963          * @returns {Array<number>} coordinates
51964          * @example
51965          * var pt = turf.point([10, 10]);
51966          *
51967          * var coord = turf.getCoord(pt);
51968          * //= [10, 10]
51969          */
51970         function getCoord(coord) {
51971             if (!coord) {
51972                 throw new Error("coord is required");
51973             }
51974             if (!Array.isArray(coord)) {
51975                 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
51976                     return coord.geometry.coordinates;
51977                 }
51978                 if (coord.type === "Point") {
51979                     return coord.coordinates;
51980                 }
51981             }
51982             if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
51983                 return coord;
51984             }
51985             throw new Error("coord must be GeoJSON Point or an Array of numbers");
51986         }
51987         exports.getCoord = getCoord;
51988         /**
51989          * Unwrap coordinates from a Feature, Geometry Object or an Array
51990          *
51991          * @name getCoords
51992          * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
51993          * @returns {Array<any>} coordinates
51994          * @example
51995          * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
51996          *
51997          * var coords = turf.getCoords(poly);
51998          * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
51999          */
52000         function getCoords(coords) {
52001             if (Array.isArray(coords)) {
52002                 return coords;
52003             }
52004             // Feature
52005             if (coords.type === "Feature") {
52006                 if (coords.geometry !== null) {
52007                     return coords.geometry.coordinates;
52008                 }
52009             }
52010             else {
52011                 // Geometry
52012                 if (coords.coordinates) {
52013                     return coords.coordinates;
52014                 }
52015             }
52016             throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
52017         }
52018         exports.getCoords = getCoords;
52019         /**
52020          * Checks if coordinates contains a number
52021          *
52022          * @name containsNumber
52023          * @param {Array<any>} coordinates GeoJSON Coordinates
52024          * @returns {boolean} true if Array contains a number
52025          */
52026         function containsNumber(coordinates) {
52027             if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
52028                 return true;
52029             }
52030             if (Array.isArray(coordinates[0]) && coordinates[0].length) {
52031                 return containsNumber(coordinates[0]);
52032             }
52033             throw new Error("coordinates must only contain numbers");
52034         }
52035         exports.containsNumber = containsNumber;
52036         /**
52037          * Enforce expectations about types of GeoJSON objects for Turf.
52038          *
52039          * @name geojsonType
52040          * @param {GeoJSON} value any GeoJSON object
52041          * @param {string} type expected GeoJSON type
52042          * @param {string} name name of calling function
52043          * @throws {Error} if value is not the expected type.
52044          */
52045         function geojsonType(value, type, name) {
52046             if (!type || !name) {
52047                 throw new Error("type and name required");
52048             }
52049             if (!value || value.type !== type) {
52050                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
52051             }
52052         }
52053         exports.geojsonType = geojsonType;
52054         /**
52055          * Enforce expectations about types of {@link Feature} inputs for Turf.
52056          * Internally this uses {@link geojsonType} to judge geometry types.
52057          *
52058          * @name featureOf
52059          * @param {Feature} feature a feature with an expected geometry type
52060          * @param {string} type expected GeoJSON type
52061          * @param {string} name name of calling function
52062          * @throws {Error} error if value is not the expected type.
52063          */
52064         function featureOf(feature, type, name) {
52065             if (!feature) {
52066                 throw new Error("No feature passed");
52067             }
52068             if (!name) {
52069                 throw new Error(".featureOf() requires a name");
52070             }
52071             if (!feature || feature.type !== "Feature" || !feature.geometry) {
52072                 throw new Error("Invalid input to " + name + ", Feature with geometry required");
52073             }
52074             if (!feature.geometry || feature.geometry.type !== type) {
52075                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
52076             }
52077         }
52078         exports.featureOf = featureOf;
52079         /**
52080          * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
52081          * Internally this uses {@link geojsonType} to judge geometry types.
52082          *
52083          * @name collectionOf
52084          * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
52085          * @param {string} type expected GeoJSON type
52086          * @param {string} name name of calling function
52087          * @throws {Error} if value is not the expected type.
52088          */
52089         function collectionOf(featureCollection, type, name) {
52090             if (!featureCollection) {
52091                 throw new Error("No featureCollection passed");
52092             }
52093             if (!name) {
52094                 throw new Error(".collectionOf() requires a name");
52095             }
52096             if (!featureCollection || featureCollection.type !== "FeatureCollection") {
52097                 throw new Error("Invalid input to " + name + ", FeatureCollection required");
52098             }
52099             for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
52100                 var feature = _a[_i];
52101                 if (!feature || feature.type !== "Feature" || !feature.geometry) {
52102                     throw new Error("Invalid input to " + name + ", Feature with geometry required");
52103                 }
52104                 if (!feature.geometry || feature.geometry.type !== type) {
52105                     throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
52106                 }
52107             }
52108         }
52109         exports.collectionOf = collectionOf;
52110         /**
52111          * Get Geometry from Feature or Geometry Object
52112          *
52113          * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
52114          * @returns {Geometry|null} GeoJSON Geometry Object
52115          * @throws {Error} if geojson is not a Feature or Geometry Object
52116          * @example
52117          * var point = {
52118          *   "type": "Feature",
52119          *   "properties": {},
52120          *   "geometry": {
52121          *     "type": "Point",
52122          *     "coordinates": [110, 40]
52123          *   }
52124          * }
52125          * var geom = turf.getGeom(point)
52126          * //={"type": "Point", "coordinates": [110, 40]}
52127          */
52128         function getGeom(geojson) {
52129             if (geojson.type === "Feature") {
52130                 return geojson.geometry;
52131             }
52132             return geojson;
52133         }
52134         exports.getGeom = getGeom;
52135         /**
52136          * Get GeoJSON object's type, Geometry type is prioritize.
52137          *
52138          * @param {GeoJSON} geojson GeoJSON object
52139          * @param {string} [name="geojson"] name of the variable to display in error message
52140          * @returns {string} GeoJSON type
52141          * @example
52142          * var point = {
52143          *   "type": "Feature",
52144          *   "properties": {},
52145          *   "geometry": {
52146          *     "type": "Point",
52147          *     "coordinates": [110, 40]
52148          *   }
52149          * }
52150          * var geom = turf.getType(point)
52151          * //="Point"
52152          */
52153         function getType(geojson, name) {
52154             if (geojson.type === "FeatureCollection") {
52155                 return "FeatureCollection";
52156             }
52157             if (geojson.type === "GeometryCollection") {
52158                 return "GeometryCollection";
52159             }
52160             if (geojson.type === "Feature" && geojson.geometry !== null) {
52161                 return geojson.geometry.type;
52162             }
52163             return geojson.type;
52164         }
52165         exports.getType = getType;
52166         });
52167
52168         unwrapExports(invariant);
52169         var invariant_1 = invariant.getCoord;
52170         var invariant_2 = invariant.getCoords;
52171         var invariant_3 = invariant.containsNumber;
52172         var invariant_4 = invariant.geojsonType;
52173         var invariant_5 = invariant.featureOf;
52174         var invariant_6 = invariant.collectionOf;
52175         var invariant_7 = invariant.getGeom;
52176         var invariant_8 = invariant.getType;
52177
52178         var lineclip_1$1 = lineclip$1;
52179         var default_1$1 = lineclip$1;
52180
52181         lineclip$1.polyline = lineclip$1;
52182         lineclip$1.polygon = polygonclip$1;
52183
52184
52185         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
52186         // handle polylines rather than just segments
52187
52188         function lineclip$1(points, bbox, result) {
52189
52190             var len = points.length,
52191                 codeA = bitCode$1(points[0], bbox),
52192                 part = [],
52193                 i, a, b, codeB, lastCode;
52194
52195             if (!result) result = [];
52196
52197             for (i = 1; i < len; i++) {
52198                 a = points[i - 1];
52199                 b = points[i];
52200                 codeB = lastCode = bitCode$1(b, bbox);
52201
52202                 while (true) {
52203
52204                     if (!(codeA | codeB)) { // accept
52205                         part.push(a);
52206
52207                         if (codeB !== lastCode) { // segment went outside
52208                             part.push(b);
52209
52210                             if (i < len - 1) { // start a new line
52211                                 result.push(part);
52212                                 part = [];
52213                             }
52214                         } else if (i === len - 1) {
52215                             part.push(b);
52216                         }
52217                         break;
52218
52219                     } else if (codeA & codeB) { // trivial reject
52220                         break;
52221
52222                     } else if (codeA) { // a outside, intersect with clip edge
52223                         a = intersect$2(a, b, codeA, bbox);
52224                         codeA = bitCode$1(a, bbox);
52225
52226                     } else { // b outside
52227                         b = intersect$2(a, b, codeB, bbox);
52228                         codeB = bitCode$1(b, bbox);
52229                     }
52230                 }
52231
52232                 codeA = lastCode;
52233             }
52234
52235             if (part.length) result.push(part);
52236
52237             return result;
52238         }
52239
52240         // Sutherland-Hodgeman polygon clipping algorithm
52241
52242         function polygonclip$1(points, bbox) {
52243
52244             var result, edge, prev, prevInside, i, p, inside;
52245
52246             // clip against each side of the clip rectangle
52247             for (edge = 1; edge <= 8; edge *= 2) {
52248                 result = [];
52249                 prev = points[points.length - 1];
52250                 prevInside = !(bitCode$1(prev, bbox) & edge);
52251
52252                 for (i = 0; i < points.length; i++) {
52253                     p = points[i];
52254                     inside = !(bitCode$1(p, bbox) & edge);
52255
52256                     // if segment goes through the clip window, add an intersection
52257                     if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
52258
52259                     if (inside) result.push(p); // add a point if it's inside
52260
52261                     prev = p;
52262                     prevInside = inside;
52263                 }
52264
52265                 points = result;
52266
52267                 if (!points.length) break;
52268             }
52269
52270             return result;
52271         }
52272
52273         // intersect a segment against one of the 4 lines that make up the bbox
52274
52275         function intersect$2(a, b, edge, bbox) {
52276             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
52277                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
52278                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
52279                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
52280                    null;
52281         }
52282
52283         // bit code reflects the point position relative to the bbox:
52284
52285         //         left  mid  right
52286         //    top  1001  1000  1010
52287         //    mid  0001  0000  0010
52288         // bottom  0101  0100  0110
52289
52290         function bitCode$1(p, bbox) {
52291             var code = 0;
52292
52293             if (p[0] < bbox[0]) code |= 1; // left
52294             else if (p[0] > bbox[2]) code |= 2; // right
52295
52296             if (p[1] < bbox[1]) code |= 4; // bottom
52297             else if (p[1] > bbox[3]) code |= 8; // top
52298
52299             return code;
52300         }
52301         lineclip_1$1.default = default_1$1;
52302
52303         var bboxClip_1 = createCommonjsModule(function (module, exports) {
52304         var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
52305             if (mod && mod.__esModule) return mod;
52306             var result = {};
52307             if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
52308             result["default"] = mod;
52309             return result;
52310         };
52311         Object.defineProperty(exports, "__esModule", { value: true });
52312
52313
52314         var lineclip = __importStar(lineclip_1$1);
52315         /**
52316          * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
52317          * [lineclip](https://github.com/mapbox/lineclip).
52318          * May result in degenerate edges when clipping Polygons.
52319          *
52320          * @name bboxClip
52321          * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
52322          * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
52323          * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
52324          * @example
52325          * var bbox = [0, 0, 10, 10];
52326          * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
52327          *
52328          * var clipped = turf.bboxClip(poly, bbox);
52329          *
52330          * //addToMap
52331          * var addToMap = [bbox, poly, clipped]
52332          */
52333         function bboxClip(feature, bbox) {
52334             var geom = invariant.getGeom(feature);
52335             var type = geom.type;
52336             var properties = feature.type === "Feature" ? feature.properties : {};
52337             var coords = geom.coordinates;
52338             switch (type) {
52339                 case "LineString":
52340                 case "MultiLineString":
52341                     var lines_1 = [];
52342                     if (type === "LineString") {
52343                         coords = [coords];
52344                     }
52345                     coords.forEach(function (line) {
52346                         lineclip.polyline(line, bbox, lines_1);
52347                     });
52348                     if (lines_1.length === 1) {
52349                         return helpers.lineString(lines_1[0], properties);
52350                     }
52351                     return helpers.multiLineString(lines_1, properties);
52352                 case "Polygon":
52353                     return helpers.polygon(clipPolygon(coords, bbox), properties);
52354                 case "MultiPolygon":
52355                     return helpers.multiPolygon(coords.map(function (poly) {
52356                         return clipPolygon(poly, bbox);
52357                     }), properties);
52358                 default:
52359                     throw new Error("geometry " + type + " not supported");
52360             }
52361         }
52362         exports.default = bboxClip;
52363         function clipPolygon(rings, bbox) {
52364             var outRings = [];
52365             for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
52366                 var ring = rings_1[_i];
52367                 var clipped = lineclip.polygon(ring, bbox);
52368                 if (clipped.length > 0) {
52369                     if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
52370                         clipped.push(clipped[0]);
52371                     }
52372                     if (clipped.length >= 4) {
52373                         outRings.push(clipped);
52374                     }
52375                 }
52376             }
52377             return outRings;
52378         }
52379         });
52380
52381         var turf_bboxClip = unwrapExports(bboxClip_1);
52382
52383         var fastJsonStableStringify = function (data, opts) {
52384             if (!opts) opts = {};
52385             if (typeof opts === 'function') opts = { cmp: opts };
52386             var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
52387
52388             var cmp = opts.cmp && (function (f) {
52389                 return function (node) {
52390                     return function (a, b) {
52391                         var aobj = { key: a, value: node[a] };
52392                         var bobj = { key: b, value: node[b] };
52393                         return f(aobj, bobj);
52394                     };
52395                 };
52396             })(opts.cmp);
52397
52398             var seen = [];
52399             return (function stringify (node) {
52400                 if (node && node.toJSON && typeof node.toJSON === 'function') {
52401                     node = node.toJSON();
52402                 }
52403
52404                 if (node === undefined) return;
52405                 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
52406                 if (typeof node !== 'object') return JSON.stringify(node);
52407
52408                 var i, out;
52409                 if (Array.isArray(node)) {
52410                     out = '[';
52411                     for (i = 0; i < node.length; i++) {
52412                         if (i) out += ',';
52413                         out += stringify(node[i]) || 'null';
52414                     }
52415                     return out + ']';
52416                 }
52417
52418                 if (node === null) return 'null';
52419
52420                 if (seen.indexOf(node) !== -1) {
52421                     if (cycles) return JSON.stringify('__cycle__');
52422                     throw new TypeError('Converting circular structure to JSON');
52423                 }
52424
52425                 var seenIndex = seen.push(node) - 1;
52426                 var keys = Object.keys(node).sort(cmp && cmp(node));
52427                 out = '';
52428                 for (i = 0; i < keys.length; i++) {
52429                     var key = keys[i];
52430                     var value = stringify(node[key]);
52431
52432                     if (!value) continue;
52433                     if (out) out += ',';
52434                     out += JSON.stringify(key) + ':' + value;
52435                 }
52436                 seen.splice(seenIndex, 1);
52437                 return '{' + out + '}';
52438             })(data);
52439         };
52440
52441         var martinez_umd = createCommonjsModule(function (module, exports) {
52442         /**
52443          * martinez v0.5.0
52444          * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
52445          *
52446          * @author Alex Milevski <info@w8r.name>
52447          * @license MIT
52448          * @preserve
52449          */
52450
52451         (function (global, factory) {
52452            factory(exports) ;
52453         }(commonjsGlobal, (function (exports) {
52454           function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
52455
52456           var SplayTree = function SplayTree(compare, noDuplicates) {
52457             if ( compare === void 0 ) compare = DEFAULT_COMPARE;
52458             if ( noDuplicates === void 0 ) noDuplicates = false;
52459
52460             this._compare = compare;
52461             this._root = null;
52462             this._size = 0;
52463             this._noDuplicates = !!noDuplicates;
52464           };
52465
52466           var prototypeAccessors = { size: { configurable: true } };
52467
52468
52469           SplayTree.prototype.rotateLeft = function rotateLeft (x) {
52470             var y = x.right;
52471             if (y) {
52472               x.right = y.left;
52473               if (y.left) { y.left.parent = x; }
52474               y.parent = x.parent;
52475             }
52476
52477             if (!x.parent)              { this._root = y; }
52478             else if (x === x.parent.left) { x.parent.left = y; }
52479             else                        { x.parent.right = y; }
52480             if (y) { y.left = x; }
52481             x.parent = y;
52482           };
52483
52484
52485           SplayTree.prototype.rotateRight = function rotateRight (x) {
52486             var y = x.left;
52487             if (y) {
52488               x.left = y.right;
52489               if (y.right) { y.right.parent = x; }
52490               y.parent = x.parent;
52491             }
52492
52493             if (!x.parent)             { this._root = y; }
52494             else if(x === x.parent.left) { x.parent.left = y; }
52495             else                       { x.parent.right = y; }
52496             if (y) { y.right = x; }
52497             x.parent = y;
52498           };
52499
52500
52501           SplayTree.prototype._splay = function _splay (x) {
52502               var this$1 = this;
52503
52504             while (x.parent) {
52505               var p = x.parent;
52506               if (!p.parent) {
52507                 if (p.left === x) { this$1.rotateRight(p); }
52508                 else            { this$1.rotateLeft(p); }
52509               } else if (p.left === x && p.parent.left === p) {
52510                 this$1.rotateRight(p.parent);
52511                 this$1.rotateRight(p);
52512               } else if (p.right === x && p.parent.right === p) {
52513                 this$1.rotateLeft(p.parent);
52514                 this$1.rotateLeft(p);
52515               } else if (p.left === x && p.parent.right === p) {
52516                 this$1.rotateRight(p);
52517                 this$1.rotateLeft(p);
52518               } else {
52519                 this$1.rotateLeft(p);
52520                 this$1.rotateRight(p);
52521               }
52522             }
52523           };
52524
52525
52526           SplayTree.prototype.splay = function splay (x) {
52527               var this$1 = this;
52528
52529             var p, gp, ggp, l, r;
52530
52531             while (x.parent) {
52532               p = x.parent;
52533               gp = p.parent;
52534
52535               if (gp && gp.parent) {
52536                 ggp = gp.parent;
52537                 if (ggp.left === gp) { ggp.left= x; }
52538                 else               { ggp.right = x; }
52539                 x.parent = ggp;
52540               } else {
52541                 x.parent = null;
52542                 this$1._root = x;
52543               }
52544
52545               l = x.left; r = x.right;
52546
52547               if (x === p.left) { // left
52548                 if (gp) {
52549                   if (gp.left === p) {
52550                     /* zig-zig */
52551                     if (p.right) {
52552                       gp.left = p.right;
52553                       gp.left.parent = gp;
52554                     } else { gp.left = null; }
52555
52556                     p.right = gp;
52557                     gp.parent = p;
52558                   } else {
52559                     /* zig-zag */
52560                     if (l) {
52561                       gp.right = l;
52562                       l.parent = gp;
52563                     } else { gp.right = null; }
52564
52565                     x.left  = gp;
52566                     gp.parent = x;
52567                   }
52568                 }
52569                 if (r) {
52570                   p.left = r;
52571                   r.parent = p;
52572                 } else { p.left = null; }
52573
52574                 x.right= p;
52575                 p.parent = x;
52576               } else { // right
52577                 if (gp) {
52578                   if (gp.right === p) {
52579                     /* zig-zig */
52580                     if (p.left) {
52581                       gp.right = p.left;
52582                       gp.right.parent = gp;
52583                     } else { gp.right = null; }
52584
52585                     p.left = gp;
52586                     gp.parent = p;
52587                   } else {
52588                     /* zig-zag */
52589                     if (r) {
52590                       gp.left = r;
52591                       r.parent = gp;
52592                     } else { gp.left = null; }
52593
52594                     x.right = gp;
52595                     gp.parent = x;
52596                   }
52597                 }
52598                 if (l) {
52599                   p.right = l;
52600                   l.parent = p;
52601                 } else { p.right = null; }
52602
52603                 x.left = p;
52604                 p.parent = x;
52605               }
52606             }
52607           };
52608
52609
52610           SplayTree.prototype.replace = function replace (u, v) {
52611             if (!u.parent) { this._root = v; }
52612             else if (u === u.parent.left) { u.parent.left = v; }
52613             else { u.parent.right = v; }
52614             if (v) { v.parent = u.parent; }
52615           };
52616
52617
52618           SplayTree.prototype.minNode = function minNode (u) {
52619               if ( u === void 0 ) u = this._root;
52620
52621             if (u) { while (u.left) { u = u.left; } }
52622             return u;
52623           };
52624
52625
52626           SplayTree.prototype.maxNode = function maxNode (u) {
52627               if ( u === void 0 ) u = this._root;
52628
52629             if (u) { while (u.right) { u = u.right; } }
52630             return u;
52631           };
52632
52633
52634           SplayTree.prototype.insert = function insert (key, data) {
52635             var z = this._root;
52636             var p = null;
52637             var comp = this._compare;
52638             var cmp;
52639
52640             if (this._noDuplicates) {
52641               while (z) {
52642                 p = z;
52643                 cmp = comp(z.key, key);
52644                 if (cmp === 0) { return; }
52645                 else if (comp(z.key, key) < 0) { z = z.right; }
52646                 else { z = z.left; }
52647               }
52648             } else {
52649               while (z) {
52650                 p = z;
52651                 if (comp(z.key, key) < 0) { z = z.right; }
52652                 else { z = z.left; }
52653               }
52654             }
52655
52656             z = { key: key, data: data, left: null, right: null, parent: p };
52657
52658             if (!p)                        { this._root = z; }
52659             else if (comp(p.key, z.key) < 0) { p.right = z; }
52660             else                           { p.left= z; }
52661
52662             this.splay(z);
52663             this._size++;
52664             return z;
52665           };
52666
52667
52668           SplayTree.prototype.find = function find (key) {
52669             var z  = this._root;
52670             var comp = this._compare;
52671             while (z) {
52672               var cmp = comp(z.key, key);
52673               if    (cmp < 0) { z = z.right; }
52674               else if (cmp > 0) { z = z.left; }
52675               else            { return z; }
52676             }
52677             return null;
52678           };
52679
52680           /**
52681            * Whether the tree contains a node with the given key
52682            * @param{Key} key
52683            * @return {boolean} true/false
52684            */
52685           SplayTree.prototype.contains = function contains (key) {
52686             var node     = this._root;
52687             var comparator = this._compare;
52688             while (node){
52689               var cmp = comparator(key, node.key);
52690               if    (cmp === 0) { return true; }
52691               else if (cmp < 0) { node = node.left; }
52692               else              { node = node.right; }
52693             }
52694
52695             return false;
52696           };
52697
52698
52699           SplayTree.prototype.remove = function remove (key) {
52700             var z = this.find(key);
52701
52702             if (!z) { return false; }
52703
52704             this.splay(z);
52705
52706             if (!z.left) { this.replace(z, z.right); }
52707             else if (!z.right) { this.replace(z, z.left); }
52708             else {
52709               var y = this.minNode(z.right);
52710               if (y.parent !== z) {
52711                 this.replace(y, y.right);
52712                 y.right = z.right;
52713                 y.right.parent = y;
52714               }
52715               this.replace(z, y);
52716               y.left = z.left;
52717               y.left.parent = y;
52718             }
52719
52720             this._size--;
52721             return true;
52722           };
52723
52724
52725           SplayTree.prototype.removeNode = function removeNode (z) {
52726             if (!z) { return false; }
52727
52728             this.splay(z);
52729
52730             if (!z.left) { this.replace(z, z.right); }
52731             else if (!z.right) { this.replace(z, z.left); }
52732             else {
52733               var y = this.minNode(z.right);
52734               if (y.parent !== z) {
52735                 this.replace(y, y.right);
52736                 y.right = z.right;
52737                 y.right.parent = y;
52738               }
52739               this.replace(z, y);
52740               y.left = z.left;
52741               y.left.parent = y;
52742             }
52743
52744             this._size--;
52745             return true;
52746           };
52747
52748
52749           SplayTree.prototype.erase = function erase (key) {
52750             var z = this.find(key);
52751             if (!z) { return; }
52752
52753             this.splay(z);
52754
52755             var s = z.left;
52756             var t = z.right;
52757
52758             var sMax = null;
52759             if (s) {
52760               s.parent = null;
52761               sMax = this.maxNode(s);
52762               this.splay(sMax);
52763               this._root = sMax;
52764             }
52765             if (t) {
52766               if (s) { sMax.right = t; }
52767               else { this._root = t; }
52768               t.parent = sMax;
52769             }
52770
52771             this._size--;
52772           };
52773
52774           /**
52775            * Removes and returns the node with smallest key
52776            * @return {?Node}
52777            */
52778           SplayTree.prototype.pop = function pop () {
52779             var node = this._root, returnValue = null;
52780             if (node) {
52781               while (node.left) { node = node.left; }
52782               returnValue = { key: node.key, data: node.data };
52783               this.remove(node.key);
52784             }
52785             return returnValue;
52786           };
52787
52788
52789           /* eslint-disable class-methods-use-this */
52790
52791           /**
52792            * Successor node
52793            * @param{Node} node
52794            * @return {?Node}
52795            */
52796           SplayTree.prototype.next = function next (node) {
52797             var successor = node;
52798             if (successor) {
52799               if (successor.right) {
52800                 successor = successor.right;
52801                 while (successor && successor.left) { successor = successor.left; }
52802               } else {
52803                 successor = node.parent;
52804                 while (successor && successor.right === node) {
52805                   node = successor; successor = successor.parent;
52806                 }
52807               }
52808             }
52809             return successor;
52810           };
52811
52812
52813           /**
52814            * Predecessor node
52815            * @param{Node} node
52816            * @return {?Node}
52817            */
52818           SplayTree.prototype.prev = function prev (node) {
52819             var predecessor = node;
52820             if (predecessor) {
52821               if (predecessor.left) {
52822                 predecessor = predecessor.left;
52823                 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
52824               } else {
52825                 predecessor = node.parent;
52826                 while (predecessor && predecessor.left === node) {
52827                   node = predecessor;
52828                   predecessor = predecessor.parent;
52829                 }
52830               }
52831             }
52832             return predecessor;
52833           };
52834           /* eslint-enable class-methods-use-this */
52835
52836
52837           /**
52838            * @param{forEachCallback} callback
52839            * @return {SplayTree}
52840            */
52841           SplayTree.prototype.forEach = function forEach (callback) {
52842             var current = this._root;
52843             var s = [], done = false, i = 0;
52844
52845             while (!done) {
52846               // Reach the left most Node of the current Node
52847               if (current) {
52848                 // Place pointer to a tree node on the stack
52849                 // before traversing the node's left subtree
52850                 s.push(current);
52851                 current = current.left;
52852               } else {
52853                 // BackTrack from the empty subtree and visit the Node
52854                 // at the top of the stack; however, if the stack is
52855                 // empty you are done
52856                 if (s.length > 0) {
52857                   current = s.pop();
52858                   callback(current, i++);
52859
52860                   // We have visited the node and its left
52861                   // subtree. Now, it's right subtree's turn
52862                   current = current.right;
52863                 } else { done = true; }
52864               }
52865             }
52866             return this;
52867           };
52868
52869
52870           /**
52871            * Walk key range from `low` to `high`. Stops if `fn` returns a value.
52872            * @param{Key}    low
52873            * @param{Key}    high
52874            * @param{Function} fn
52875            * @param{*?}     ctx
52876            * @return {SplayTree}
52877            */
52878           SplayTree.prototype.range = function range (low, high, fn, ctx) {
52879               var this$1 = this;
52880
52881             var Q = [];
52882             var compare = this._compare;
52883             var node = this._root, cmp;
52884
52885             while (Q.length !== 0 || node) {
52886               if (node) {
52887                 Q.push(node);
52888                 node = node.left;
52889               } else {
52890                 node = Q.pop();
52891                 cmp = compare(node.key, high);
52892                 if (cmp > 0) {
52893                   break;
52894                 } else if (compare(node.key, low) >= 0) {
52895                   if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
52896                 }
52897                 node = node.right;
52898               }
52899             }
52900             return this;
52901           };
52902
52903           /**
52904            * Returns all keys in order
52905            * @return {Array<Key>}
52906            */
52907           SplayTree.prototype.keys = function keys () {
52908             var current = this._root;
52909             var s = [], r = [], done = false;
52910
52911             while (!done) {
52912               if (current) {
52913                 s.push(current);
52914                 current = current.left;
52915               } else {
52916                 if (s.length > 0) {
52917                   current = s.pop();
52918                   r.push(current.key);
52919                   current = current.right;
52920                 } else { done = true; }
52921               }
52922             }
52923             return r;
52924           };
52925
52926
52927           /**
52928            * Returns `data` fields of all nodes in order.
52929            * @return {Array<Value>}
52930            */
52931           SplayTree.prototype.values = function values () {
52932             var current = this._root;
52933             var s = [], r = [], done = false;
52934
52935             while (!done) {
52936               if (current) {
52937                 s.push(current);
52938                 current = current.left;
52939               } else {
52940                 if (s.length > 0) {
52941                   current = s.pop();
52942                   r.push(current.data);
52943                   current = current.right;
52944                 } else { done = true; }
52945               }
52946             }
52947             return r;
52948           };
52949
52950
52951           /**
52952            * Returns node at given index
52953            * @param{number} index
52954            * @return {?Node}
52955            */
52956           SplayTree.prototype.at = function at (index) {
52957             // removed after a consideration, more misleading than useful
52958             // index = index % this.size;
52959             // if (index < 0) index = this.size - index;
52960
52961             var current = this._root;
52962             var s = [], done = false, i = 0;
52963
52964             while (!done) {
52965               if (current) {
52966                 s.push(current);
52967                 current = current.left;
52968               } else {
52969                 if (s.length > 0) {
52970                   current = s.pop();
52971                   if (i === index) { return current; }
52972                   i++;
52973                   current = current.right;
52974                 } else { done = true; }
52975               }
52976             }
52977             return null;
52978           };
52979
52980           /**
52981            * Bulk-load items. Both array have to be same size
52982            * @param{Array<Key>}  keys
52983            * @param{Array<Value>}[values]
52984            * @param{Boolean}     [presort=false] Pre-sort keys and values, using
52985            *                                       tree's comparator. Sorting is done
52986            *                                       in-place
52987            * @return {AVLTree}
52988            */
52989           SplayTree.prototype.load = function load (keys, values, presort) {
52990               if ( keys === void 0 ) keys = [];
52991               if ( values === void 0 ) values = [];
52992               if ( presort === void 0 ) presort = false;
52993
52994             if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
52995             var size = keys.length;
52996             if (presort) { sort(keys, values, 0, size - 1, this._compare); }
52997             this._root = loadRecursive(null, keys, values, 0, size);
52998             this._size = size;
52999             return this;
53000           };
53001
53002
53003           SplayTree.prototype.min = function min () {
53004             var node = this.minNode(this._root);
53005             if (node) { return node.key; }
53006             else    { return null; }
53007           };
53008
53009
53010           SplayTree.prototype.max = function max () {
53011             var node = this.maxNode(this._root);
53012             if (node) { return node.key; }
53013             else    { return null; }
53014           };
53015
53016           SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
53017           prototypeAccessors.size.get = function () { return this._size; };
53018
53019
53020           /**
53021            * Create a tree and load it with items
53022            * @param{Array<Key>}        keys
53023            * @param{Array<Value>?}      [values]
53024
53025            * @param{Function?}          [comparator]
53026            * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
53027            *                                             tree's comparator. Sorting is done
53028            *                                             in-place
53029            * @param{Boolean?}           [noDuplicates=false] Allow duplicates
53030            * @return {SplayTree}
53031            */
53032           SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
53033             return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
53034           };
53035
53036           Object.defineProperties( SplayTree.prototype, prototypeAccessors );
53037
53038
53039           function loadRecursive (parent, keys, values, start, end) {
53040             var size = end - start;
53041             if (size > 0) {
53042               var middle = start + Math.floor(size / 2);
53043               var key    = keys[middle];
53044               var data   = values[middle];
53045               var node   = { key: key, data: data, parent: parent };
53046               node.left    = loadRecursive(node, keys, values, start, middle);
53047               node.right   = loadRecursive(node, keys, values, middle + 1, end);
53048               return node;
53049             }
53050             return null;
53051           }
53052
53053
53054           function sort(keys, values, left, right, compare) {
53055             if (left >= right) { return; }
53056
53057             var pivot = keys[(left + right) >> 1];
53058             var i = left - 1;
53059             var j = right + 1;
53060
53061             while (true) {
53062               do { i++; } while (compare(keys[i], pivot) < 0);
53063               do { j--; } while (compare(keys[j], pivot) > 0);
53064               if (i >= j) { break; }
53065
53066               var tmp = keys[i];
53067               keys[i] = keys[j];
53068               keys[j] = tmp;
53069
53070               tmp = values[i];
53071               values[i] = values[j];
53072               values[j] = tmp;
53073             }
53074
53075             sort(keys, values,  left,     j, compare);
53076             sort(keys, values, j + 1, right, compare);
53077           }
53078
53079           var NORMAL               = 0;
53080           var NON_CONTRIBUTING     = 1;
53081           var SAME_TRANSITION      = 2;
53082           var DIFFERENT_TRANSITION = 3;
53083
53084           var INTERSECTION = 0;
53085           var UNION        = 1;
53086           var DIFFERENCE   = 2;
53087           var XOR          = 3;
53088
53089           /**
53090            * @param  {SweepEvent} event
53091            * @param  {SweepEvent} prev
53092            * @param  {Operation} operation
53093            */
53094           function computeFields (event, prev, operation) {
53095             // compute inOut and otherInOut fields
53096             if (prev === null) {
53097               event.inOut      = false;
53098               event.otherInOut = true;
53099
53100             // previous line segment in sweepline belongs to the same polygon
53101             } else {
53102               if (event.isSubject === prev.isSubject) {
53103                 event.inOut      = !prev.inOut;
53104                 event.otherInOut = prev.otherInOut;
53105
53106               // previous line segment in sweepline belongs to the clipping polygon
53107               } else {
53108                 event.inOut      = !prev.otherInOut;
53109                 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
53110               }
53111
53112               // compute prevInResult field
53113               if (prev) {
53114                 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
53115                   ? prev.prevInResult : prev;
53116               }
53117             }
53118
53119             // check if the line segment belongs to the Boolean operation
53120             event.inResult = inResult(event, operation);
53121           }
53122
53123
53124           /* eslint-disable indent */
53125           function inResult(event, operation) {
53126             switch (event.type) {
53127               case NORMAL:
53128                 switch (operation) {
53129                   case INTERSECTION:
53130                     return !event.otherInOut;
53131                   case UNION:
53132                     return event.otherInOut;
53133                   case DIFFERENCE:
53134                     // return (event.isSubject && !event.otherInOut) ||
53135                     //         (!event.isSubject && event.otherInOut);
53136                     return (event.isSubject && event.otherInOut) ||
53137                             (!event.isSubject && !event.otherInOut);
53138                   case XOR:
53139                     return true;
53140                 }
53141                 break;
53142               case SAME_TRANSITION:
53143                 return operation === INTERSECTION || operation === UNION;
53144               case DIFFERENT_TRANSITION:
53145                 return operation === DIFFERENCE;
53146               case NON_CONTRIBUTING:
53147                 return false;
53148             }
53149             return false;
53150           }
53151           /* eslint-enable indent */
53152
53153           var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
53154
53155             /**
53156              * Is left endpoint?
53157              * @type {Boolean}
53158              */
53159             this.left = left;
53160
53161             /**
53162              * @type {Array.<Number>}
53163              */
53164             this.point = point;
53165
53166             /**
53167              * Other edge reference
53168              * @type {SweepEvent}
53169              */
53170             this.otherEvent = otherEvent;
53171
53172             /**
53173              * Belongs to source or clipping polygon
53174              * @type {Boolean}
53175              */
53176             this.isSubject = isSubject;
53177
53178             /**
53179              * Edge contribution type
53180              * @type {Number}
53181              */
53182             this.type = edgeType || NORMAL;
53183
53184
53185             /**
53186              * In-out transition for the sweepline crossing polygon
53187              * @type {Boolean}
53188              */
53189             this.inOut = false;
53190
53191
53192             /**
53193              * @type {Boolean}
53194              */
53195             this.otherInOut = false;
53196
53197             /**
53198              * Previous event in result?
53199              * @type {SweepEvent}
53200              */
53201             this.prevInResult = null;
53202
53203             /**
53204              * Does event belong to result?
53205              * @type {Boolean}
53206              */
53207             this.inResult = false;
53208
53209
53210             // connection step
53211
53212             /**
53213              * @type {Boolean}
53214              */
53215             this.resultInOut = false;
53216
53217             this.isExteriorRing = true;
53218           };
53219
53220
53221           /**
53222            * @param{Array.<Number>}p
53223            * @return {Boolean}
53224            */
53225           SweepEvent.prototype.isBelow = function isBelow (p) {
53226             var p0 = this.point, p1 = this.otherEvent.point;
53227             return this.left
53228               ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
53229               // signedArea(this.point, this.otherEvent.point, p) > 0 :
53230               : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
53231               //signedArea(this.otherEvent.point, this.point, p) > 0;
53232           };
53233
53234
53235           /**
53236            * @param{Array.<Number>}p
53237            * @return {Boolean}
53238            */
53239           SweepEvent.prototype.isAbove = function isAbove (p) {
53240             return !this.isBelow(p);
53241           };
53242
53243
53244           /**
53245            * @return {Boolean}
53246            */
53247           SweepEvent.prototype.isVertical = function isVertical () {
53248             return this.point[0] === this.otherEvent.point[0];
53249           };
53250
53251
53252           SweepEvent.prototype.clone = function clone () {
53253             var copy = new SweepEvent(
53254               this.point, this.left, this.otherEvent, this.isSubject, this.type);
53255
53256             copy.inResult     = this.inResult;
53257             copy.prevInResult = this.prevInResult;
53258             copy.isExteriorRing = this.isExteriorRing;
53259             copy.inOut        = this.inOut;
53260             copy.otherInOut   = this.otherInOut;
53261
53262             return copy;
53263           };
53264
53265           function equals(p1, p2) {
53266             if (p1[0] === p2[0]) {
53267               if (p1[1] === p2[1]) {
53268                 return true;
53269               } else {
53270                 return false;
53271               }
53272             }
53273             return false;
53274           }
53275
53276           // const EPSILON = 1e-9;
53277           // const abs = Math.abs;
53278           // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
53279           // Precision problem.
53280           //
53281           // module.exports = function equals(p1, p2) {
53282           //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
53283           // };
53284
53285           /**
53286            * Signed area of the triangle (p0, p1, p2)
53287            * @param  {Array.<Number>} p0
53288            * @param  {Array.<Number>} p1
53289            * @param  {Array.<Number>} p2
53290            * @return {Number}
53291            */
53292           function signedArea(p0, p1, p2) {
53293             return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
53294           }
53295
53296           /**
53297            * @param  {SweepEvent} e1
53298            * @param  {SweepEvent} e2
53299            * @return {Number}
53300            */
53301           function compareEvents(e1, e2) {
53302             var p1 = e1.point;
53303             var p2 = e2.point;
53304
53305             // Different x-coordinate
53306             if (p1[0] > p2[0]) { return 1; }
53307             if (p1[0] < p2[0]) { return -1; }
53308
53309             // Different points, but same x-coordinate
53310             // Event with lower y-coordinate is processed first
53311             if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
53312
53313             return specialCases(e1, e2, p1);
53314           }
53315
53316
53317           /* eslint-disable no-unused-vars */
53318           function specialCases(e1, e2, p1, p2) {
53319             // Same coordinates, but one is a left endpoint and the other is
53320             // a right endpoint. The right endpoint is processed first
53321             if (e1.left !== e2.left)
53322               { return e1.left ? 1 : -1; }
53323
53324             // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
53325             // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
53326             // Same coordinates, both events
53327             // are left endpoints or right endpoints.
53328             // not collinear
53329             if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
53330               // the event associate to the bottom segment is processed first
53331               return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
53332             }
53333
53334             return (!e1.isSubject && e2.isSubject) ? 1 : -1;
53335           }
53336           /* eslint-enable no-unused-vars */
53337
53338           /**
53339            * @param  {SweepEvent} se
53340            * @param  {Array.<Number>} p
53341            * @param  {Queue} queue
53342            * @return {Queue}
53343            */
53344           function divideSegment(se, p, queue)  {
53345             var r = new SweepEvent(p, false, se,            se.isSubject);
53346             var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
53347
53348             /* eslint-disable no-console */
53349             if (equals(se.point, se.otherEvent.point)) {
53350
53351               console.warn('what is that, a collapsed segment?', se);
53352             }
53353             /* eslint-enable no-console */
53354
53355             r.contourId = l.contourId = se.contourId;
53356
53357             // avoid a rounding error. The left event would be processed after the right event
53358             if (compareEvents(l, se.otherEvent) > 0) {
53359               se.otherEvent.left = true;
53360               l.left = false;
53361             }
53362
53363             // avoid a rounding error. The left event would be processed after the right event
53364             // if (compareEvents(se, r) > 0) {}
53365
53366             se.otherEvent.otherEvent = l;
53367             se.otherEvent = r;
53368
53369             queue.push(l);
53370             queue.push(r);
53371
53372             return queue;
53373           }
53374
53375           //const EPS = 1e-9;
53376
53377           /**
53378            * Finds the magnitude of the cross product of two vectors (if we pretend
53379            * they're in three dimensions)
53380            *
53381            * @param {Object} a First vector
53382            * @param {Object} b Second vector
53383            * @private
53384            * @returns {Number} The magnitude of the cross product
53385            */
53386           function crossProduct(a, b) {
53387             return (a[0] * b[1]) - (a[1] * b[0]);
53388           }
53389
53390           /**
53391            * Finds the dot product of two vectors.
53392            *
53393            * @param {Object} a First vector
53394            * @param {Object} b Second vector
53395            * @private
53396            * @returns {Number} The dot product
53397            */
53398           function dotProduct(a, b) {
53399             return (a[0] * b[0]) + (a[1] * b[1]);
53400           }
53401
53402           /**
53403            * Finds the intersection (if any) between two line segments a and b, given the
53404            * line segments' end points a1, a2 and b1, b2.
53405            *
53406            * This algorithm is based on Schneider and Eberly.
53407            * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
53408            * Page 244.
53409            *
53410            * @param {Array.<Number>} a1 point of first line
53411            * @param {Array.<Number>} a2 point of first line
53412            * @param {Array.<Number>} b1 point of second line
53413            * @param {Array.<Number>} b2 point of second line
53414            * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
53415            *                                         (meaning connected segments) as
53416            *                                         intersections
53417            * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
53418            * intersection. If they overlap, the two end points of the overlapping segment.
53419            * Otherwise, null.
53420            */
53421           function intersection (a1, a2, b1, b2, noEndpointTouch) {
53422             // The algorithm expects our lines in the form P + sd, where P is a point,
53423             // s is on the interval [0, 1], and d is a vector.
53424             // We are passed two points. P can be the first point of each pair. The
53425             // vector, then, could be thought of as the distance (in x and y components)
53426             // from the first point to the second point.
53427             // So first, let's make our vectors:
53428             var va = [a2[0] - a1[0], a2[1] - a1[1]];
53429             var vb = [b2[0] - b1[0], b2[1] - b1[1]];
53430             // We also define a function to convert back to regular point form:
53431
53432             /* eslint-disable arrow-body-style */
53433
53434             function toPoint(p, s, d) {
53435               return [
53436                 p[0] + s * d[0],
53437                 p[1] + s * d[1]
53438               ];
53439             }
53440
53441             /* eslint-enable arrow-body-style */
53442
53443             // The rest is pretty much a straight port of the algorithm.
53444             var e = [b1[0] - a1[0], b1[1] - a1[1]];
53445             var kross    = crossProduct(va, vb);
53446             var sqrKross = kross * kross;
53447             var sqrLenA  = dotProduct(va, va);
53448             //const sqrLenB  = dotProduct(vb, vb);
53449
53450             // Check for line intersection. This works because of the properties of the
53451             // cross product -- specifically, two vectors are parallel if and only if the
53452             // cross product is the 0 vector. The full calculation involves relative error
53453             // to account for possible very small line segments. See Schneider & Eberly
53454             // for details.
53455             if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
53456               // If they're not parallel, then (because these are line segments) they
53457               // still might not actually intersect. This code checks that the
53458               // intersection point of the lines is actually on both line segments.
53459               var s = crossProduct(e, vb) / kross;
53460               if (s < 0 || s > 1) {
53461                 // not on line segment a
53462                 return null;
53463               }
53464               var t = crossProduct(e, va) / kross;
53465               if (t < 0 || t > 1) {
53466                 // not on line segment b
53467                 return null;
53468               }
53469               if (s === 0 || s === 1) {
53470                 // on an endpoint of line segment a
53471                 return noEndpointTouch ? null : [toPoint(a1, s, va)];
53472               }
53473               if (t === 0 || t === 1) {
53474                 // on an endpoint of line segment b
53475                 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
53476               }
53477               return [toPoint(a1, s, va)];
53478             }
53479
53480             // If we've reached this point, then the lines are either parallel or the
53481             // same, but the segments could overlap partially or fully, or not at all.
53482             // So we need to find the overlap, if any. To do that, we can use e, which is
53483             // the (vector) difference between the two initial points. If this is parallel
53484             // with the line itself, then the two lines are the same line, and there will
53485             // be overlap.
53486             //const sqrLenE = dotProduct(e, e);
53487             kross = crossProduct(e, va);
53488             sqrKross = kross * kross;
53489
53490             if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
53491             // Lines are just parallel, not the same. No overlap.
53492               return null;
53493             }
53494
53495             var sa = dotProduct(va, e) / sqrLenA;
53496             var sb = sa + dotProduct(va, vb) / sqrLenA;
53497             var smin = Math.min(sa, sb);
53498             var smax = Math.max(sa, sb);
53499
53500             // this is, essentially, the FindIntersection acting on floats from
53501             // Schneider & Eberly, just inlined into this function.
53502             if (smin <= 1 && smax >= 0) {
53503
53504               // overlap on an end point
53505               if (smin === 1) {
53506                 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
53507               }
53508
53509               if (smax === 0) {
53510                 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
53511               }
53512
53513               if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
53514
53515               // There's overlap on a segment -- two points of intersection. Return both.
53516               return [
53517                 toPoint(a1, smin > 0 ? smin : 0, va),
53518                 toPoint(a1, smax < 1 ? smax : 1, va)
53519               ];
53520             }
53521
53522             return null;
53523           }
53524
53525           /**
53526            * @param  {SweepEvent} se1
53527            * @param  {SweepEvent} se2
53528            * @param  {Queue}      queue
53529            * @return {Number}
53530            */
53531           function possibleIntersection (se1, se2, queue) {
53532             // that disallows self-intersecting polygons,
53533             // did cost us half a day, so I'll leave it
53534             // out of respect
53535             // if (se1.isSubject === se2.isSubject) return;
53536             var inter = intersection(
53537               se1.point, se1.otherEvent.point,
53538               se2.point, se2.otherEvent.point
53539             );
53540
53541             var nintersections = inter ? inter.length : 0;
53542             if (nintersections === 0) { return 0; } // no intersection
53543
53544             // the line segments intersect at an endpoint of both line segments
53545             if ((nintersections === 1) &&
53546                 (equals(se1.point, se2.point) ||
53547                  equals(se1.otherEvent.point, se2.otherEvent.point))) {
53548               return 0;
53549             }
53550
53551             if (nintersections === 2 && se1.isSubject === se2.isSubject) {
53552               // if(se1.contourId === se2.contourId){
53553               // console.warn('Edges of the same polygon overlap',
53554               //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
53555               // }
53556               //throw new Error('Edges of the same polygon overlap');
53557               return 0;
53558             }
53559
53560             // The line segments associated to se1 and se2 intersect
53561             if (nintersections === 1) {
53562
53563               // if the intersection point is not an endpoint of se1
53564               if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
53565                 divideSegment(se1, inter[0], queue);
53566               }
53567
53568               // if the intersection point is not an endpoint of se2
53569               if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
53570                 divideSegment(se2, inter[0], queue);
53571               }
53572               return 1;
53573             }
53574
53575             // The line segments associated to se1 and se2 overlap
53576             var events        = [];
53577             var leftCoincide  = false;
53578             var rightCoincide = false;
53579
53580             if (equals(se1.point, se2.point)) {
53581               leftCoincide = true; // linked
53582             } else if (compareEvents(se1, se2) === 1) {
53583               events.push(se2, se1);
53584             } else {
53585               events.push(se1, se2);
53586             }
53587
53588             if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
53589               rightCoincide = true;
53590             } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
53591               events.push(se2.otherEvent, se1.otherEvent);
53592             } else {
53593               events.push(se1.otherEvent, se2.otherEvent);
53594             }
53595
53596             if ((leftCoincide && rightCoincide) || leftCoincide) {
53597               // both line segments are equal or share the left endpoint
53598               se2.type = NON_CONTRIBUTING;
53599               se1.type = (se2.inOut === se1.inOut)
53600                 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
53601
53602               if (leftCoincide && !rightCoincide) {
53603                 // honestly no idea, but changing events selection from [2, 1]
53604                 // to [0, 1] fixes the overlapping self-intersecting polygons issue
53605                 divideSegment(events[1].otherEvent, events[0].point, queue);
53606               }
53607               return 2;
53608             }
53609
53610             // the line segments share the right endpoint
53611             if (rightCoincide) {
53612               divideSegment(events[0], events[1].point, queue);
53613               return 3;
53614             }
53615
53616             // no line segment includes totally the other one
53617             if (events[0] !== events[3].otherEvent) {
53618               divideSegment(events[0], events[1].point, queue);
53619               divideSegment(events[1], events[2].point, queue);
53620               return 3;
53621             }
53622
53623             // one line segment includes the other one
53624             divideSegment(events[0], events[1].point, queue);
53625             divideSegment(events[3].otherEvent, events[2].point, queue);
53626
53627             return 3;
53628           }
53629
53630           /**
53631            * @param  {SweepEvent} le1
53632            * @param  {SweepEvent} le2
53633            * @return {Number}
53634            */
53635           function compareSegments(le1, le2) {
53636             if (le1 === le2) { return 0; }
53637
53638             // Segments are not collinear
53639             if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
53640               signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
53641
53642               // If they share their left endpoint use the right endpoint to sort
53643               if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
53644
53645               // Different left endpoint: use the left endpoint to sort
53646               if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
53647
53648               // has the line segment associated to e1 been inserted
53649               // into S after the line segment associated to e2 ?
53650               if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
53651
53652               // The line segment associated to e2 has been inserted
53653               // into S after the line segment associated to e1
53654               return le1.isBelow(le2.point) ? -1 : 1;
53655             }
53656
53657             if (le1.isSubject === le2.isSubject) { // same polygon
53658               var p1 = le1.point, p2 = le2.point;
53659               if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
53660                 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
53661                 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
53662                 else { return le1.contourId > le2.contourId ? 1 : -1; }
53663               }
53664             } else { // Segments are collinear, but belong to separate polygons
53665               return le1.isSubject ? -1 : 1;
53666             }
53667
53668             return compareEvents(le1, le2) === 1 ? 1 : -1;
53669           }
53670
53671           function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
53672             var sweepLine = new SplayTree(compareSegments);
53673             var sortedEvents = [];
53674
53675             var rightbound = Math.min(sbbox[2], cbbox[2]);
53676
53677             var prev, next, begin;
53678
53679             while (eventQueue.length !== 0) {
53680               var event = eventQueue.pop();
53681               sortedEvents.push(event);
53682
53683               // optimization by bboxes for intersection and difference goes here
53684               if ((operation === INTERSECTION && event.point[0] > rightbound) ||
53685                   (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
53686                 break;
53687               }
53688
53689               if (event.left) {
53690                 next  = prev = sweepLine.insert(event);
53691                 begin = sweepLine.minNode();
53692
53693                 if (prev !== begin) { prev = sweepLine.prev(prev); }
53694                 else                { prev = null; }
53695
53696                 next = sweepLine.next(next);
53697
53698                 var prevEvent = prev ? prev.key : null;
53699                 var prevprevEvent = (void 0);
53700                 computeFields(event, prevEvent, operation);
53701                 if (next) {
53702                   if (possibleIntersection(event, next.key, eventQueue) === 2) {
53703                     computeFields(event, prevEvent, operation);
53704                     computeFields(event, next.key, operation);
53705                   }
53706                 }
53707
53708                 if (prev) {
53709                   if (possibleIntersection(prev.key, event, eventQueue) === 2) {
53710                     var prevprev = prev;
53711                     if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
53712                     else                    { prevprev = null; }
53713
53714                     prevprevEvent = prevprev ? prevprev.key : null;
53715                     computeFields(prevEvent, prevprevEvent, operation);
53716                     computeFields(event,     prevEvent,     operation);
53717                   }
53718                 }
53719               } else {
53720                 event = event.otherEvent;
53721                 next = prev = sweepLine.find(event);
53722
53723                 if (prev && next) {
53724
53725                   if (prev !== begin) { prev = sweepLine.prev(prev); }
53726                   else                { prev = null; }
53727
53728                   next = sweepLine.next(next);
53729                   sweepLine.remove(event);
53730
53731                   if (next && prev) {
53732                     possibleIntersection(prev.key, next.key, eventQueue);
53733                   }
53734                 }
53735               }
53736             }
53737             return sortedEvents;
53738           }
53739
53740           /**
53741            * @param  {Array.<SweepEvent>} sortedEvents
53742            * @return {Array.<SweepEvent>}
53743            */
53744           function orderEvents(sortedEvents) {
53745             var event, i, len, tmp;
53746             var resultEvents = [];
53747             for (i = 0, len = sortedEvents.length; i < len; i++) {
53748               event = sortedEvents[i];
53749               if ((event.left && event.inResult) ||
53750                 (!event.left && event.otherEvent.inResult)) {
53751                 resultEvents.push(event);
53752               }
53753             }
53754             // Due to overlapping edges the resultEvents array can be not wholly sorted
53755             var sorted = false;
53756             while (!sorted) {
53757               sorted = true;
53758               for (i = 0, len = resultEvents.length; i < len; i++) {
53759                 if ((i + 1) < len &&
53760                   compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
53761                   tmp = resultEvents[i];
53762                   resultEvents[i] = resultEvents[i + 1];
53763                   resultEvents[i + 1] = tmp;
53764                   sorted = false;
53765                 }
53766               }
53767             }
53768
53769
53770             for (i = 0, len = resultEvents.length; i < len; i++) {
53771               event = resultEvents[i];
53772               event.pos = i;
53773             }
53774
53775             // imagine, the right event is found in the beginning of the queue,
53776             // when his left counterpart is not marked yet
53777             for (i = 0, len = resultEvents.length; i < len; i++) {
53778               event = resultEvents[i];
53779               if (!event.left) {
53780                 tmp = event.pos;
53781                 event.pos = event.otherEvent.pos;
53782                 event.otherEvent.pos = tmp;
53783               }
53784             }
53785
53786             return resultEvents;
53787           }
53788
53789
53790           /**
53791            * @param  {Number} pos
53792            * @param  {Array.<SweepEvent>} resultEvents
53793            * @param  {Object>}    processed
53794            * @return {Number}
53795            */
53796           function nextPos(pos, resultEvents, processed, origIndex) {
53797             var p, p1;
53798             var newPos = pos + 1;
53799             var length = resultEvents.length;
53800
53801             p  = resultEvents[pos].point;
53802
53803             if (newPos < length)
53804               { p1 = resultEvents[newPos].point; }
53805
53806
53807             // while in range and not the current one by value
53808             while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
53809               if (!processed[newPos]) {
53810                 return newPos;
53811               } else   {
53812                 newPos++;
53813               }
53814               p1 = resultEvents[newPos].point;
53815             }
53816
53817             newPos = pos - 1;
53818
53819             while (processed[newPos] && newPos >= origIndex) {
53820               newPos--;
53821             }
53822             return newPos;
53823           }
53824
53825
53826           /**
53827            * @param  {Array.<SweepEvent>} sortedEvents
53828            * @return {Array.<*>} polygons
53829            */
53830           function connectEdges(sortedEvents, operation) {
53831             var i, len;
53832             var resultEvents = orderEvents(sortedEvents);
53833
53834             // "false"-filled array
53835             var processed = {};
53836             var result = [];
53837             var event;
53838
53839             for (i = 0, len = resultEvents.length; i < len; i++) {
53840               if (processed[i]) { continue; }
53841               var contour = [[]];
53842
53843               if (!resultEvents[i].isExteriorRing) {
53844                 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
53845                   result.push(contour);
53846                 } else if (result.length === 0) {
53847                   result.push([[contour]]);
53848                 } else {
53849                   result[result.length - 1].push(contour[0]);
53850                 }
53851               } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
53852                 result[result.length - 1].push(contour[0]);
53853               } else {
53854                 result.push(contour);
53855               }
53856
53857               var ringId = result.length - 1;
53858               var pos = i;
53859
53860               var initial = resultEvents[i].point;
53861               contour[0].push(initial);
53862
53863               while (pos >= i) {
53864                 event = resultEvents[pos];
53865                 processed[pos] = true;
53866
53867                 if (event.left) {
53868                   event.resultInOut = false;
53869                   event.contourId   = ringId;
53870                 } else {
53871                   event.otherEvent.resultInOut = true;
53872                   event.otherEvent.contourId   = ringId;
53873                 }
53874
53875                 pos = event.pos;
53876                 processed[pos] = true;
53877                 contour[0].push(resultEvents[pos].point);
53878                 pos = nextPos(pos, resultEvents, processed, i);
53879               }
53880
53881               pos = pos === -1 ? i : pos;
53882
53883               event = resultEvents[pos];
53884               processed[pos] = processed[event.pos] = true;
53885               event.otherEvent.resultInOut = true;
53886               event.otherEvent.contourId   = ringId;
53887             }
53888
53889             // Handle if the result is a polygon (eg not multipoly)
53890             // Commented it again, let's see what do we mean by that
53891             // if (result.length === 1) result = result[0];
53892             return result;
53893           }
53894
53895           var tinyqueue = TinyQueue;
53896           var default_1 = TinyQueue;
53897
53898           function TinyQueue(data, compare) {
53899               var this$1 = this;
53900
53901               if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
53902
53903               this.data = data || [];
53904               this.length = this.data.length;
53905               this.compare = compare || defaultCompare;
53906
53907               if (this.length > 0) {
53908                   for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
53909               }
53910           }
53911
53912           function defaultCompare(a, b) {
53913               return a < b ? -1 : a > b ? 1 : 0;
53914           }
53915
53916           TinyQueue.prototype = {
53917
53918               push: function (item) {
53919                   this.data.push(item);
53920                   this.length++;
53921                   this._up(this.length - 1);
53922               },
53923
53924               pop: function () {
53925                   if (this.length === 0) { return undefined; }
53926
53927                   var top = this.data[0];
53928                   this.length--;
53929
53930                   if (this.length > 0) {
53931                       this.data[0] = this.data[this.length];
53932                       this._down(0);
53933                   }
53934                   this.data.pop();
53935
53936                   return top;
53937               },
53938
53939               peek: function () {
53940                   return this.data[0];
53941               },
53942
53943               _up: function (pos) {
53944                   var data = this.data;
53945                   var compare = this.compare;
53946                   var item = data[pos];
53947
53948                   while (pos > 0) {
53949                       var parent = (pos - 1) >> 1;
53950                       var current = data[parent];
53951                       if (compare(item, current) >= 0) { break; }
53952                       data[pos] = current;
53953                       pos = parent;
53954                   }
53955
53956                   data[pos] = item;
53957               },
53958
53959               _down: function (pos) {
53960                   var this$1 = this;
53961
53962                   var data = this.data;
53963                   var compare = this.compare;
53964                   var halfLength = this.length >> 1;
53965                   var item = data[pos];
53966
53967                   while (pos < halfLength) {
53968                       var left = (pos << 1) + 1;
53969                       var right = left + 1;
53970                       var best = data[left];
53971
53972                       if (right < this$1.length && compare(data[right], best) < 0) {
53973                           left = right;
53974                           best = data[right];
53975                       }
53976                       if (compare(best, item) >= 0) { break; }
53977
53978                       data[pos] = best;
53979                       pos = left;
53980                   }
53981
53982                   data[pos] = item;
53983               }
53984           };
53985           tinyqueue.default = default_1;
53986
53987           var max = Math.max;
53988           var min = Math.min;
53989
53990           var contourId = 0;
53991
53992
53993           function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
53994             var i, len, s1, s2, e1, e2;
53995             for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
53996               s1 = contourOrHole[i];
53997               s2 = contourOrHole[i + 1];
53998               e1 = new SweepEvent(s1, false, undefined, isSubject);
53999               e2 = new SweepEvent(s2, false, e1,        isSubject);
54000               e1.otherEvent = e2;
54001
54002               if (s1[0] === s2[0] && s1[1] === s2[1]) {
54003                 continue; // skip collapsed edges, or it breaks
54004               }
54005
54006               e1.contourId = e2.contourId = depth;
54007               if (!isExteriorRing) {
54008                 e1.isExteriorRing = false;
54009                 e2.isExteriorRing = false;
54010               }
54011               if (compareEvents(e1, e2) > 0) {
54012                 e2.left = true;
54013               } else {
54014                 e1.left = true;
54015               }
54016
54017               var x = s1[0], y = s1[1];
54018               bbox[0] = min(bbox[0], x);
54019               bbox[1] = min(bbox[1], y);
54020               bbox[2] = max(bbox[2], x);
54021               bbox[3] = max(bbox[3], y);
54022
54023               // Pushing it so the queue is sorted from left to right,
54024               // with object on the left having the highest priority.
54025               Q.push(e1);
54026               Q.push(e2);
54027             }
54028           }
54029
54030
54031           function fillQueue(subject, clipping, sbbox, cbbox, operation) {
54032             var eventQueue = new tinyqueue(null, compareEvents);
54033             var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
54034
54035             for (i = 0, ii = subject.length; i < ii; i++) {
54036               polygonSet = subject[i];
54037               for (j = 0, jj = polygonSet.length; j < jj; j++) {
54038                 isExteriorRing = j === 0;
54039                 if (isExteriorRing) { contourId++; }
54040                 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
54041               }
54042             }
54043
54044             for (i = 0, ii = clipping.length; i < ii; i++) {
54045               polygonSet = clipping[i];
54046               for (j = 0, jj = polygonSet.length; j < jj; j++) {
54047                 isExteriorRing = j === 0;
54048                 if (operation === DIFFERENCE) { isExteriorRing = false; }
54049                 if (isExteriorRing) { contourId++; }
54050                 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
54051               }
54052             }
54053
54054             return eventQueue;
54055           }
54056
54057           var EMPTY = [];
54058
54059
54060           function trivialOperation(subject, clipping, operation) {
54061             var result = null;
54062             if (subject.length * clipping.length === 0) {
54063               if        (operation === INTERSECTION) {
54064                 result = EMPTY;
54065               } else if (operation === DIFFERENCE) {
54066                 result = subject;
54067               } else if (operation === UNION ||
54068                          operation === XOR) {
54069                 result = (subject.length === 0) ? clipping : subject;
54070               }
54071             }
54072             return result;
54073           }
54074
54075
54076           function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
54077             var result = null;
54078             if (sbbox[0] > cbbox[2] ||
54079                 cbbox[0] > sbbox[2] ||
54080                 sbbox[1] > cbbox[3] ||
54081                 cbbox[1] > sbbox[3]) {
54082               if        (operation === INTERSECTION) {
54083                 result = EMPTY;
54084               } else if (operation === DIFFERENCE) {
54085                 result = subject;
54086               } else if (operation === UNION ||
54087                          operation === XOR) {
54088                 result = subject.concat(clipping);
54089               }
54090             }
54091             return result;
54092           }
54093
54094
54095           function boolean(subject, clipping, operation) {
54096             if (typeof subject[0][0][0] === 'number') {
54097               subject = [subject];
54098             }
54099             if (typeof clipping[0][0][0] === 'number') {
54100               clipping = [clipping];
54101             }
54102             var trivial = trivialOperation(subject, clipping, operation);
54103             if (trivial) {
54104               return trivial === EMPTY ? null : trivial;
54105             }
54106             var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
54107             var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
54108
54109             //console.time('fill queue');
54110             var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
54111             //console.timeEnd('fill queue');
54112
54113             trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
54114             if (trivial) {
54115               return trivial === EMPTY ? null : trivial;
54116             }
54117             //console.time('subdivide edges');
54118             var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
54119             //console.timeEnd('subdivide edges');
54120
54121             //console.time('connect vertices');
54122             var result = connectEdges(sortedEvents, operation);
54123             //console.timeEnd('connect vertices');
54124             return result;
54125           }
54126
54127           function union (subject, clipping) {
54128             return boolean(subject, clipping, UNION);
54129           }
54130
54131           function diff (subject, clipping) {
54132             return boolean(subject, clipping, DIFFERENCE);
54133           }
54134
54135           function xor (subject, clipping){
54136             return boolean(subject, clipping, XOR);
54137           }
54138
54139           function intersection$1 (subject, clipping) {
54140             return boolean(subject, clipping, INTERSECTION);
54141           }
54142
54143           /**
54144            * @enum {Number}
54145            */
54146           var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
54147
54148           exports.union = union;
54149           exports.diff = diff;
54150           exports.xor = xor;
54151           exports.intersection = intersection$1;
54152           exports.operations = operations;
54153
54154           Object.defineProperty(exports, '__esModule', { value: true });
54155
54156         })));
54157
54158         });
54159
54160         var martinez = unwrapExports(martinez_umd);
54161
54162         var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
54163           var e, m;
54164           var eLen = (nBytes * 8) - mLen - 1;
54165           var eMax = (1 << eLen) - 1;
54166           var eBias = eMax >> 1;
54167           var nBits = -7;
54168           var i = isLE ? (nBytes - 1) : 0;
54169           var d = isLE ? -1 : 1;
54170           var s = buffer[offset + i];
54171
54172           i += d;
54173
54174           e = s & ((1 << (-nBits)) - 1);
54175           s >>= (-nBits);
54176           nBits += eLen;
54177           for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
54178
54179           m = e & ((1 << (-nBits)) - 1);
54180           e >>= (-nBits);
54181           nBits += mLen;
54182           for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
54183
54184           if (e === 0) {
54185             e = 1 - eBias;
54186           } else if (e === eMax) {
54187             return m ? NaN : ((s ? -1 : 1) * Infinity)
54188           } else {
54189             m = m + Math.pow(2, mLen);
54190             e = e - eBias;
54191           }
54192           return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
54193         };
54194
54195         var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
54196           var e, m, c;
54197           var eLen = (nBytes * 8) - mLen - 1;
54198           var eMax = (1 << eLen) - 1;
54199           var eBias = eMax >> 1;
54200           var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
54201           var i = isLE ? 0 : (nBytes - 1);
54202           var d = isLE ? 1 : -1;
54203           var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
54204
54205           value = Math.abs(value);
54206
54207           if (isNaN(value) || value === Infinity) {
54208             m = isNaN(value) ? 1 : 0;
54209             e = eMax;
54210           } else {
54211             e = Math.floor(Math.log(value) / Math.LN2);
54212             if (value * (c = Math.pow(2, -e)) < 1) {
54213               e--;
54214               c *= 2;
54215             }
54216             if (e + eBias >= 1) {
54217               value += rt / c;
54218             } else {
54219               value += rt * Math.pow(2, 1 - eBias);
54220             }
54221             if (value * c >= 2) {
54222               e++;
54223               c /= 2;
54224             }
54225
54226             if (e + eBias >= eMax) {
54227               m = 0;
54228               e = eMax;
54229             } else if (e + eBias >= 1) {
54230               m = ((value * c) - 1) * Math.pow(2, mLen);
54231               e = e + eBias;
54232             } else {
54233               m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
54234               e = 0;
54235             }
54236           }
54237
54238           for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
54239
54240           e = (e << mLen) | m;
54241           eLen += mLen;
54242           for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
54243
54244           buffer[offset + i - d] |= s * 128;
54245         };
54246
54247         var ieee754 = {
54248                 read: read$6,
54249                 write: write$6
54250         };
54251
54252         var pbf = Pbf;
54253
54254
54255
54256         function Pbf(buf) {
54257             this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
54258             this.pos = 0;
54259             this.type = 0;
54260             this.length = this.buf.length;
54261         }
54262
54263         Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
54264         Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
54265         Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
54266         Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
54267
54268         var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
54269             SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
54270
54271         Pbf.prototype = {
54272
54273             destroy: function() {
54274                 this.buf = null;
54275             },
54276
54277             // === READING =================================================================
54278
54279             readFields: function(readField, result, end) {
54280                 end = end || this.length;
54281
54282                 while (this.pos < end) {
54283                     var val = this.readVarint(),
54284                         tag = val >> 3,
54285                         startPos = this.pos;
54286
54287                     this.type = val & 0x7;
54288                     readField(tag, result, this);
54289
54290                     if (this.pos === startPos) this.skip(val);
54291                 }
54292                 return result;
54293             },
54294
54295             readMessage: function(readField, result) {
54296                 return this.readFields(readField, result, this.readVarint() + this.pos);
54297             },
54298
54299             readFixed32: function() {
54300                 var val = readUInt32(this.buf, this.pos);
54301                 this.pos += 4;
54302                 return val;
54303             },
54304
54305             readSFixed32: function() {
54306                 var val = readInt32(this.buf, this.pos);
54307                 this.pos += 4;
54308                 return val;
54309             },
54310
54311             // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
54312
54313             readFixed64: function() {
54314                 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54315                 this.pos += 8;
54316                 return val;
54317             },
54318
54319             readSFixed64: function() {
54320                 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54321                 this.pos += 8;
54322                 return val;
54323             },
54324
54325             readFloat: function() {
54326                 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
54327                 this.pos += 4;
54328                 return val;
54329             },
54330
54331             readDouble: function() {
54332                 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
54333                 this.pos += 8;
54334                 return val;
54335             },
54336
54337             readVarint: function(isSigned) {
54338                 var buf = this.buf,
54339                     val, b;
54340
54341                 b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
54342                 b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
54343                 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
54344                 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
54345                 b = buf[this.pos];   val |= (b & 0x0f) << 28;
54346
54347                 return readVarintRemainder(val, isSigned, this);
54348             },
54349
54350             readVarint64: function() { // for compatibility with v2.0.1
54351                 return this.readVarint(true);
54352             },
54353
54354             readSVarint: function() {
54355                 var num = this.readVarint();
54356                 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
54357             },
54358
54359             readBoolean: function() {
54360                 return Boolean(this.readVarint());
54361             },
54362
54363             readString: function() {
54364                 var end = this.readVarint() + this.pos,
54365                     str = readUtf8(this.buf, this.pos, end);
54366                 this.pos = end;
54367                 return str;
54368             },
54369
54370             readBytes: function() {
54371                 var end = this.readVarint() + this.pos,
54372                     buffer = this.buf.subarray(this.pos, end);
54373                 this.pos = end;
54374                 return buffer;
54375             },
54376
54377             // verbose for performance reasons; doesn't affect gzipped size
54378
54379             readPackedVarint: function(arr, isSigned) {
54380                 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
54381                 var end = readPackedEnd(this);
54382                 arr = arr || [];
54383                 while (this.pos < end) arr.push(this.readVarint(isSigned));
54384                 return arr;
54385             },
54386             readPackedSVarint: function(arr) {
54387                 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
54388                 var end = readPackedEnd(this);
54389                 arr = arr || [];
54390                 while (this.pos < end) arr.push(this.readSVarint());
54391                 return arr;
54392             },
54393             readPackedBoolean: function(arr) {
54394                 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
54395                 var end = readPackedEnd(this);
54396                 arr = arr || [];
54397                 while (this.pos < end) arr.push(this.readBoolean());
54398                 return arr;
54399             },
54400             readPackedFloat: function(arr) {
54401                 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
54402                 var end = readPackedEnd(this);
54403                 arr = arr || [];
54404                 while (this.pos < end) arr.push(this.readFloat());
54405                 return arr;
54406             },
54407             readPackedDouble: function(arr) {
54408                 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
54409                 var end = readPackedEnd(this);
54410                 arr = arr || [];
54411                 while (this.pos < end) arr.push(this.readDouble());
54412                 return arr;
54413             },
54414             readPackedFixed32: function(arr) {
54415                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
54416                 var end = readPackedEnd(this);
54417                 arr = arr || [];
54418                 while (this.pos < end) arr.push(this.readFixed32());
54419                 return arr;
54420             },
54421             readPackedSFixed32: function(arr) {
54422                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
54423                 var end = readPackedEnd(this);
54424                 arr = arr || [];
54425                 while (this.pos < end) arr.push(this.readSFixed32());
54426                 return arr;
54427             },
54428             readPackedFixed64: function(arr) {
54429                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
54430                 var end = readPackedEnd(this);
54431                 arr = arr || [];
54432                 while (this.pos < end) arr.push(this.readFixed64());
54433                 return arr;
54434             },
54435             readPackedSFixed64: function(arr) {
54436                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
54437                 var end = readPackedEnd(this);
54438                 arr = arr || [];
54439                 while (this.pos < end) arr.push(this.readSFixed64());
54440                 return arr;
54441             },
54442
54443             skip: function(val) {
54444                 var type = val & 0x7;
54445                 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
54446                 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
54447                 else if (type === Pbf.Fixed32) this.pos += 4;
54448                 else if (type === Pbf.Fixed64) this.pos += 8;
54449                 else throw new Error('Unimplemented type: ' + type);
54450             },
54451
54452             // === WRITING =================================================================
54453
54454             writeTag: function(tag, type) {
54455                 this.writeVarint((tag << 3) | type);
54456             },
54457
54458             realloc: function(min) {
54459                 var length = this.length || 16;
54460
54461                 while (length < this.pos + min) length *= 2;
54462
54463                 if (length !== this.length) {
54464                     var buf = new Uint8Array(length);
54465                     buf.set(this.buf);
54466                     this.buf = buf;
54467                     this.length = length;
54468                 }
54469             },
54470
54471             finish: function() {
54472                 this.length = this.pos;
54473                 this.pos = 0;
54474                 return this.buf.subarray(0, this.length);
54475             },
54476
54477             writeFixed32: function(val) {
54478                 this.realloc(4);
54479                 writeInt32(this.buf, val, this.pos);
54480                 this.pos += 4;
54481             },
54482
54483             writeSFixed32: function(val) {
54484                 this.realloc(4);
54485                 writeInt32(this.buf, val, this.pos);
54486                 this.pos += 4;
54487             },
54488
54489             writeFixed64: function(val) {
54490                 this.realloc(8);
54491                 writeInt32(this.buf, val & -1, this.pos);
54492                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54493                 this.pos += 8;
54494             },
54495
54496             writeSFixed64: function(val) {
54497                 this.realloc(8);
54498                 writeInt32(this.buf, val & -1, this.pos);
54499                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54500                 this.pos += 8;
54501             },
54502
54503             writeVarint: function(val) {
54504                 val = +val || 0;
54505
54506                 if (val > 0xfffffff || val < 0) {
54507                     writeBigVarint(val, this);
54508                     return;
54509                 }
54510
54511                 this.realloc(4);
54512
54513                 this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54514                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54515                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54516                 this.buf[this.pos++] =   (val >>> 7) & 0x7f;
54517             },
54518
54519             writeSVarint: function(val) {
54520                 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
54521             },
54522
54523             writeBoolean: function(val) {
54524                 this.writeVarint(Boolean(val));
54525             },
54526
54527             writeString: function(str) {
54528                 str = String(str);
54529                 this.realloc(str.length * 4);
54530
54531                 this.pos++; // reserve 1 byte for short string length
54532
54533                 var startPos = this.pos;
54534                 // write the string directly to the buffer and see how much was written
54535                 this.pos = writeUtf8(this.buf, str, this.pos);
54536                 var len = this.pos - startPos;
54537
54538                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54539
54540                 // finally, write the message length in the reserved place and restore the position
54541                 this.pos = startPos - 1;
54542                 this.writeVarint(len);
54543                 this.pos += len;
54544             },
54545
54546             writeFloat: function(val) {
54547                 this.realloc(4);
54548                 ieee754.write(this.buf, val, this.pos, true, 23, 4);
54549                 this.pos += 4;
54550             },
54551
54552             writeDouble: function(val) {
54553                 this.realloc(8);
54554                 ieee754.write(this.buf, val, this.pos, true, 52, 8);
54555                 this.pos += 8;
54556             },
54557
54558             writeBytes: function(buffer) {
54559                 var len = buffer.length;
54560                 this.writeVarint(len);
54561                 this.realloc(len);
54562                 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
54563             },
54564
54565             writeRawMessage: function(fn, obj) {
54566                 this.pos++; // reserve 1 byte for short message length
54567
54568                 // write the message directly to the buffer and see how much was written
54569                 var startPos = this.pos;
54570                 fn(obj, this);
54571                 var len = this.pos - startPos;
54572
54573                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54574
54575                 // finally, write the message length in the reserved place and restore the position
54576                 this.pos = startPos - 1;
54577                 this.writeVarint(len);
54578                 this.pos += len;
54579             },
54580
54581             writeMessage: function(tag, fn, obj) {
54582                 this.writeTag(tag, Pbf.Bytes);
54583                 this.writeRawMessage(fn, obj);
54584             },
54585
54586             writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
54587             writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
54588             writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
54589             writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
54590             writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
54591             writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
54592             writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
54593             writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
54594             writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
54595
54596             writeBytesField: function(tag, buffer) {
54597                 this.writeTag(tag, Pbf.Bytes);
54598                 this.writeBytes(buffer);
54599             },
54600             writeFixed32Field: function(tag, val) {
54601                 this.writeTag(tag, Pbf.Fixed32);
54602                 this.writeFixed32(val);
54603             },
54604             writeSFixed32Field: function(tag, val) {
54605                 this.writeTag(tag, Pbf.Fixed32);
54606                 this.writeSFixed32(val);
54607             },
54608             writeFixed64Field: function(tag, val) {
54609                 this.writeTag(tag, Pbf.Fixed64);
54610                 this.writeFixed64(val);
54611             },
54612             writeSFixed64Field: function(tag, val) {
54613                 this.writeTag(tag, Pbf.Fixed64);
54614                 this.writeSFixed64(val);
54615             },
54616             writeVarintField: function(tag, val) {
54617                 this.writeTag(tag, Pbf.Varint);
54618                 this.writeVarint(val);
54619             },
54620             writeSVarintField: function(tag, val) {
54621                 this.writeTag(tag, Pbf.Varint);
54622                 this.writeSVarint(val);
54623             },
54624             writeStringField: function(tag, str) {
54625                 this.writeTag(tag, Pbf.Bytes);
54626                 this.writeString(str);
54627             },
54628             writeFloatField: function(tag, val) {
54629                 this.writeTag(tag, Pbf.Fixed32);
54630                 this.writeFloat(val);
54631             },
54632             writeDoubleField: function(tag, val) {
54633                 this.writeTag(tag, Pbf.Fixed64);
54634                 this.writeDouble(val);
54635             },
54636             writeBooleanField: function(tag, val) {
54637                 this.writeVarintField(tag, Boolean(val));
54638             }
54639         };
54640
54641         function readVarintRemainder(l, s, p) {
54642             var buf = p.buf,
54643                 h, b;
54644
54645             b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
54646             b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
54647             b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
54648             b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
54649             b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
54650             b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
54651
54652             throw new Error('Expected varint not more than 10 bytes');
54653         }
54654
54655         function readPackedEnd(pbf) {
54656             return pbf.type === Pbf.Bytes ?
54657                 pbf.readVarint() + pbf.pos : pbf.pos + 1;
54658         }
54659
54660         function toNum(low, high, isSigned) {
54661             if (isSigned) {
54662                 return high * 0x100000000 + (low >>> 0);
54663             }
54664
54665             return ((high >>> 0) * 0x100000000) + (low >>> 0);
54666         }
54667
54668         function writeBigVarint(val, pbf) {
54669             var low, high;
54670
54671             if (val >= 0) {
54672                 low  = (val % 0x100000000) | 0;
54673                 high = (val / 0x100000000) | 0;
54674             } else {
54675                 low  = ~(-val % 0x100000000);
54676                 high = ~(-val / 0x100000000);
54677
54678                 if (low ^ 0xffffffff) {
54679                     low = (low + 1) | 0;
54680                 } else {
54681                     low = 0;
54682                     high = (high + 1) | 0;
54683                 }
54684             }
54685
54686             if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
54687                 throw new Error('Given varint doesn\'t fit into 10 bytes');
54688             }
54689
54690             pbf.realloc(10);
54691
54692             writeBigVarintLow(low, high, pbf);
54693             writeBigVarintHigh(high, pbf);
54694         }
54695
54696         function writeBigVarintLow(low, high, pbf) {
54697             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54698             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54699             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54700             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54701             pbf.buf[pbf.pos]   = low & 0x7f;
54702         }
54703
54704         function writeBigVarintHigh(high, pbf) {
54705             var lsb = (high & 0x07) << 4;
54706
54707             pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
54708             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54709             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54710             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54711             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54712             pbf.buf[pbf.pos++]  = high & 0x7f;
54713         }
54714
54715         function makeRoomForExtraLength(startPos, len, pbf) {
54716             var extraLen =
54717                 len <= 0x3fff ? 1 :
54718                 len <= 0x1fffff ? 2 :
54719                 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
54720
54721             // if 1 byte isn't enough for encoding message length, shift the data to the right
54722             pbf.realloc(extraLen);
54723             for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
54724         }
54725
54726         function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
54727         function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
54728         function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
54729         function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
54730         function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
54731         function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
54732         function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
54733         function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
54734         function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
54735
54736         // Buffer code below from https://github.com/feross/buffer, MIT-licensed
54737
54738         function readUInt32(buf, pos) {
54739             return ((buf[pos]) |
54740                 (buf[pos + 1] << 8) |
54741                 (buf[pos + 2] << 16)) +
54742                 (buf[pos + 3] * 0x1000000);
54743         }
54744
54745         function writeInt32(buf, val, pos) {
54746             buf[pos] = val;
54747             buf[pos + 1] = (val >>> 8);
54748             buf[pos + 2] = (val >>> 16);
54749             buf[pos + 3] = (val >>> 24);
54750         }
54751
54752         function readInt32(buf, pos) {
54753             return ((buf[pos]) |
54754                 (buf[pos + 1] << 8) |
54755                 (buf[pos + 2] << 16)) +
54756                 (buf[pos + 3] << 24);
54757         }
54758
54759         function readUtf8(buf, pos, end) {
54760             var str = '';
54761             var i = pos;
54762
54763             while (i < end) {
54764                 var b0 = buf[i];
54765                 var c = null; // codepoint
54766                 var bytesPerSequence =
54767                     b0 > 0xEF ? 4 :
54768                     b0 > 0xDF ? 3 :
54769                     b0 > 0xBF ? 2 : 1;
54770
54771                 if (i + bytesPerSequence > end) break;
54772
54773                 var b1, b2, b3;
54774
54775                 if (bytesPerSequence === 1) {
54776                     if (b0 < 0x80) {
54777                         c = b0;
54778                     }
54779                 } else if (bytesPerSequence === 2) {
54780                     b1 = buf[i + 1];
54781                     if ((b1 & 0xC0) === 0x80) {
54782                         c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
54783                         if (c <= 0x7F) {
54784                             c = null;
54785                         }
54786                     }
54787                 } else if (bytesPerSequence === 3) {
54788                     b1 = buf[i + 1];
54789                     b2 = buf[i + 2];
54790                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
54791                         c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
54792                         if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
54793                             c = null;
54794                         }
54795                     }
54796                 } else if (bytesPerSequence === 4) {
54797                     b1 = buf[i + 1];
54798                     b2 = buf[i + 2];
54799                     b3 = buf[i + 3];
54800                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
54801                         c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
54802                         if (c <= 0xFFFF || c >= 0x110000) {
54803                             c = null;
54804                         }
54805                     }
54806                 }
54807
54808                 if (c === null) {
54809                     c = 0xFFFD;
54810                     bytesPerSequence = 1;
54811
54812                 } else if (c > 0xFFFF) {
54813                     c -= 0x10000;
54814                     str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
54815                     c = 0xDC00 | c & 0x3FF;
54816                 }
54817
54818                 str += String.fromCharCode(c);
54819                 i += bytesPerSequence;
54820             }
54821
54822             return str;
54823         }
54824
54825         function writeUtf8(buf, str, pos) {
54826             for (var i = 0, c, lead; i < str.length; i++) {
54827                 c = str.charCodeAt(i); // code point
54828
54829                 if (c > 0xD7FF && c < 0xE000) {
54830                     if (lead) {
54831                         if (c < 0xDC00) {
54832                             buf[pos++] = 0xEF;
54833                             buf[pos++] = 0xBF;
54834                             buf[pos++] = 0xBD;
54835                             lead = c;
54836                             continue;
54837                         } else {
54838                             c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
54839                             lead = null;
54840                         }
54841                     } else {
54842                         if (c > 0xDBFF || (i + 1 === str.length)) {
54843                             buf[pos++] = 0xEF;
54844                             buf[pos++] = 0xBF;
54845                             buf[pos++] = 0xBD;
54846                         } else {
54847                             lead = c;
54848                         }
54849                         continue;
54850                     }
54851                 } else if (lead) {
54852                     buf[pos++] = 0xEF;
54853                     buf[pos++] = 0xBF;
54854                     buf[pos++] = 0xBD;
54855                     lead = null;
54856                 }
54857
54858                 if (c < 0x80) {
54859                     buf[pos++] = c;
54860                 } else {
54861                     if (c < 0x800) {
54862                         buf[pos++] = c >> 0x6 | 0xC0;
54863                     } else {
54864                         if (c < 0x10000) {
54865                             buf[pos++] = c >> 0xC | 0xE0;
54866                         } else {
54867                             buf[pos++] = c >> 0x12 | 0xF0;
54868                             buf[pos++] = c >> 0xC & 0x3F | 0x80;
54869                         }
54870                         buf[pos++] = c >> 0x6 & 0x3F | 0x80;
54871                     }
54872                     buf[pos++] = c & 0x3F | 0x80;
54873                 }
54874             }
54875             return pos;
54876         }
54877
54878         var pointGeometry = Point;
54879
54880         /**
54881          * A standalone point geometry with useful accessor, comparison, and
54882          * modification methods.
54883          *
54884          * @class Point
54885          * @param {Number} x the x-coordinate. this could be longitude or screen
54886          * pixels, or any other sort of unit.
54887          * @param {Number} y the y-coordinate. this could be latitude or screen
54888          * pixels, or any other sort of unit.
54889          * @example
54890          * var point = new Point(-77, 38);
54891          */
54892         function Point(x, y) {
54893             this.x = x;
54894             this.y = y;
54895         }
54896
54897         Point.prototype = {
54898
54899             /**
54900              * Clone this point, returning a new point that can be modified
54901              * without affecting the old one.
54902              * @return {Point} the clone
54903              */
54904             clone: function() { return new Point(this.x, this.y); },
54905
54906             /**
54907              * Add this point's x & y coordinates to another point,
54908              * yielding a new point.
54909              * @param {Point} p the other point
54910              * @return {Point} output point
54911              */
54912             add:     function(p) { return this.clone()._add(p); },
54913
54914             /**
54915              * Subtract this point's x & y coordinates to from point,
54916              * yielding a new point.
54917              * @param {Point} p the other point
54918              * @return {Point} output point
54919              */
54920             sub:     function(p) { return this.clone()._sub(p); },
54921
54922             /**
54923              * Multiply this point's x & y coordinates by point,
54924              * yielding a new point.
54925              * @param {Point} p the other point
54926              * @return {Point} output point
54927              */
54928             multByPoint:    function(p) { return this.clone()._multByPoint(p); },
54929
54930             /**
54931              * Divide this point's x & y coordinates by point,
54932              * yielding a new point.
54933              * @param {Point} p the other point
54934              * @return {Point} output point
54935              */
54936             divByPoint:     function(p) { return this.clone()._divByPoint(p); },
54937
54938             /**
54939              * Multiply this point's x & y coordinates by a factor,
54940              * yielding a new point.
54941              * @param {Point} k factor
54942              * @return {Point} output point
54943              */
54944             mult:    function(k) { return this.clone()._mult(k); },
54945
54946             /**
54947              * Divide this point's x & y coordinates by a factor,
54948              * yielding a new point.
54949              * @param {Point} k factor
54950              * @return {Point} output point
54951              */
54952             div:     function(k) { return this.clone()._div(k); },
54953
54954             /**
54955              * Rotate this point around the 0, 0 origin by an angle a,
54956              * given in radians
54957              * @param {Number} a angle to rotate around, in radians
54958              * @return {Point} output point
54959              */
54960             rotate:  function(a) { return this.clone()._rotate(a); },
54961
54962             /**
54963              * Rotate this point around p point by an angle a,
54964              * given in radians
54965              * @param {Number} a angle to rotate around, in radians
54966              * @param {Point} p Point to rotate around
54967              * @return {Point} output point
54968              */
54969             rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
54970
54971             /**
54972              * Multiply this point by a 4x1 transformation matrix
54973              * @param {Array<Number>} m transformation matrix
54974              * @return {Point} output point
54975              */
54976             matMult: function(m) { return this.clone()._matMult(m); },
54977
54978             /**
54979              * Calculate this point but as a unit vector from 0, 0, meaning
54980              * that the distance from the resulting point to the 0, 0
54981              * coordinate will be equal to 1 and the angle from the resulting
54982              * point to the 0, 0 coordinate will be the same as before.
54983              * @return {Point} unit vector point
54984              */
54985             unit:    function() { return this.clone()._unit(); },
54986
54987             /**
54988              * Compute a perpendicular point, where the new y coordinate
54989              * is the old x coordinate and the new x coordinate is the old y
54990              * coordinate multiplied by -1
54991              * @return {Point} perpendicular point
54992              */
54993             perp:    function() { return this.clone()._perp(); },
54994
54995             /**
54996              * Return a version of this point with the x & y coordinates
54997              * rounded to integers.
54998              * @return {Point} rounded point
54999              */
55000             round:   function() { return this.clone()._round(); },
55001
55002             /**
55003              * Return the magitude of this point: this is the Euclidean
55004              * distance from the 0, 0 coordinate to this point's x and y
55005              * coordinates.
55006              * @return {Number} magnitude
55007              */
55008             mag: function() {
55009                 return Math.sqrt(this.x * this.x + this.y * this.y);
55010             },
55011
55012             /**
55013              * Judge whether this point is equal to another point, returning
55014              * true or false.
55015              * @param {Point} other the other point
55016              * @return {boolean} whether the points are equal
55017              */
55018             equals: function(other) {
55019                 return this.x === other.x &&
55020                        this.y === other.y;
55021             },
55022
55023             /**
55024              * Calculate the distance from this point to another point
55025              * @param {Point} p the other point
55026              * @return {Number} distance
55027              */
55028             dist: function(p) {
55029                 return Math.sqrt(this.distSqr(p));
55030             },
55031
55032             /**
55033              * Calculate the distance from this point to another point,
55034              * without the square root step. Useful if you're comparing
55035              * relative distances.
55036              * @param {Point} p the other point
55037              * @return {Number} distance
55038              */
55039             distSqr: function(p) {
55040                 var dx = p.x - this.x,
55041                     dy = p.y - this.y;
55042                 return dx * dx + dy * dy;
55043             },
55044
55045             /**
55046              * Get the angle from the 0, 0 coordinate to this point, in radians
55047              * coordinates.
55048              * @return {Number} angle
55049              */
55050             angle: function() {
55051                 return Math.atan2(this.y, this.x);
55052             },
55053
55054             /**
55055              * Get the angle from this point to another point, in radians
55056              * @param {Point} b the other point
55057              * @return {Number} angle
55058              */
55059             angleTo: function(b) {
55060                 return Math.atan2(this.y - b.y, this.x - b.x);
55061             },
55062
55063             /**
55064              * Get the angle between this point and another point, in radians
55065              * @param {Point} b the other point
55066              * @return {Number} angle
55067              */
55068             angleWith: function(b) {
55069                 return this.angleWithSep(b.x, b.y);
55070             },
55071
55072             /*
55073              * Find the angle of the two vectors, solving the formula for
55074              * the cross product a x b = |a||b|sin(θ) for θ.
55075              * @param {Number} x the x-coordinate
55076              * @param {Number} y the y-coordinate
55077              * @return {Number} the angle in radians
55078              */
55079             angleWithSep: function(x, y) {
55080                 return Math.atan2(
55081                     this.x * y - this.y * x,
55082                     this.x * x + this.y * y);
55083             },
55084
55085             _matMult: function(m) {
55086                 var x = m[0] * this.x + m[1] * this.y,
55087                     y = m[2] * this.x + m[3] * this.y;
55088                 this.x = x;
55089                 this.y = y;
55090                 return this;
55091             },
55092
55093             _add: function(p) {
55094                 this.x += p.x;
55095                 this.y += p.y;
55096                 return this;
55097             },
55098
55099             _sub: function(p) {
55100                 this.x -= p.x;
55101                 this.y -= p.y;
55102                 return this;
55103             },
55104
55105             _mult: function(k) {
55106                 this.x *= k;
55107                 this.y *= k;
55108                 return this;
55109             },
55110
55111             _div: function(k) {
55112                 this.x /= k;
55113                 this.y /= k;
55114                 return this;
55115             },
55116
55117             _multByPoint: function(p) {
55118                 this.x *= p.x;
55119                 this.y *= p.y;
55120                 return this;
55121             },
55122
55123             _divByPoint: function(p) {
55124                 this.x /= p.x;
55125                 this.y /= p.y;
55126                 return this;
55127             },
55128
55129             _unit: function() {
55130                 this._div(this.mag());
55131                 return this;
55132             },
55133
55134             _perp: function() {
55135                 var y = this.y;
55136                 this.y = this.x;
55137                 this.x = -y;
55138                 return this;
55139             },
55140
55141             _rotate: function(angle) {
55142                 var cos = Math.cos(angle),
55143                     sin = Math.sin(angle),
55144                     x = cos * this.x - sin * this.y,
55145                     y = sin * this.x + cos * this.y;
55146                 this.x = x;
55147                 this.y = y;
55148                 return this;
55149             },
55150
55151             _rotateAround: function(angle, p) {
55152                 var cos = Math.cos(angle),
55153                     sin = Math.sin(angle),
55154                     x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
55155                     y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
55156                 this.x = x;
55157                 this.y = y;
55158                 return this;
55159             },
55160
55161             _round: function() {
55162                 this.x = Math.round(this.x);
55163                 this.y = Math.round(this.y);
55164                 return this;
55165             }
55166         };
55167
55168         /**
55169          * Construct a point from an array if necessary, otherwise if the input
55170          * is already a Point, or an unknown type, return it unchanged
55171          * @param {Array<Number>|Point|*} a any kind of input value
55172          * @return {Point} constructed point, or passed-through value.
55173          * @example
55174          * // this
55175          * var point = Point.convert([0, 1]);
55176          * // is equivalent to
55177          * var point = new Point(0, 1);
55178          */
55179         Point.convert = function (a) {
55180             if (a instanceof Point) {
55181                 return a;
55182             }
55183             if (Array.isArray(a)) {
55184                 return new Point(a[0], a[1]);
55185             }
55186             return a;
55187         };
55188
55189         var vectortilefeature = VectorTileFeature;
55190
55191         function VectorTileFeature(pbf, end, extent, keys, values) {
55192             // Public
55193             this.properties = {};
55194             this.extent = extent;
55195             this.type = 0;
55196
55197             // Private
55198             this._pbf = pbf;
55199             this._geometry = -1;
55200             this._keys = keys;
55201             this._values = values;
55202
55203             pbf.readFields(readFeature, this, end);
55204         }
55205
55206         function readFeature(tag, feature, pbf) {
55207             if (tag == 1) feature.id = pbf.readVarint();
55208             else if (tag == 2) readTag(pbf, feature);
55209             else if (tag == 3) feature.type = pbf.readVarint();
55210             else if (tag == 4) feature._geometry = pbf.pos;
55211         }
55212
55213         function readTag(pbf, feature) {
55214             var end = pbf.readVarint() + pbf.pos;
55215
55216             while (pbf.pos < end) {
55217                 var key = feature._keys[pbf.readVarint()],
55218                     value = feature._values[pbf.readVarint()];
55219                 feature.properties[key] = value;
55220             }
55221         }
55222
55223         VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
55224
55225         VectorTileFeature.prototype.loadGeometry = function() {
55226             var pbf = this._pbf;
55227             pbf.pos = this._geometry;
55228
55229             var end = pbf.readVarint() + pbf.pos,
55230                 cmd = 1,
55231                 length = 0,
55232                 x = 0,
55233                 y = 0,
55234                 lines = [],
55235                 line;
55236
55237             while (pbf.pos < end) {
55238                 if (length <= 0) {
55239                     var cmdLen = pbf.readVarint();
55240                     cmd = cmdLen & 0x7;
55241                     length = cmdLen >> 3;
55242                 }
55243
55244                 length--;
55245
55246                 if (cmd === 1 || cmd === 2) {
55247                     x += pbf.readSVarint();
55248                     y += pbf.readSVarint();
55249
55250                     if (cmd === 1) { // moveTo
55251                         if (line) lines.push(line);
55252                         line = [];
55253                     }
55254
55255                     line.push(new pointGeometry(x, y));
55256
55257                 } else if (cmd === 7) {
55258
55259                     // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
55260                     if (line) {
55261                         line.push(line[0].clone()); // closePolygon
55262                     }
55263
55264                 } else {
55265                     throw new Error('unknown command ' + cmd);
55266                 }
55267             }
55268
55269             if (line) lines.push(line);
55270
55271             return lines;
55272         };
55273
55274         VectorTileFeature.prototype.bbox = function() {
55275             var pbf = this._pbf;
55276             pbf.pos = this._geometry;
55277
55278             var end = pbf.readVarint() + pbf.pos,
55279                 cmd = 1,
55280                 length = 0,
55281                 x = 0,
55282                 y = 0,
55283                 x1 = Infinity,
55284                 x2 = -Infinity,
55285                 y1 = Infinity,
55286                 y2 = -Infinity;
55287
55288             while (pbf.pos < end) {
55289                 if (length <= 0) {
55290                     var cmdLen = pbf.readVarint();
55291                     cmd = cmdLen & 0x7;
55292                     length = cmdLen >> 3;
55293                 }
55294
55295                 length--;
55296
55297                 if (cmd === 1 || cmd === 2) {
55298                     x += pbf.readSVarint();
55299                     y += pbf.readSVarint();
55300                     if (x < x1) x1 = x;
55301                     if (x > x2) x2 = x;
55302                     if (y < y1) y1 = y;
55303                     if (y > y2) y2 = y;
55304
55305                 } else if (cmd !== 7) {
55306                     throw new Error('unknown command ' + cmd);
55307                 }
55308             }
55309
55310             return [x1, y1, x2, y2];
55311         };
55312
55313         VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
55314             var size = this.extent * Math.pow(2, z),
55315                 x0 = this.extent * x,
55316                 y0 = this.extent * y,
55317                 coords = this.loadGeometry(),
55318                 type = VectorTileFeature.types[this.type],
55319                 i, j;
55320
55321             function project(line) {
55322                 for (var j = 0; j < line.length; j++) {
55323                     var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
55324                     line[j] = [
55325                         (p.x + x0) * 360 / size - 180,
55326                         360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
55327                     ];
55328                 }
55329             }
55330
55331             switch (this.type) {
55332             case 1:
55333                 var points = [];
55334                 for (i = 0; i < coords.length; i++) {
55335                     points[i] = coords[i][0];
55336                 }
55337                 coords = points;
55338                 project(coords);
55339                 break;
55340
55341             case 2:
55342                 for (i = 0; i < coords.length; i++) {
55343                     project(coords[i]);
55344                 }
55345                 break;
55346
55347             case 3:
55348                 coords = classifyRings(coords);
55349                 for (i = 0; i < coords.length; i++) {
55350                     for (j = 0; j < coords[i].length; j++) {
55351                         project(coords[i][j]);
55352                     }
55353                 }
55354                 break;
55355             }
55356
55357             if (coords.length === 1) {
55358                 coords = coords[0];
55359             } else {
55360                 type = 'Multi' + type;
55361             }
55362
55363             var result = {
55364                 type: "Feature",
55365                 geometry: {
55366                     type: type,
55367                     coordinates: coords
55368                 },
55369                 properties: this.properties
55370             };
55371
55372             if ('id' in this) {
55373                 result.id = this.id;
55374             }
55375
55376             return result;
55377         };
55378
55379         // classifies an array of rings into polygons with outer rings and holes
55380
55381         function classifyRings(rings) {
55382             var len = rings.length;
55383
55384             if (len <= 1) return [rings];
55385
55386             var polygons = [],
55387                 polygon,
55388                 ccw;
55389
55390             for (var i = 0; i < len; i++) {
55391                 var area = signedArea(rings[i]);
55392                 if (area === 0) continue;
55393
55394                 if (ccw === undefined) ccw = area < 0;
55395
55396                 if (ccw === area < 0) {
55397                     if (polygon) polygons.push(polygon);
55398                     polygon = [rings[i]];
55399
55400                 } else {
55401                     polygon.push(rings[i]);
55402                 }
55403             }
55404             if (polygon) polygons.push(polygon);
55405
55406             return polygons;
55407         }
55408
55409         function signedArea(ring) {
55410             var sum = 0;
55411             for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
55412                 p1 = ring[i];
55413                 p2 = ring[j];
55414                 sum += (p2.x - p1.x) * (p1.y + p2.y);
55415             }
55416             return sum;
55417         }
55418
55419         var vectortilelayer = VectorTileLayer;
55420
55421         function VectorTileLayer(pbf, end) {
55422             // Public
55423             this.version = 1;
55424             this.name = null;
55425             this.extent = 4096;
55426             this.length = 0;
55427
55428             // Private
55429             this._pbf = pbf;
55430             this._keys = [];
55431             this._values = [];
55432             this._features = [];
55433
55434             pbf.readFields(readLayer, this, end);
55435
55436             this.length = this._features.length;
55437         }
55438
55439         function readLayer(tag, layer, pbf) {
55440             if (tag === 15) layer.version = pbf.readVarint();
55441             else if (tag === 1) layer.name = pbf.readString();
55442             else if (tag === 5) layer.extent = pbf.readVarint();
55443             else if (tag === 2) layer._features.push(pbf.pos);
55444             else if (tag === 3) layer._keys.push(pbf.readString());
55445             else if (tag === 4) layer._values.push(readValueMessage(pbf));
55446         }
55447
55448         function readValueMessage(pbf) {
55449             var value = null,
55450                 end = pbf.readVarint() + pbf.pos;
55451
55452             while (pbf.pos < end) {
55453                 var tag = pbf.readVarint() >> 3;
55454
55455                 value = tag === 1 ? pbf.readString() :
55456                     tag === 2 ? pbf.readFloat() :
55457                     tag === 3 ? pbf.readDouble() :
55458                     tag === 4 ? pbf.readVarint64() :
55459                     tag === 5 ? pbf.readVarint() :
55460                     tag === 6 ? pbf.readSVarint() :
55461                     tag === 7 ? pbf.readBoolean() : null;
55462             }
55463
55464             return value;
55465         }
55466
55467         // return feature `i` from this layer as a `VectorTileFeature`
55468         VectorTileLayer.prototype.feature = function(i) {
55469             if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
55470
55471             this._pbf.pos = this._features[i];
55472
55473             var end = this._pbf.readVarint() + this._pbf.pos;
55474             return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
55475         };
55476
55477         var vectortile = VectorTile;
55478
55479         function VectorTile(pbf, end) {
55480             this.layers = pbf.readFields(readTile, {}, end);
55481         }
55482
55483         function readTile(tag, layers, pbf) {
55484             if (tag === 3) {
55485                 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
55486                 if (layer.length) layers[layer.name] = layer;
55487             }
55488         }
55489
55490         var VectorTile$1 = vectortile;
55491         var VectorTileFeature$1 = vectortilefeature;
55492         var VectorTileLayer$1 = vectortilelayer;
55493
55494         var vectorTile = {
55495                 VectorTile: VectorTile$1,
55496                 VectorTileFeature: VectorTileFeature$1,
55497                 VectorTileLayer: VectorTileLayer$1
55498         };
55499
55500         var tiler$6 = utilTiler().tileSize(512).margin(1);
55501         var dispatch$7 = dispatch('loadedData');
55502         var _vtCache;
55503
55504
55505         function abortRequest$6(controller) {
55506             controller.abort();
55507         }
55508
55509
55510         function vtToGeoJSON(data, tile, mergeCache) {
55511             var vectorTile$1 = new vectorTile.VectorTile(new pbf(data));
55512             var layers = Object.keys(vectorTile$1.layers);
55513             if (!Array.isArray(layers)) { layers = [layers]; }
55514
55515             var features = [];
55516             layers.forEach(function(layerID) {
55517                 var layer = vectorTile$1.layers[layerID];
55518                 if (layer) {
55519                     for (var i = 0; i < layer.length; i++) {
55520                         var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
55521                         var geometry = feature.geometry;
55522
55523                         // Treat all Polygons as MultiPolygons
55524                         if (geometry.type === 'Polygon') {
55525                             geometry.type = 'MultiPolygon';
55526                             geometry.coordinates = [geometry.coordinates];
55527                         }
55528
55529                         // Clip to tile bounds
55530                         if (geometry.type === 'MultiPolygon') {
55531                             var isClipped = false;
55532                             var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
55533                             if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
55534                                 // feature = featureClip;
55535                                 isClipped = true;
55536                             }
55537                             if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
55538                             if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
55539                         }
55540
55541                         // Generate some unique IDs and add some metadata
55542                         var featurehash = utilHashcode(fastJsonStableStringify(feature));
55543                         var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
55544                         feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
55545                         feature.__featurehash__ = featurehash;
55546                         feature.__propertyhash__ = propertyhash;
55547                         features.push(feature);
55548
55549                         // Clipped Polygons at same zoom with identical properties can get merged
55550                         if (isClipped && geometry.type === 'MultiPolygon') {
55551                             var merged = mergeCache[propertyhash];
55552                             if (merged && merged.length) {
55553                                 var other = merged[0];
55554                                 var coords = martinez.union(
55555                                     feature.geometry.coordinates, other.geometry.coordinates
55556                                 );
55557
55558                                 if (!coords || !coords.length) {
55559                                     continue;  // something failed in martinez union
55560                                 }
55561
55562                                 merged.push(feature);
55563                                 for (var j = 0; j < merged.length; j++) {      // all these features get...
55564                                     merged[j].geometry.coordinates = coords;   // same coords
55565                                     merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
55566                                 }
55567                             } else {
55568                                 mergeCache[propertyhash] = [feature];
55569                             }
55570                         }
55571                     }
55572                 }
55573             });
55574
55575             return features;
55576         }
55577
55578
55579         function loadTile(source, tile) {
55580             if (source.loaded[tile.id] || source.inflight[tile.id]) return;
55581
55582             var url = source.template
55583                 .replace('{x}', tile.xyz[0])
55584                 .replace('{y}', tile.xyz[1])
55585                 // TMS-flipped y coordinate
55586                 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
55587                 .replace(/\{z(oom)?\}/, tile.xyz[2])
55588                 .replace(/\{switch:([^}]+)\}/, function(s, r) {
55589                     var subdomains = r.split(',');
55590                     return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
55591                 });
55592
55593
55594             var controller = new AbortController();
55595             source.inflight[tile.id] = controller;
55596
55597             fetch(url, { signal: controller.signal })
55598                 .then(function(response) {
55599                     if (!response.ok) {
55600                         throw new Error(response.status + ' ' + response.statusText);
55601                     }
55602                     source.loaded[tile.id] = [];
55603                     delete source.inflight[tile.id];
55604                     return response.arrayBuffer();
55605                 })
55606                 .then(function(data) {
55607                     if (!data) {
55608                         throw new Error('No Data');
55609                     }
55610
55611                     var z = tile.xyz[2];
55612                     if (!source.canMerge[z]) {
55613                         source.canMerge[z] = {};  // initialize mergeCache
55614                     }
55615
55616                     source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
55617                     dispatch$7.call('loadedData');
55618                 })
55619                 .catch(function() {
55620                     source.loaded[tile.id] = [];
55621                     delete source.inflight[tile.id];
55622                 });
55623         }
55624
55625
55626         var serviceVectorTile = {
55627
55628             init: function() {
55629                 if (!_vtCache) {
55630                     this.reset();
55631                 }
55632
55633                 this.event = utilRebind(this, dispatch$7, 'on');
55634             },
55635
55636
55637             reset: function() {
55638                 for (var sourceID in _vtCache) {
55639                     var source = _vtCache[sourceID];
55640                     if (source && source.inflight) {
55641                         Object.values(source.inflight).forEach(abortRequest$6);
55642                     }
55643                 }
55644
55645                 _vtCache = {};
55646             },
55647
55648
55649             addSource: function(sourceID, template) {
55650                 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
55651                 return _vtCache[sourceID];
55652             },
55653
55654
55655             data: function(sourceID, projection) {
55656                 var source = _vtCache[sourceID];
55657                 if (!source) return [];
55658
55659                 var tiles = tiler$6.getTiles(projection);
55660                 var seen = {};
55661                 var results = [];
55662
55663                 for (var i = 0; i < tiles.length; i++) {
55664                     var features = source.loaded[tiles[i].id];
55665                     if (!features || !features.length) continue;
55666
55667                     for (var j = 0; j < features.length; j++) {
55668                         var feature = features[j];
55669                         var hash = feature.__featurehash__;
55670                         if (seen[hash]) continue;
55671                         seen[hash] = true;
55672
55673                         // return a shallow copy, because the hash may change
55674                         // later if this feature gets merged with another
55675                         results.push(Object.assign({}, feature));  // shallow copy
55676                     }
55677                 }
55678
55679                 return results;
55680             },
55681
55682
55683             loadTiles: function(sourceID, template, projection) {
55684                 var source = _vtCache[sourceID];
55685                 if (!source) {
55686                     source = this.addSource(sourceID, template);
55687                 }
55688
55689                 var tiles = tiler$6.getTiles(projection);
55690
55691                 // abort inflight requests that are no longer needed
55692                 Object.keys(source.inflight).forEach(function(k) {
55693                     var wanted = tiles.find(function(tile) { return k === tile.id; });
55694                     if (!wanted) {
55695                         abortRequest$6(source.inflight[k]);
55696                         delete source.inflight[k];
55697                     }
55698                 });
55699
55700                 tiles.forEach(function(tile) {
55701                     loadTile(source, tile);
55702                 });
55703             },
55704
55705
55706             cache: function() {
55707                 return _vtCache;
55708             }
55709
55710         };
55711
55712         var apibase$5 = 'https://www.wikidata.org/w/api.php?';
55713         var _wikidataCache = {};
55714
55715
55716         var serviceWikidata = {
55717
55718             init: function() {},
55719
55720             reset: function() {
55721                 _wikidataCache = {};
55722             },
55723
55724
55725             // Search for Wikidata items matching the query
55726             itemsForSearchQuery: function(query, callback) {
55727                 if (!query) {
55728                     if (callback) callback('No query', {});
55729                     return;
55730                 }
55731
55732                 var url = apibase$5 + utilQsString({
55733                     action: 'wbsearchentities',
55734                     format: 'json',
55735                     formatversion: 2,
55736                     search: query,
55737                     type: 'item',
55738                     language: this.languagesToQuery()[0],
55739                     limit: 10,
55740                     origin: '*'
55741                 });
55742
55743                 d3_json(url)
55744                     .then(function(result) {
55745                         if (result && result.error) {
55746                             throw new Error(result.error);
55747                         }
55748                         if (callback) callback(null, result.search || {});
55749                     })
55750                     .catch(function(err) {
55751                         if (callback) callback(err.message, {});
55752                     });
55753             },
55754
55755
55756             // Given a Wikipedia language and article title,
55757             // return an array of corresponding Wikidata entities.
55758             itemsByTitle: function(lang, title, callback) {
55759                 if (!title) {
55760                     if (callback) callback('No title', {});
55761                     return;
55762                 }
55763
55764                 lang = lang || 'en';
55765                 var url = apibase$5 + utilQsString({
55766                     action: 'wbgetentities',
55767                     format: 'json',
55768                     formatversion: 2,
55769                     sites: lang.replace(/-/g, '_') + 'wiki',
55770                     titles: title,
55771                     languages: 'en', // shrink response by filtering to one language
55772                     origin: '*'
55773                 });
55774
55775                 d3_json(url)
55776                     .then(function(result) {
55777                         if (result && result.error) {
55778                             throw new Error(result.error);
55779                         }
55780                         if (callback) callback(null, result.entities || {});
55781                     })
55782                     .catch(function(err) {
55783                         if (callback) callback(err.message, {});
55784                     });
55785             },
55786
55787
55788             languagesToQuery: function() {
55789                 return utilArrayUniq([
55790                     currentLocale.toLowerCase(),
55791                     currentLocale.split('-', 2)[0].toLowerCase(),
55792                     'en'
55793                 ]);
55794             },
55795
55796
55797             entityByQID: function(qid, callback) {
55798                 if (!qid) {
55799                     callback('No qid', {});
55800                     return;
55801                 }
55802                 if (_wikidataCache[qid]) {
55803                     if (callback) callback(null, _wikidataCache[qid]);
55804                     return;
55805                 }
55806
55807                 var langs = this.languagesToQuery();
55808                 var url = apibase$5 + utilQsString({
55809                     action: 'wbgetentities',
55810                     format: 'json',
55811                     formatversion: 2,
55812                     ids: qid,
55813                     props: 'labels|descriptions|claims|sitelinks',
55814                     sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
55815                     languages: langs.join('|'),
55816                     languagefallback: 1,
55817                     origin: '*'
55818                 });
55819
55820                 d3_json(url)
55821                     .then(function(result) {
55822                         if (result && result.error) {
55823                             throw new Error(result.error);
55824                         }
55825                         if (callback) callback(null, result.entities[qid] || {});
55826                     })
55827                     .catch(function(err) {
55828                         if (callback) callback(err.message, {});
55829                     });
55830             },
55831
55832
55833             // Pass `params` object of the form:
55834             // {
55835             //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
55836             // }
55837             //
55838             // Get an result object used to display tag documentation
55839             // {
55840             //   title:        'string',
55841             //   description:  'string',
55842             //   editURL:      'string',
55843             //   imageURL:     'string',
55844             //   wiki:         { title: 'string', text: 'string', url: 'string' }
55845             // }
55846             //
55847             getDocs: function(params, callback) {
55848                 var langs = this.languagesToQuery();
55849                 this.entityByQID(params.qid, function(err, entity) {
55850                     if (err || !entity) {
55851                         callback(err || 'No entity');
55852                         return;
55853                     }
55854
55855                     var i;
55856                     var description;
55857                     if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
55858                         description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
55859                     }
55860
55861                     // prepare result
55862                     var result = {
55863                         title: entity.id,
55864                         description: description,
55865                         editURL: 'https://www.wikidata.org/wiki/' + entity.id
55866                     };
55867
55868                     // add image
55869                     if (entity.claims) {
55870                         var imageroot = 'https://commons.wikimedia.org/w/index.php';
55871                         var props = ['P154','P18'];  // logo image, image
55872                         var prop, image;
55873                         for (i = 0; i < props.length; i++) {
55874                             prop = entity.claims[props[i]];
55875                             if (prop && Object.keys(prop).length > 0) {
55876                                 image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
55877                                 if (image) {
55878                                     result.imageURL = imageroot + '?' + utilQsString({
55879                                         title: 'Special:Redirect/file/' + image,
55880                                         width: 400
55881                                     });
55882                                     break;
55883                                 }
55884                             }
55885                         }
55886                     }
55887
55888                     if (entity.sitelinks) {
55889                         var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
55890
55891                         // must be one of these that we requested..
55892                         for (i = 0; i < langs.length; i++) {   // check each, in order of preference
55893                             var w = langs[i] + 'wiki';
55894                             if (entity.sitelinks[w]) {
55895                                 var title = entity.sitelinks[w].title;
55896                                 var tKey = 'inspector.wiki_reference';
55897                                 if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
55898                                     tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
55899                                 }
55900
55901                                 result.wiki = {
55902                                     title: title,
55903                                     text: tKey,
55904                                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
55905                                 };
55906                                 break;
55907                             }
55908                         }
55909                     }
55910
55911                     callback(null, result);
55912                 });
55913             }
55914
55915         };
55916
55917         var endpoint = 'https://en.wikipedia.org/w/api.php?';
55918
55919         var serviceWikipedia = {
55920
55921             init: function() {},
55922             reset: function() {},
55923
55924
55925             search: function(lang, query, callback) {
55926                 if (!query) {
55927                     if (callback) callback('No Query', []);
55928                     return;
55929                 }
55930
55931                 lang = lang || 'en';
55932                 var url = endpoint.replace('en', lang) +
55933                     utilQsString({
55934                         action: 'query',
55935                         list: 'search',
55936                         srlimit: '10',
55937                         srinfo: 'suggestion',
55938                         format: 'json',
55939                         origin: '*',
55940                         srsearch: query
55941                     });
55942
55943                 d3_json(url)
55944                     .then(function(result) {
55945                         if (result && result.error) {
55946                             throw new Error(result.error);
55947                         } else if (!result || !result.query || !result.query.search) {
55948                             throw new Error('No Results');
55949                         }
55950                         if (callback) {
55951                             var titles = result.query.search.map(function(d) { return d.title; });
55952                             callback(null, titles);
55953                         }
55954                     })
55955                     .catch(function(err) {
55956                         if (callback) callback(err, []);
55957                     });
55958             },
55959
55960
55961             suggestions: function(lang, query, callback) {
55962                 if (!query) {
55963                     if (callback) callback('', []);
55964                     return;
55965                 }
55966
55967                 lang = lang || 'en';
55968                 var url = endpoint.replace('en', lang) +
55969                     utilQsString({
55970                         action: 'opensearch',
55971                         namespace: 0,
55972                         suggest: '',
55973                         format: 'json',
55974                         origin: '*',
55975                         search: query
55976                     });
55977
55978                 d3_json(url)
55979                     .then(function(result) {
55980                         if (result && result.error) {
55981                             throw new Error(result.error);
55982                         } else if (!result || result.length < 2) {
55983                             throw new Error('No Results');
55984                         }
55985                         if (callback) callback(null, result[1] || []);
55986                     })
55987                     .catch(function(err) {
55988                         if (callback) callback(err.message, []);
55989                     });
55990             },
55991
55992
55993             translations: function(lang, title, callback) {
55994                 if (!title) {
55995                     if (callback) callback('No Title');
55996                     return;
55997                 }
55998
55999                 var url = endpoint.replace('en', lang) +
56000                     utilQsString({
56001                         action: 'query',
56002                         prop: 'langlinks',
56003                         format: 'json',
56004                         origin: '*',
56005                         lllimit: 500,
56006                         titles: title
56007                     });
56008
56009                 d3_json(url)
56010                     .then(function(result) {
56011                         if (result && result.error) {
56012                             throw new Error(result.error);
56013                         } else if (!result || !result.query || !result.query.pages) {
56014                             throw new Error('No Results');
56015                         }
56016                         if (callback) {
56017                             var list = result.query.pages[Object.keys(result.query.pages)[0]];
56018                             var translations = {};
56019                             if (list && list.langlinks) {
56020                                 list.langlinks.forEach(function(d) { translations[d.lang] = d['*']; });
56021                             }
56022                             callback(null, translations);
56023                         }
56024                     })
56025                     .catch(function(err) {
56026                         if (callback) callback(err.message);
56027                     });
56028             }
56029
56030         };
56031
56032         var services$1 = {
56033             geocoder: serviceNominatim,
56034             keepRight: serviceKeepRight,
56035             improveOSM: serviceImproveOSM,
56036             mapillary: serviceMapillary,
56037             openstreetcam: serviceOpenstreetcam,
56038             osm: serviceOsm,
56039             osmWikibase: serviceOsmWikibase,
56040             maprules: serviceMapRules,
56041             streetside: serviceStreetside,
56042             taginfo: serviceTaginfo,
56043             vectorTile: serviceVectorTile,
56044             wikidata: serviceWikidata,
56045             wikipedia: serviceWikipedia
56046         };
56047
56048         function svgIcon(name, svgklass, useklass) {
56049             return function drawIcon(selection) {
56050                 selection.selectAll('svg.icon')
56051                     .data([0])
56052                     .enter()
56053                     .append('svg')
56054                     .attr('class', 'icon ' + (svgklass || ''))
56055                     .append('use')
56056                     .attr('xlink:href', name)
56057                     .attr('class', useklass);
56058             };
56059         }
56060
56061         function uiNoteComments() {
56062             var _note;
56063
56064
56065             function noteComments(selection) {
56066                 if (_note.isNew()) return; // don't draw .comments-container
56067
56068                 var comments = selection.selectAll('.comments-container')
56069                     .data([0]);
56070
56071                 comments = comments.enter()
56072                     .append('div')
56073                     .attr('class', 'comments-container')
56074                     .merge(comments);
56075
56076                 var commentEnter = comments.selectAll('.comment')
56077                     .data(_note.comments)
56078                     .enter()
56079                     .append('div')
56080                     .attr('class', 'comment');
56081
56082                 commentEnter
56083                     .append('div')
56084                     .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
56085                     .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
56086
56087                 var mainEnter = commentEnter
56088                     .append('div')
56089                     .attr('class', 'comment-main');
56090
56091                 var metadataEnter = mainEnter
56092                     .append('div')
56093                     .attr('class', 'comment-metadata');
56094
56095                 metadataEnter
56096                     .append('div')
56097                     .attr('class', 'comment-author')
56098                     .each(function(d) {
56099                         var selection = d3_select(this);
56100                         var osm = services$1.osm;
56101                         if (osm && d.user) {
56102                             selection = selection
56103                                 .append('a')
56104                                 .attr('class', 'comment-author-link')
56105                                 .attr('href', osm.userURL(d.user))
56106                                 .attr('tabindex', -1)
56107                                 .attr('target', '_blank');
56108                         }
56109                         selection
56110                             .text(function(d) { return d.user || t('note.anonymous'); });
56111                     });
56112
56113                 metadataEnter
56114                     .append('div')
56115                     .attr('class', 'comment-date')
56116                     .text(function(d) {
56117                         return t('note.status.' + d.action, { when: localeDateString(d.date) });
56118                     });
56119
56120                 mainEnter
56121                     .append('div')
56122                     .attr('class', 'comment-text')
56123                     .html(function(d) { return d.html; });
56124
56125                 comments
56126                     .call(replaceAvatars);
56127             }
56128
56129
56130             function replaceAvatars(selection) {
56131                 var osm = services$1.osm;
56132                 if (!osm) return;
56133
56134                 var uids = {};  // gather uids in the comment thread
56135                 _note.comments.forEach(function(d) {
56136                     if (d.uid) uids[d.uid] = true;
56137                 });
56138
56139                 Object.keys(uids).forEach(function(uid) {
56140                     osm.loadUser(uid, function(err, user) {
56141                         if (!user || !user.image_url) return;
56142
56143                         selection.selectAll('.comment-avatar.user-' + uid)
56144                             .html('')
56145                             .append('img')
56146                             .attr('class', 'icon comment-avatar-icon')
56147                             .attr('src', user.image_url)
56148                             .attr('alt', user.display_name);
56149                     });
56150                 });
56151             }
56152
56153
56154             function localeDateString(s) {
56155                 if (!s) return null;
56156                 var detected = utilDetect();
56157                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
56158                 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
56159                 var d = new Date(s);
56160                 if (isNaN(d.getTime())) return null;
56161                 return d.toLocaleDateString(detected.locale, options);
56162             }
56163
56164
56165             noteComments.note = function(val) {
56166                 if (!arguments.length) return _note;
56167                 _note = val;
56168                 return noteComments;
56169             };
56170
56171
56172             return noteComments;
56173         }
56174
56175         function uiNoteHeader() {
56176             var _note;
56177
56178
56179             function noteHeader(selection) {
56180                 var header = selection.selectAll('.note-header')
56181                     .data(
56182                         (_note ? [_note] : []),
56183                         function(d) { return d.status + d.id; }
56184                     );
56185
56186                 header.exit()
56187                     .remove();
56188
56189                 var headerEnter = header.enter()
56190                     .append('div')
56191                     .attr('class', 'note-header');
56192
56193                 var iconEnter = headerEnter
56194                     .append('div')
56195                     .attr('class', function(d) { return 'note-header-icon ' + d.status; })
56196                     .classed('new', function(d) { return d.id < 0; });
56197
56198                 iconEnter
56199                     .append('div')
56200                     .attr('class', 'preset-icon-28')
56201                     .call(svgIcon('#iD-icon-note', 'note-fill'));
56202
56203                 iconEnter.each(function(d) {
56204                     var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
56205                     iconEnter
56206                         .append('div')
56207                         .attr('class', 'note-icon-annotation')
56208                         .call(svgIcon(statusIcon, 'icon-annotation'));
56209                 });
56210
56211                 headerEnter
56212                     .append('div')
56213                     .attr('class', 'note-header-label')
56214                     .text(function(d) {
56215                         if (_note.isNew()) { return t('note.new'); }
56216                         return t('note.note') + ' ' + d.id + ' ' +
56217                             (d.status === 'closed' ? t('note.closed') : '');
56218                     });
56219             }
56220
56221
56222             noteHeader.note = function(val) {
56223                 if (!arguments.length) return _note;
56224                 _note = val;
56225                 return noteHeader;
56226             };
56227
56228
56229             return noteHeader;
56230         }
56231
56232         function uiNoteReport() {
56233             var _note;
56234
56235             function noteReport(selection) {
56236                 var url;
56237                 if (services$1.osm && (_note instanceof osmNote) && (!_note.isNew())) {
56238                     url = services$1.osm.noteReportURL(_note);
56239                 }
56240
56241                 var link = selection.selectAll('.note-report')
56242                     .data(url ? [url] : []);
56243
56244                 // exit
56245                 link.exit()
56246                     .remove();
56247
56248                 // enter
56249                 var linkEnter = link.enter()
56250                     .append('a')
56251                     .attr('class', 'note-report')
56252                     .attr('target', '_blank')
56253                     .attr('href', function(d) { return d; })
56254                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56255
56256                 linkEnter
56257                     .append('span')
56258                     .text(t('note.report'));
56259             }
56260
56261
56262             noteReport.note = function(val) {
56263                 if (!arguments.length) return _note;
56264                 _note = val;
56265                 return noteReport;
56266             };
56267
56268             return noteReport;
56269         }
56270
56271         var _tooltipID = 0;
56272
56273         function tooltip(klass) {
56274             var _id = _tooltipID++;
56275             var tooltip = function(selection) {
56276                 selection.each(setup);
56277             };
56278             var _animation = utilFunctor(false);
56279             var _title = function() {
56280                 var title = this.getAttribute('data-original-title');
56281                 if (title) {
56282                     return title;
56283                 } else {
56284                     title = this.getAttribute('title');
56285                     this.removeAttribute('title');
56286                     this.setAttribute('data-original-title', title);
56287                 }
56288                 return title;
56289             };
56290             var _html = utilFunctor(false);
56291             var _placement = utilFunctor('top');
56292
56293
56294             tooltip.title = function(val) {
56295                 if (arguments.length) {
56296                     _title = utilFunctor(val);
56297                     return tooltip;
56298                 } else {
56299                     return _title;
56300                 }
56301             };
56302
56303
56304             tooltip.html = function(val) {
56305                 if (arguments.length) {
56306                     _html = utilFunctor(val);
56307                     return tooltip;
56308                 } else {
56309                     return _html;
56310                 }
56311             };
56312
56313
56314             tooltip.placement = function(val) {
56315                 if (arguments.length) {
56316                     _placement = utilFunctor(val);
56317                     return tooltip;
56318                 } else {
56319                     return _placement;
56320                 }
56321             };
56322
56323
56324             tooltip.show = function(selection) {
56325                 selection.each(show);
56326             };
56327
56328
56329             tooltip.hide = function(selection) {
56330                 selection.each(hide);
56331             };
56332
56333
56334             tooltip.toggle = function(selection) {
56335                 selection.each(toggle);
56336             };
56337
56338
56339             tooltip.destroy = function(selection, selector) {
56340                 // by default, just destroy the current tooltip
56341                 selector = selector || '.tooltip-' + _id;
56342
56343                 selection
56344                     .on('mouseenter.tooltip', null)
56345                     .on('mouseleave.tooltip', null)
56346                     .attr('title', function() {
56347                         return this.getAttribute('data-original-title') || this.getAttribute('title');
56348                     })
56349                     .attr('data-original-title', null)
56350                     .selectAll(selector)
56351                     .remove();
56352             };
56353
56354
56355             tooltip.destroyAny = function(selection) {
56356                 selection.call(tooltip.destroy, '.tooltip');
56357             };
56358
56359             var isTouchEvent = false;
56360
56361             function setup() {
56362                 var root = d3_select(this);
56363                 var animate = _animation.apply(this, arguments);
56364                 var tip = root.selectAll('.tooltip-' + _id)
56365                     .data([0]);
56366
56367                 var enter = tip.enter()
56368                     .append('div')
56369                     .attr('class', 'tooltip tooltip-' + _id + ' ' + (klass ? klass : ''));
56370
56371                 enter
56372                     .append('div')
56373                     .attr('class', 'tooltip-arrow');
56374
56375                 enter
56376                     .append('div')
56377                     .attr('class', 'tooltip-inner');
56378
56379                 tip = enter
56380                     .merge(tip);
56381
56382                 if (animate) {
56383                     tip.classed('fade', true);
56384                 }
56385
56386                 var place = _placement.apply(this, arguments);
56387                 tip.classed(place, true);
56388
56389                 root.on('touchstart.tooltip', function() {
56390                     // hack to avoid showing tooltips upon touch input
56391                     isTouchEvent = true;
56392                 });
56393                 root.on('mouseenter.tooltip', show);
56394                 root.on('mouseleave.tooltip', hide);
56395             }
56396
56397
56398             function show() {
56399                 if (isTouchEvent) {
56400                     isTouchEvent = false;
56401                     return;
56402                 }
56403                 var root = d3_select(this);
56404                 var content = _title.apply(this, arguments);
56405                 var tip = root.selectAll('.tooltip-' + _id);
56406
56407                 if (tip.empty()) {   // tooltip was removed somehow, put it back
56408                     root.call(tooltip.destroy);
56409                     root.each(setup);
56410                     tip = root.selectAll('.tooltip-' + _id);
56411                 }
56412
56413                 tip.classed('in', true);
56414                 var markup = _html.apply(this, arguments);
56415
56416                 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
56417                 var place = _placement.apply(this, arguments);
56418                 var outer = getPosition(root.node());
56419                 var inner = getPosition(tip.node());
56420                 var pos;
56421
56422                 switch (place) {
56423                     case 'top':
56424                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
56425                     break;
56426                     case 'right':
56427                     pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
56428                     break;
56429                     case 'left':
56430                     pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
56431                     break;
56432                     case 'bottom':
56433                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y + outer.h };
56434                     break;
56435                 }
56436
56437                 if (pos) {
56438                     tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
56439                 } else {
56440                     tip.style('left', null).style('top', null);
56441                 }
56442
56443                 this.tooltipVisible = true;
56444
56445
56446                 function getPosition(node) {
56447                     var mode = d3_select(node).style('position');
56448                     if (mode === 'absolute' || mode === 'static') {
56449                         return {
56450                             x: node.offsetLeft,
56451                             y: node.offsetTop,
56452                             w: node.offsetWidth,
56453                             h: node.offsetHeight
56454                         };
56455                     } else {
56456                         return {
56457                             x: 0,
56458                             y: 0,
56459                             w: node.offsetWidth,
56460                             h: node.offsetHeight
56461                         };
56462                     }
56463                 }
56464             }
56465
56466
56467             function hide() {
56468                 d3_select(this).selectAll('.tooltip-' + _id).classed('in', false);
56469                 this.tooltipVisible = false;
56470             }
56471
56472
56473             function toggle() {
56474                 if (this.tooltipVisible) {
56475                     hide.apply(this, arguments);
56476                 } else {
56477                     show.apply(this, arguments);
56478                 }
56479             }
56480
56481
56482             return tooltip;
56483         }
56484
56485         function uiQuickLinks() {
56486             var _choices = [];
56487
56488
56489             function quickLinks(selection) {
56490                 var container = selection.selectAll('.quick-links')
56491                     .data([0]);
56492
56493                 container = container.enter()
56494                     .append('div')
56495                     .attr('class', 'quick-links')
56496                     .merge(container);
56497
56498                 var items = container.selectAll('.quick-link')
56499                     .data(_choices, function(d) { return d.id; });
56500
56501                 items.exit()
56502                     .remove();
56503
56504                 items.enter()
56505                     .append('a')
56506                     .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
56507                     .attr('href', '#')
56508                     .text(function(d) { return t(d.label); })
56509                     .each(function(d) {
56510                         if (typeof d.tooltip !== 'function') return;
56511                         d3_select(this)
56512                             .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
56513                     })
56514                     .on('click', function(d) {
56515                         if (typeof d.click !== 'function') return;
56516                         event.preventDefault();
56517                         d.click(d);
56518                     });
56519             }
56520
56521
56522             //  val should be an array of choices like:
56523             //    [{
56524             //       id: 'link-id',
56525             //       label: 'translation.key',
56526             //       tooltip: function(d),
56527             //       click: function(d)
56528             //    }, ..]
56529             quickLinks.choices = function(val) {
56530                 if (!arguments.length) return _choices;
56531                 _choices = val;
56532                 return quickLinks;
56533             };
56534
56535
56536             return quickLinks;
56537         }
56538
56539         function uiTooltipHtml(text, key, heading) {
56540             var s = '';
56541
56542             if (heading) {
56543                 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
56544             }
56545             if (text) {
56546                 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
56547             }
56548             if (key) {
56549                 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
56550                     '<span class="keyhint">' + key + '</span></div>';
56551             }
56552
56553             return s;
56554         }
56555
56556         function uiViewOnOSM(context) {
56557             var _what;   // an osmEntity or osmNote
56558
56559
56560             function viewOnOSM(selection) {
56561                 var url;
56562                 if (_what instanceof osmEntity) {
56563                     url = context.connection().entityURL(_what);
56564                 } else if (_what instanceof osmNote) {
56565                     url = context.connection().noteURL(_what);
56566                 }
56567
56568                 var data = ((!_what || _what.isNew()) ? [] : [_what]);
56569                 var link = selection.selectAll('.view-on-osm')
56570                     .data(data, function(d) { return d.id; });
56571
56572                 // exit
56573                 link.exit()
56574                     .remove();
56575
56576                 // enter
56577                 var linkEnter = link.enter()
56578                     .append('a')
56579                     .attr('class', 'view-on-osm')
56580                     .attr('target', '_blank')
56581                     .attr('href', url)
56582                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56583
56584                 linkEnter
56585                     .append('span')
56586                     .text(t('inspector.view_on_osm'));
56587             }
56588
56589
56590             viewOnOSM.what = function(_) {
56591                 if (!arguments.length) return _what;
56592                 _what = _;
56593                 return viewOnOSM;
56594             };
56595
56596             return viewOnOSM;
56597         }
56598
56599         function uiNoteEditor(context) {
56600             var dispatch$1 = dispatch('change');
56601             var quickLinks = uiQuickLinks();
56602             var noteComments = uiNoteComments();
56603             var noteHeader = uiNoteHeader();
56604
56605             // var formFields = uiFormFields(context);
56606
56607             var _note;
56608             // var _fieldsArr;
56609
56610
56611             function noteEditor(selection) {
56612                 // quick links
56613                 var choices = [{
56614                     id: 'zoom_to',
56615                     label: 'inspector.zoom_to.title',
56616                     tooltip: function() {
56617                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
56618                     },
56619                     click: function zoomTo() {
56620                         context.mode().zoomToSelected();
56621                     }
56622                 }];
56623
56624
56625                 var header = selection.selectAll('.header')
56626                     .data([0]);
56627
56628                 var headerEnter = header.enter()
56629                     .append('div')
56630                     .attr('class', 'header fillL');
56631
56632                 headerEnter
56633                     .append('button')
56634                     .attr('class', 'fr note-editor-close')
56635                     .on('click', function() {
56636                         context.enter(modeBrowse(context));
56637                     })
56638                     .call(svgIcon('#iD-icon-close'));
56639
56640                 headerEnter
56641                     .append('h3')
56642                     .text(t('note.title'));
56643
56644
56645                 var body = selection.selectAll('.body')
56646                     .data([0]);
56647
56648                 body = body.enter()
56649                     .append('div')
56650                     .attr('class', 'body')
56651                     .merge(body);
56652
56653                 var editor = body.selectAll('.note-editor')
56654                     .data([0]);
56655
56656                 editor.enter()
56657                     .append('div')
56658                     .attr('class', 'modal-section note-editor')
56659                     .merge(editor)
56660                     .call(noteHeader.note(_note))
56661                     .call(quickLinks.choices(choices))
56662                     .call(noteComments.note(_note))
56663                     .call(noteSaveSection);
56664
56665
56666                 var footer = selection.selectAll('.footer')
56667                     .data([0]);
56668
56669                 footer.enter()
56670                     .append('div')
56671                     .attr('class', 'footer')
56672                     .merge(footer)
56673                     .call(uiViewOnOSM(context).what(_note))
56674                     .call(uiNoteReport().note(_note));
56675
56676
56677                 // rerender the note editor on any auth change
56678                 var osm = services$1.osm;
56679                 if (osm) {
56680                     osm.on('change.note-save', function() {
56681                         selection.call(noteEditor);
56682                     });
56683                 }
56684             }
56685
56686
56687             function noteSaveSection(selection) {
56688                 var isSelected = (_note && _note.id === context.selectedNoteID());
56689                 var noteSave = selection.selectAll('.note-save')
56690                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56691
56692                 // exit
56693                 noteSave.exit()
56694                     .remove();
56695
56696                 // enter
56697                 var noteSaveEnter = noteSave.enter()
56698                     .append('div')
56699                     .attr('class', 'note-save save-section cf');
56700
56701                 // // if new note, show categories to pick from
56702                 // if (_note.isNew()) {
56703                 //     var presets = context.presets();
56704
56705                 //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
56706                 //     _fieldsArr = [
56707                 //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
56708                 //     ];
56709
56710                 //     _fieldsArr.forEach(function(field) {
56711                 //         field
56712                 //             .on('change', changeCategory);
56713                 //     });
56714
56715                 //     noteSaveEnter
56716                 //         .append('div')
56717                 //         .attr('class', 'note-category')
56718                 //         .call(formFields.fieldsArr(_fieldsArr));
56719                 // }
56720
56721                 // function changeCategory() {
56722                 //     // NOTE: perhaps there is a better way to get value
56723                 //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
56724
56725                 //     // store the unsaved category with the note itself
56726                 //     _note = _note.update({ newCategory: val });
56727                 //     var osm = services.osm;
56728                 //     if (osm) {
56729                 //         osm.replaceNote(_note);  // update note cache
56730                 //     }
56731                 //     noteSave
56732                 //         .call(noteSaveButtons);
56733                 // }
56734
56735                 noteSaveEnter
56736                     .append('h4')
56737                     .attr('class', '.note-save-header')
56738                     .text(function() {
56739                         return _note.isNew() ? t('note.newDescription') : t('note.newComment');
56740                     });
56741
56742                 noteSaveEnter
56743                     .append('textarea')
56744                     .attr('class', 'new-comment-input')
56745                     .attr('placeholder', t('note.inputPlaceholder'))
56746                     .attr('maxlength', 1000)
56747                     .property('value', function(d) { return d.newComment; })
56748                     .call(utilNoAuto)
56749                     .on('keydown.note-input', keydown)
56750                     .on('input.note-input', changeInput)
56751                     .on('blur.note-input', changeInput);
56752
56753                 // update
56754                 noteSave = noteSaveEnter
56755                     .merge(noteSave)
56756                     .call(userDetails)
56757                     .call(noteSaveButtons);
56758
56759
56760                 // fast submit if user presses cmd+enter
56761                 function keydown() {
56762                     if (!(event.keyCode === 13 && event.metaKey)) return;
56763
56764                     var osm = services$1.osm;
56765                     if (!osm) return;
56766
56767                     var hasAuth = osm.authenticated();
56768                     if (!hasAuth) return;
56769
56770                     if (!_note.newComment) return;
56771
56772                     event.preventDefault();
56773
56774                     d3_select(this)
56775                         .on('keydown.note-input', null);
56776
56777                     // focus on button and submit
56778                     window.setTimeout(function() {
56779                         if (_note.isNew()) {
56780                             noteSave.selectAll('.save-button').node().focus();
56781                             clickSave(_note);
56782                         } else  {
56783                             noteSave.selectAll('.comment-button').node().focus();
56784                             clickComment(_note);
56785                         }
56786                     }, 10);
56787                 }
56788
56789
56790                 function changeInput() {
56791                     var input = d3_select(this);
56792                     var val = input.property('value').trim() || undefined;
56793
56794                     // store the unsaved comment with the note itself
56795                     _note = _note.update({ newComment: val });
56796
56797                     var osm = services$1.osm;
56798                     if (osm) {
56799                         osm.replaceNote(_note);  // update note cache
56800                     }
56801
56802                     noteSave
56803                         .call(noteSaveButtons);
56804                 }
56805             }
56806
56807
56808             function userDetails(selection) {
56809                 var detailSection = selection.selectAll('.detail-section')
56810                     .data([0]);
56811
56812                 detailSection = detailSection.enter()
56813                     .append('div')
56814                     .attr('class', 'detail-section')
56815                     .merge(detailSection);
56816
56817                 var osm = services$1.osm;
56818                 if (!osm) return;
56819
56820                 // Add warning if user is not logged in
56821                 var hasAuth = osm.authenticated();
56822                 var authWarning = detailSection.selectAll('.auth-warning')
56823                     .data(hasAuth ? [] : [0]);
56824
56825                 authWarning.exit()
56826                     .transition()
56827                     .duration(200)
56828                     .style('opacity', 0)
56829                     .remove();
56830
56831                 var authEnter = authWarning.enter()
56832                     .insert('div', '.tag-reference-body')
56833                     .attr('class', 'field-warning auth-warning')
56834                     .style('opacity', 0);
56835
56836                 authEnter
56837                     .call(svgIcon('#iD-icon-alert', 'inline'));
56838
56839                 authEnter
56840                     .append('span')
56841                     .text(t('note.login'));
56842
56843                 authEnter
56844                     .append('a')
56845                     .attr('target', '_blank')
56846                     .call(svgIcon('#iD-icon-out-link', 'inline'))
56847                     .append('span')
56848                     .text(t('login'))
56849                     .on('click.note-login', function() {
56850                         event.preventDefault();
56851                         osm.authenticate();
56852                     });
56853
56854                 authEnter
56855                     .transition()
56856                     .duration(200)
56857                     .style('opacity', 1);
56858
56859
56860                 var prose = detailSection.selectAll('.note-save-prose')
56861                     .data(hasAuth ? [0] : []);
56862
56863                 prose.exit()
56864                     .remove();
56865
56866                 prose = prose.enter()
56867                     .append('p')
56868                     .attr('class', 'note-save-prose')
56869                     .text(t('note.upload_explanation'))
56870                     .merge(prose);
56871
56872                 osm.userDetails(function(err, user) {
56873                     if (err) return;
56874
56875                     var userLink = d3_select(document.createElement('div'));
56876
56877                     if (user.image_url) {
56878                         userLink
56879                             .append('img')
56880                             .attr('src', user.image_url)
56881                             .attr('class', 'icon pre-text user-icon');
56882                     }
56883
56884                     userLink
56885                         .append('a')
56886                         .attr('class', 'user-info')
56887                         .text(user.display_name)
56888                         .attr('href', osm.userURL(user.display_name))
56889                         .attr('tabindex', -1)
56890                         .attr('target', '_blank');
56891
56892                     prose
56893                         .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
56894                 });
56895             }
56896
56897
56898             function noteSaveButtons(selection) {
56899                 var osm = services$1.osm;
56900                 var hasAuth = osm && osm.authenticated();
56901
56902                 var isSelected = (_note && _note.id === context.selectedNoteID());
56903                 var buttonSection = selection.selectAll('.buttons')
56904                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56905
56906                 // exit
56907                 buttonSection.exit()
56908                     .remove();
56909
56910                 // enter
56911                 var buttonEnter = buttonSection.enter()
56912                     .append('div')
56913                     .attr('class', 'buttons');
56914
56915                 if (_note.isNew()) {
56916                     buttonEnter
56917                         .append('button')
56918                         .attr('class', 'button cancel-button secondary-action')
56919                         .text(t('confirm.cancel'));
56920
56921                     buttonEnter
56922                         .append('button')
56923                         .attr('class', 'button save-button action')
56924                         .text(t('note.save'));
56925
56926                 } else {
56927                     buttonEnter
56928                         .append('button')
56929                         .attr('class', 'button status-button action');
56930
56931                     buttonEnter
56932                         .append('button')
56933                         .attr('class', 'button comment-button action')
56934                         .text(t('note.comment'));
56935                 }
56936
56937
56938                 // update
56939                 buttonSection = buttonSection
56940                     .merge(buttonEnter);
56941
56942                 buttonSection.select('.cancel-button')   // select and propagate data
56943                     .on('click.cancel', clickCancel);
56944
56945                 buttonSection.select('.save-button')     // select and propagate data
56946                     .attr('disabled', isSaveDisabled)
56947                     .on('click.save', clickSave);
56948
56949                 buttonSection.select('.status-button')   // select and propagate data
56950                     .attr('disabled', (hasAuth ? null : true))
56951                     .text(function(d) {
56952                         var action = (d.status === 'open' ? 'close' : 'open');
56953                         var andComment = (d.newComment ? '_comment' : '');
56954                         return t('note.' + action + andComment);
56955                     })
56956                     .on('click.status', clickStatus);
56957
56958                 buttonSection.select('.comment-button')   // select and propagate data
56959                     .attr('disabled', isSaveDisabled)
56960                     .on('click.comment', clickComment);
56961
56962
56963                 function isSaveDisabled(d) {
56964                     return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
56965                 }
56966             }
56967
56968
56969
56970             function clickCancel(d) {
56971                 this.blur();    // avoid keeping focus on the button - #4641
56972                 var osm = services$1.osm;
56973                 if (osm) {
56974                     osm.removeNote(d);
56975                 }
56976                 context.enter(modeBrowse(context));
56977                 dispatch$1.call('change');
56978             }
56979
56980
56981             function clickSave(d) {
56982                 this.blur();    // avoid keeping focus on the button - #4641
56983                 var osm = services$1.osm;
56984                 if (osm) {
56985                     osm.postNoteCreate(d, function(err, note) {
56986                         dispatch$1.call('change', note);
56987                     });
56988                 }
56989             }
56990
56991
56992             function clickStatus(d) {
56993                 this.blur();    // avoid keeping focus on the button - #4641
56994                 var osm = services$1.osm;
56995                 if (osm) {
56996                     var setStatus = (d.status === 'open' ? 'closed' : 'open');
56997                     osm.postNoteUpdate(d, setStatus, function(err, note) {
56998                         dispatch$1.call('change', note);
56999                     });
57000                 }
57001             }
57002
57003             function clickComment(d) {
57004                 this.blur();    // avoid keeping focus on the button - #4641
57005                 var osm = services$1.osm;
57006                 if (osm) {
57007                     osm.postNoteUpdate(d, d.status, function(err, note) {
57008                         dispatch$1.call('change', note);
57009                     });
57010                 }
57011             }
57012
57013
57014             noteEditor.note = function(val) {
57015                 if (!arguments.length) return _note;
57016                 _note = val;
57017                 return noteEditor;
57018             };
57019
57020
57021             return utilRebind(noteEditor, dispatch$1, 'on');
57022         }
57023
57024         function modeSelectNote(context, selectedNoteID) {
57025             var mode = {
57026                 id: 'select-note',
57027                 button: 'browse'
57028             };
57029
57030             var osm = services$1.osm;
57031             var keybinding = utilKeybinding('select-note');
57032             var noteEditor = uiNoteEditor(context)
57033                 .on('change', function() {
57034                     context.map().pan([0,0]);  // trigger a redraw
57035                     var note = checkSelectedID();
57036                     if (!note) return;
57037                     context.ui().sidebar
57038                         .show(noteEditor.note(note));
57039                 });
57040
57041             var behaviors = [
57042                 behaviorBreathe(),
57043                 behaviorHover(context),
57044                 behaviorSelect(context),
57045                 behaviorLasso(context),
57046                 modeDragNode(context).behavior,
57047                 modeDragNote(context).behavior
57048             ];
57049
57050             var newFeature = false;
57051
57052
57053             function checkSelectedID() {
57054                 if (!osm) return;
57055                 var note = osm.getNote(selectedNoteID);
57056                 if (!note) {
57057                     context.enter(modeBrowse(context));
57058                 }
57059                 return note;
57060             }
57061
57062
57063             // class the note as selected, or return to browse mode if the note is gone
57064             function selectNote(drawn) {
57065                 if (!checkSelectedID()) return;
57066
57067                 var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
57068
57069                 if (selection.empty()) {
57070                     // Return to browse mode if selected DOM elements have
57071                     // disappeared because the user moved them out of view..
57072                     var source = event && event.type === 'zoom' && event.sourceEvent;
57073                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
57074                         context.enter(modeBrowse(context));
57075                     }
57076
57077                 } else {
57078                     selection
57079                         .classed('selected', true);
57080
57081                     context.selectedNoteID(selectedNoteID);
57082                 }
57083             }
57084
57085
57086             function esc() {
57087                 if (d3_select('.combobox').size()) return;
57088                 context.enter(modeBrowse(context));
57089             }
57090
57091
57092             mode.zoomToSelected = function() {
57093                 if (!osm) return;
57094                 var note = osm.getNote(selectedNoteID);
57095                 if (note) {
57096                     context.map().centerZoomEase(note.loc, 20);
57097                 }
57098             };
57099
57100
57101             mode.newFeature = function(val) {
57102                 if (!arguments.length) return newFeature;
57103                 newFeature = val;
57104                 return mode;
57105             };
57106
57107
57108             mode.enter = function() {
57109                 var note = checkSelectedID();
57110                 if (!note) return;
57111
57112                 behaviors.forEach(context.install);
57113
57114                 keybinding
57115                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
57116                     .on('⎋', esc, true);
57117
57118                 d3_select(document)
57119                     .call(keybinding);
57120
57121                 selectNote();
57122
57123                 var sidebar = context.ui().sidebar;
57124                 sidebar.show(noteEditor.note(note));
57125
57126                 // expand the sidebar, avoid obscuring the note if needed
57127                 sidebar.expand(sidebar.intersects(note.extent()));
57128
57129                 context.map()
57130                     .on('drawn.select', selectNote);
57131             };
57132
57133
57134             mode.exit = function() {
57135                 behaviors.forEach(context.uninstall);
57136
57137                 d3_select(document)
57138                     .call(keybinding.unbind);
57139
57140                 context.surface()
57141                     .selectAll('.layer-notes .selected')
57142                     .classed('selected hover', false);
57143
57144                 context.map()
57145                     .on('drawn.select', null);
57146
57147                 context.ui().sidebar
57148                     .hide();
57149
57150                 context.selectedNoteID(null);
57151             };
57152
57153
57154             return mode;
57155         }
57156
57157         function modeDragNote(context) {
57158             var mode = {
57159                 id: 'drag-note',
57160                 button: 'browse'
57161             };
57162
57163             var edit = behaviorEdit(context);
57164
57165             var _nudgeInterval;
57166             var _lastLoc;
57167             var _note;    // most current note.. dragged note may have stale datum.
57168
57169
57170             function startNudge(nudge) {
57171                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
57172                 _nudgeInterval = window.setInterval(function() {
57173                     context.pan(nudge);
57174                     doMove(nudge);
57175                 }, 50);
57176             }
57177
57178
57179             function stopNudge() {
57180                 if (_nudgeInterval) {
57181                     window.clearInterval(_nudgeInterval);
57182                     _nudgeInterval = null;
57183                 }
57184             }
57185
57186
57187             function origin(note) {
57188                 return context.projection(note.loc);
57189             }
57190
57191
57192             function start(note) {
57193                 _note = note;
57194                 var osm = services$1.osm;
57195                 if (osm) {
57196                     // Get latest note from cache.. The marker may have a stale datum bound to it
57197                     // and dragging it around can sometimes delete the users note comment.
57198                     _note = osm.getNote(_note.id);
57199                 }
57200
57201                 context.surface().selectAll('.note-' + _note.id)
57202                     .classed('active', true);
57203
57204                 context.perform(actionNoop());
57205                 context.enter(mode);
57206                 context.selectedNoteID(_note.id);
57207             }
57208
57209
57210             function move() {
57211                 event.sourceEvent.stopPropagation();
57212                 _lastLoc = context.projection.invert(event.point);
57213
57214                 doMove();
57215                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
57216                 if (nudge) {
57217                     startNudge(nudge);
57218                 } else {
57219                     stopNudge();
57220                 }
57221             }
57222
57223
57224             function doMove(nudge) {
57225                 nudge = nudge || [0, 0];
57226
57227                 var currPoint = (event && event.point) || context.projection(_lastLoc);
57228                 var currMouse = geoVecSubtract(currPoint, nudge);
57229                 var loc = context.projection.invert(currMouse);
57230
57231                 _note = _note.move(loc);
57232
57233                 var osm = services$1.osm;
57234                 if (osm) {
57235                     osm.replaceNote(_note);  // update note cache
57236                 }
57237
57238                 context.replace(actionNoop());   // trigger redraw
57239             }
57240
57241
57242             function end() {
57243                 context.replace(actionNoop());   // trigger redraw
57244
57245                 context
57246                     .selectedNoteID(_note.id)
57247                     .enter(modeSelectNote(context, _note.id));
57248             }
57249
57250
57251             var drag = behaviorDrag()
57252                 .selector('.layer-touch.markers .target.note.new')
57253                 .surface(d3_select('#map').node())
57254                 .origin(origin)
57255                 .on('start', start)
57256                 .on('move', move)
57257                 .on('end', end);
57258
57259
57260             mode.enter = function() {
57261                 context.install(edit);
57262             };
57263
57264
57265             mode.exit = function() {
57266                 context.ui().sidebar.hover.cancel();
57267                 context.uninstall(edit);
57268
57269                 context.surface()
57270                     .selectAll('.active')
57271                     .classed('active', false);
57272
57273                 stopNudge();
57274             };
57275
57276             mode.behavior = drag;
57277
57278             return mode;
57279         }
57280
57281         function uiDataHeader() {
57282             var _datum;
57283
57284
57285             function dataHeader(selection) {
57286                 var header = selection.selectAll('.data-header')
57287                     .data(
57288                         (_datum ? [_datum] : []),
57289                         function(d) { return d.__featurehash__; }
57290                     );
57291
57292                 header.exit()
57293                     .remove();
57294
57295                 var headerEnter = header.enter()
57296                     .append('div')
57297                     .attr('class', 'data-header');
57298
57299                 var iconEnter = headerEnter
57300                     .append('div')
57301                     .attr('class', 'data-header-icon');
57302
57303                 iconEnter
57304                     .append('div')
57305                     .attr('class', 'preset-icon-28')
57306                     .call(svgIcon('#iD-icon-data', 'note-fill'));
57307
57308                 headerEnter
57309                     .append('div')
57310                     .attr('class', 'data-header-label')
57311                     .text(t('map_data.layers.custom.title'));
57312             }
57313
57314
57315             dataHeader.datum = function(val) {
57316                 if (!arguments.length) return _datum;
57317                 _datum = val;
57318                 return this;
57319             };
57320
57321
57322             return dataHeader;
57323         }
57324
57325         // This code assumes that the combobox values will not have duplicate entries.
57326         // It is keyed on the `value` of the entry. Data should be an array of objects like:
57327         //   [{
57328         //       value:  'display text',  // required
57329         //       title:  'hover text'     // optional
57330         //   }, ...]
57331
57332         var _comboHideTimerID;
57333
57334         function uiCombobox(context, klass) {
57335             var dispatch$1 = dispatch('accept', 'cancel');
57336             var container = context.container();
57337
57338             var _suggestions = [];
57339             var _data = [];
57340             var _fetched = {};
57341             var _selected = null;
57342             var _canAutocomplete = true;
57343             var _caseSensitive = false;
57344             var _cancelFetch = false;
57345             var _minItems = 2;
57346             var _tDown = 0;
57347
57348             var _fetcher = function(val, cb) {
57349                 cb(_data.filter(function(d) {
57350                     return d.value
57351                         .toString()
57352                         .toLowerCase()
57353                         .indexOf(val.toLowerCase()) !== -1;
57354                 }));
57355             };
57356
57357             var combobox = function(input, attachTo) {
57358                 if (!input || input.empty()) return;
57359
57360                 input
57361                     .classed('combobox-input', true)
57362                     .on('focus.combo-input', focus)
57363                     .on('blur.combo-input', blur)
57364                     .on('keydown.combo-input', keydown)
57365                     .on('keyup.combo-input', keyup)
57366                     .on('input.combo-input', change)
57367                     .on('mousedown.combo-input', mousedown)
57368                     .each(function() {
57369                         var parent = this.parentNode;
57370                         var sibling = this.nextSibling;
57371
57372                         d3_select(parent).selectAll('.combobox-caret')
57373                             .filter(function(d) { return d === input.node(); })
57374                             .data([input.node()])
57375                             .enter()
57376                             .insert('div', function() { return sibling; })
57377                             .attr('class', 'combobox-caret')
57378                             .on('mousedown.combo-caret', function() {
57379                                 event.preventDefault(); // don't steal focus from input
57380                                 input.node().focus(); // focus the input as if it was clicked
57381                                 mousedown();
57382                             })
57383                             .on('mouseup.combo-caret', function() {
57384                                 event.preventDefault(); // don't steal focus from input
57385                                 mouseup();
57386                             });
57387                     });
57388
57389
57390                 function mousedown() {
57391                     if (event.button !== 0) return;    // left click only
57392                     _tDown = +new Date();
57393
57394                     // clear selection
57395                     var start = input.property('selectionStart');
57396                     var end = input.property('selectionEnd');
57397                     if (start !== end) {
57398                         var val = utilGetSetValue(input);
57399                         input.node().setSelectionRange(val.length, val.length);
57400                         return;
57401                     }
57402
57403                     input.on('mouseup.combo-input', mouseup);
57404                 }
57405
57406
57407                 function mouseup() {
57408                     input.on('mouseup.combo-input', null);
57409                     if (event.button !== 0) return;    // left click only
57410                     if (input.node() !== document.activeElement) return;   // exit if this input is not focused
57411
57412                     var start = input.property('selectionStart');
57413                     var end = input.property('selectionEnd');
57414                     if (start !== end) return;  // exit if user is selecting
57415
57416                     // not showing or showing for a different field - try to show it.
57417                     var combo = container.selectAll('.combobox');
57418                     if (combo.empty() || combo.datum() !== input.node()) {
57419                         var tOrig = _tDown;
57420                         window.setTimeout(function() {
57421                             if (tOrig !== _tDown) return;   // exit if user double clicked
57422                             fetchComboData('', function() {
57423                                 show();
57424                                 render();
57425                             });
57426                         }, 250);
57427
57428                     } else {
57429                         hide();
57430                     }
57431                 }
57432
57433
57434                 function focus() {
57435                     fetchComboData('');   // prefetch values (may warm taginfo cache)
57436                 }
57437
57438
57439                 function blur() {
57440                     _comboHideTimerID = window.setTimeout(hide, 75);
57441                 }
57442
57443
57444                 function show() {
57445                     hide();   // remove any existing
57446
57447                     container
57448                         .insert('div', ':first-child')
57449                         .datum(input.node())
57450                         .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
57451                         .style('position', 'absolute')
57452                         .style('display', 'block')
57453                         .style('left', '0px')
57454                         .on('mousedown.combo-container', function () {
57455                             // prevent moving focus out of the input field
57456                             event.preventDefault();
57457                         });
57458
57459                     d3_select('body')
57460                         .on('scroll.combo-scroll', render, true);
57461                 }
57462
57463
57464                 function hide() {
57465                     if (_comboHideTimerID) {
57466                         window.clearTimeout(_comboHideTimerID);
57467                         _comboHideTimerID = undefined;
57468                     }
57469
57470                     container.selectAll('.combobox')
57471                         .remove();
57472
57473                     d3_select('body')
57474                         .on('scroll.combo-scroll', null);
57475                 }
57476
57477
57478                 function keydown() {
57479                     var shown = !container.selectAll('.combobox').empty();
57480                     var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
57481
57482                     switch (event.keyCode) {
57483                         case 8:   // ⌫ Backspace
57484                         case 46:  // ⌦ Delete
57485                             event.stopPropagation();
57486                             _selected = null;
57487                             render();
57488                             input.on('input.combo-input', function() {
57489                                 var start = input.property('selectionStart');
57490                                 input.node().setSelectionRange(start, start);
57491                                 input.on('input.combo-input', change);
57492                             });
57493                             break;
57494
57495                         case 9:   // ⇥ Tab
57496                             accept();
57497                             break;
57498
57499                         case 13:  // ↩ Return
57500                             event.preventDefault();
57501                             event.stopPropagation();
57502                             break;
57503
57504                         case 38:  // ↑ Up arrow
57505                             if (tagName === 'textarea' && !shown) return;
57506                             event.preventDefault();
57507                             if (tagName === 'input' && !shown) {
57508                                 show();
57509                             }
57510                             nav(-1);
57511                             break;
57512
57513                         case 40:  // ↓ Down arrow
57514                             if (tagName === 'textarea' && !shown) return;
57515                             event.preventDefault();
57516                             if (tagName === 'input' && !shown) {
57517                                 show();
57518                             }
57519                             nav(+1);
57520                             break;
57521                     }
57522                 }
57523
57524
57525                 function keyup() {
57526                     switch (event.keyCode) {
57527                         case 27:  // ⎋ Escape
57528                             cancel();
57529                             break;
57530
57531                         case 13:  // ↩ Return
57532                             accept();
57533                             break;
57534                     }
57535                 }
57536
57537
57538                 // Called whenever the input value is changed (e.g. on typing)
57539                 function change() {
57540                     fetchComboData(value(), function() {
57541                         _selected = null;
57542                         var val = input.property('value');
57543
57544                         if (_suggestions.length) {
57545                             if (input.property('selectionEnd') === val.length) {
57546                                 _selected = tryAutocomplete();
57547                             }
57548
57549                             if (!_selected) {
57550                                 _selected = val;
57551                             }
57552                         }
57553
57554                         if (val.length) {
57555                             var combo = container.selectAll('.combobox');
57556                             if (combo.empty()) {
57557                                 show();
57558                             }
57559                         } else {
57560                             hide();
57561                         }
57562
57563                         render();
57564                     });
57565                 }
57566
57567
57568                 // Called when the user presses up/down arrows to navigate the list
57569                 function nav(dir) {
57570                     if (_suggestions.length) {
57571                         // try to determine previously selected index..
57572                         var index = -1;
57573                         for (var i = 0; i < _suggestions.length; i++) {
57574                             if (_selected && _suggestions[i].value === _selected) {
57575                                 index = i;
57576                                 break;
57577                             }
57578                         }
57579
57580                         // pick new _selected
57581                         index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
57582                         _selected = _suggestions[index].value;
57583                         input.property('value', _selected);
57584                     }
57585
57586                     render();
57587                     ensureVisible();
57588                 }
57589
57590
57591                 function ensureVisible() {
57592                     var combo = container.selectAll('.combobox');
57593                     if (combo.empty()) return;
57594
57595                     var containerRect = container.node().getBoundingClientRect();
57596                     var comboRect = combo.node().getBoundingClientRect();
57597
57598                     if (comboRect.bottom > containerRect.bottom) {
57599                         var node = attachTo ? attachTo.node() : input.node();
57600                         node.scrollIntoView({ behavior: 'instant', block: 'center' });
57601                         render();
57602                     }
57603
57604                     // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
57605                     var selected = combo.selectAll('.combobox-option.selected').node();
57606                     if (selected) {
57607                         selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
57608                     }
57609                 }
57610
57611
57612                 function value() {
57613                     var value = input.property('value');
57614                     var start = input.property('selectionStart');
57615                     var end = input.property('selectionEnd');
57616
57617                     if (start && end) {
57618                         value = value.substring(0, start);
57619                     }
57620
57621                     return value;
57622                 }
57623
57624
57625                 function fetchComboData(v, cb) {
57626                     _cancelFetch = false;
57627
57628                     _fetcher.call(input, v, function(results) {
57629                         // already chose a value, don't overwrite or autocomplete it
57630                         if (_cancelFetch) return;
57631
57632                         _suggestions = results;
57633                         results.forEach(function(d) { _fetched[d.value] = d; });
57634
57635                         if (cb) {
57636                             cb();
57637                         }
57638                     });
57639                 }
57640
57641
57642                 function tryAutocomplete() {
57643                     if (!_canAutocomplete) return;
57644
57645                     var val = _caseSensitive ? value() : value().toLowerCase();
57646                     if (!val) return;
57647
57648                     // Don't autocomplete if user is typing a number - #4935
57649                     if (!isNaN(parseFloat(val)) && isFinite(val)) return;
57650
57651                     var bestIndex = -1;
57652                     for (var i = 0; i < _suggestions.length; i++) {
57653                         var suggestion = _suggestions[i].value;
57654                         var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
57655
57656                         // if search string matches suggestion exactly, pick it..
57657                         if (compare === val) {
57658                             bestIndex = i;
57659                             break;
57660
57661                         // otherwise lock in the first result that starts with the search string..
57662                         } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
57663                             bestIndex = i;
57664                         }
57665                     }
57666
57667                     if (bestIndex !== -1) {
57668                         var bestVal = _suggestions[bestIndex].value;
57669                         input.property('value', bestVal);
57670                         input.node().setSelectionRange(val.length, bestVal.length);
57671                         return bestVal;
57672                     }
57673                 }
57674
57675
57676                 function render() {
57677                     if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
57678                         hide();
57679                         return;
57680                     }
57681
57682                     var shown = !container.selectAll('.combobox').empty();
57683                     if (!shown) return;
57684
57685                     var combo = container.selectAll('.combobox');
57686                     var options = combo.selectAll('.combobox-option')
57687                         .data(_suggestions, function(d) { return d.value; });
57688
57689                     options.exit()
57690                         .remove();
57691
57692                     // enter/update
57693                     options.enter()
57694                         .append('a')
57695                         .attr('class', 'combobox-option')
57696                         .attr('title', function(d) { return d.title; })
57697                         .text(function(d) { return d.display || d.value; })
57698                         .merge(options)
57699                         .classed('selected', function(d) { return d.value === _selected; })
57700                         .on('click.combo-option', accept)
57701                         .order();
57702
57703                     var node = attachTo ? attachTo.node() : input.node();
57704                     var rect = node.getBoundingClientRect();
57705
57706                     combo
57707                         .style('left', (rect.left + 5) + 'px')
57708                         .style('width', (rect.width - 10) + 'px')
57709                         .style('top', rect.height + rect.top + 'px');
57710                 }
57711
57712
57713                 // Dispatches an 'accept' event
57714                 // Then hides the combobox.
57715                 function accept(d) {
57716                     _cancelFetch = true;
57717                     var thiz = input.node();
57718
57719                     if (d) {   // user clicked on a suggestion
57720                         utilGetSetValue(input, d.value);    // replace field contents
57721                         utilTriggerEvent(input, 'change');
57722                     }
57723
57724                     // clear (and keep) selection
57725                     var val = utilGetSetValue(input);
57726                     thiz.setSelectionRange(val.length, val.length);
57727
57728                     d = _fetched[val];
57729                     dispatch$1.call('accept', thiz, d, val);
57730                     hide();
57731                 }
57732
57733
57734                 // Dispatches an 'cancel' event
57735                 // Then hides the combobox.
57736                 function cancel() {
57737                     _cancelFetch = true;
57738                     var thiz = input.node();
57739
57740                     // clear (and remove) selection, and replace field contents
57741                     var val = utilGetSetValue(input);
57742                     var start = input.property('selectionStart');
57743                     var end = input.property('selectionEnd');
57744                     val = val.slice(0, start) + val.slice(end);
57745                     utilGetSetValue(input, val);
57746                     thiz.setSelectionRange(val.length, val.length);
57747
57748                     dispatch$1.call('cancel', thiz);
57749                     hide();
57750                 }
57751
57752             };
57753
57754
57755             combobox.canAutocomplete = function(val) {
57756                 if (!arguments.length) return _canAutocomplete;
57757                 _canAutocomplete = val;
57758                 return combobox;
57759             };
57760
57761             combobox.caseSensitive = function(val) {
57762                 if (!arguments.length) return _caseSensitive;
57763                 _caseSensitive = val;
57764                 return combobox;
57765             };
57766
57767             combobox.data = function(val) {
57768                 if (!arguments.length) return _data;
57769                 _data = val;
57770                 return combobox;
57771             };
57772
57773             combobox.fetcher = function(val) {
57774                 if (!arguments.length) return _fetcher;
57775                 _fetcher = val;
57776                 return combobox;
57777             };
57778
57779             combobox.minItems = function(val) {
57780                 if (!arguments.length) return _minItems;
57781                 _minItems = val;
57782                 return combobox;
57783             };
57784
57785
57786             return utilRebind(combobox, dispatch$1, 'on');
57787         }
57788
57789
57790         uiCombobox.off = function(input) {
57791             input
57792                 .on('focus.combo-input', null)
57793                 .on('blur.combo-input', null)
57794                 .on('keydown.combo-input', null)
57795                 .on('keyup.combo-input', null)
57796                 .on('input.combo-input', null)
57797                 .on('mousedown.combo-input', null)
57798                 .on('mouseup.combo-input', null);
57799
57800
57801             d3_select('body')
57802                 .on('scroll.combo-scroll', null);
57803         };
57804
57805         // toggles the visibility of ui elements, using a combination of the
57806         // hide class, which sets display=none, and a d3 transition for opacity.
57807         // this will cause blinking when called repeatedly, so check that the
57808         // value actually changes between calls.
57809         function uiToggle(show, callback) {
57810             return function(selection) {
57811                 selection
57812                     .style('opacity', show ? 0 : 1)
57813                     .classed('hide', false)
57814                     .transition()
57815                     .style('opacity', show ? 1 : 0)
57816                     .on('end', function() {
57817                         d3_select(this)
57818                             .classed('hide', !show)
57819                             .style('opacity', null);
57820                         if (callback) callback.apply(this);
57821                     });
57822             };
57823         }
57824
57825         function uiDisclosure(context, key, expandedDefault) {
57826             var dispatch$1 = dispatch('toggled');
57827             var _preference = (context.storage('disclosure.' + key + '.expanded'));
57828             var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57829             var _title;
57830             var _updatePreference = true;
57831             var _content = function () {};
57832
57833
57834             var disclosure = function(selection) {
57835                 var hideToggle = selection.selectAll('.hide-toggle-' + key)
57836                     .data([0]);
57837
57838                 // enter
57839                 var hideToggleEnter = hideToggle.enter()
57840                     .append('a')
57841                     .attr('href', '#')
57842                     .attr('class', 'hide-toggle hide-toggle-' + key)
57843                     .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57844
57845                 hideToggleEnter
57846                     .append('span')
57847                     .attr('class', 'hide-toggle-text');
57848
57849                 // update
57850                 hideToggle = hideToggleEnter
57851                     .merge(hideToggle);
57852
57853                 hideToggle
57854                     .on('click', toggle)
57855                     .classed('expanded', _expanded);
57856
57857                 hideToggle.selectAll('.hide-toggle-text')
57858                     .text(_title);
57859
57860                 hideToggle.selectAll('.hide-toggle-icon')
57861                     .attr('xlink:href', _expanded ? '#iD-icon-down'
57862                         : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57863                     );
57864
57865
57866                 var wrap = selection.selectAll('.disclosure-wrap')
57867                     .data([0]);
57868
57869                 // enter/update
57870                 wrap = wrap.enter()
57871                     .append('div')
57872                     .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57873                     .merge(wrap)
57874                     .classed('hide', !_expanded);
57875
57876                 if (_expanded) {
57877                     wrap
57878                         .call(_content);
57879                 }
57880
57881
57882                 function toggle() {
57883                     event.preventDefault();
57884
57885                     _expanded = !_expanded;
57886
57887                     if (_updatePreference) {
57888                         context.storage('disclosure.' + key + '.expanded', _expanded);
57889                     }
57890
57891                     hideToggle
57892                         .classed('expanded', _expanded);
57893
57894                     hideToggle.selectAll('.hide-toggle-icon')
57895                         .attr('xlink:href', _expanded ? '#iD-icon-down'
57896                             : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57897                         );
57898
57899                     wrap
57900                         .call(uiToggle(_expanded));
57901
57902                     if (_expanded) {
57903                         wrap
57904                             .call(_content);
57905                     }
57906
57907                     dispatch$1.call('toggled', this, _expanded);
57908                 }
57909             };
57910
57911
57912             disclosure.title = function(val) {
57913                 if (!arguments.length) return _title;
57914                 _title = val;
57915                 return disclosure;
57916             };
57917
57918
57919             disclosure.expanded = function(val) {
57920                 if (!arguments.length) return _expanded;
57921                 _expanded = val;
57922                 return disclosure;
57923             };
57924
57925
57926             disclosure.updatePreference = function(val) {
57927                 if (!arguments.length) return _updatePreference;
57928                 _updatePreference = val;
57929                 return disclosure;
57930             };
57931
57932
57933             disclosure.content = function(val) {
57934                 if (!arguments.length) return _content;
57935                 _content = val;
57936                 return disclosure;
57937             };
57938
57939
57940             return utilRebind(disclosure, dispatch$1, 'on');
57941         }
57942
57943         // Pass `which` object of the form:
57944         // {
57945         //   key: 'string',     // required
57946         //   value: 'string'    // optional
57947         // }
57948         //   -or-
57949         // {
57950         //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
57951         // }
57952         //   -or-
57953         // {
57954         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
57955         // }
57956         //
57957         function uiTagReference(what) {
57958             var wikibase = what.qid ? services$1.wikidata : services$1.osmWikibase;
57959             var tagReference = {};
57960
57961             var _button = d3_select(null);
57962             var _body = d3_select(null);
57963             var _loaded;
57964             var _showing;
57965
57966
57967             function load() {
57968                 if (!wikibase) return;
57969
57970                 _button
57971                     .classed('tag-reference-loading', true);
57972
57973                 wikibase.getDocs(what, gotDocs);
57974             }
57975
57976
57977             function gotDocs(err, docs) {
57978                 _body.html('');
57979
57980                 if (!docs || !docs.title) {
57981                     _body
57982                         .append('p')
57983                         .attr('class', 'tag-reference-description')
57984                         .text(t('inspector.no_documentation_key'));
57985                     done();
57986                     return;
57987                 }
57988
57989                 if (docs.imageURL) {
57990                     _body
57991                         .append('img')
57992                         .attr('class', 'tag-reference-wiki-image')
57993                         .attr('src', docs.imageURL)
57994                         .on('load', function() { done(); })
57995                         .on('error', function() { d3_select(this).remove(); done(); });
57996                 } else {
57997                     done();
57998                 }
57999
58000                 _body
58001                     .append('p')
58002                     .attr('class', 'tag-reference-description')
58003                     .text(docs.description || t('inspector.no_documentation_key'))
58004                     .append('a')
58005                     .attr('class', 'tag-reference-edit')
58006                     .attr('target', '_blank')
58007                     .attr('tabindex', -1)
58008                     .attr('title', t('inspector.edit_reference'))
58009                     .attr('href', docs.editURL)
58010                     .call(svgIcon('#iD-icon-edit', 'inline'));
58011
58012                 if (docs.wiki) {
58013                     _body
58014                       .append('a')
58015                       .attr('class', 'tag-reference-link')
58016                       .attr('target', '_blank')
58017                       .attr('tabindex', -1)
58018                       .attr('href', docs.wiki.url)
58019                       .call(svgIcon('#iD-icon-out-link', 'inline'))
58020                       .append('span')
58021                       .text(t(docs.wiki.text));
58022                 }
58023
58024                 // Add link to info about "good changeset comments" - #2923
58025                 if (what.key === 'comment') {
58026                     _body
58027                         .append('a')
58028                         .attr('class', 'tag-reference-comment-link')
58029                         .attr('target', '_blank')
58030                         .attr('tabindex', -1)
58031                         .call(svgIcon('#iD-icon-out-link', 'inline'))
58032                         .attr('href', t('commit.about_changeset_comments_link'))
58033                         .append('span')
58034                         .text(t('commit.about_changeset_comments'));
58035                 }
58036             }
58037
58038
58039             function done() {
58040                 _loaded = true;
58041
58042                 _button
58043                     .classed('tag-reference-loading', false);
58044
58045                 _body
58046                     .classed('expanded', true)
58047                     .transition()
58048                     .duration(200)
58049                     .style('max-height', '200px')
58050                     .style('opacity', '1');
58051
58052                 _showing = true;
58053
58054                 _button.selectAll('svg.icon use').each(function() {
58055                     var iconUse = d3_select(this);
58056                     if (iconUse.attr('href') === '#iD-icon-info') {
58057                         iconUse.attr('href', '#iD-icon-info-filled');
58058                     }
58059                 });
58060             }
58061
58062
58063             function hide() {
58064                 _body
58065                     .transition()
58066                     .duration(200)
58067                     .style('max-height', '0px')
58068                     .style('opacity', '0')
58069                     .on('end', function () {
58070                         _body.classed('expanded', false);
58071                     });
58072
58073                 _showing = false;
58074
58075                 _button.selectAll('svg.icon use').each(function() {
58076                     var iconUse = d3_select(this);
58077                     if (iconUse.attr('href') === '#iD-icon-info-filled') {
58078                         iconUse.attr('href', '#iD-icon-info');
58079                     }
58080                 });
58081
58082             }
58083
58084
58085             tagReference.button = function(selection, klass, iconName) {
58086                 _button = selection.selectAll('.tag-reference-button')
58087                     .data([0]);
58088
58089                 _button = _button.enter()
58090                     .append('button')
58091                     .attr('class', 'tag-reference-button ' + klass)
58092                     .attr('title', t('icons.information'))
58093                     .attr('tabindex', -1)
58094                     .call(svgIcon('#iD-icon-' + (iconName || 'inspect')))
58095                     .merge(_button);
58096
58097                 _button
58098                     .on('click', function () {
58099                         event.stopPropagation();
58100                         event.preventDefault();
58101                         this.blur();    // avoid keeping focus on the button - #4641
58102                         if (_showing) {
58103                             hide();
58104                         } else if (_loaded) {
58105                             done();
58106                         } else {
58107                             load();
58108                         }
58109                     });
58110             };
58111
58112
58113             tagReference.body = function(selection) {
58114                 var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
58115                 _body = selection.selectAll('.tag-reference-body')
58116                     .data([itemID], function(d) { return d; });
58117
58118                 _body.exit()
58119                     .remove();
58120
58121                 _body = _body.enter()
58122                     .append('div')
58123                     .attr('class', 'tag-reference-body')
58124                     .style('max-height', '0')
58125                     .style('opacity', '0')
58126                     .merge(_body);
58127
58128                 if (_showing === false) {
58129                     hide();
58130                 }
58131             };
58132
58133
58134             tagReference.showing = function(val) {
58135                 if (!arguments.length) return _showing;
58136                 _showing = val;
58137                 return tagReference;
58138             };
58139
58140
58141             return tagReference;
58142         }
58143
58144         function uiRawTagEditor(context) {
58145             var taginfo = services$1.taginfo;
58146             var dispatch$1 = dispatch('change');
58147             var availableViews = [
58148                 { id: 'text', icon: '#fas-i-cursor' },
58149                 { id: 'list', icon: '#fas-th-list' }
58150             ];
58151
58152             var _tagView = (context.storage('raw-tag-editor-view') || 'list');   // 'list, 'text'
58153             var _readOnlyTags = [];
58154             var _indexedKeys = [];
58155             var _showBlank = false;
58156             var _updatePreference = true;
58157             var _expanded = false;
58158             var _pendingChange = null;
58159             var _state;
58160             var _preset;
58161             var _tags;
58162             var _entityID;
58163
58164
58165             function rawTagEditor(selection) {
58166                 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
58167
58168                 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
58169                     .title(t('inspector.all_tags') + ' (' + count + ')')
58170                     .on('toggled', toggled)
58171                     .updatePreference(_updatePreference)
58172                     .content(content);
58173
58174                 // Sometimes we want to force the raw_tag_editor to be opened/closed..
58175                 // When undefined, uiDisclosure will use the user's stored preference.
58176                 if (_expanded !== undefined) {
58177                     disclosure.expanded(_expanded);
58178                 }
58179
58180                 selection.call(disclosure);
58181
58182                 function toggled(expanded) {
58183                     _expanded = expanded;
58184                     if (expanded) {
58185                         selection.node().parentNode.scrollTop += 200;
58186                     }
58187                 }
58188             }
58189
58190
58191             function content(wrap) {
58192                 // When switching to a different entity or changing the state (hover/select)
58193                 // reorder the keys alphabetically.
58194                 // We trigger this by emptying the `_indexedKeys` array, then it will be rebuilt here.
58195                 // Otherwise leave their order alone - #5857, #5927
58196                 var all = Object.keys(_tags).sort();
58197                 var known = _indexedKeys.map(function(t) { return t.key; });
58198                 var missing = utilArrayDifference(all, known);
58199                 for (var i = 0; i < missing.length; i++) {
58200                     _indexedKeys.push({ index: _indexedKeys.length, key: missing[i] });
58201                 }
58202
58203                 // assemble row data, excluding any deleted tags
58204                 var rowData = _indexedKeys.map(function(row) {
58205                     var v = _tags[row.key];
58206                     return (v === undefined) ? null : Object.assign(row, { value: v });
58207                 }).filter(Boolean);
58208
58209                 // append blank row last, if necessary
58210                 if (!_indexedKeys.length || _showBlank) {
58211                     _showBlank = false;
58212                     rowData.push({ index: _indexedKeys.length, key: '', value: '' });
58213                 }
58214
58215
58216                 // View Options
58217                 var options = wrap.selectAll('.raw-tag-options')
58218                     .data([0]);
58219
58220                 var optionsEnter = options.enter()
58221                     .append('div')
58222                     .attr('class', 'raw-tag-options');
58223
58224                 var optionEnter = optionsEnter.selectAll('.raw-tag-option')
58225                     .data(availableViews, function(d) { return d.id; })
58226                     .enter();
58227
58228                 optionEnter
58229                     .append('button')
58230                     .attr('class', function(d) {
58231                         return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
58232                     })
58233                     .attr('title', function(d) { return d.id; })
58234                     .on('click', function(d) {
58235                         _tagView = d.id;
58236                         context.storage('raw-tag-editor-view', d.id);
58237
58238                         wrap.selectAll('.raw-tag-option')
58239                             .classed('selected', function(datum) { return datum === d; });
58240
58241                         wrap.selectAll('.tag-text')
58242                             .classed('hide', (d.id !== 'text'))
58243                             .each(setTextareaHeight);
58244
58245                         wrap.selectAll('.tag-list, .add-row')
58246                             .classed('hide', (d.id !== 'list'));
58247                     })
58248                     .each(function(d) {
58249                         d3_select(this)
58250                             .call(svgIcon(d.icon));
58251                     });
58252
58253
58254                 // View as Text
58255                 var textData = rowsToText(rowData);
58256                 var textarea = wrap.selectAll('.tag-text')
58257                     .data([0]);
58258
58259                 textarea = textarea.enter()
58260                     .append('textarea')
58261                     .attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : ''))
58262                     .call(utilNoAuto)
58263                     .attr('spellcheck', 'false')
58264                     .merge(textarea);
58265
58266                 textarea
58267                     .call(utilGetSetValue, textData)
58268                     .each(setTextareaHeight)
58269                     .on('input', setTextareaHeight)
58270                     .on('blur', textChanged)
58271                     .on('change', textChanged);
58272
58273                 // If All Fields section is hidden, focus textarea and put cursor at end..
58274                 var fieldsExpanded = d3_select('.hide-toggle-preset_fields.expanded').size();
58275                 if (_state !== 'hover' && _tagView === 'text' && !fieldsExpanded) {
58276                     var element = textarea.node();
58277                     element.focus();
58278                     element.setSelectionRange(textData.length, textData.length);
58279                 }
58280
58281
58282                 // View as List
58283                 var list = wrap.selectAll('.tag-list')
58284                     .data([0]);
58285
58286                 list = list.enter()
58287                     .append('ul')
58288                     .attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : ''))
58289                     .merge(list);
58290
58291
58292                 // Container for the Add button
58293                 var addRowEnter = wrap.selectAll('.add-row')
58294                     .data([0])
58295                     .enter()
58296                     .append('div')
58297                     .attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
58298
58299                 addRowEnter
58300                     .append('button')
58301                     .attr('class', 'add-tag')
58302                     .call(svgIcon('#iD-icon-plus', 'light'))
58303                     .on('click', addTag);
58304
58305                 addRowEnter
58306                     .append('div')
58307                     .attr('class', 'space-value');   // preserve space
58308
58309                 addRowEnter
58310                     .append('div')
58311                     .attr('class', 'space-buttons');  // preserve space
58312
58313
58314                 // Tag list items
58315                 var items = list.selectAll('.tag-row')
58316                     .data(rowData, function(d) { return d.key; });
58317
58318                 items.exit()
58319                     .each(unbind)
58320                     .remove();
58321
58322
58323                 // Enter
58324                 var itemsEnter = items.enter()
58325                     .append('li')
58326                     .attr('class', 'tag-row')
58327                     .classed('readonly', isReadOnly);
58328
58329                 var innerWrap = itemsEnter.append('div')
58330                     .attr('class', 'inner-wrap');
58331
58332                 innerWrap
58333                     .append('div')
58334                     .attr('class', 'key-wrap')
58335                     .append('input')
58336                     .property('type', 'text')
58337                     .attr('class', 'key')
58338                     .attr('maxlength', 255)
58339                     .call(utilNoAuto)
58340                     .on('blur', keyChange)
58341                     .on('change', keyChange);
58342
58343                 innerWrap
58344                     .append('div')
58345                     .attr('class', 'value-wrap')
58346                     .append('input')
58347                     .property('type', 'text')
58348                     .attr('class', 'value')
58349                     .attr('maxlength', 255)
58350                     .call(utilNoAuto)
58351                     .on('blur', valueChange)
58352                     .on('change', valueChange)
58353                     .on('keydown.push-more', pushMore);
58354
58355                 innerWrap
58356                     .append('button')
58357                     .attr('tabindex', -1)
58358                     .attr('class', 'form-field-button remove')
58359                     .attr('title', t('icons.remove'))
58360                     .call(svgIcon('#iD-operation-delete'));
58361
58362
58363                 // Update
58364                 items = items
58365                     .merge(itemsEnter)
58366                     .sort(function(a, b) { return a.index - b.index; });
58367
58368                 items
58369                     .each(function(d) {
58370                         var row = d3_select(this);
58371                         var key = row.select('input.key');      // propagate bound data
58372                         var value = row.select('input.value');  // propagate bound data
58373
58374                         if (_entityID && taginfo && _state !== 'hover') {
58375                             bindTypeahead(key, value);
58376                         }
58377
58378                         var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
58379                         var reference;
58380
58381                         if (isRelation && d.key === 'type') {
58382                             reference = uiTagReference({ rtype: d.value });
58383                         } else {
58384                             reference = uiTagReference({ key: d.key, value: d.value });
58385                         }
58386
58387                         if (_state === 'hover') {
58388                             reference.showing(false);
58389                         }
58390
58391                         row.select('.inner-wrap')      // propagate bound data
58392                             .call(reference.button);
58393
58394                         row.call(reference.body);
58395
58396                         row.select('button.remove');   // propagate bound data
58397                     });
58398
58399                 items.selectAll('input.key')
58400                     .attr('title', function(d) { return d.key; })
58401                     .call(utilGetSetValue, function(d) { return d.key; })
58402                     .property('disabled', isReadOnly);
58403
58404                 items.selectAll('input.value')
58405                     .attr('title', function(d) { return d.value; })
58406                     .call(utilGetSetValue, function(d) { return d.value; })
58407                     .property('disabled', isReadOnly);
58408
58409                 items.selectAll('button.remove')
58410                     .on('mousedown', removeTag);  // 'click' fires too late - #5878
58411
58412
58413
58414                 function isReadOnly(d) {
58415                     for (var i = 0; i < _readOnlyTags.length; i++) {
58416                         if (d.key.match(_readOnlyTags[i]) !== null) {
58417                             return true;
58418                         }
58419                     }
58420                     return false;
58421                 }
58422
58423
58424                 function setTextareaHeight() {
58425                     if (_tagView !== 'text') return;
58426
58427                     var selection = d3_select(this);
58428                     selection.style('height', null);
58429                     selection.style('height', selection.node().scrollHeight + 5 + 'px');
58430                 }
58431
58432
58433                 function stringify(s) {
58434                     return JSON.stringify(s).slice(1, -1);   // without leading/trailing "
58435                 }
58436
58437                 function unstringify(s) {
58438                     var leading = '';
58439                     var trailing = '';
58440                     if (s.length < 1 || s.charAt(0) !== '"') {
58441                         leading = '"';
58442                     }
58443                     if (s.length < 2 || s.charAt(s.length - 1) !== '"' ||
58444                         (s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\')
58445                     ) {
58446                         trailing = '"';
58447                     }
58448                     return JSON.parse(leading + s + trailing);
58449                 }
58450
58451
58452                 function rowsToText(rows) {
58453                     var str = rows
58454                         .filter(function(row) { return row.key && row.key.trim() !== ''; })
58455                         .map(function(row) { return stringify(row.key) + '=' + stringify(row.value); })
58456                         .join('\n');
58457
58458                     return _state === 'hover' ? str : str + '\n';
58459                 }
58460
58461
58462                 function textChanged() {
58463                     var newText = this.value.trim();
58464                     var newTags = {};
58465                     newText.split('\n').forEach(function(row) {
58466                         var m = row.match(/^\s*([^=]+)=(.*)$/);
58467                         if (m !== null) {
58468                             var k = unstringify(m[1].trim());
58469                             var v = unstringify(m[2].trim());
58470                             newTags[k] = v;
58471                         }
58472                     });
58473
58474                     var tagDiff = utilTagDiff(_tags, newTags);
58475                     if (!tagDiff.length) return;
58476
58477                     _pendingChange  = _pendingChange || {};
58478
58479                     tagDiff.forEach(function(change) {
58480                         if (isReadOnly({ key: change.key })) return;
58481
58482                         if (change.type === '-') {
58483                             _pendingChange[change.key] = undefined;
58484                         } else if (change.type === '+') {
58485                             _pendingChange[change.key] = change.newVal || '';
58486                         }
58487                     });
58488
58489                     scheduleChange();
58490                 }
58491
58492
58493                 function pushMore() {
58494                     if (event.keyCode === 9 && !event.shiftKey &&
58495                         list.selectAll('li:last-child input.value').node() === this) {
58496                         addTag();
58497                     }
58498                 }
58499
58500
58501                 function bindTypeahead(key, value) {
58502                     if (isReadOnly(key.datum())) return;
58503
58504                     var geometry = context.geometry(_entityID);
58505
58506                     key.call(uiCombobox(context, 'tag-key')
58507                         .fetcher(function(value, callback) {
58508                             taginfo.keys({
58509                                 debounce: true,
58510                                 geometry: geometry,
58511                                 query: value
58512                             }, function(err, data) {
58513                                 if (!err) {
58514                                     var filtered = data.filter(function(d) { return _tags[d.value] === undefined; });
58515                                     callback(sort(value, filtered));
58516                                 }
58517                             });
58518                         }));
58519
58520                     value.call(uiCombobox(context, 'tag-value')
58521                         .fetcher(function(value, callback) {
58522                             taginfo.values({
58523                                 debounce: true,
58524                                 key: utilGetSetValue(key),
58525                                 geometry: geometry,
58526                                 query: value
58527                             }, function(err, data) {
58528                                 if (!err) callback(sort(value, data));
58529                             });
58530                         }));
58531
58532
58533                     function sort(value, data) {
58534                         var sameletter = [];
58535                         var other = [];
58536                         for (var i = 0; i < data.length; i++) {
58537                             if (data[i].value.substring(0, value.length) === value) {
58538                                 sameletter.push(data[i]);
58539                             } else {
58540                                 other.push(data[i]);
58541                             }
58542                         }
58543                         return sameletter.concat(other);
58544                     }
58545                 }
58546
58547
58548                 function unbind() {
58549                     var row = d3_select(this);
58550
58551                     row.selectAll('input.key')
58552                         .call(uiCombobox.off);
58553
58554                     row.selectAll('input.value')
58555                         .call(uiCombobox.off);
58556                 }
58557
58558
58559                 function keyChange(d) {
58560                     var kOld = d.key;
58561                     var kNew = this.value.trim();
58562                     var row = this.parentNode.parentNode;
58563                     var inputVal = d3_select(row).selectAll('input.value');
58564                     var vNew = utilGetSetValue(inputVal);
58565
58566                     // allow no change if the key should be readonly
58567                     if (isReadOnly({ key: kNew })) {
58568                         this.value = kOld;
58569                         return;
58570                     }
58571
58572                     // switch focus if key is already in use
58573                     if (kNew && kNew !== kOld) {
58574                         if (_tags[kNew] !== undefined) {      // new key is already in use
58575                             this.value = kOld;                // reset the key
58576                             list.selectAll('input.value')
58577                                 .each(function(d) {
58578                                     if (d.key === kNew) {     // send focus to that other value combo instead
58579                                         var input = d3_select(this).node();
58580                                         input.focus();
58581                                         input.select();
58582                                     }
58583                                 });
58584                             return;
58585                         }
58586                     }
58587
58588                     _pendingChange  = _pendingChange || {};
58589
58590                     // exit if we are currently about to delete this row anyway - #6366
58591                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58592
58593                     if (kOld) {
58594                         _pendingChange[kOld] = undefined;
58595                     }
58596
58597                     _pendingChange[kNew] = vNew;
58598
58599                     d.key = kNew;    // update datum to avoid exit/enter on tag update
58600                     d.value = vNew;
58601
58602                     this.value = kNew;
58603                     utilGetSetValue(inputVal, vNew);
58604                     scheduleChange();
58605                 }
58606
58607
58608                 function valueChange(d) {
58609                     if (isReadOnly(d)) return;
58610
58611                     _pendingChange  = _pendingChange || {};
58612
58613                     // exit if we are currently about to delete this row anyway - #6366
58614                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58615
58616                     _pendingChange[d.key] = this.value;
58617                     scheduleChange();
58618                 }
58619
58620
58621                 function removeTag(d) {
58622                     if (isReadOnly(d)) return;
58623
58624                     if (d.key === '') {    // removing the blank row
58625                         _showBlank = false;
58626                         content(wrap);
58627
58628                     } else {
58629                         // remove from indexedKeys too, so that if the user puts it back,
58630                         // it will be sorted to the end and not back to its original position
58631                         _indexedKeys = _indexedKeys.filter(function(row) { return row.key !== d.key; });
58632
58633                         _pendingChange  = _pendingChange || {};
58634                         _pendingChange[d.key] = undefined;
58635                         scheduleChange();
58636                     }
58637                 }
58638
58639
58640                 function addTag() {
58641                     // Delay render in case this click is blurring an edited combo.
58642                     // Without the setTimeout, the `content` render would wipe out the pending tag change.
58643                     window.setTimeout(function() {
58644                         _showBlank = true;
58645                         content(wrap);
58646                         list.selectAll('li:last-child input.key').node().focus();
58647                     }, 20);
58648                 }
58649
58650
58651                 function scheduleChange() {
58652                     // Delay change in case this change is blurring an edited combo. - #5878
58653                     window.setTimeout(function() {
58654                         dispatch$1.call('change', this, _pendingChange);
58655                         _pendingChange = null;
58656                     }, 10);
58657                 }
58658
58659             }
58660
58661
58662             rawTagEditor.state = function(val) {
58663                 if (!arguments.length) return _state;
58664                 if (_state !== val) {
58665                     _indexedKeys = [];
58666                     _state = val;
58667                 }
58668                 return rawTagEditor;
58669             };
58670
58671
58672             rawTagEditor.preset = function(val) {
58673                 if (!arguments.length) return _preset;
58674                 _preset = val;
58675                 if (_preset.isFallback()) {
58676                     _expanded = true;
58677                     _updatePreference = false;
58678                 } else {
58679                     _expanded = undefined;
58680                     _updatePreference = true;
58681                 }
58682                 return rawTagEditor;
58683             };
58684
58685
58686             rawTagEditor.tags = function(val) {
58687                 if (!arguments.length) return _tags;
58688                 _tags = val;
58689                 return rawTagEditor;
58690             };
58691
58692
58693             rawTagEditor.entityID = function(val) {
58694                 if (!arguments.length) return _entityID;
58695                 if (_entityID !== val) {
58696                     _indexedKeys = [];
58697                     _entityID = val;
58698                 }
58699                 return rawTagEditor;
58700             };
58701
58702
58703             rawTagEditor.expanded = function(val) {
58704                 if (!arguments.length) return _expanded;
58705                 _expanded = val;
58706                 _updatePreference = false;
58707                 return rawTagEditor;
58708             };
58709
58710
58711             // pass an array of regular expressions to test against the tag key
58712             rawTagEditor.readOnlyTags = function(val) {
58713                 if (!arguments.length) return _readOnlyTags;
58714                 _readOnlyTags = val;
58715                 return rawTagEditor;
58716             };
58717
58718
58719             return utilRebind(rawTagEditor, dispatch$1, 'on');
58720         }
58721
58722         function uiDataEditor(context) {
58723             var dataHeader = uiDataHeader();
58724             var quickLinks = uiQuickLinks();
58725             var rawTagEditor = uiRawTagEditor(context);
58726             var _datum;
58727
58728
58729             function dataEditor(selection) {
58730                 // quick links
58731                 var choices = [{
58732                     id: 'zoom_to',
58733                     label: 'inspector.zoom_to.title',
58734                     tooltip: function() {
58735                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
58736                     },
58737                     click: function zoomTo() {
58738                         context.mode().zoomToSelected();
58739                     }
58740                 }];
58741
58742
58743                 var header = selection.selectAll('.header')
58744                     .data([0]);
58745
58746                 var headerEnter = header.enter()
58747                     .append('div')
58748                     .attr('class', 'header fillL');
58749
58750                 headerEnter
58751                     .append('button')
58752                     .attr('class', 'fr data-editor-close')
58753                     .on('click', function() {
58754                         context.enter(modeBrowse(context));
58755                     })
58756                     .call(svgIcon('#iD-icon-close'));
58757
58758                 headerEnter
58759                     .append('h3')
58760                     .text(t('map_data.title'));
58761
58762
58763                 var body = selection.selectAll('.body')
58764                     .data([0]);
58765
58766                 body = body.enter()
58767                     .append('div')
58768                     .attr('class', 'body')
58769                     .merge(body);
58770
58771                 var editor = body.selectAll('.data-editor')
58772                     .data([0]);
58773
58774                 // enter/update
58775                 editor.enter()
58776                     .append('div')
58777                     .attr('class', 'modal-section data-editor')
58778                     .merge(editor)
58779                     .call(dataHeader.datum(_datum))
58780                     .call(quickLinks.choices(choices));
58781
58782                 var rte = body.selectAll('.raw-tag-editor')
58783                     .data([0]);
58784
58785                 // enter/update
58786                 rte.enter()
58787                     .append('div')
58788                     .attr('class', 'raw-tag-editor inspector-inner data-editor')
58789                     .merge(rte)
58790                     .call(rawTagEditor
58791                         .expanded(true)
58792                         .readOnlyTags([/./])
58793                         .tags((_datum && _datum.properties) || {})
58794                         .state('hover')
58795                     )
58796                     .selectAll('textarea.tag-text')
58797                     .property('disabled', true)
58798                     .classed('readonly', true);
58799             }
58800
58801
58802             dataEditor.datum = function(val) {
58803                 if (!arguments.length) return _datum;
58804                 _datum = val;
58805                 return this;
58806             };
58807
58808
58809             return dataEditor;
58810         }
58811
58812         function modeSelectData(context, selectedDatum) {
58813             var mode = {
58814                 id: 'select-data',
58815                 button: 'browse'
58816             };
58817
58818             var keybinding = utilKeybinding('select-data');
58819             var dataEditor = uiDataEditor(context);
58820
58821             var behaviors = [
58822                 behaviorBreathe(),
58823                 behaviorHover(context),
58824                 behaviorSelect(context),
58825                 behaviorLasso(context),
58826                 modeDragNode(context).behavior,
58827                 modeDragNote(context).behavior
58828             ];
58829
58830
58831             // class the data as selected, or return to browse mode if the data is gone
58832             function selectData(drawn) {
58833                 var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
58834
58835                 if (selection.empty()) {
58836                     // Return to browse mode if selected DOM elements have
58837                     // disappeared because the user moved them out of view..
58838                     var source = event && event.type === 'zoom' && event.sourceEvent;
58839                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
58840                         context.enter(modeBrowse(context));
58841                     }
58842                 } else {
58843                     selection.classed('selected', true);
58844                 }
58845             }
58846
58847
58848             function esc() {
58849                 if (d3_select('.combobox').size()) return;
58850                 context.enter(modeBrowse(context));
58851             }
58852
58853
58854             mode.zoomToSelected = function() {
58855                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58856                 context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
58857             };
58858
58859
58860             mode.enter = function() {
58861                 behaviors.forEach(context.install);
58862
58863                 keybinding
58864                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
58865                     .on('⎋', esc, true);
58866
58867                 d3_select(document)
58868                     .call(keybinding);
58869
58870                 selectData();
58871
58872                 var sidebar = context.ui().sidebar;
58873                 sidebar.show(dataEditor.datum(selectedDatum));
58874
58875                 // expand the sidebar, avoid obscuring the data if needed
58876                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58877                 sidebar.expand(sidebar.intersects(extent));
58878
58879                 context.map()
58880                     .on('drawn.select-data', selectData);
58881             };
58882
58883
58884             mode.exit = function() {
58885                 behaviors.forEach(context.uninstall);
58886
58887                 d3_select(document)
58888                     .call(keybinding.unbind);
58889
58890                 context.surface()
58891                     .selectAll('.layer-mapdata .selected')
58892                     .classed('selected hover', false);
58893
58894                 context.map()
58895                     .on('drawn.select-data', null);
58896
58897                 context.ui().sidebar
58898                     .hide();
58899             };
58900
58901
58902             return mode;
58903         }
58904
58905         function uiImproveOsmComments() {
58906             var _error;
58907
58908
58909             function errorComments(selection) {
58910                 // make the div immediately so it appears above the buttons
58911                 var comments = selection.selectAll('.comments-container')
58912                     .data([0]);
58913
58914                 comments = comments.enter()
58915                     .append('div')
58916                     .attr('class', 'comments-container')
58917                     .merge(comments);
58918
58919                 // must retrieve comments from API before they can be displayed
58920                 services$1.improveOSM.getComments(_error, function(err, d) {
58921                     if (!d.comments) { return; } // nothing to do here
58922
58923                     var commentEnter = comments.selectAll('.comment')
58924                         .data(d.comments)
58925                         .enter()
58926                         .append('div')
58927                         .attr('class', 'comment');
58928
58929                     commentEnter
58930                         .append('div')
58931                         .attr('class', 'comment-avatar')
58932                         .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
58933
58934                     var mainEnter = commentEnter
58935                         .append('div')
58936                         .attr('class', 'comment-main');
58937
58938                     var metadataEnter = mainEnter
58939                         .append('div')
58940                         .attr('class', 'comment-metadata');
58941
58942                     metadataEnter
58943                         .append('div')
58944                         .attr('class', 'comment-author')
58945                         .each(function(d) {
58946                             var selection = d3_select(this);
58947                             var osm = services$1.osm;
58948                             if (osm && d.username) {
58949                                 selection = selection
58950                                     .append('a')
58951                                     .attr('class', 'comment-author-link')
58952                                     .attr('href', osm.userURL(d.username))
58953                                     .attr('tabindex', -1)
58954                                     .attr('target', '_blank');
58955                             }
58956                             selection
58957                                 .text(function(d) { return d.username; });
58958                         });
58959
58960                     metadataEnter
58961                         .append('div')
58962                         .attr('class', 'comment-date')
58963                         .text(function(d) {
58964                             return t('note.status.commented', { when: localeDateString(d.timestamp) });
58965                         });
58966
58967                     mainEnter
58968                         .append('div')
58969                         .attr('class', 'comment-text')
58970                         .append('p')
58971                         .text(function(d) { return d.text; });
58972                 });
58973             }
58974
58975             function localeDateString(s) {
58976                 if (!s) return null;
58977                 var detected = utilDetect();
58978                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58979                 var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
58980                 if (isNaN(d.getTime())) return null;
58981                 return d.toLocaleDateString(detected.locale, options);
58982             }
58983
58984             errorComments.error = function(val) {
58985                 if (!arguments.length) return _error;
58986                 _error = val;
58987                 return errorComments;
58988             };
58989
58990             return errorComments;
58991         }
58992
58993         function uiImproveOsmDetails(context) {
58994             var _error;
58995
58996
58997             function errorDetail(d) {
58998                 var unknown = t('inspector.unknown');
58999
59000                 if (!d) return unknown;
59001
59002                 if (d.desc) return d.desc;
59003
59004                 var errorType = d.error_key;
59005                 var et = en.QA.improveOSM.error_types[errorType];
59006
59007                 var detail;
59008                 if (et && et.description) {
59009                     detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
59010                 } else {
59011                     detail = unknown;
59012                 }
59013
59014                 return detail;
59015             }
59016
59017
59018             function improveOsmDetails(selection) {
59019                 var details = selection.selectAll('.error-details')
59020                     .data(
59021                         (_error ? [_error] : []),
59022                         function(d) { return d.id + '-' + (d.status || 0); }
59023                     );
59024
59025                 details.exit()
59026                     .remove();
59027
59028                 var detailsEnter = details.enter()
59029                     .append('div')
59030                     .attr('class', 'error-details error-details-container');
59031
59032
59033                 // description
59034                 var descriptionEnter = detailsEnter
59035                     .append('div')
59036                     .attr('class', 'error-details-description');
59037
59038                 descriptionEnter
59039                     .append('h4')
59040                     .text(function() { return t('QA.keepRight.detail_description'); });
59041
59042                 descriptionEnter
59043                     .append('div')
59044                     .attr('class', 'error-details-description-text')
59045                     .html(errorDetail);
59046
59047                 // If there are entity links in the error message..
59048                 var relatedEntities = [];
59049                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59050                     .each(function() {
59051                         var link = d3_select(this);
59052                         var isObjectLink = link.classed('error_object_link');
59053                         var entityID = isObjectLink ?
59054                             (utilEntityRoot(_error.object_type) + _error.object_id)
59055                             : this.textContent;
59056                         var entity = context.hasEntity(entityID);
59057
59058                         relatedEntities.push(entityID);
59059
59060                         // Add click handler
59061                         link
59062                             .on('mouseover', function() {
59063                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59064                                     .classed('hover', true);
59065                             })
59066                             .on('mouseout', function() {
59067                                 context.surface().selectAll('.hover')
59068                                     .classed('hover', false);
59069                             })
59070                             .on('click', function() {
59071                                 event.preventDefault();
59072                                 var osmlayer = context.layers().layer('osm');
59073                                 if (!osmlayer.enabled()) {
59074                                     osmlayer.enabled(true);
59075                                 }
59076
59077                                 context.map().centerZoom(_error.loc, 20);
59078
59079                                 if (entity) {
59080                                     context.enter(modeSelect(context, [entityID]));
59081                                 } else {
59082                                     context.loadEntity(entityID, function() {
59083                                         context.enter(modeSelect(context, [entityID]));
59084                                     });
59085                                 }
59086                             });
59087
59088                         // Replace with friendly name if possible
59089                         // (The entity may not yet be loaded into the graph)
59090                         if (entity) {
59091                             var name = utilDisplayName(entity);  // try to use common name
59092
59093                             if (!name && !isObjectLink) {
59094                                 var preset = context.presets().match(entity, context.graph());
59095                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59096                             }
59097
59098                             if (name) {
59099                                 this.innerText = name;
59100                             }
59101                         }
59102                     });
59103
59104                 // Don't hide entities related to this error - #5880
59105                 context.features().forceVisible(relatedEntities);
59106             }
59107
59108
59109             improveOsmDetails.error = function(val) {
59110                 if (!arguments.length) return _error;
59111                 _error = val;
59112                 return improveOsmDetails;
59113             };
59114
59115
59116             return improveOsmDetails;
59117         }
59118
59119         function uiImproveOsmHeader() {
59120             var _error;
59121
59122
59123             function errorTitle(d) {
59124                 var unknown = t('inspector.unknown');
59125
59126                 if (!d) return unknown;
59127                 var errorType = d.error_key;
59128                 var et = en.QA.improveOSM.error_types[errorType];
59129
59130                 if (et && et.title) {
59131                     return t('QA.improveOSM.error_types.' + errorType + '.title');
59132                 } else {
59133                     return unknown;
59134                 }
59135             }
59136
59137
59138             function improveOsmHeader(selection) {
59139                 var header = selection.selectAll('.error-header')
59140                     .data(
59141                         (_error ? [_error] : []),
59142                         function(d) { return d.id + '-' + (d.status || 0); }
59143                     );
59144
59145                 header.exit()
59146                     .remove();
59147
59148                 var headerEnter = header.enter()
59149                     .append('div')
59150                     .attr('class', 'error-header');
59151
59152                 var iconEnter = headerEnter
59153                     .append('div')
59154                     .attr('class', 'error-header-icon')
59155                     .classed('new', function(d) { return d.id < 0; });
59156
59157                 var svgEnter = iconEnter
59158                     .append('svg')
59159                     .attr('width', '20px')
59160                     .attr('height', '30px')
59161                     .attr('viewbox', '0 0 20 30')
59162                     .attr('class', function(d) {
59163                         return [
59164                             'preset-icon-28',
59165                             'qa_error',
59166                             d.service,
59167                             'error_id-' + d.id,
59168                             'error_type-' + d.error_type,
59169                             'category-' + d.category
59170                         ].join(' ');
59171                     });
59172
59173                 svgEnter
59174                     .append('polygon')
59175                     .attr('fill', 'currentColor')
59176                     .attr('class', 'qa_error-fill')
59177                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
59178
59179                 svgEnter
59180                     .append('use')
59181                     .attr('class', 'icon-annotation')
59182                     .attr('width', '11px')
59183                     .attr('height', '11px')
59184                     .attr('transform', 'translate(4.5, 7)')
59185                     .attr('xlink:href', function(d) {
59186                         var picon = d.icon;
59187
59188                         if (!picon) {
59189                             return '';
59190                         } else {
59191                             var isMaki = /^maki-/.test(picon);
59192                             return '#' + picon + (isMaki ? '-11' : '');
59193                         }
59194                     });
59195
59196                 headerEnter
59197                     .append('div')
59198                     .attr('class', 'error-header-label')
59199                     .text(errorTitle);
59200             }
59201
59202
59203             improveOsmHeader.error = function(val) {
59204                 if (!arguments.length) return _error;
59205                 _error = val;
59206                 return improveOsmHeader;
59207             };
59208
59209
59210             return improveOsmHeader;
59211         }
59212
59213         function uiImproveOsmEditor(context) {
59214             var dispatch$1 = dispatch('change');
59215             var errorDetails = uiImproveOsmDetails(context);
59216             var errorComments = uiImproveOsmComments();
59217             var errorHeader = uiImproveOsmHeader();
59218             var quickLinks = uiQuickLinks();
59219
59220             var _error;
59221
59222
59223             function improveOsmEditor(selection) {
59224                 // quick links
59225                 var choices = [{
59226                     id: 'zoom_to',
59227                     label: 'inspector.zoom_to.title',
59228                     tooltip: function() {
59229                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59230                     },
59231                     click: function zoomTo() {
59232                         context.mode().zoomToSelected();
59233                     }
59234                 }];
59235
59236
59237                 var header = selection.selectAll('.header')
59238                     .data([0]);
59239
59240                 var headerEnter = header.enter()
59241                     .append('div')
59242                     .attr('class', 'header fillL');
59243
59244                 headerEnter
59245                     .append('button')
59246                     .attr('class', 'fr error-editor-close')
59247                     .on('click', function() {
59248                         context.enter(modeBrowse(context));
59249                     })
59250                     .call(svgIcon('#iD-icon-close'));
59251
59252                 headerEnter
59253                     .append('h3')
59254                     .text(t('QA.improveOSM.title'));
59255
59256
59257                 var body = selection.selectAll('.body')
59258                     .data([0]);
59259
59260                 body = body.enter()
59261                     .append('div')
59262                     .attr('class', 'body')
59263                     .merge(body);
59264
59265                 var editor = body.selectAll('.error-editor')
59266                     .data([0]);
59267
59268                 editor.enter()
59269                     .append('div')
59270                     .attr('class', 'modal-section error-editor')
59271                     .merge(editor)
59272                     .call(errorHeader.error(_error))
59273                     .call(quickLinks.choices(choices))
59274                     .call(errorDetails.error(_error))
59275                     .call(errorComments.error(_error))
59276                     .call(improveOsmSaveSection);
59277             }
59278
59279             function improveOsmSaveSection(selection) {
59280                 var isSelected = (_error && _error.id === context.selectedErrorID());
59281                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59282                 var saveSection = selection.selectAll('.error-save')
59283                     .data(
59284                         (isShown ? [_error] : []),
59285                         function(d) { return d.id + '-' + (d.status || 0); }
59286                     );
59287
59288                 // exit
59289                 saveSection.exit()
59290                     .remove();
59291
59292                 // enter
59293                 var saveSectionEnter = saveSection.enter()
59294                     .append('div')
59295                     .attr('class', 'error-save save-section cf');
59296
59297                 saveSectionEnter
59298                     .append('h4')
59299                     .attr('class', '.error-save-header')
59300                     .text(t('note.newComment'));
59301
59302                 saveSectionEnter
59303                     .append('textarea')
59304                     .attr('class', 'new-comment-input')
59305                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59306                     .attr('maxlength', 1000)
59307                     .property('value', function(d) { return d.newComment; })
59308                     .call(utilNoAuto)
59309                     .on('input', changeInput)
59310                     .on('blur', changeInput);
59311
59312                 // update
59313                 saveSection = saveSectionEnter
59314                     .merge(saveSection)
59315                     .call(errorSaveButtons);
59316
59317                 function changeInput() {
59318                     var input = d3_select(this);
59319                     var val = input.property('value').trim();
59320
59321                     if (val === '') {
59322                         val = undefined;
59323                     }
59324
59325                     // store the unsaved comment with the error itself
59326                     _error = _error.update({ newComment: val });
59327
59328                     var errorService = services$1.improveOSM;
59329                     if (errorService) {
59330                         errorService.replaceError(_error);
59331                     }
59332
59333                     saveSection
59334                         .call(errorSaveButtons);
59335                 }
59336             }
59337
59338             function errorSaveButtons(selection) {
59339                 var isSelected = (_error && _error.id === context.selectedErrorID());
59340                 var buttonSection = selection.selectAll('.buttons')
59341                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59342
59343                 // exit
59344                 buttonSection.exit()
59345                     .remove();
59346
59347                 // enter
59348                 var buttonEnter = buttonSection.enter()
59349                     .append('div')
59350                     .attr('class', 'buttons');
59351
59352                 buttonEnter
59353                     .append('button')
59354                     .attr('class', 'button comment-button action')
59355                     .text(t('QA.keepRight.save_comment'));
59356
59357                 buttonEnter
59358                     .append('button')
59359                     .attr('class', 'button close-button action');
59360
59361                 buttonEnter
59362                     .append('button')
59363                     .attr('class', 'button ignore-button action');
59364
59365
59366                 // update
59367                 buttonSection = buttonSection
59368                     .merge(buttonEnter);
59369
59370                 buttonSection.select('.comment-button')
59371                     .attr('disabled', function(d) {
59372                         return d.newComment === undefined ? true : null;
59373                     })
59374                     .on('click.comment', function(d) {
59375                         this.blur();    // avoid keeping focus on the button - #4641
59376                         var errorService = services$1.improveOSM;
59377                         if (errorService) {
59378                             errorService.postUpdate(d, function(err, error) {
59379                                 dispatch$1.call('change', error);
59380                             });
59381                         }
59382                     });
59383
59384                 buttonSection.select('.close-button')
59385                     .text(function(d) {
59386                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59387                         return t('QA.keepRight.close' + andComment);
59388                     })
59389                     .on('click.close', function(d) {
59390                         this.blur();    // avoid keeping focus on the button - #4641
59391                         var errorService = services$1.improveOSM;
59392                         if (errorService) {
59393                             d.newStatus = 'SOLVED';
59394                             errorService.postUpdate(d, function(err, error) {
59395                                 dispatch$1.call('change', error);
59396                             });
59397                         }
59398                     });
59399
59400                 buttonSection.select('.ignore-button')
59401                     .text(function(d) {
59402                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59403                         return t('QA.keepRight.ignore' + andComment);
59404                     })
59405                     .on('click.ignore', function(d) {
59406                         this.blur();    // avoid keeping focus on the button - #4641
59407                         var errorService = services$1.improveOSM;
59408                         if (errorService) {
59409                             d.newStatus = 'INVALID';
59410                             errorService.postUpdate(d, function(err, error) {
59411                                 dispatch$1.call('change', error);
59412                             });
59413                         }
59414                     });
59415             }
59416
59417             improveOsmEditor.error = function(val) {
59418                 if (!arguments.length) return _error;
59419                 _error = val;
59420                 return improveOsmEditor;
59421             };
59422
59423
59424             return utilRebind(improveOsmEditor, dispatch$1, 'on');
59425         }
59426
59427         function uiKeepRightDetails(context) {
59428             var _error;
59429
59430
59431             function errorDetail(d) {
59432                 var unknown = t('inspector.unknown');
59433
59434                 if (!d) return unknown;
59435                 var errorType = d.error_type;
59436                 var parentErrorType = d.parent_error_type;
59437
59438                 var et = en.QA.keepRight.errorTypes[errorType];
59439                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59440
59441                 var detail;
59442                 if (et && et.description) {
59443                     detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
59444                 } else if (pt && pt.description) {
59445                     detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
59446                 } else {
59447                     detail = unknown;
59448                 }
59449
59450                 return detail;
59451             }
59452
59453
59454             function keepRightDetails(selection) {
59455                 var details = selection.selectAll('.error-details')
59456                     .data(
59457                         (_error ? [_error] : []),
59458                         function(d) { return d.id + '-' + (d.status || 0); }
59459                     );
59460
59461                 details.exit()
59462                     .remove();
59463
59464                 var detailsEnter = details.enter()
59465                     .append('div')
59466                     .attr('class', 'error-details error-details-container');
59467
59468
59469                 // description
59470                 var descriptionEnter = detailsEnter
59471                     .append('div')
59472                     .attr('class', 'error-details-description');
59473
59474                 descriptionEnter
59475                     .append('h4')
59476                     .text(function() { return t('QA.keepRight.detail_description'); });
59477
59478                 descriptionEnter
59479                     .append('div')
59480                     .attr('class', 'error-details-description-text')
59481                     .html(errorDetail);
59482
59483                 // If there are entity links in the error message..
59484                 var relatedEntities = [];
59485                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59486                     .each(function() {
59487                         var link = d3_select(this);
59488                         var isObjectLink = link.classed('error_object_link');
59489                         var entityID = isObjectLink ?
59490                             (utilEntityRoot(_error.object_type) + _error.object_id)
59491                             : this.textContent;
59492                         var entity = context.hasEntity(entityID);
59493
59494                         relatedEntities.push(entityID);
59495
59496                         // Add click handler
59497                         link
59498                             .on('mouseover', function() {
59499                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59500                                     .classed('hover', true);
59501                             })
59502                             .on('mouseout', function() {
59503                                 context.surface().selectAll('.hover')
59504                                     .classed('hover', false);
59505                             })
59506                             .on('click', function() {
59507                                 event.preventDefault();
59508                                 var osmlayer = context.layers().layer('osm');
59509                                 if (!osmlayer.enabled()) {
59510                                     osmlayer.enabled(true);
59511                                 }
59512
59513                                 context.map().centerZoomEase(_error.loc, 20);
59514
59515                                 if (entity) {
59516                                     context.enter(modeSelect(context, [entityID]));
59517                                 } else {
59518                                     context.loadEntity(entityID, function() {
59519                                         context.enter(modeSelect(context, [entityID]));
59520                                     });
59521                                 }
59522                             });
59523
59524                         // Replace with friendly name if possible
59525                         // (The entity may not yet be loaded into the graph)
59526                         if (entity) {
59527                             var name = utilDisplayName(entity);  // try to use common name
59528
59529                             if (!name && !isObjectLink) {
59530                                 var preset = context.presets().match(entity, context.graph());
59531                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59532                             }
59533
59534                             if (name) {
59535                                 this.innerText = name;
59536                             }
59537                         }
59538                     });
59539
59540                 // Don't hide entities related to this error - #5880
59541                 context.features().forceVisible(relatedEntities);
59542             }
59543
59544
59545             keepRightDetails.error = function(val) {
59546                 if (!arguments.length) return _error;
59547                 _error = val;
59548                 return keepRightDetails;
59549             };
59550
59551
59552             return keepRightDetails;
59553         }
59554
59555         function uiKeepRightHeader() {
59556             var _error;
59557
59558
59559             function errorTitle(d) {
59560                 var unknown = t('inspector.unknown');
59561
59562                 if (!d) return unknown;
59563                 var errorType = d.error_type;
59564                 var parentErrorType = d.parent_error_type;
59565
59566                 var et = en.QA.keepRight.errorTypes[errorType];
59567                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59568
59569                 if (et && et.title) {
59570                     return t('QA.keepRight.errorTypes.' + errorType + '.title');
59571                 } else if (pt && pt.title) {
59572                     return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
59573                 } else {
59574                     return unknown;
59575                 }
59576             }
59577
59578
59579             function keepRightHeader(selection) {
59580                 var header = selection.selectAll('.error-header')
59581                     .data(
59582                         (_error ? [_error] : []),
59583                         function(d) { return d.id + '-' + (d.status || 0); }
59584                     );
59585
59586                 header.exit()
59587                     .remove();
59588
59589                 var headerEnter = header.enter()
59590                     .append('div')
59591                     .attr('class', 'error-header');
59592
59593                 var iconEnter = headerEnter
59594                     .append('div')
59595                     .attr('class', 'error-header-icon')
59596                     .classed('new', function(d) { return d.id < 0; });
59597
59598                 iconEnter
59599                     .append('div')
59600                     .attr('class', function(d) {
59601                         return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
59602                     })
59603                     .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
59604
59605                 headerEnter
59606                     .append('div')
59607                     .attr('class', 'error-header-label')
59608                     .text(errorTitle);
59609             }
59610
59611
59612             keepRightHeader.error = function(val) {
59613                 if (!arguments.length) return _error;
59614                 _error = val;
59615                 return keepRightHeader;
59616             };
59617
59618
59619             return keepRightHeader;
59620         }
59621
59622         function uiViewOnKeepRight() {
59623             var _error;   // a keepright error
59624
59625
59626             function viewOnKeepRight(selection) {
59627                 var url;
59628                 if (services$1.keepRight && (_error instanceof qaError)) {
59629                     url = services$1.keepRight.errorURL(_error);
59630                 }
59631
59632                 var link = selection.selectAll('.view-on-keepRight')
59633                     .data(url ? [url] : []);
59634
59635                 // exit
59636                 link.exit()
59637                     .remove();
59638
59639                 // enter
59640                 var linkEnter = link.enter()
59641                     .append('a')
59642                     .attr('class', 'view-on-keepRight')
59643                     .attr('target', '_blank')
59644                     .attr('href', function(d) { return d; })
59645                     .call(svgIcon('#iD-icon-out-link', 'inline'));
59646
59647                 linkEnter
59648                     .append('span')
59649                     .text(t('inspector.view_on_keepRight'));
59650             }
59651
59652
59653             viewOnKeepRight.what = function(val) {
59654                 if (!arguments.length) return _error;
59655                 _error = val;
59656                 return viewOnKeepRight;
59657             };
59658
59659             return viewOnKeepRight;
59660         }
59661
59662         function uiKeepRightEditor(context) {
59663             var dispatch$1 = dispatch('change');
59664             var keepRightDetails = uiKeepRightDetails(context);
59665             var keepRightHeader = uiKeepRightHeader();
59666             var quickLinks = uiQuickLinks();
59667
59668             var _error;
59669
59670
59671             function keepRightEditor(selection) {
59672                 // quick links
59673                 var choices = [{
59674                     id: 'zoom_to',
59675                     label: 'inspector.zoom_to.title',
59676                     tooltip: function() {
59677                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59678                     },
59679                     click: function zoomTo() {
59680                         context.mode().zoomToSelected();
59681                     }
59682                 }];
59683
59684
59685                 var header = selection.selectAll('.header')
59686                     .data([0]);
59687
59688                 var headerEnter = header.enter()
59689                     .append('div')
59690                     .attr('class', 'header fillL');
59691
59692                 headerEnter
59693                     .append('button')
59694                     .attr('class', 'fr error-editor-close')
59695                     .on('click', function() {
59696                         context.enter(modeBrowse(context));
59697                     })
59698                     .call(svgIcon('#iD-icon-close'));
59699
59700                 headerEnter
59701                     .append('h3')
59702                     .text(t('QA.keepRight.title'));
59703
59704
59705                 var body = selection.selectAll('.body')
59706                     .data([0]);
59707
59708                 body = body.enter()
59709                     .append('div')
59710                     .attr('class', 'body')
59711                     .merge(body);
59712
59713                 var editor = body.selectAll('.error-editor')
59714                     .data([0]);
59715
59716                 editor.enter()
59717                     .append('div')
59718                     .attr('class', 'modal-section error-editor')
59719                     .merge(editor)
59720                     .call(keepRightHeader.error(_error))
59721                     .call(quickLinks.choices(choices))
59722                     .call(keepRightDetails.error(_error))
59723                     .call(keepRightSaveSection);
59724
59725
59726                 var footer = selection.selectAll('.footer')
59727                     .data([0]);
59728
59729                 footer.enter()
59730                     .append('div')
59731                     .attr('class', 'footer')
59732                     .merge(footer)
59733                     .call(uiViewOnKeepRight().what(_error));
59734             }
59735
59736
59737             function keepRightSaveSection(selection) {
59738                 var isSelected = (_error && _error.id === context.selectedErrorID());
59739                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59740                 var saveSection = selection.selectAll('.error-save')
59741                     .data(
59742                         (isShown ? [_error] : []),
59743                         function(d) { return d.id + '-' + (d.status || 0); }
59744                     );
59745
59746                 // exit
59747                 saveSection.exit()
59748                     .remove();
59749
59750                 // enter
59751                 var saveSectionEnter = saveSection.enter()
59752                     .append('div')
59753                     .attr('class', 'error-save save-section cf');
59754
59755                 saveSectionEnter
59756                     .append('h4')
59757                     .attr('class', '.error-save-header')
59758                     .text(t('QA.keepRight.comment'));
59759
59760                 saveSectionEnter
59761                     .append('textarea')
59762                     .attr('class', 'new-comment-input')
59763                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59764                     .attr('maxlength', 1000)
59765                     .property('value', function(d) { return d.newComment || d.comment; })
59766                     .call(utilNoAuto)
59767                     .on('input', changeInput)
59768                     .on('blur', changeInput);
59769
59770                 // update
59771                 saveSection = saveSectionEnter
59772                     .merge(saveSection)
59773                     .call(keepRightSaveButtons);
59774
59775
59776                 function changeInput() {
59777                     var input = d3_select(this);
59778                     var val = input.property('value').trim();
59779
59780                     if (val === _error.comment) {
59781                         val = undefined;
59782                     }
59783
59784                     // store the unsaved comment with the error itself
59785                     _error = _error.update({ newComment: val });
59786
59787                     var keepRight = services$1.keepRight;
59788                     if (keepRight) {
59789                         keepRight.replaceError(_error);  // update keepright cache
59790                     }
59791
59792                     saveSection
59793                         .call(keepRightSaveButtons);
59794                 }
59795             }
59796
59797
59798             function keepRightSaveButtons(selection) {
59799                 var isSelected = (_error && _error.id === context.selectedErrorID());
59800                 var buttonSection = selection.selectAll('.buttons')
59801                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59802
59803                 // exit
59804                 buttonSection.exit()
59805                     .remove();
59806
59807                 // enter
59808                 var buttonEnter = buttonSection.enter()
59809                     .append('div')
59810                     .attr('class', 'buttons');
59811
59812                 buttonEnter
59813                     .append('button')
59814                     .attr('class', 'button comment-button action')
59815                     .text(t('QA.keepRight.save_comment'));
59816
59817                 buttonEnter
59818                     .append('button')
59819                     .attr('class', 'button close-button action');
59820
59821                 buttonEnter
59822                     .append('button')
59823                     .attr('class', 'button ignore-button action');
59824
59825
59826                 // update
59827                 buttonSection = buttonSection
59828                     .merge(buttonEnter);
59829
59830                 buttonSection.select('.comment-button')   // select and propagate data
59831                     .attr('disabled', function(d) {
59832                         return d.newComment === undefined ? true : null;
59833                     })
59834                     .on('click.comment', function(d) {
59835                         this.blur();    // avoid keeping focus on the button - #4641
59836                         var keepRight = services$1.keepRight;
59837                         if (keepRight) {
59838                             keepRight.postKeepRightUpdate(d, function(err, error) {
59839                                 dispatch$1.call('change', error);
59840                             });
59841                         }
59842                     });
59843
59844                 buttonSection.select('.close-button')   // select and propagate data
59845                     .text(function(d) {
59846                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59847                         return t('QA.keepRight.close' + andComment);
59848                     })
59849                     .on('click.close', function(d) {
59850                         this.blur();    // avoid keeping focus on the button - #4641
59851                         var keepRight = services$1.keepRight;
59852                         if (keepRight) {
59853                             d.state = 'ignore_t';   // ignore temporarily (error fixed)
59854                             keepRight.postKeepRightUpdate(d, function(err, error) {
59855                                 dispatch$1.call('change', error);
59856                             });
59857                         }
59858                     });
59859
59860                 buttonSection.select('.ignore-button')   // select and propagate data
59861                     .text(function(d) {
59862                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59863                         return t('QA.keepRight.ignore' + andComment);
59864                     })
59865                     .on('click.ignore', function(d) {
59866                         this.blur();    // avoid keeping focus on the button - #4641
59867                         var keepRight = services$1.keepRight;
59868                         if (keepRight) {
59869                             d.state = 'ignore';   // ignore permanently (false positive)
59870                             keepRight.postKeepRightUpdate(d, function(err, error) {
59871                                 dispatch$1.call('change', error);
59872                             });
59873                         }
59874                     });
59875             }
59876
59877
59878             keepRightEditor.error = function(val) {
59879                 if (!arguments.length) return _error;
59880                 _error = val;
59881                 return keepRightEditor;
59882             };
59883
59884
59885             return utilRebind(keepRightEditor, dispatch$1, 'on');
59886         }
59887
59888         function modeSelectError(context, selectedErrorID, selectedErrorService) {
59889             var mode = {
59890                 id: 'select-error',
59891                 button: 'browse'
59892             };
59893
59894             var keybinding = utilKeybinding('select-error');
59895
59896             var errorService = services$1[selectedErrorService];
59897             var errorEditor;
59898             switch (selectedErrorService) {
59899                 case 'improveOSM':
59900                     errorEditor = uiImproveOsmEditor(context)
59901                     .on('change', function() {
59902                         context.map().pan([0,0]);  // trigger a redraw
59903                         var error = checkSelectedID();
59904                         if (!error) return;
59905                         context.ui().sidebar
59906                             .show(errorEditor.error(error));
59907                     });
59908                     break;
59909                 case 'keepRight':
59910                     errorEditor = uiKeepRightEditor(context)
59911                     .on('change', function() {
59912                         context.map().pan([0,0]);  // trigger a redraw
59913                         var error = checkSelectedID();
59914                         if (!error) return;
59915                         context.ui().sidebar
59916                             .show(errorEditor.error(error));
59917                     });
59918                     break;
59919             }
59920
59921
59922             var behaviors = [
59923                 behaviorBreathe(),
59924                 behaviorHover(context),
59925                 behaviorSelect(context),
59926                 behaviorLasso(context),
59927                 modeDragNode(context).behavior,
59928                 modeDragNote(context).behavior
59929             ];
59930
59931
59932             function checkSelectedID() {
59933                 if (!errorService) return;
59934                 var error = errorService.getError(selectedErrorID);
59935                 if (!error) {
59936                     context.enter(modeBrowse(context));
59937                 }
59938                 return error;
59939             }
59940
59941
59942             mode.zoomToSelected = function() {
59943                 if (!errorService) return;
59944                 var error = errorService.getError(selectedErrorID);
59945                 if (error) {
59946                     context.map().centerZoomEase(error.loc, 20);
59947                 }
59948             };
59949
59950
59951             mode.enter = function() {
59952                 var error = checkSelectedID();
59953                 if (!error) return;
59954
59955                 behaviors.forEach(context.install);
59956                 keybinding
59957                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
59958                     .on('⎋', esc, true);
59959
59960                 d3_select(document)
59961                     .call(keybinding);
59962
59963                 selectError();
59964
59965                 var sidebar = context.ui().sidebar;
59966                 sidebar.show(errorEditor.error(error));
59967
59968                 context.map()
59969                     .on('drawn.select-error', selectError);
59970
59971
59972                 // class the error as selected, or return to browse mode if the error is gone
59973                 function selectError(drawn) {
59974                     if (!checkSelectedID()) return;
59975
59976                     var selection = context.surface()
59977                         .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
59978
59979                     if (selection.empty()) {
59980                         // Return to browse mode if selected DOM elements have
59981                         // disappeared because the user moved them out of view..
59982                         var source = event && event.type === 'zoom' && event.sourceEvent;
59983                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
59984                             context.enter(modeBrowse(context));
59985                         }
59986
59987                     } else {
59988                         selection
59989                             .classed('selected', true);
59990
59991                         context.selectedErrorID(selectedErrorID);
59992                     }
59993                 }
59994
59995                 function esc() {
59996                     if (d3_select('.combobox').size()) return;
59997                     context.enter(modeBrowse(context));
59998                 }
59999             };
60000
60001
60002             mode.exit = function() {
60003                 behaviors.forEach(context.uninstall);
60004
60005                 d3_select(document)
60006                     .call(keybinding.unbind);
60007
60008                 context.surface()
60009                     .selectAll('.qa_error.selected')
60010                     .classed('selected hover', false);
60011
60012                 context.map()
60013                     .on('drawn.select-error', null);
60014
60015                 context.ui().sidebar
60016                     .hide();
60017
60018                 context.selectedErrorID(null);
60019                 context.features().forceVisible([]);
60020             };
60021
60022
60023             return mode;
60024         }
60025
60026         function behaviorSelect(context) {
60027             // legacy option to show menu on every click
60028             var isShowAlways = +context.storage('edit-menu-show-always') === 1;
60029             var tolerance = 4;
60030             var _lastMouse = null;
60031             var _suppressMenu = true;
60032             var _p1 = null;
60033
60034
60035             function point() {
60036                 return d3_mouse(context.container().node());
60037             }
60038
60039
60040             function keydown() {
60041                 var e = event;
60042                 if (e && e.shiftKey) {
60043                     context.surface()
60044                         .classed('behavior-multiselect', true);
60045                 }
60046
60047                 if (e && e.keyCode === 93) {  // context menu
60048                     e.preventDefault();
60049                     e.stopPropagation();
60050                 }
60051             }
60052
60053
60054             function keyup() {
60055                 var e = event;
60056                 if (!e || !e.shiftKey) {
60057                     context.surface()
60058                         .classed('behavior-multiselect', false);
60059                 }
60060
60061
60062                 if (e && e.keyCode === 93) {  // context menu
60063                     e.preventDefault();
60064                     e.stopPropagation();
60065                     contextmenu();
60066                 }
60067             }
60068
60069
60070             function mousedown() {
60071                 if (!_p1) {
60072                     _p1 = point();
60073                 }
60074                 d3_select(window)
60075                     .on('mouseup.select', mouseup, true);
60076
60077                 _suppressMenu = !isShowAlways;
60078             }
60079
60080
60081             function mousemove() {
60082                 if (event) {
60083                     _lastMouse = event;
60084                 }
60085             }
60086
60087
60088             function mouseup() {
60089                 click();
60090             }
60091
60092
60093             function contextmenu() {
60094                 var e = event;
60095                 e.preventDefault();
60096                 e.stopPropagation();
60097
60098                 if (!+e.clientX && !+e.clientY) {
60099                     if (_lastMouse) {
60100                         e.sourceEvent = _lastMouse;
60101                     } else {
60102                         return;
60103                     }
60104                 }
60105
60106                 if (!_p1) {
60107                     _p1 = point();
60108                 }
60109                 _suppressMenu = false;
60110                 click();
60111             }
60112
60113
60114             function click() {
60115                 d3_select(window)
60116                     .on('mouseup.select', null, true);
60117
60118                 if (!_p1) return;
60119                 var p2 = point();
60120                 var dist = geoVecLength(_p1, p2);
60121                 _p1 = null;
60122                 if (dist > tolerance) return;
60123
60124                 // Defer processing the click,
60125                 // because this click may trigger a blur event,
60126                 // and the blur event may trigger a tag change,
60127                 // and we really want that tag change to go to the already selected entity
60128                 // and not the one that we are about to select with the click  #6028, #5878
60129                 // (Be very careful entering modeSelect anywhere that might also blur a field!)
60130                 var datum = event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
60131                 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
60132                 window.setTimeout(function() {
60133                     processClick(datum, isMultiselect);
60134                 }, 20);  // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).
60135             }
60136
60137
60138             function processClick(datum, isMultiselect) {
60139                 var mode = context.mode();
60140
60141                 var entity = datum && datum.properties && datum.properties.entity;
60142                 if (entity) datum = entity;
60143
60144                 if (datum && datum.type === 'midpoint') {
60145                     datum = datum.parents[0];
60146                 }
60147
60148                 if (datum instanceof osmEntity) {    // clicked an entity..
60149                     var selectedIDs = context.selectedIDs();
60150                     context.selectedNoteID(null);
60151                     context.selectedErrorID(null);
60152
60153                     if (!isMultiselect) {
60154                         if (selectedIDs.length > 1 && (!_suppressMenu && !isShowAlways)) {
60155                             // multiple things already selected, just show the menu...
60156                             mode.suppressMenu(false).reselect();
60157                         } else {
60158                             // select a single thing..
60159                             context.enter(modeSelect(context, [datum.id]).suppressMenu(_suppressMenu));
60160                         }
60161
60162                     } else {
60163                         if (selectedIDs.indexOf(datum.id) !== -1) {
60164                             // clicked entity is already in the selectedIDs list..
60165                             if (!_suppressMenu && !isShowAlways) {
60166                                 // don't deselect clicked entity, just show the menu.
60167                                 mode.suppressMenu(false).reselect();
60168                             } else {
60169                                 // deselect clicked entity, then reenter select mode or return to browse mode..
60170                                 selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
60171                                 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
60172                             }
60173                         } else {
60174                             // clicked entity is not in the selected list, add it..
60175                             selectedIDs = selectedIDs.concat([datum.id]);
60176                             context.enter(modeSelect(context, selectedIDs).suppressMenu(_suppressMenu));
60177                         }
60178                     }
60179
60180                 } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
60181                     context
60182                         .selectedNoteID(null)
60183                         .enter(modeSelectData(context, datum));
60184
60185                 } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
60186                     context
60187                         .selectedNoteID(datum.id)
60188                         .enter(modeSelectNote(context, datum.id));
60189
60190                 } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
60191                     context
60192                         .selectedErrorID(datum.id)
60193                         .enter(modeSelectError(context, datum.id, datum.service));
60194
60195                 } else {    // clicked nothing..
60196                     context.selectedNoteID(null);
60197                     context.selectedErrorID(null);
60198                     if (!isMultiselect && mode.id !== 'browse') {
60199                         context.enter(modeBrowse(context));
60200                     }
60201                 }
60202
60203                 // reset for next time..
60204                 _suppressMenu = true;
60205             }
60206
60207
60208             function behavior(selection) {
60209                 _lastMouse = null;
60210                 _suppressMenu = true;
60211                 _p1 = null;
60212
60213                 d3_select(window)
60214                     .on('keydown.select', keydown)
60215                     .on('keyup.select', keyup)
60216                     .on('contextmenu.select-window', function() {
60217                         // Edge and IE really like to show the contextmenu on the
60218                         // menubar when user presses a keyboard menu button
60219                         // even after we've already preventdefaulted the key event.
60220                         var e = event;
60221                         if (+e.clientX === 0 && +e.clientY === 0) {
60222                             event.preventDefault();
60223                             event.stopPropagation();
60224                         }
60225                     });
60226
60227                 selection
60228                     .on('mousedown.select', mousedown)
60229                     .on('mousemove.select', mousemove)
60230                     .on('contextmenu.select', contextmenu);
60231
60232                 if (event && event.shiftKey) {
60233                     context.surface()
60234                         .classed('behavior-multiselect', true);
60235                 }
60236             }
60237
60238
60239             behavior.off = function(selection) {
60240                 d3_select(window)
60241                     .on('keydown.select', null)
60242                     .on('keyup.select', null)
60243                     .on('contextmenu.select-window', null)
60244                     .on('mouseup.select', null, true);
60245
60246                 selection
60247                     .on('mousedown.select', null)
60248                     .on('mousemove.select', null)
60249                     .on('contextmenu.select', null);
60250
60251                 context.surface()
60252                     .classed('behavior-multiselect', false);
60253             };
60254
60255
60256             return behavior;
60257         }
60258
60259         function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
60260
60261             var origWay = context.entity(wayID);
60262
60263             var annotation = t((origWay.isDegenerate() ?
60264                 'operations.start.annotation.' :
60265                 'operations.continue.annotation.') + context.geometry(wayID)
60266             );
60267
60268             var behavior = behaviorDraw(context);
60269             behavior.hover().initialNodeID(index ? origWay.nodes[index] :
60270                 (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
60271
60272             var _tempEdits = 0;
60273
60274             var end = osmNode({ loc: context.map().mouseCoordinates() });
60275
60276             // Push an annotated state for undo to return back to.
60277             // We must make sure to remove this edit later.
60278             context.pauseChangeDispatch();
60279             context.perform(actionNoop(), annotation);
60280             _tempEdits++;
60281
60282             // Add the drawing node to the graph.
60283             // We must make sure to remove this edit later.
60284             context.perform(_actionAddDrawNode());
60285             _tempEdits++;
60286             context.resumeChangeDispatch();
60287
60288
60289             function keydown() {
60290                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60291                     if (context.surface().classed('nope')) {
60292                         context.surface()
60293                             .classed('nope-suppressed', true);
60294                     }
60295                     context.surface()
60296                         .classed('nope', false)
60297                         .classed('nope-disabled', true);
60298                 }
60299             }
60300
60301
60302             function keyup() {
60303                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60304                     if (context.surface().classed('nope-suppressed')) {
60305                         context.surface()
60306                             .classed('nope', true);
60307                     }
60308                     context.surface()
60309                         .classed('nope-suppressed', false)
60310                         .classed('nope-disabled', false);
60311                 }
60312             }
60313
60314
60315             function allowsVertex(d) {
60316                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
60317             }
60318
60319
60320             // related code
60321             // - `mode/drag_node.js`     `doMode()`
60322             // - `behavior/draw.js`      `click()`
60323             // - `behavior/draw_way.js`  `move()`
60324             function move(datum) {
60325                 context.surface().classed('nope-disabled', event.altKey);
60326
60327                 var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
60328                 var targetNodes = datum && datum.properties && datum.properties.nodes;
60329                 var loc = context.map().mouseCoordinates();
60330
60331                 if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
60332                     loc = targetLoc;
60333
60334                 } else if (targetNodes) {   // snap to way - a line target with `.nodes`
60335                     var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
60336                     if (choice) {
60337                         loc = choice.loc;
60338                     }
60339                 }
60340
60341                 context.replace(actionMoveNode(end.id, loc));
60342                 end = context.entity(end.id);
60343                 checkGeometry(false);
60344             }
60345
60346
60347             // Check whether this edit causes the geometry to break.
60348             // If so, class the surface with a nope cursor.
60349             // `finishDraw` - Only checks the relevant line segments if finishing drawing
60350             function checkGeometry(finishDraw) {
60351                 var nopeDisabled = context.surface().classed('nope-disabled');
60352                 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
60353
60354                 if (nopeDisabled) {
60355                     context.surface()
60356                         .classed('nope', false)
60357                         .classed('nope-suppressed', isInvalid);
60358                 } else {
60359                     context.surface()
60360                         .classed('nope', isInvalid)
60361                         .classed('nope-suppressed', false);
60362                 }
60363             }
60364
60365
60366             function isInvalidGeometry(entity, graph, finishDraw) {
60367                 var parents = graph.parentWays(entity);
60368
60369                 for (var i = 0; i < parents.length; i++) {
60370                     var parent = parents[i];
60371                     var nodes = graph.childNodes(parent).slice();  // shallow copy
60372
60373                     if (origWay.isClosed()) { // Check if Area
60374                         if (finishDraw) {
60375                             if (nodes.length < 3) return false;
60376                             nodes.splice(-2, 1);
60377                             entity = nodes[nodes.length-2];
60378                         } else {
60379                             nodes.pop();
60380                         }
60381                     } else { // Line
60382                         if (finishDraw) {
60383                             nodes.pop();
60384                         }
60385                     }
60386
60387                     if (geoHasSelfIntersections(nodes, entity.id)) {
60388                         return true;
60389                     }
60390                 }
60391
60392                 return false;
60393             }
60394
60395
60396             function undone() {
60397                 context.pauseChangeDispatch();
60398                 // Undo popped the history back to the initial annotated no-op edit.
60399                 _tempEdits = 0;     // We will deal with the temp edits here
60400                 context.pop(1);     // Remove initial no-op edit
60401
60402                 if (context.graph() === baselineGraph) {    // We've undone back to the beginning
60403                     // baselineGraph may be behind startGraph if this way was added rather than continued
60404                     resetToStartGraph();
60405                     context.resumeChangeDispatch();
60406                     context.enter(modeSelect(context, [wayID]));
60407                 } else {
60408                     // Remove whatever segment was drawn previously and continue drawing
60409                     context.pop(1);
60410                     context.resumeChangeDispatch();
60411                     context.enter(mode);
60412                 }
60413             }
60414
60415
60416             function setActiveElements() {
60417                 context.surface().selectAll('.' + end.id)
60418                     .classed('active', true);
60419             }
60420
60421
60422             function resetToStartGraph() {
60423                 while (context.graph() !== startGraph) {
60424                     context.pop();
60425                 }
60426             }
60427
60428
60429             var drawWay = function(surface) {
60430                 behavior
60431                     .on('move', move)
60432                     .on('click', drawWay.add)
60433                     .on('clickWay', drawWay.addWay)
60434                     .on('clickNode', drawWay.addNode)
60435                     .on('undo', context.undo)
60436                     .on('cancel', drawWay.cancel)
60437                     .on('finish', drawWay.finish);
60438
60439                 d3_select(window)
60440                     .on('keydown.drawWay', keydown)
60441                     .on('keyup.drawWay', keyup);
60442
60443                 context.map()
60444                     .dblclickEnable(false)
60445                     .on('drawn.draw', setActiveElements);
60446
60447                 setActiveElements();
60448
60449                 surface.call(behavior);
60450
60451                 context.history()
60452                     .on('undone.draw', undone);
60453             };
60454
60455
60456             drawWay.off = function(surface) {
60457                 // Drawing was interrupted unexpectedly.
60458                 // This can happen if the user changes modes,
60459                 // clicks geolocate button, a hashchange event occurs, etc.
60460                 if (_tempEdits) {
60461                     context.pauseChangeDispatch();
60462                     context.pop(_tempEdits);
60463                     resetToStartGraph();
60464                     context.resumeChangeDispatch();
60465                 }
60466
60467                 context.map()
60468                     .on('drawn.draw', null);
60469
60470                 surface.call(behavior.off)
60471                     .selectAll('.active')
60472                     .classed('active', false);
60473
60474                 surface
60475                     .classed('nope', false)
60476                     .classed('nope-suppressed', false)
60477                     .classed('nope-disabled', false);
60478
60479                 d3_select(window)
60480                     .on('keydown.hover', null)
60481                     .on('keyup.hover', null);
60482
60483                 context.history()
60484                     .on('undone.draw', null);
60485             };
60486
60487
60488             function _actionAddDrawNode() {
60489                 return function(graph) {
60490                     return graph
60491                         .replace(end)
60492                         .replace(origWay.addNode(end.id, index));
60493                 };
60494             }
60495
60496
60497             function _actionReplaceDrawNode(newNode) {
60498                 return function(graph) {
60499                     return graph
60500                         .replace(origWay.addNode(newNode.id, index))
60501                         .remove(end);
60502                 };
60503             }
60504
60505
60506             // Accept the current position of the drawing node and continue drawing.
60507             drawWay.add = function(loc, d) {
60508                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60509                     return;   // can't click here
60510                 }
60511
60512                 context.pauseChangeDispatch();
60513                 context.pop(_tempEdits);
60514                 _tempEdits = 0;
60515
60516                 context.perform(
60517                     _actionAddDrawNode(),
60518                     annotation
60519                 );
60520
60521                 context.resumeChangeDispatch();
60522                 checkGeometry(false);   // finishDraw = false
60523                 context.enter(mode);
60524             };
60525
60526
60527             // Connect the way to an existing way.
60528             drawWay.addWay = function(loc, edge, d) {
60529                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60530                     return;   // can't click here
60531                 }
60532
60533                 context.pauseChangeDispatch();
60534                 context.pop(_tempEdits);
60535                 _tempEdits = 0;
60536
60537                 context.perform(
60538                     _actionAddDrawNode(),
60539                     actionAddMidpoint({ loc: loc, edge: edge }, end),
60540                     annotation
60541                 );
60542
60543                 context.resumeChangeDispatch();
60544                 checkGeometry(false);   // finishDraw = false
60545                 context.enter(mode);
60546             };
60547
60548
60549             // Connect the way to an existing node and continue drawing.
60550             drawWay.addNode = function(node, d) {
60551                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60552                     return;   // can't click here
60553                 }
60554
60555                 context.pauseChangeDispatch();
60556                 context.pop(_tempEdits);
60557                 _tempEdits = 0;
60558
60559                 context.perform(
60560                     _actionReplaceDrawNode(node),
60561                     annotation
60562                 );
60563
60564                 context.resumeChangeDispatch();
60565                 checkGeometry(false);   // finishDraw = false
60566                 context.enter(mode);
60567             };
60568
60569
60570             // Finish the draw operation, removing the temporary edits.
60571             // If the way has enough nodes to be valid, it's selected.
60572             // Otherwise, delete everything and return to browse mode.
60573             drawWay.finish = function() {
60574                 checkGeometry(true);   // finishDraw = true
60575                 if (context.surface().classed('nope')) {
60576                     return;   // can't click here
60577                 }
60578
60579                 context.pauseChangeDispatch();
60580                 context.pop(_tempEdits);
60581                 _tempEdits = 0;
60582
60583                 var way = context.hasEntity(wayID);
60584                 if (!way || way.isDegenerate()) {
60585                     drawWay.cancel();
60586                     return;
60587                 }
60588
60589                 context.resumeChangeDispatch();
60590
60591                 window.setTimeout(function() {
60592                     context.map().dblclickEnable(true);
60593                 }, 1000);
60594
60595                 var isNewFeature = !mode.isContinuing;
60596                 context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
60597             };
60598
60599
60600             // Cancel the draw operation, delete everything, and return to browse mode.
60601             drawWay.cancel = function() {
60602                 context.pauseChangeDispatch();
60603                 context.pop(_tempEdits);
60604                 _tempEdits = 0;
60605
60606                 resetToStartGraph();
60607                 context.resumeChangeDispatch();
60608
60609                 window.setTimeout(function() {
60610                     context.map().dblclickEnable(true);
60611                 }, 1000);
60612
60613                 context.surface()
60614                     .classed('nope', false)
60615                     .classed('nope-disabled', false)
60616                     .classed('nope-suppressed', false);
60617
60618                 context.enter(modeBrowse(context));
60619             };
60620
60621
60622             drawWay.activeID = function() {
60623                 if (!arguments.length) return end.id;
60624                 // no assign
60625                 return drawWay;
60626             };
60627
60628
60629             drawWay.tail = function(text) {
60630                 behavior.tail(text);
60631                 return drawWay;
60632             };
60633
60634
60635             return drawWay;
60636         }
60637
60638         function modeDrawLine(context, wayID, startGraph, baselineGraph, button, affix, continuing) {
60639             var mode = {
60640                 button: button,
60641                 id: 'draw-line'
60642             };
60643
60644             var behavior;
60645
60646             mode.wayID = wayID;
60647
60648             mode.isContinuing = continuing;
60649
60650             mode.enter = function() {
60651                 var way = context.entity(wayID);
60652                 var index = (affix === 'prefix') ? 0 : undefined;
60653                 var headID = (affix === 'prefix') ? way.first() : way.last();
60654
60655                 behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60656                     .tail(t('modes.draw_line.tail'));
60657
60658                 var addNode = behavior.addNode;
60659                 behavior.addNode = function(node, d) {
60660                     if (node.id === headID) {
60661                         behavior.finish();
60662                     } else {
60663                         addNode(node, d);
60664                     }
60665                 };
60666
60667                 context.install(behavior);
60668             };
60669
60670
60671             mode.exit = function() {
60672                 context.uninstall(behavior);
60673             };
60674
60675
60676             mode.selectedIDs = function() {
60677                 return [wayID];
60678             };
60679
60680
60681             mode.activeID = function() {
60682                 return (behavior && behavior.activeID()) || [];
60683             };
60684
60685             return mode;
60686         }
60687
60688         function operationContinue(selectedIDs, context) {
60689             var graph = context.graph();
60690             var entities = selectedIDs.map(function(id) { return graph.entity(id); });
60691             var geometries = Object.assign(
60692                 { line: [], vertex: [] },
60693                 utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
60694             );
60695             var vertex = geometries.vertex[0];
60696
60697
60698             function candidateWays() {
60699                 return graph.parentWays(vertex).filter(function(parent) {
60700                     return parent.geometry(graph) === 'line' &&
60701                         !parent.isClosed() &&
60702                         parent.affix(vertex.id) &&
60703                         (geometries.line.length === 0 || geometries.line[0] === parent);
60704                 });
60705             }
60706
60707
60708             var operation = function() {
60709                 var candidate = candidateWays()[0];
60710                 context.enter(
60711                     modeDrawLine(context, candidate.id, context.graph(), context.graph(), 'line', candidate.affix(vertex.id), true)
60712                 );
60713             };
60714
60715
60716             operation.available = function() {
60717                 return geometries.vertex.length === 1 &&
60718                     geometries.line.length <= 1 &&
60719                     !context.features().hasHiddenConnections(vertex, context.graph());
60720             };
60721
60722
60723             operation.disabled = function() {
60724                 var candidates = candidateWays();
60725                 if (candidates.length === 0) {
60726                     return 'not_eligible';
60727                 } else if (candidates.length > 1) {
60728                     return 'multiple';
60729                 }
60730
60731                 return false;
60732             };
60733
60734
60735             operation.tooltip = function() {
60736                 var disable = operation.disabled();
60737                 return disable ?
60738                     t('operations.continue.' + disable) :
60739                     t('operations.continue.description');
60740             };
60741
60742
60743             operation.annotation = function() {
60744                 return t('operations.continue.annotation.line');
60745             };
60746
60747
60748             operation.id = 'continue';
60749             operation.keys = [t('operations.continue.key')];
60750             operation.title = t('operations.continue.title');
60751             operation.behavior = behaviorOperation(context).which(operation);
60752
60753             return operation;
60754         }
60755
60756         function operationDisconnect(selectedIDs, context) {
60757             var vertexIDs = [];
60758             var wayIDs = [];
60759             var otherIDs = [];
60760             var actions = [];
60761
60762             selectedIDs.forEach(function(id) {
60763                 if (context.geometry(id) === 'vertex') {
60764                     vertexIDs.push(id);
60765                 } else if (context.entity(id).type === 'way'){
60766                     wayIDs.push(id);
60767                 } else {
60768                     otherIDs.push(id);
60769                 }
60770             });
60771
60772             var disconnectingWayID = (vertexIDs.length === 0 && wayIDs.length === 1 && wayIDs[0]);
60773             var extent, nodes, coords;
60774
60775             if (disconnectingWayID) {   // disconnecting a way
60776                 var way = context.entity(disconnectingWayID);
60777                 extent = way.extent(context.graph());
60778                 nodes = utilGetAllNodes([disconnectingWayID], context.graph());
60779                 coords = nodes.map(function(n) { return n.loc; });
60780
60781                 way.nodes.forEach(function(vertexID) {
60782                     var action = actionDisconnect(vertexID).limitWays(wayIDs);
60783                     if (action.disabled(context.graph()) !== 'not_connected') {
60784                         actions.push(action);
60785                     }
60786                 });
60787
60788             } else {    // disconnecting a vertex
60789                 vertexIDs.forEach(function(vertexID) {
60790                     var action = actionDisconnect(vertexID);
60791
60792                     if (wayIDs.length > 0) {
60793                         var waysIDsForVertex = wayIDs.filter(function(wayID) {
60794                             var way = context.entity(wayID);
60795                             return way.nodes.indexOf(vertexID) !== -1;
60796                         });
60797                         action.limitWays(waysIDsForVertex);
60798                     }
60799                     actions.push(action);
60800                 });
60801             }
60802
60803
60804             var operation = function() {
60805                 context.perform(function(graph) {
60806                     return actions.reduce(function(graph, action) { return action(graph); }, graph);
60807                 }, operation.annotation());
60808
60809                 context.validator().validate();
60810             };
60811
60812
60813             operation.available = function() {
60814                 if (actions.length === 0) return false;
60815                 if (otherIDs.length !== 0) return false;
60816
60817                 if (vertexIDs.length !== 0 && wayIDs.length !== 0 && !wayIDs.every(function(wayID) {
60818                     return vertexIDs.some(function(vertexID) {
60819                         var way = context.entity(wayID);
60820                         return way.nodes.indexOf(vertexID) !== -1;
60821                     });
60822                 })) return false;
60823
60824                 return true;
60825             };
60826
60827
60828             operation.disabled = function() {
60829                 var reason;
60830                 for (var actionIndex in actions) {
60831                     reason = actions[actionIndex].disabled(context.graph());
60832                     if (reason) return reason;
60833                 }
60834
60835                 if (disconnectingWayID && extent.percentContainedIn(context.extent()) < 0.8) {
60836                     return 'too_large.single';
60837                 } else if (disconnectingWayID && someMissing()) {
60838                     return 'not_downloaded';
60839                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
60840                     return 'connected_to_hidden';
60841                 }
60842
60843                 return false;
60844
60845
60846                 function someMissing() {
60847                     if (context.inIntro()) return false;
60848                     var osm = context.connection();
60849                     if (osm) {
60850                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
60851                         if (missing.length) {
60852                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
60853                             return true;
60854                         }
60855                     }
60856                     return false;
60857                 }
60858             };
60859
60860
60861             operation.tooltip = function() {
60862                 var disable = operation.disabled();
60863                 if (disable) {
60864                     return t('operations.disconnect.' + disable);
60865                 }
60866                 if (disconnectingWayID) {
60867                     return t('operations.disconnect.' + context.geometry(disconnectingWayID) + '.description');
60868                 }
60869                 return t('operations.disconnect.description');
60870             };
60871
60872
60873             operation.annotation = function() {
60874                 return t('operations.disconnect.annotation');
60875             };
60876
60877
60878             operation.id = 'disconnect';
60879             operation.keys = [t('operations.disconnect.key')];
60880             operation.title = t('operations.disconnect.title');
60881             operation.behavior = behaviorOperation(context).which(operation);
60882
60883             return operation;
60884         }
60885
60886         function operationDowngrade(selectedIDs, context) {
60887             var affectedFeatureCount = 0;
60888             var downgradeType;
60889
60890             setDowngradeTypeForEntityIDs();
60891
60892             var multi = affectedFeatureCount === 1 ? 'single' : 'multiple';
60893
60894             function setDowngradeTypeForEntityIDs() {
60895                 for (var i in selectedIDs) {
60896                     var entityID = selectedIDs[i];
60897                     var type = downgradeTypeForEntityID(entityID);
60898                     if (type) {
60899                         affectedFeatureCount += 1;
60900                         if (downgradeType && type !== downgradeType) {
60901                             downgradeType = 'building_address';
60902                         } else {
60903                             downgradeType = type;
60904                         }
60905                     }
60906                 }
60907             }
60908
60909             function downgradeTypeForEntityID(entityID) {
60910                 var graph = context.graph();
60911                 var entity = graph.entity(entityID);
60912                 var preset = context.presets().match(entity, graph);
60913
60914                 if (preset.isFallback()) return null;
60915
60916                 if (entity.type === 'node' &&
60917                     preset.id !== 'address' &&
60918                     Object.keys(entity.tags).some(function(key) {
60919                         return key.match(/^addr:.{1,}/);
60920                     })) {
60921
60922                     return 'address';
60923                 }
60924                 if (entity.geometry(graph) === 'area' &&
60925                     entity.tags.building &&
60926                     !preset.tags.building) {
60927
60928                     return 'building';
60929                 }
60930
60931                 return null;
60932             }
60933
60934             var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
60935             var addressKeysToKeep = ['source'];
60936
60937             var operation = function () {
60938                 context.perform(function(graph) {
60939
60940                     for (var i in selectedIDs) {
60941                         var entityID = selectedIDs[i];
60942                         var type = downgradeTypeForEntityID(entityID);
60943                         if (!type) continue;
60944
60945                         var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
60946                         for (var key in tags) {
60947                             if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
60948                             if (type === 'building') {
60949                                 if (buildingKeysToKeep.indexOf(key) !== -1 ||
60950                                     key.match(/^building:.{1,}/) ||
60951                                     key.match(/^roof:.{1,}/)) continue;
60952                             }
60953                             // keep address tags for buildings too
60954                             if (key.match(/^addr:.{1,}/)) continue;
60955
60956                             delete tags[key];
60957                         }
60958                         graph = actionChangeTags(entityID, tags)(graph);
60959                     }
60960                     return graph;
60961                 }, operation.annotation());
60962
60963                 context.validator().validate();
60964
60965                 // refresh the select mode to enable the delete operation
60966                 context.enter(modeSelect(context, selectedIDs));
60967             };
60968
60969
60970             operation.available = function () {
60971                 return downgradeType;
60972             };
60973
60974
60975             operation.disabled = function () {
60976                 if (selectedIDs.some(hasWikidataTag)) {
60977                     return 'has_wikidata_tag';
60978                 }
60979                 return false;
60980
60981                 function hasWikidataTag(id) {
60982                     var entity = context.entity(id);
60983                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
60984                 }
60985             };
60986
60987
60988             operation.tooltip = function () {
60989                 var disable = operation.disabled();
60990                 return disable ?
60991                     t('operations.downgrade.' + disable + '.' + multi) :
60992                     t('operations.downgrade.description.' + downgradeType);
60993             };
60994
60995
60996             operation.annotation = function () {
60997                 var suffix;
60998                 if (downgradeType === 'building_address') {
60999                     suffix = 'multiple';
61000                 } else {
61001                     suffix = downgradeType + '.' + multi;
61002                 }
61003                 return t('operations.downgrade.annotation.' + suffix, { n: affectedFeatureCount});
61004             };
61005
61006
61007             operation.id = 'downgrade';
61008             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
61009             operation.title = t('operations.downgrade.title');
61010             operation.behavior = behaviorOperation(context).which(operation);
61011
61012
61013             return operation;
61014         }
61015
61016         function operationExtract(selectedIDs, context) {
61017             var entityID = selectedIDs.length && selectedIDs[0];
61018             var action = actionExtract(entityID, context.projection);
61019
61020             var geometry = entityID && context.geometry(entityID);
61021             var extent = geometry === 'area' && context.entity(entityID).extent(context.graph());
61022
61023
61024             var operation = function () {
61025                 context.perform(action);  // do the extract
61026                 context.validator().validate();
61027
61028                 var extractedNodeID = action.getExtractedNodeID();
61029
61030                 var mouse = context.map().mouseCoordinates();
61031                 if (mouse.some(isNaN)) {
61032                     enterMoveMode();
61033
61034                 } else {
61035                     // move detached node to the mouse location (transitioned)
61036                     context.perform(actionMoveNode(extractedNodeID, mouse));
61037
61038                     // after transition completes, put at final mouse location and enter move mode.
61039                     window.setTimeout(function() {
61040                         mouse = context.map().mouseCoordinates();
61041                         context.replace(actionMoveNode(extractedNodeID, mouse));
61042                         enterMoveMode();
61043                     }, 150);
61044                 }
61045
61046                 function enterMoveMode() {
61047                     var baseGraph = context.graph();
61048                     context.enter(modeMove(context, [extractedNodeID], baseGraph));
61049                 }
61050             };
61051
61052
61053             operation.available = function () {
61054                 if (selectedIDs.length !== 1) return false;
61055
61056                 var graph = context.graph();
61057                 var entity = graph.hasEntity(entityID);
61058                 if (!entity) return false;
61059
61060                 if (!entity.hasInterestingTags()) return false;
61061
61062                 if (geometry === 'area') {
61063                     var preset = context.presets().match(entity, graph);
61064                     return preset.geometry.indexOf('point') !== -1;
61065                 }
61066
61067                 return entity.type === 'node' && graph.parentWays(entity).length > 0;
61068             };
61069
61070
61071             operation.disabled = function () {
61072                 var reason = action.disabled(context.graph());
61073                 if (reason) {
61074                     return reason;
61075                 } else if (geometry === 'vertex' && selectedIDs.some(context.hasHiddenConnections)) {
61076                     return 'connected_to_hidden';
61077                 } else if (extent && extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
61078                     return 'too_large';
61079                 }
61080
61081                 return false;
61082             };
61083
61084
61085             operation.tooltip = function () {
61086                 var disableReason = operation.disabled();
61087                 if (disableReason) {
61088                     return t('operations.extract.' + disableReason + '.' + geometry + '.single',
61089                         { relation: context.presets().item('type/restriction').name() });
61090                 } else {
61091                     return t('operations.extract.description.' + geometry + '.single');
61092                 }
61093             };
61094
61095
61096             operation.annotation = function () {
61097                 return t('operations.extract.annotation.single');
61098             };
61099
61100
61101             operation.id = 'extract';
61102             operation.keys = [t('operations.extract.key')];
61103             operation.title = t('operations.extract.title');
61104             operation.behavior = behaviorOperation(context).which(operation);
61105
61106
61107             return operation;
61108         }
61109
61110         function operationMerge(selectedIDs, context) {
61111
61112             function updatePresetTags(newGraph, ids) {
61113                 var id = ids[0];
61114                 var newEntity = newGraph.hasEntity(id);
61115
61116                 if (!newEntity) return;
61117                 var newPreset = context.presets().match(newEntity, newGraph);
61118                 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
61119             }
61120
61121
61122             var join = actionJoin(selectedIDs);
61123             var merge = actionMerge(selectedIDs);
61124             var mergePolygon = actionMergePolygon(selectedIDs);
61125             var mergeNodes = actionMergeNodes(selectedIDs);
61126
61127
61128             var operation = function() {
61129                 var doUpdateTags;
61130                 var action;
61131
61132                 if (!join.disabled(context.graph())) {
61133                     doUpdateTags = false;
61134                     action = join;
61135                 } else if (!merge.disabled(context.graph())) {
61136                     doUpdateTags = true;
61137                     action = merge;
61138                 } else if (!mergePolygon.disabled(context.graph())) {
61139                     doUpdateTags = false;
61140                     action = mergePolygon;
61141                 } else {
61142                     doUpdateTags = true;
61143                     action = mergeNodes;
61144                 }
61145
61146                 context.perform(action, operation.annotation());
61147
61148                 var ids = selectedIDs.filter(function(id) {
61149                     var entity = context.hasEntity(id);
61150                     return entity && entity.type !== 'node';
61151                 });
61152
61153                 // if we merged tags, rematch preset to update tags if necessary (#3851)
61154                 if (doUpdateTags) {
61155                     updatePresetTags(context.graph(), ids);
61156                 }
61157
61158                 context.validator().validate();
61159                 context.enter(modeSelect(context, ids));
61160             };
61161
61162
61163             operation.available = function() {
61164                 return selectedIDs.length >= 2;
61165             };
61166
61167
61168             operation.disabled = function() {
61169                 return join.disabled(context.graph()) &&
61170                     merge.disabled(context.graph()) &&
61171                     mergePolygon.disabled(context.graph()) &&
61172                     mergeNodes.disabled(context.graph());
61173             };
61174
61175
61176             operation.tooltip = function() {
61177                 var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
61178                 var m = merge.disabled(context.graph());         // 'not_eligible'
61179                 var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
61180                 var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
61181
61182                 // disabled for one of various reasons
61183                 if (j && m && p && n) {
61184                     if (j === 'restriction' || n === 'restriction') {
61185                         return t('operations.merge.restriction',
61186                             { relation: context.presets().item('type/restriction').name() });
61187
61188                     } else if (p === 'incomplete_relation') {
61189                         return t('operations.merge.incomplete_relation');
61190
61191                     } else if (n === 'relation') {
61192                         return t('operations.merge.relation');
61193
61194                     } else {
61195                         return t('operations.merge.' + j);
61196                     }
61197
61198                 } else {
61199                     return t('operations.merge.description');
61200                 }
61201             };
61202
61203
61204             operation.annotation = function() {
61205                 return t('operations.merge.annotation', { n: selectedIDs.length });
61206             };
61207
61208
61209             operation.id = 'merge';
61210             operation.keys = [t('operations.merge.key')];
61211             operation.title = t('operations.merge.title');
61212             operation.behavior = behaviorOperation(context).which(operation);
61213
61214             return operation;
61215         }
61216
61217         function operationReverse(selectedIDs, context) {
61218             var entityID = selectedIDs[0];
61219
61220             var operation = function() {
61221                 context.perform(actionReverse(entityID), operation.annotation());
61222                 context.validator().validate();
61223             };
61224
61225
61226             operation.available = function() {
61227                 return selectedIDs.length === 1 && context.geometry(entityID) === 'line';
61228             };
61229
61230
61231             operation.disabled = function() {
61232                 return false;
61233             };
61234
61235
61236             operation.tooltip = function() {
61237                 return t('operations.reverse.description');
61238             };
61239
61240
61241             operation.annotation = function() {
61242                 return t('operations.reverse.annotation');
61243             };
61244
61245
61246             operation.id = 'reverse';
61247             operation.keys = [t('operations.reverse.key')];
61248             operation.title = t('operations.reverse.title');
61249             operation.behavior = behaviorOperation(context).which(operation);
61250
61251             return operation;
61252         }
61253
61254         function operationSplit(selectedIDs, context) {
61255             var vertices = selectedIDs
61256                 .filter(function(id) { return context.geometry(id) === 'vertex'; });
61257             var entityID = vertices[0];
61258             var action = actionSplit(entityID);
61259             var ways = [];
61260
61261             if (vertices.length === 1) {
61262                 if (entityID && selectedIDs.length > 1) {
61263                     var ids = selectedIDs.filter(function(id) { return id !== entityID; });
61264                     action.limitWays(ids);
61265                 }
61266                 ways = action.ways(context.graph());
61267             }
61268
61269
61270             var operation = function() {
61271                 var difference = context.perform(action, operation.annotation());
61272                 context.enter(modeSelect(context, difference.extantIDs()));
61273             };
61274
61275
61276             operation.available = function() {
61277                 return vertices.length === 1;
61278             };
61279
61280
61281             operation.disabled = function() {
61282                 var reason = action.disabled(context.graph());
61283                 if (reason) {
61284                     return reason;
61285                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61286                     return 'connected_to_hidden';
61287                 }
61288
61289                 return false;
61290             };
61291
61292
61293             operation.tooltip = function() {
61294                 var disable = operation.disabled();
61295                 if (disable) {
61296                     return t('operations.split.' + disable);
61297                 } else if (ways.length === 1) {
61298                     return t('operations.split.description.' + context.geometry(ways[0].id));
61299                 } else {
61300                     return t('operations.split.description.multiple');
61301                 }
61302             };
61303
61304
61305             operation.annotation = function() {
61306                 return ways.length === 1 ?
61307                     t('operations.split.annotation.' + context.geometry(ways[0].id)) :
61308                     t('operations.split.annotation.multiple', { n: ways.length });
61309             };
61310
61311
61312             operation.id = 'split';
61313             operation.keys = [t('operations.split.key')];
61314             operation.title = t('operations.split.title');
61315             operation.behavior = behaviorOperation(context).which(operation);
61316
61317             return operation;
61318         }
61319
61320         function operationStraighten(selectedIDs, context) {
61321             var wayIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'w'; });
61322             var nodeIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'n'; });
61323
61324             var nodes = utilGetAllNodes(selectedIDs, context.graph());
61325             var coords = nodes.map(function(n) { return n.loc; });
61326             var action = chooseAction();
61327             var geometry;
61328
61329
61330             function chooseAction() {
61331                 // straighten selected nodes
61332                 if (wayIDs.length === 0 && nodeIDs.length > 2) {
61333                     geometry = 'points';
61334                     return actionStraightenNodes(nodeIDs, context.projection);
61335
61336                 // straighten selected ways (possibly between range of 2 selected nodes)
61337                 } else if (wayIDs.length > 0 && (nodeIDs.length === 0 || nodeIDs.length === 2)) {
61338                     var startNodeIDs = [];
61339                     var endNodeIDs = [];
61340
61341                     for (var i = 0; i < selectedIDs.length; i++) {
61342                         var entity = context.entity(selectedIDs[i]);
61343                         if (entity.type === 'node') {
61344                             continue;
61345                         } else if (entity.type !== 'way' || entity.isClosed()) {
61346                             return false;  // exit early, can't straighten these
61347                         }
61348
61349                         startNodeIDs.push(entity.first());
61350                         endNodeIDs.push(entity.last());
61351                     }
61352
61353                     // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
61354                     startNodeIDs = startNodeIDs.filter(function(n) {
61355                         return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
61356                     });
61357                     endNodeIDs = endNodeIDs.filter(function(n) {
61358                         return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
61359                     });
61360
61361                     // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
61362                     if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
61363                         utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return false;
61364
61365                     // Ensure path contains at least 3 unique nodes
61366                     var wayNodeIDs = utilGetAllNodes(wayIDs, context.graph())
61367                         .map(function(node) { return node.id; });
61368                     if (wayNodeIDs.length <= 2) return false;
61369
61370                     // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
61371                     if (nodeIDs.length === 2 && (
61372                         wayNodeIDs.indexOf(nodeIDs[0]) === -1 || wayNodeIDs.indexOf(nodeIDs[1]) === -1
61373                     )) return false;
61374
61375                     geometry = 'line';
61376                     return actionStraightenWay(selectedIDs, context.projection);
61377                 }
61378
61379                 return false;
61380             }
61381
61382
61383             function operation() {
61384                 if (!action) return;
61385
61386                 context.perform(action, operation.annotation());
61387
61388                 window.setTimeout(function() {
61389                     context.validator().validate();
61390                 }, 300);  // after any transition
61391             }
61392
61393
61394             operation.available = function() {
61395                 return Boolean(action);
61396             };
61397
61398
61399             operation.disabled = function() {
61400                 var reason = action.disabled(context.graph());
61401                 if (reason) {
61402                     return reason;
61403                 } else if (someMissing()) {
61404                     return 'not_downloaded';
61405                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61406                     return 'connected_to_hidden';
61407                 }
61408
61409                 return false;
61410
61411
61412                 function someMissing() {
61413                     if (context.inIntro()) return false;
61414                     var osm = context.connection();
61415                     if (osm) {
61416                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
61417                         if (missing.length) {
61418                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
61419                             return true;
61420                         }
61421                     }
61422                     return false;
61423                 }
61424             };
61425
61426
61427             operation.tooltip = function() {
61428                 var disable = operation.disabled();
61429                 return disable ?
61430                     t('operations.straighten.' + disable) :
61431                     t('operations.straighten.description.' + geometry);
61432             };
61433
61434
61435             operation.annotation = function() {
61436                 return t('operations.straighten.annotation.' + geometry);
61437             };
61438
61439
61440             operation.id = 'straighten';
61441             operation.keys = [t('operations.straighten.key')];
61442             operation.title = t('operations.straighten.title');
61443             operation.behavior = behaviorOperation(context).which(operation);
61444
61445             return operation;
61446         }
61447
61448
61449
61450         var Operations = /*#__PURE__*/Object.freeze({
61451                 operationCircularize: operationCircularize,
61452                 operationContinue: operationContinue,
61453                 operationDelete: operationDelete,
61454                 operationDisconnect: operationDisconnect,
61455                 operationDowngrade: operationDowngrade,
61456                 operationExtract: operationExtract,
61457                 operationMerge: operationMerge,
61458                 operationMove: operationMove,
61459                 operationOrthogonalize: operationOrthogonalize,
61460                 operationReflectShort: operationReflectShort,
61461                 operationReflectLong: operationReflectLong,
61462                 operationReverse: operationReverse,
61463                 operationRotate: operationRotate,
61464                 operationSplit: operationSplit,
61465                 operationStraighten: operationStraighten
61466         });
61467
61468         function uiEditMenu(context, operations) {
61469             var menu;
61470             var center = [0, 0];
61471             var offset = [0, 0];
61472             var tooltip;
61473
61474             var p = 8;               // top padding
61475             var m = 4;               // top margin
61476             var h = 15;              // height of icon
61477             var vpBottomMargin = 45; // viewport bottom margin
61478             var vpSideMargin = 35;   // viewport side margin
61479             var buttonWidth = 44;
61480             var buttonHeight = (2 * p + h);
61481             var menuWidth = buttonWidth;
61482             var menuHeight = (2 * m) + operations.length * buttonHeight;
61483             var menuSideMargin = 10;
61484             var tooltipWidth = 200;
61485             var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
61486
61487
61488             var editMenu = function (selection) {
61489                 if (!operations.length) return;
61490
61491                 selection.node().parentNode.focus();
61492
61493                 var isRTL = textDirection === 'rtl';
61494                 var viewport = context.surfaceRect();
61495
61496                 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
61497                     // menu is going left-to-right and near right viewport edge, go left instead
61498                     isRTL = true;
61499                 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
61500                     // menu is going right-to-left and near left viewport edge, go right instead
61501                     isRTL = false;
61502                 }
61503
61504                 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
61505
61506                 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
61507                     // menu is near bottom viewport edge, shift upwards
61508                     offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
61509                 }
61510
61511                 var origin = geoVecAdd(center, offset);
61512
61513                 menu = selection
61514                     .append('g')
61515                     .attr('class', 'edit-menu')
61516                     .attr('transform', 'translate(' + origin + ')')
61517                     .attr('opacity', 0);
61518
61519                 menu
61520                     .transition()
61521                     .attr('opacity', 1);
61522
61523                 menu
61524                     .append('rect')
61525                     .attr('class', 'edit-menu-background')
61526                     .attr('x', 4)
61527                     .attr('rx', 4)
61528                     .attr('ry', 4)
61529                     .attr('width', menuWidth)
61530                     .attr('height', menuHeight)
61531                     .attr('stroke-linecap', 'round');
61532
61533
61534                 var buttons = menu.selectAll('.edit-menu-item')
61535                     .data(operations);
61536
61537                 // enter
61538                 var buttonsEnter = buttons.enter()
61539                     .append('g')
61540                     .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
61541                     .attr('transform', function(d, i) {
61542                         return 'translate(' + geoVecFloor([0, m + i * buttonHeight]).join(',') + ')';
61543                     });
61544
61545                 buttonsEnter
61546                     .append('rect')
61547                     .attr('x', 4)
61548                     .attr('width', buttonWidth)
61549                     .attr('height', buttonHeight)
61550                     .on('click', click)
61551                     .on('mousedown', mousedown)
61552                     .on('mouseover', mouseover)
61553                     .on('mouseout', mouseout);
61554
61555                 buttonsEnter
61556                     .append('use')
61557                     .attr('width', '20')
61558                     .attr('height', '20')
61559                     .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
61560                     .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
61561
61562                 // update
61563                 buttons = buttonsEnter
61564                     .merge(buttons)
61565                     .classed('disabled', function(d) { return d.disabled(); });
61566
61567
61568                 tooltip = d3_select('#id-container')
61569                     .append('div')
61570                     .attr('class', 'tooltip-inner edit-menu-tooltip');
61571
61572
61573                 function click(operation) {
61574                     event.stopPropagation();
61575                     if (operation.disabled()) return;
61576                     operation();
61577                     editMenu.close();
61578                 }
61579
61580                 function mousedown() {
61581                     event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
61582                 }
61583
61584                 function mouseover(d, i) {
61585                     var tipX, tipY;
61586
61587                     if (!isRTL) {
61588                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61589                     } else {
61590                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61591                     }
61592
61593                     if (tipX + tooltipWidth > viewport.right) {
61594                         // tip is going left-to-right and near right viewport edge, go left instead
61595                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61596                     } else if (tipX < viewport.left) {
61597                         // tip is going right-to-left and near left viewport edge, go right instead
61598                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61599                     }
61600
61601                     tipY = viewport.top + origin[1] + (i * buttonHeight);
61602                     if (tipY + tooltipHeight > viewport.bottom) {
61603                         // tip is near bottom viewport edge, shift upwards
61604                         tipY -= tipY + tooltipHeight - viewport.bottom;
61605                     }
61606
61607                     tooltip
61608                         .style('left', tipX + 'px')
61609                         .style('top', tipY + 'px')
61610                         .style('display', 'block')
61611                         .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
61612
61613                     // update disabled again, just in case tooltip and disabled state disagree
61614                     // https://github.com/openstreetmap/iD/issues/6296#issuecomment-489259027
61615                     d3_select(this.parentNode)
61616                         .classed('disabled', d.disabled());
61617
61618                 }
61619
61620                 function mouseout() {
61621                     tooltip.style('display', 'none');
61622                 }
61623             };
61624
61625
61626             editMenu.close = function () {
61627                 if (menu) {
61628                     menu
61629                         .style('pointer-events', 'none')
61630                         .transition()
61631                         .attr('opacity', 0)
61632                         .remove();
61633                 }
61634
61635                 if (tooltip) {
61636                     tooltip.remove();
61637                 }
61638             };
61639
61640
61641             editMenu.center = function(val) {
61642                 if (!arguments.length) return center;
61643                 center = val;
61644                 return editMenu;
61645             };
61646
61647
61648             return editMenu;
61649         }
61650
61651         function uiSelectionList(context, selectedIDs) {
61652
61653             function selectEntity(entity) {
61654                 context.enter(modeSelect(context, [entity.id]));
61655             }
61656
61657
61658             function deselectEntity(entity) {
61659                 event.stopPropagation();
61660                 var index = selectedIDs.indexOf(entity.id);
61661                 if (index > -1) {
61662                     selectedIDs.splice(index, 1);
61663                 }
61664                 context.enter(modeSelect(context, selectedIDs));
61665             }
61666
61667
61668             function selectionList(selection) {
61669                 selection.classed('selection-list-pane', true);
61670
61671                 var header = selection
61672                     .append('div')
61673                     .attr('class', 'header fillL cf');
61674
61675                 header
61676                     .append('h3')
61677                     .text(t('inspector.multiselect'));
61678
61679                 var listWrap = selection
61680                     .append('div')
61681                     .attr('class', 'inspector-body');
61682
61683                 var list = listWrap
61684                     .append('div')
61685                     .attr('class', 'feature-list cf');
61686
61687
61688                 context.history()
61689                     .on('change.selectionList', function(difference) {
61690                         if (difference) drawList();
61691                     });
61692
61693                 drawList();
61694
61695
61696                 function drawList() {
61697                     var entities = selectedIDs
61698                         .map(function(id) { return context.hasEntity(id); })
61699                         .filter(function(entity) { return entity; });
61700
61701                     var items = list.selectAll('.feature-list-item')
61702                         .data(entities, osmEntity.key);
61703
61704                     items.exit()
61705                         .remove();
61706
61707                     // Enter
61708                     var enter = items.enter()
61709                         .append('div')
61710                         .attr('class', 'feature-list-item')
61711                         .on('click', selectEntity);
61712
61713                     enter
61714                         .each(function(d) {
61715                             d3_select(this).on('mouseover', function() {
61716                                 utilHighlightEntities([d.id], true, context);
61717                             });
61718                             d3_select(this).on('mouseout', function() {
61719                                 utilHighlightEntities([d.id], false, context);
61720                             });
61721                         });
61722
61723                     var label = enter
61724                         .append('button')
61725                         .attr('class', 'label');
61726
61727                     enter
61728                         .append('button')
61729                         .attr('class', 'close')
61730                         .on('click', deselectEntity)
61731                         .call(svgIcon('#iD-icon-close'));
61732
61733                     label
61734                         .append('span')
61735                         .attr('class', 'entity-geom-icon')
61736                         .call(svgIcon('', 'pre-text'));
61737
61738                     label
61739                         .append('span')
61740                         .attr('class', 'entity-type');
61741
61742                     label
61743                         .append('span')
61744                         .attr('class', 'entity-name');
61745
61746                     // Update
61747                     items = items.merge(enter);
61748
61749                     items.selectAll('.entity-geom-icon use')
61750                         .attr('href', function() {
61751                             var entity = this.parentNode.parentNode.__data__;
61752                             return '#iD-icon-' + context.geometry(entity.id);
61753                         });
61754
61755                     items.selectAll('.entity-type')
61756                         .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
61757
61758                     items.selectAll('.entity-name')
61759                         .text(function(entity) { return utilDisplayName(entity); });
61760                 }
61761             }
61762
61763             return selectionList;
61764         }
61765
61766         function uiRadialMenu(context, operations) {
61767             var menu;
61768             var center = [0, 0];
61769             var tooltip;
61770
61771
61772             var radialMenu = function(selection) {
61773                 if (!operations.length) return;
61774
61775                 selection.node().parentNode.focus();
61776
61777                 function click(operation) {
61778                     event.stopPropagation();
61779                     if (operation.disabled()) return;
61780                     operation();
61781                     radialMenu.close();
61782                 }
61783
61784                 menu = selection
61785                     .append('g')
61786                     .attr('class', 'radial-menu')
61787                     .attr('transform', 'translate(' + center + ')')
61788                     .attr('opacity', 0);
61789
61790                 menu
61791                     .transition()
61792                     .attr('opacity', 1);
61793
61794                 var r = 50;
61795                 var a = Math.PI / 4;
61796                 var a0 = -Math.PI / 4;
61797                 var a1 = a0 + (operations.length - 1) * a;
61798
61799                 menu
61800                     .append('path')
61801                     .attr('class', 'radial-menu-background')
61802                     .attr('d', 'M' + r * Math.sin(a0) + ',' +
61803                                      r * Math.cos(a0) +
61804                               ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
61805                                      (r * Math.sin(a1) + 1e-3) + ',' +
61806                                      (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
61807                     .attr('stroke-width', 50)
61808                     .attr('stroke-linecap', 'round');
61809
61810                 var button = menu.selectAll()
61811                     .data(operations)
61812                     .enter()
61813                     .append('g')
61814                     .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
61815                     .classed('disabled', function(d) { return d.disabled(); })
61816                     .attr('transform', function(d, i) {
61817                         return 'translate(' + geoVecFloor([
61818                                 r * Math.sin(a0 + i * a),
61819                                 r * Math.cos(a0 + i * a)]).join(',') + ')';
61820                     });
61821
61822                 button
61823                     .append('circle')
61824                     .attr('r', 15)
61825                     .on('click', click)
61826                     .on('mousedown', mousedown)
61827                     .on('mouseover', mouseover)
61828                     .on('mouseout', mouseout);
61829
61830                 button
61831                     .append('use')
61832                     .attr('transform', 'translate(-10,-10)')
61833                     .attr('width', '20')
61834                     .attr('height', '20')
61835                     .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
61836
61837                 tooltip = d3_select(document.body)
61838                     .append('div')
61839                     .attr('class', 'tooltip-inner radial-menu-tooltip');
61840
61841                 function mousedown() {
61842                     event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
61843                 }
61844
61845                 function mouseover(d, i) {
61846                     var rect = context.surfaceRect();
61847                     var angle = a0 + i * a;
61848                     var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
61849                     var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
61850                     var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
61851                     var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
61852
61853                     tooltip
61854                         .style('top', null)
61855                         .style('left', null)
61856                         .style('bottom', null)
61857                         .style('right', null)
61858                         .style('display', 'block')
61859                         .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
61860
61861                     if (i === 0) {
61862                         tooltip
61863                             .style('right', right)
61864                             .style('top', top);
61865                     } else if (i >= 4) {
61866                         tooltip
61867                             .style('left', left)
61868                             .style('bottom', bottom);
61869                     } else {
61870                         tooltip
61871                             .style('left', left)
61872                             .style('top', top);
61873                     }
61874                 }
61875
61876                 function mouseout() {
61877                     tooltip.style('display', 'none');
61878                 }
61879             };
61880
61881
61882             radialMenu.close = function() {
61883                 if (menu) {
61884                     menu
61885                         .style('pointer-events', 'none')
61886                         .transition()
61887                         .attr('opacity', 0)
61888                         .remove();
61889                 }
61890
61891                 if (tooltip) {
61892                     tooltip.remove();
61893                 }
61894             };
61895
61896
61897             radialMenu.center = function(_) {
61898                 if (!arguments.length) return center;
61899                 center = _;
61900                 return radialMenu;
61901             };
61902
61903
61904             return radialMenu;
61905         }
61906
61907         var _relatedParent;
61908
61909
61910         function modeSelect(context, selectedIDs) {
61911             var mode = {
61912                 id: 'select',
61913                 button: 'browse'
61914             };
61915
61916             var keybinding = utilKeybinding('select');
61917             var behaviors = [
61918                 behaviorCopy(context),
61919                 behaviorPaste(context),
61920                 behaviorBreathe(),
61921                 behaviorHover(context),
61922                 behaviorSelect(context),
61923                 behaviorLasso(context),
61924                 modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
61925                 modeDragNote(context).behavior
61926             ];
61927             var editMenu;
61928             var _timeout = null;
61929             var _newFeature = false;
61930             var _suppressMenu = true;
61931             var _follow = false;
61932
61933
61934             var wrap = context.container()
61935                 .select('.inspector-wrap');
61936
61937
61938             function singular() {
61939                 if (selectedIDs && selectedIDs.length === 1) {
61940                     return context.hasEntity(selectedIDs[0]);
61941                 }
61942             }
61943
61944
61945             function checkSelectedIDs() {
61946                 var ids = [];
61947                 if (Array.isArray(selectedIDs)) {
61948                     ids = selectedIDs.filter(function(id) {
61949                         return context.hasEntity(id);
61950                     });
61951                 }
61952
61953                 if (ids.length) {
61954                     selectedIDs = ids;
61955                 } else {
61956                     context.enter(modeBrowse(context));
61957                 }
61958                 return !!ids.length;
61959             }
61960
61961
61962             // find the common parent ways for nextVertex, previousVertex
61963             function commonParents() {
61964                 var graph = context.graph();
61965                 var commonParents = [];
61966
61967                 for (var i = 0; i < selectedIDs.length; i++) {
61968                     var entity = context.hasEntity(selectedIDs[i]);
61969                     if (!entity || entity.geometry(graph) !== 'vertex') {
61970                         return [];  // selection includes some not vertexes
61971                     }
61972
61973                     var currParents = graph.parentWays(entity).map(function(w) { return w.id; });
61974                     if (!commonParents.length) {
61975                         commonParents = currParents;
61976                         continue;
61977                     }
61978
61979                     commonParents = utilArrayIntersection(commonParents, currParents);
61980                     if (!commonParents.length) {
61981                         return [];
61982                     }
61983                 }
61984
61985                 return commonParents;
61986             }
61987
61988
61989             function singularParent() {
61990                 var parents = commonParents();
61991                 if (!parents || parents.length === 0) {
61992                     _relatedParent = null;
61993                     return null;
61994                 }
61995
61996                 // relatedParent is used when we visit a vertex with multiple
61997                 // parents, and we want to remember which parent line we started on.
61998
61999                 if (parents.length === 1) {
62000                     _relatedParent = parents[0];  // remember this parent for later
62001                     return _relatedParent;
62002                 }
62003
62004                 if (parents.indexOf(_relatedParent) !== -1) {
62005                     return _relatedParent;   // prefer the previously seen parent
62006                 }
62007
62008                 return parents[0];
62009             }
62010
62011
62012             function closeMenu() {
62013                 if (editMenu) {
62014                     context.surface().call(editMenu.close);
62015                 }
62016             }
62017
62018
62019             function positionMenu() {
62020                 if (!editMenu) return;
62021
62022                 var entity = singular();
62023                 if (entity && context.geometry(entity.id) === 'relation') {
62024                     _suppressMenu = true;
62025                 } else {
62026                     var point = context.mouse();
62027                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
62028
62029                     if (point && geoPointInPolygon(point, viewport)) {
62030                         editMenu.center(point);
62031                     } else {
62032                         _suppressMenu = true;
62033                     }
62034                 }
62035             }
62036
62037
62038             function showMenu() {
62039                 closeMenu();
62040                 if (editMenu) {
62041                     context.surface().call(editMenu);
62042                 }
62043             }
62044
62045
62046             function toggleMenu() {
62047                 // deprecation warning - Radial Menu to be removed in iD v3
62048                 if (d3_select('.edit-menu, .radial-menu').empty()) {
62049                     positionMenu();
62050                     showMenu();
62051                 } else {
62052                     closeMenu();
62053                 }
62054             }
62055
62056
62057             mode.selectedIDs = function() {
62058                 return selectedIDs;
62059             };
62060
62061
62062             mode.zoomToSelected = function() {
62063                 var entity = singular();
62064                 if (entity) {
62065                     context.map().zoomToEase(entity);
62066                 }
62067             };
62068
62069
62070             mode.reselect = function() {
62071                 if (!checkSelectedIDs()) return;
62072
62073                 var surfaceNode = context.surface().node();
62074                 if (surfaceNode.focus) {   // FF doesn't support it
62075                     surfaceNode.focus();
62076                 }
62077
62078                 positionMenu();
62079                 if (!_suppressMenu) {
62080                     showMenu();
62081                 }
62082             };
62083
62084
62085             mode.newFeature = function(val) {
62086                 if (!arguments.length) return _newFeature;
62087                 _newFeature = val;
62088                 return mode;
62089             };
62090
62091
62092             mode.suppressMenu = function(val) {
62093                 if (!arguments.length) return _suppressMenu;
62094                 _suppressMenu = val;
62095                 return mode;
62096             };
62097
62098
62099             mode.follow = function(val) {
62100                 if (!arguments.length) return _follow;
62101                 _follow = val;
62102                 return mode;
62103             };
62104
62105
62106             mode.enter = function() {
62107                 if (!checkSelectedIDs()) return;
62108
62109                 context.features().forceVisible(selectedIDs);
62110
62111                 var operations = Object.values(Operations)
62112                     .map(function(o) { return o(selectedIDs, context); })
62113                     .filter(function(o) { return o.available() && o.id !== 'delete' && o.id !== 'downgrade'; });
62114
62115                 var downgradeOperation = operationDowngrade(selectedIDs, context);
62116                 // don't allow delete if downgrade is available
62117                 var lastOperation = !context.inIntro() && downgradeOperation.available() ? downgradeOperation : operationDelete(selectedIDs, context);
62118
62119                 // deprecation warning - Radial Menu to be removed in iD v3
62120                 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
62121                 if (isRadialMenu) {
62122                     operations = operations.slice(0,7);
62123                     operations.unshift(lastOperation);
62124                 } else {
62125                     operations.push(lastOperation);
62126                 }
62127
62128                 operations.forEach(function(operation) {
62129                     if (operation.behavior) {
62130                         behaviors.push(operation.behavior);
62131                     }
62132                 });
62133
62134                 behaviors.forEach(context.install);
62135
62136                 keybinding
62137                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
62138                     .on(['[', 'pgup'], previousVertex)
62139                     .on([']', 'pgdown'], nextVertex)
62140                     .on(['{', uiCmd('⌘['), 'home'], firstVertex)
62141                     .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
62142                     .on(['\\', 'pause'], nextParent)
62143                     .on('⎋', esc, true)
62144                     .on('space', toggleMenu);
62145
62146                 d3_select(document)
62147                     .call(keybinding);
62148
62149
62150                 // deprecation warning - Radial Menu to be removed in iD v3
62151                 editMenu = isRadialMenu
62152                     ? uiRadialMenu(context, operations)
62153                     : uiEditMenu(context, operations);
62154
62155                 context.ui().sidebar
62156                     .select(singular() ? singular().id : null, _newFeature);
62157
62158                 context.history()
62159                     .on('undone.select', update)
62160                     .on('redone.select', update);
62161
62162                 context.map()
62163                     .on('move.select', closeMenu)
62164                     .on('drawn.select', selectElements);
62165
62166                 context.surface()
62167                     .on('dblclick.select', dblclick);
62168
62169
62170                 selectElements();
62171
62172                 if (selectedIDs.length > 1) {
62173                     var entities = uiSelectionList(context, selectedIDs);
62174                     context.ui().sidebar.show(entities);
62175                 }
62176
62177                 if (_follow) {
62178                     var extent = geoExtent();
62179                     var graph = context.graph();
62180                     selectedIDs.forEach(function(id) {
62181                         var entity = context.entity(id);
62182                         extent._extend(entity.extent(graph));
62183                     });
62184
62185                     var loc = extent.center();
62186                     context.map().centerEase(loc);
62187                 } else if (singular() && singular().type === 'way') {
62188                     context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
62189                 }
62190
62191                 _timeout = window.setTimeout(function() {
62192                     positionMenu();
62193                     if (!_suppressMenu) {
62194                         showMenu();
62195                     }
62196                 }, 270);  /* after any centerEase completes */
62197
62198
62199                 function update() {
62200                     closeMenu();
62201                     checkSelectedIDs();
62202                 }
62203
62204
62205                 function dblclick() {
62206                     var target = d3_select(event.target);
62207
62208                     var datum = target.datum();
62209                     var entity = datum && datum.properties && datum.properties.entity;
62210                     if (!entity) return;
62211
62212                     if (entity instanceof osmWay && target.classed('target')) {
62213                         var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
62214                         var prev = entity.nodes[choice.index - 1];
62215                         var next = entity.nodes[choice.index];
62216
62217                         context.perform(
62218                             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
62219                             t('operations.add.annotation.vertex')
62220                         );
62221
62222                         event.preventDefault();
62223                         event.stopPropagation();
62224
62225                     } else if (entity.type === 'midpoint') {
62226                         context.perform(
62227                             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
62228                             t('operations.add.annotation.vertex'));
62229
62230                         event.preventDefault();
62231                         event.stopPropagation();
62232                     }
62233                 }
62234
62235
62236                 function selectElements(drawn) {
62237                     if (!checkSelectedIDs()) return;
62238
62239                     var surface = context.surface();
62240                     var entity = singular();
62241
62242                     if (entity && context.geometry(entity.id) === 'relation') {
62243                         _suppressMenu = true;
62244                         return;
62245                     }
62246
62247                     surface.selectAll('.related')
62248                         .classed('related', false);
62249
62250                     singularParent();
62251                     if (_relatedParent) {
62252                         surface.selectAll(utilEntitySelector([_relatedParent]))
62253                             .classed('related', true);
62254                     }
62255
62256                     var selection = context.surface()
62257                         .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
62258
62259                     if (selection.empty()) {
62260                         // Return to browse mode if selected DOM elements have
62261                         // disappeared because the user moved them out of view..
62262                         var source = event && event.type === 'zoom' && event.sourceEvent;
62263                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
62264                             context.enter(modeBrowse(context));
62265                         }
62266                     } else {
62267                         selection
62268                             .classed('selected', true);
62269                     }
62270                 }
62271
62272
62273                 function esc() {
62274                     if (d3_select('.combobox').size()) return;
62275                     context.enter(modeBrowse(context));
62276                 }
62277
62278
62279                 function firstVertex() {
62280                     event.preventDefault();
62281                     var entity = singular();
62282                     var parent = singularParent();
62283                     var way;
62284
62285                     if (entity && entity.type === 'way') {
62286                         way = entity;
62287                     } else if (parent) {
62288                         way = context.entity(parent);
62289                     }
62290
62291                     if (way) {
62292                         context.enter(
62293                             modeSelect(context, [way.first()]).follow(true)
62294                         );
62295                     }
62296                 }
62297
62298
62299                 function lastVertex() {
62300                     event.preventDefault();
62301                     var entity = singular();
62302                     var parent = singularParent();
62303                     var way;
62304
62305                     if (entity && entity.type === 'way') {
62306                         way = entity;
62307                     } else if (parent) {
62308                         way = context.entity(parent);
62309                     }
62310
62311                     if (way) {
62312                         context.enter(
62313                             modeSelect(context, [way.last()]).follow(true)
62314                         );
62315                     }
62316                 }
62317
62318
62319                 function previousVertex() {
62320                     event.preventDefault();
62321                     var parent = singularParent();
62322                     if (!parent) return;
62323
62324                     var way = context.entity(parent);
62325                     var length = way.nodes.length;
62326                     var curr = way.nodes.indexOf(selectedIDs[0]);
62327                     var index = -1;
62328
62329                     if (curr > 0) {
62330                         index = curr - 1;
62331                     } else if (way.isClosed()) {
62332                         index = length - 2;
62333                     }
62334
62335                     if (index !== -1) {
62336                         context.enter(
62337                             modeSelect(context, [way.nodes[index]]).follow(true)
62338                         );
62339                     }
62340                 }
62341
62342
62343                 function nextVertex() {
62344                     event.preventDefault();
62345                     var parent = singularParent();
62346                     if (!parent) return;
62347
62348                     var way = context.entity(parent);
62349                     var length = way.nodes.length;
62350                     var curr = way.nodes.indexOf(selectedIDs[0]);
62351                     var index = -1;
62352
62353                     if (curr < length - 1) {
62354                         index = curr + 1;
62355                     } else if (way.isClosed()) {
62356                         index = 0;
62357                     }
62358
62359                     if (index !== -1) {
62360                         context.enter(
62361                             modeSelect(context, [way.nodes[index]]).follow(true)
62362                         );
62363                     }
62364                 }
62365
62366
62367                 function nextParent() {
62368                     event.preventDefault();
62369                     var parents = commonParents();
62370                     if (!parents || parents.length < 2) return;
62371
62372                     var index = parents.indexOf(_relatedParent);
62373                     if (index < 0 || index > parents.length - 2) {
62374                         _relatedParent = parents[0];
62375                     } else {
62376                         _relatedParent = parents[index + 1];
62377                     }
62378
62379                     var surface = context.surface();
62380                     surface.selectAll('.related')
62381                         .classed('related', false);
62382
62383                     if (_relatedParent) {
62384                         surface.selectAll(utilEntitySelector([_relatedParent]))
62385                             .classed('related', true);
62386                     }
62387                 }
62388             };
62389
62390
62391             mode.exit = function() {
62392                 if (_timeout) window.clearTimeout(_timeout);
62393
62394                 behaviors.forEach(context.uninstall);
62395
62396                 d3_select(document)
62397                     .call(keybinding.unbind);
62398
62399                 closeMenu();
62400                 editMenu = undefined;
62401
62402                 context.history()
62403                     .on('undone.select', null)
62404                     .on('redone.select', null);
62405
62406                 var surface = context.surface();
62407
62408                 surface
62409                     .on('dblclick.select', null);
62410
62411                 surface
62412                     .selectAll('.selected')
62413                     .classed('selected', false);
62414
62415                 surface
62416                     .selectAll('.related')
62417                     .classed('related', false);
62418
62419                 context.map().on('drawn.select', null);
62420                 context.ui().sidebar.hide();
62421                 context.features().forceVisible([]);
62422
62423                 var entity = singular();
62424                 if (_newFeature && entity && entity.type === 'relation' &&
62425                     // no tags
62426                     Object.keys(entity.tags).length === 0 &&
62427                     // no parent relations
62428                     context.graph().parentRelations(entity).length === 0 &&
62429                     // no members or one member with no role
62430                     (entity.members.length === 0 || (entity.members.length === 1 && !entity.members[0].role))
62431                 ) {
62432                     // the user added this relation but didn't edit it at all, so just delete it
62433                     var deleteAction = actionDeleteRelation(entity.id, true /* don't delete untagged members */);
62434                     context.perform(deleteAction, t('operations.delete.annotation.relation'));
62435                 }
62436             };
62437
62438
62439             return mode;
62440         }
62441
62442         function uiLasso(context) {
62443             var group, polygon;
62444
62445             lasso.coordinates = [];
62446
62447             function lasso(selection) {
62448                 context.container()
62449                     .classed('lasso', true);
62450
62451                 group = selection
62452                     .append('g')
62453                     .attr('class', 'lasso hide');
62454
62455                 polygon = group
62456                     .append('path')
62457                     .attr('class', 'lasso-path');
62458
62459                 group
62460                     .call(uiToggle(true));
62461             }
62462
62463
62464             function draw() {
62465                 if (polygon) {
62466                     polygon.data([lasso.coordinates])
62467                         .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
62468                 }
62469             }
62470
62471
62472             lasso.extent = function () {
62473                 return lasso.coordinates.reduce(function(extent, point) {
62474                     return extent.extend(geoExtent(point));
62475                 }, geoExtent());
62476             };
62477
62478
62479             lasso.p = function(_) {
62480                 if (!arguments.length) return lasso;
62481                 lasso.coordinates.push(_);
62482                 draw();
62483                 return lasso;
62484             };
62485
62486
62487             lasso.close = function() {
62488                 if (group) {
62489                     group.call(uiToggle(false, function() {
62490                         d3_select(this).remove();
62491                     }));
62492                 }
62493                 context.container().classed('lasso', false);
62494             };
62495
62496
62497             return lasso;
62498         }
62499
62500         function behaviorLasso(context) {
62501
62502             var behavior = function(selection) {
62503                 var lasso;
62504
62505
62506                 function mousedown() {
62507                     var button = 0;  // left
62508                     if (event.button === button && event.shiftKey === true) {
62509                         lasso = null;
62510
62511                         d3_select(window)
62512                             .on('mousemove.lasso', mousemove)
62513                             .on('mouseup.lasso', mouseup);
62514
62515                         event.stopPropagation();
62516                     }
62517                 }
62518
62519
62520                 function mousemove() {
62521                     if (!lasso) {
62522                         lasso = uiLasso(context);
62523                         context.surface().call(lasso);
62524                     }
62525
62526                     lasso.p(context.mouse());
62527                 }
62528
62529
62530                 function normalize(a, b) {
62531                     return [
62532                         [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62533                         [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
62534                     ];
62535                 }
62536
62537
62538                 function lassoed() {
62539                     if (!lasso) return [];
62540
62541                     var graph = context.graph();
62542                     var bounds = lasso.extent().map(context.projection.invert);
62543                     var extent = geoExtent(normalize(bounds[0], bounds[1]));
62544
62545                     var intersects = context.intersects(extent).filter(function(entity) {
62546                         return entity.type === 'node' &&
62547                             geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62548                             !context.features().isHidden(entity, graph, entity.geometry(graph));
62549                     });
62550
62551                     return intersects.map(function(entity) { return entity.id; });
62552                 }
62553
62554
62555                 function mouseup() {
62556                     d3_select(window)
62557                         .on('mousemove.lasso', null)
62558                         .on('mouseup.lasso', null);
62559
62560                     if (!lasso) return;
62561
62562                     var ids = lassoed();
62563                     lasso.close();
62564
62565                     if (ids.length) {
62566                         context.enter(modeSelect(context, ids));
62567                     }
62568                 }
62569
62570                 selection
62571                     .on('mousedown.lasso', mousedown);
62572             };
62573
62574
62575             behavior.off = function(selection) {
62576                 selection.on('mousedown.lasso', null);
62577             };
62578
62579
62580             return behavior;
62581         }
62582
62583         function modeBrowse(context) {
62584             var mode = {
62585                 button: 'browse',
62586                 id: 'browse',
62587                 title: t('modes.browse.title'),
62588                 description: t('modes.browse.description')
62589             }, sidebar;
62590
62591             var behaviors = [
62592                 behaviorPaste(context),
62593                 behaviorHover(context).on('hover', context.ui().sidebar.hover),
62594                 behaviorSelect(context),
62595                 behaviorLasso(context),
62596                 modeDragNode(context).behavior,
62597                 modeDragNote(context).behavior
62598             ];
62599
62600
62601             mode.enter = function() {
62602                 behaviors.forEach(context.install);
62603
62604                 // Get focus on the body.
62605                 if (document.activeElement && document.activeElement.blur) {
62606                     document.activeElement.blur();
62607                 }
62608
62609                 if (sidebar) {
62610                     context.ui().sidebar.show(sidebar);
62611                 } else {
62612                     context.ui().sidebar.select(null);
62613                 }
62614             };
62615
62616
62617             mode.exit = function() {
62618                 context.ui().sidebar.hover.cancel();
62619                 behaviors.forEach(context.uninstall);
62620
62621                 if (sidebar) {
62622                     context.ui().sidebar.hide();
62623                 }
62624             };
62625
62626
62627             mode.sidebar = function(_) {
62628                 if (!arguments.length) return sidebar;
62629                 sidebar = _;
62630                 return mode;
62631             };
62632
62633
62634             return mode;
62635         }
62636
62637         function behaviorAddWay(context) {
62638             var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
62639             var draw = behaviorDraw(context);
62640
62641             function behavior(surface) {
62642                 draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
62643                     .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
62644                     .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
62645                     .on('cancel', behavior.cancel)
62646                     .on('finish', behavior.cancel);
62647
62648                 context.map()
62649                     .dblclickEnable(false);
62650
62651                 surface.call(draw);
62652             }
62653
62654
62655             behavior.off = function(surface) {
62656                 surface.call(draw.off);
62657             };
62658
62659
62660             behavior.cancel = function() {
62661                 window.setTimeout(function() {
62662                     context.map().dblclickEnable(true);
62663                 }, 1000);
62664
62665                 context.enter(modeBrowse(context));
62666             };
62667
62668
62669             behavior.tail = function(text) {
62670                 draw.tail(text);
62671                 return behavior;
62672             };
62673
62674
62675             return utilRebind(behavior, dispatch$1, 'on');
62676         }
62677
62678         function behaviorHash(context) {
62679             var s0 = null; // cached window.location.hash
62680             var lat = 90 - 1e-8; // allowable latitude range
62681
62682
62683             var parser = function(map, s) {
62684                 var q = utilStringQs(s);
62685                 var args = (q.map || '').split('/').map(Number);
62686
62687                 if (args.length < 3 || args.some(isNaN)) {
62688                     return true; // replace bogus hash
62689
62690                 } else if (s !== formatter(map).slice(1)) {   // hash has changed
62691                     var mode = context.mode();
62692                     var dist = geoSphericalDistance(map.center(), [args[2], args[1]]);
62693                     var maxdist = 500;
62694
62695                     // Don't allow the hash location to change too much while drawing
62696                     // This can happen if the user accidently hit the back button.  #3996
62697                     if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62698                         context.enter(modeBrowse(context));
62699                     }
62700
62701                     map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62702                 }
62703             };
62704
62705
62706             var formatter = function(map) {
62707                 var center = map.center();
62708                 var zoom = map.zoom();
62709                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62710                 var q = utilObjectOmit(utilStringQs(window.location.hash.substring(1)),
62711                     ['comment', 'source', 'hashtags', 'walkthrough']
62712                 );
62713                 var newParams = {};
62714
62715                 delete q.id;
62716                 var selected = context.selectedIDs().filter(function(id) {
62717                     return !context.entity(id).isNew();
62718                 });
62719                 if (selected.length) {
62720                     newParams.id = selected.join(',');
62721                 }
62722
62723                 newParams.map = zoom.toFixed(2) +
62724                     '/' + center[1].toFixed(precision) +
62725                     '/' + center[0].toFixed(precision);
62726
62727                 return '#' + utilQsString(Object.assign(q, newParams), true);
62728             };
62729
62730
62731             function update() {
62732                 if (context.inIntro()) return;
62733                 var s1 = formatter(context.map());
62734                 if (s0 !== s1) {
62735                     window.location.replace(s0 = s1);  // don't recenter the map!
62736                 }
62737             }
62738
62739
62740             var throttledUpdate = throttle(update, 500);
62741
62742
62743             function hashchange() {
62744                 if (window.location.hash === s0) return;  // ignore spurious hashchange events
62745                 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62746                     update(); // replace bogus hash
62747                 }
62748             }
62749
62750
62751             function behavior() {
62752                 context.map()
62753                     .on('move.hash', throttledUpdate);
62754
62755                 context
62756                     .on('enter.hash', throttledUpdate);
62757
62758                 d3_select(window)
62759                     .on('hashchange.hash', hashchange);
62760
62761                 if (window.location.hash) {
62762                     var q = utilStringQs(window.location.hash.substring(1));
62763
62764                     if (q.id) {
62765                         context.zoomToEntity(q.id.split(',')[0], !q.map);
62766                     }
62767
62768                     // Store these here instead of updating local storage since local
62769                     // storage could be flushed if the user discards pending changes
62770                     if (q.comment)  behavior.comment = q.comment;
62771                     if (q.source)   behavior.source = q.source;
62772                     if (q.hashtags) behavior.hashtags = q.hashtags;
62773
62774                     if (q.walkthrough === 'true') {
62775                         behavior.startWalkthrough = true;
62776                     }
62777
62778                     hashchange();
62779
62780                     if (q.map) {
62781                         behavior.hadHash = true;
62782                     }
62783                 }
62784             }
62785
62786
62787             behavior.off = function() {
62788                 throttledUpdate.cancel();
62789
62790                 context.map()
62791                     .on('move.hash', null);
62792
62793                 context
62794                     .on('enter.hash', null);
62795
62796                 d3_select(window)
62797                     .on('hashchange.hash', null);
62798
62799                 window.location.hash = '';
62800             };
62801
62802
62803             return behavior;
62804         }
62805
62806         /*
62807             iD.coreDifference represents the difference between two graphs.
62808             It knows how to calculate the set of entities that were
62809             created, modified, or deleted, and also contains the logic
62810             for recursively extending a difference to the complete set
62811             of entities that will require a redraw, taking into account
62812             child and parent relationships.
62813          */
62814         function coreDifference(base, head) {
62815             var _changes = {};
62816             var _didChange = {};  // 'addition', 'deletion', 'geometry', 'properties'
62817             var _diff = {};
62818
62819             function checkEntityID(id) {
62820                 var h = head.entities[id];
62821                 var b = base.entities[id];
62822
62823                 if (h === b) return;
62824                 if (_changes[id]) return;
62825
62826                 if (!h && b) {
62827                     _changes[id] = { base: b, head: h };
62828                     _didChange.deletion = true;
62829                     return;
62830                 }
62831                 if (h && !b) {
62832                     _changes[id] = { base: b, head: h };
62833                     _didChange.addition = true;
62834                     return;
62835                 }
62836
62837                 if (h && b) {
62838                     if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
62839                         _changes[id] = { base: b, head: h };
62840                         _didChange.geometry = true;
62841                         _didChange.properties = true;
62842                         return;
62843                     }
62844                     if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
62845                         _changes[id] = { base: b, head: h };
62846                         _didChange.geometry = true;
62847                     }
62848                     if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
62849                         _changes[id] = { base: b, head: h };
62850                         _didChange.geometry = true;
62851                     }
62852                     if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
62853                         _changes[id] = { base: b, head: h };
62854                         _didChange.properties = true;
62855                     }
62856                 }
62857             }
62858
62859             Object.keys(head.entities).forEach(checkEntityID);
62860             Object.keys(base.entities).forEach(checkEntityID);
62861
62862
62863             _diff.length = function length() {
62864                 return Object.keys(_changes).length;
62865             };
62866
62867
62868             _diff.changes = function changes() {
62869                 return _changes;
62870             };
62871
62872             _diff.didChange = _didChange;
62873
62874
62875             // pass true to include affected relation members
62876             _diff.extantIDs = function extantIDs(includeRelMembers) {
62877                 var result = new Set();
62878                 Object.keys(_changes).forEach(function(id) {
62879                     if (_changes[id].head) {
62880                         result.add(id);
62881                     }
62882
62883                     var h = _changes[id].head;
62884                     var b = _changes[id].base;
62885                     var entity = h || b;
62886
62887                     if (includeRelMembers && entity.type === 'relation') {
62888                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62889                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62890                         utilArrayUnion(mh, mb).forEach(function(memberID) {
62891                             if (head.hasEntity(memberID)) {
62892                                 result.add(memberID);
62893                             }
62894                         });
62895                     }
62896                 });
62897
62898                 return Array.from(result);
62899             };
62900
62901
62902             _diff.modified = function modified() {
62903                 var result = [];
62904                 Object.values(_changes).forEach(function(change) {
62905                     if (change.base && change.head) {
62906                         result.push(change.head);
62907                     }
62908                 });
62909                 return result;
62910             };
62911
62912
62913             _diff.created = function created() {
62914                 var result = [];
62915                 Object.values(_changes).forEach(function(change) {
62916                     if (!change.base && change.head) {
62917                         result.push(change.head);
62918                     }
62919                 });
62920                 return result;
62921             };
62922
62923
62924             _diff.deleted = function deleted() {
62925                 var result = [];
62926                 Object.values(_changes).forEach(function(change) {
62927                     if (change.base && !change.head) {
62928                         result.push(change.base);
62929                     }
62930                 });
62931                 return result;
62932             };
62933
62934
62935             _diff.summary = function summary() {
62936                 var relevant = {};
62937
62938                 var keys = Object.keys(_changes);
62939                 for (var i = 0; i < keys.length; i++) {
62940                     var change = _changes[keys[i]];
62941
62942                     if (change.head && change.head.geometry(head) !== 'vertex') {
62943                         addEntity(change.head, head, change.base ? 'modified' : 'created');
62944
62945                     } else if (change.base && change.base.geometry(base) !== 'vertex') {
62946                         addEntity(change.base, base, 'deleted');
62947
62948                     } else if (change.base && change.head) { // modified vertex
62949                         var moved    = !fastDeepEqual(change.base.loc,  change.head.loc);
62950                         var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
62951
62952                         if (moved) {
62953                             addParents(change.head);
62954                         }
62955
62956                         if (retagged || (moved && change.head.hasInterestingTags())) {
62957                             addEntity(change.head, head, 'modified');
62958                         }
62959
62960                     } else if (change.head && change.head.hasInterestingTags()) { // created vertex
62961                         addEntity(change.head, head, 'created');
62962
62963                     } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
62964                         addEntity(change.base, base, 'deleted');
62965                     }
62966                 }
62967
62968                 return Object.values(relevant);
62969
62970
62971                 function addEntity(entity, graph, changeType) {
62972                     relevant[entity.id] = {
62973                         entity: entity,
62974                         graph: graph,
62975                         changeType: changeType
62976                     };
62977                 }
62978
62979                 function addParents(entity) {
62980                     var parents = head.parentWays(entity);
62981                     for (var j = parents.length - 1; j >= 0; j--) {
62982                         var parent = parents[j];
62983                         if (!(parent.id in relevant)) {
62984                             addEntity(parent, head, 'modified');
62985                         }
62986                     }
62987                 }
62988             };
62989
62990
62991             // returns complete set of entities that require a redraw
62992             //  (optionally within given `extent`)
62993             _diff.complete = function complete(extent) {
62994                 var result = {};
62995                 var id, change;
62996
62997                 for (id in _changes) {
62998                     change = _changes[id];
62999
63000                     var h = change.head;
63001                     var b = change.base;
63002                     var entity = h || b;
63003                     var i;
63004
63005                     if (extent &&
63006                         (!h || !h.intersects(extent, head)) &&
63007                         (!b || !b.intersects(extent, base)))
63008                         continue;
63009
63010                     result[id] = h;
63011
63012                     if (entity.type === 'way') {
63013                         var nh = h ? h.nodes : [];
63014                         var nb = b ? b.nodes : [];
63015                         var diff;
63016
63017                         diff = utilArrayDifference(nh, nb);
63018                         for (i = 0; i < diff.length; i++) {
63019                             result[diff[i]] = head.hasEntity(diff[i]);
63020                         }
63021
63022                         diff = utilArrayDifference(nb, nh);
63023                         for (i = 0; i < diff.length; i++) {
63024                             result[diff[i]] = head.hasEntity(diff[i]);
63025                         }
63026                     }
63027
63028                     if (entity.type === 'relation' && entity.isMultipolygon()) {
63029                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
63030                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
63031                         var ids = utilArrayUnion(mh, mb);
63032                         for (i = 0; i < ids.length; i++) {
63033                             var member = head.hasEntity(ids[i]);
63034                             if (!member) continue;   // not downloaded
63035                             if (extent && !member.intersects(extent, head)) continue;   // not visible
63036                             result[ids[i]] = member;
63037                         }
63038                     }
63039
63040                     addParents(head.parentWays(entity), result);
63041                     addParents(head.parentRelations(entity), result);
63042                 }
63043
63044                 return result;
63045
63046
63047                 function addParents(parents, result) {
63048                     for (var i = 0; i < parents.length; i++) {
63049                         var parent = parents[i];
63050                         if (parent.id in result) continue;
63051
63052                         result[parent.id] = parent;
63053                         addParents(head.parentRelations(parent), result);
63054                     }
63055                 }
63056             };
63057
63058
63059             return _diff;
63060         }
63061
63062         function coreTree(head) {
63063             var rtree = rbush_1();
63064             var bboxes = {};
63065             var tree = {};
63066
63067
63068             function entityBBox(entity) {
63069                 var bbox = entity.extent(head).bbox();
63070                 bbox.id = entity.id;
63071                 bboxes[entity.id] = bbox;
63072                 return bbox;
63073             }
63074
63075
63076             function updateParents(entity, insertions, memo) {
63077                 head.parentWays(entity).forEach(function(way) {
63078                     if (bboxes[way.id]) {
63079                         rtree.remove(bboxes[way.id]);
63080                         insertions[way.id] = way;
63081                     }
63082                     updateParents(way, insertions, memo);
63083                 });
63084
63085                 head.parentRelations(entity).forEach(function(relation) {
63086                     if (memo[entity.id]) return;
63087                     memo[entity.id] = true;
63088                     if (bboxes[relation.id]) {
63089                         rtree.remove(bboxes[relation.id]);
63090                         insertions[relation.id] = relation;
63091                     }
63092                     updateParents(relation, insertions, memo);
63093                 });
63094             }
63095
63096
63097             tree.rebase = function(entities, force) {
63098                 var insertions = {};
63099
63100                 for (var i = 0; i < entities.length; i++) {
63101                     var entity = entities[i];
63102                     if (!entity.visible) continue;
63103
63104                     if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
63105                         if (!force) {
63106                             continue;
63107                         } else if (bboxes[entity.id]) {
63108                             rtree.remove(bboxes[entity.id]);
63109                         }
63110                     }
63111
63112                     insertions[entity.id] = entity;
63113                     updateParents(entity, insertions, {});
63114                 }
63115
63116                 rtree.load(Object.values(insertions).map(entityBBox));
63117
63118                 return tree;
63119             };
63120
63121
63122             tree.intersects = function(extent, graph) {
63123                 if (graph !== head) {
63124                     var diff = coreDifference(head, graph);
63125                     var changed = diff.didChange;
63126
63127                     if (changed.addition || changed.deletion || changed.geometry) {
63128                         var insertions = {};
63129                         head = graph;
63130
63131                         if (changed.deletion) {
63132                             diff.deleted().forEach(function(entity) {
63133                                 rtree.remove(bboxes[entity.id]);
63134                                 delete bboxes[entity.id];
63135                             });
63136                         }
63137
63138                         if (changed.geometry) {
63139                             diff.modified().forEach(function(entity) {
63140                                 rtree.remove(bboxes[entity.id]);
63141                                 insertions[entity.id] = entity;
63142                                 updateParents(entity, insertions, {});
63143                             });
63144                         }
63145
63146                         if (changed.addition) {
63147                             diff.created().forEach(function(entity) {
63148                                 insertions[entity.id] = entity;
63149                             });
63150                         }
63151
63152                         rtree.load(Object.values(insertions).map(entityBBox));
63153                     }
63154                 }
63155
63156                 return rtree.search(extent.bbox())
63157                     .map(function(bbox) { return graph.entity(bbox.id); });
63158             };
63159
63160
63161             return tree;
63162         }
63163
63164         function uiModal(selection, blocking) {
63165             var keybinding = utilKeybinding('modal');
63166             var previous = selection.select('div.modal');
63167             var animate = previous.empty();
63168
63169             previous.transition()
63170                 .duration(200)
63171                 .style('opacity', 0)
63172                 .remove();
63173
63174             var shaded = selection
63175                 .append('div')
63176                 .attr('class', 'shaded')
63177                 .style('opacity', 0);
63178
63179             shaded.close = function() {
63180                 shaded
63181                     .transition()
63182                     .duration(200)
63183                     .style('opacity',0)
63184                     .remove();
63185
63186                 modal
63187                     .transition()
63188                     .duration(200)
63189                     .style('top','0px');
63190
63191                 d3_select(document)
63192                     .call(keybinding.unbind);
63193             };
63194
63195
63196             var modal = shaded
63197                 .append('div')
63198                 .attr('class', 'modal fillL');
63199
63200             if (!blocking) {
63201                 shaded.on('click.remove-modal', function() {
63202                     if (event.target === this) {
63203                         shaded.close();
63204                     }
63205                 });
63206
63207                 modal.append('button')
63208                     .attr('class', 'close')
63209                     .on('click', shaded.close)
63210                     .call(svgIcon('#iD-icon-close'));
63211
63212                 keybinding
63213                     .on('⌫', shaded.close)
63214                     .on('⎋', shaded.close);
63215
63216                 d3_select(document)
63217                     .call(keybinding);
63218             }
63219
63220             modal
63221                 .append('div')
63222                 .attr('class', 'content');
63223
63224             if (animate) {
63225                 shaded.transition().style('opacity', 1);
63226             } else {
63227                 shaded.style('opacity', 1);
63228             }
63229
63230
63231             return shaded;
63232         }
63233
63234         function uiLoading(context) {
63235             var _modalSelection = d3_select(null);
63236             var _message = '';
63237             var _blocking = false;
63238
63239
63240             var loading = function(selection) {
63241                 _modalSelection = uiModal(selection, _blocking);
63242
63243                 var loadertext = _modalSelection.select('.content')
63244                     .classed('loading-modal', true)
63245                     .append('div')
63246                     .attr('class', 'modal-section fillL');
63247
63248                 loadertext
63249                     .append('img')
63250                     .attr('class', 'loader')
63251                     .attr('src', context.imagePath('loader-white.gif'));
63252
63253                 loadertext
63254                     .append('h3')
63255                     .text(_message);
63256
63257                 _modalSelection.select('button.close')
63258                     .attr('class', 'hide');
63259
63260                 return loading;
63261             };
63262
63263
63264             loading.message = function(_) {
63265                 if (!arguments.length) return _message;
63266                 _message = _;
63267                 return loading;
63268             };
63269
63270
63271             loading.blocking = function(_) {
63272                 if (!arguments.length) return _blocking;
63273                 _blocking = _;
63274                 return loading;
63275             };
63276
63277
63278             loading.close = function() {
63279                 _modalSelection.remove();
63280             };
63281
63282
63283             return loading;
63284         }
63285
63286         function coreHistory(context) {
63287             var dispatch$1 = dispatch('change', 'merge', 'restore', 'undone', 'redone');
63288             var lock = utilSessionMutex('lock');
63289             var duration = 150;
63290             var _imageryUsed = [];
63291             var _photoOverlaysUsed = [];
63292             var _checkpoints = {};
63293             var _pausedGraph;
63294             var _stack;
63295             var _index;
63296             var _tree;
63297
63298
63299             // internal _act, accepts list of actions and eased time
63300             function _act(actions, t) {
63301                 actions = Array.prototype.slice.call(actions);
63302
63303                 var annotation;
63304                 if (typeof actions[actions.length - 1] !== 'function') {
63305                     annotation = actions.pop();
63306                 }
63307
63308                 var graph = _stack[_index].graph;
63309                 for (var i = 0; i < actions.length; i++) {
63310                     graph = actions[i](graph, t);
63311                 }
63312
63313                 return {
63314                     graph: graph,
63315                     annotation: annotation,
63316                     imageryUsed: _imageryUsed,
63317                     photoOverlaysUsed: _photoOverlaysUsed,
63318                     transform: context.projection.transform(),
63319                     selectedIDs: context.selectedIDs()
63320                 };
63321             }
63322
63323
63324             // internal _perform with eased time
63325             function _perform(args, t) {
63326                 var previous = _stack[_index].graph;
63327                 _stack = _stack.slice(0, _index + 1);
63328                 var actionResult = _act(args, t);
63329                 _stack.push(actionResult);
63330                 _index++;
63331                 return change(previous);
63332             }
63333
63334
63335             // internal _replace with eased time
63336             function _replace(args, t) {
63337                 var previous = _stack[_index].graph;
63338                 // assert(_index == _stack.length - 1)
63339                 var actionResult = _act(args, t);
63340                 _stack[_index] = actionResult;
63341                 return change(previous);
63342             }
63343
63344
63345             // internal _overwrite with eased time
63346             function _overwrite(args, t) {
63347                 var previous = _stack[_index].graph;
63348                 if (_index > 0) {
63349                     _index--;
63350                     _stack.pop();
63351                 }
63352                 _stack = _stack.slice(0, _index + 1);
63353                 var actionResult = _act(args, t);
63354                 _stack.push(actionResult);
63355                 _index++;
63356                 return change(previous);
63357             }
63358
63359
63360             // determine difference and dispatch a change event
63361             function change(previous) {
63362                 var difference = coreDifference(previous, history.graph());
63363                 if (!_pausedGraph) {
63364                     dispatch$1.call('change', this, difference);
63365                 }
63366                 return difference;
63367             }
63368
63369
63370             // iD uses namespaced keys so multiple installations do not conflict
63371             function getKey(n) {
63372                 return 'iD_' + window.location.origin + '_' + n;
63373             }
63374
63375
63376             var history = {
63377
63378                 graph: function() {
63379                     return _stack[_index].graph;
63380                 },
63381
63382
63383                 tree: function() {
63384                     return _tree;
63385                 },
63386
63387
63388                 base: function() {
63389                     return _stack[0].graph;
63390                 },
63391
63392
63393                 merge: function(entities, extent) {
63394                     var stack = _stack.map(function(state) { return state.graph; });
63395                     _stack[0].graph.rebase(entities, stack, false);
63396                     _tree.rebase(entities, false);
63397
63398                     dispatch$1.call('merge', this, entities);
63399                 },
63400
63401
63402                 perform: function() {
63403                     // complete any transition already in progress
63404                     d3_select(document).interrupt('history.perform');
63405
63406                     var transitionable = false;
63407                     var action0 = arguments[0];
63408
63409                     if (arguments.length === 1 ||
63410                         (arguments.length === 2 && (typeof arguments[1] !== 'function'))) {
63411                         transitionable = !!action0.transitionable;
63412                     }
63413
63414                     if (transitionable) {
63415                         var origArguments = arguments;
63416                         d3_select(document)
63417                             .transition('history.perform')
63418                             .duration(duration)
63419                             .ease(linear$1)
63420                             .tween('history.tween', function() {
63421                                 return function(t) {
63422                                     if (t < 1) _overwrite([action0], t);
63423                                 };
63424                             })
63425                             .on('start', function() {
63426                                 _perform([action0], 0);
63427                             })
63428                             .on('end interrupt', function() {
63429                                 _overwrite(origArguments, 1);
63430                             });
63431
63432                     } else {
63433                         return _perform(arguments);
63434                     }
63435                 },
63436
63437
63438                 replace: function() {
63439                     d3_select(document).interrupt('history.perform');
63440                     return _replace(arguments, 1);
63441                 },
63442
63443
63444                 // Same as calling pop and then perform
63445                 overwrite: function() {
63446                     d3_select(document).interrupt('history.perform');
63447                     return _overwrite(arguments, 1);
63448                 },
63449
63450
63451                 pop: function(n) {
63452                     d3_select(document).interrupt('history.perform');
63453
63454                     var previous = _stack[_index].graph;
63455                     if (isNaN(+n) || +n < 0) {
63456                         n = 1;
63457                     }
63458                     while (n-- > 0 && _index > 0) {
63459                         _index--;
63460                         _stack.pop();
63461                     }
63462                     return change(previous);
63463                 },
63464
63465
63466                 // Back to the previous annotated state or _index = 0.
63467                 undo: function() {
63468                     d3_select(document).interrupt('history.perform');
63469
63470                     var previousStack = _stack[_index];
63471                     var previous = previousStack.graph;
63472                     while (_index > 0) {
63473                         _index--;
63474                         if (_stack[_index].annotation) break;
63475                     }
63476
63477                     dispatch$1.call('undone', this, _stack[_index], previousStack);
63478                     return change(previous);
63479                 },
63480
63481
63482                 // Forward to the next annotated state.
63483                 redo: function() {
63484                     d3_select(document).interrupt('history.perform');
63485
63486                     var previousStack = _stack[_index];
63487                     var previous = previousStack.graph;
63488                     var tryIndex = _index;
63489                     while (tryIndex < _stack.length - 1) {
63490                         tryIndex++;
63491                         if (_stack[tryIndex].annotation) {
63492                             _index = tryIndex;
63493                             dispatch$1.call('redone', this, _stack[_index], previousStack);
63494                             break;
63495                         }
63496                     }
63497
63498                     return change(previous);
63499                 },
63500
63501
63502                 pauseChangeDispatch: function() {
63503                     if (!_pausedGraph) {
63504                         _pausedGraph = _stack[_index].graph;
63505                     }
63506                 },
63507
63508
63509                 resumeChangeDispatch: function() {
63510                     if (_pausedGraph) {
63511                         var previous = _pausedGraph;
63512                         _pausedGraph = null;
63513                         return change(previous);
63514                     }
63515                 },
63516
63517
63518                 undoAnnotation: function() {
63519                     var i = _index;
63520                     while (i >= 0) {
63521                         if (_stack[i].annotation) return _stack[i].annotation;
63522                         i--;
63523                     }
63524                 },
63525
63526
63527                 redoAnnotation: function() {
63528                     var i = _index + 1;
63529                     while (i <= _stack.length - 1) {
63530                         if (_stack[i].annotation) return _stack[i].annotation;
63531                         i++;
63532                     }
63533                 },
63534
63535
63536                 intersects: function(extent) {
63537                     return _tree.intersects(extent, _stack[_index].graph);
63538                 },
63539
63540
63541                 difference: function() {
63542                     var base = _stack[0].graph;
63543                     var head = _stack[_index].graph;
63544                     return coreDifference(base, head);
63545                 },
63546
63547
63548                 changes: function(action) {
63549                     var base = _stack[0].graph;
63550                     var head = _stack[_index].graph;
63551
63552                     if (action) {
63553                         head = action(head);
63554                     }
63555
63556                     var difference = coreDifference(base, head);
63557
63558                     return {
63559                         modified: difference.modified(),
63560                         created: difference.created(),
63561                         deleted: difference.deleted()
63562                     };
63563                 },
63564
63565
63566                 hasChanges: function() {
63567                     return this.difference().length() > 0;
63568                 },
63569
63570
63571                 imageryUsed: function(sources) {
63572                     if (sources) {
63573                         _imageryUsed = sources;
63574                         return history;
63575                     } else {
63576                         var s = new Set();
63577                         _stack.slice(1, _index + 1).forEach(function(state) {
63578                             state.imageryUsed.forEach(function(source) {
63579                                 if (source !== 'Custom') {
63580                                     s.add(source);
63581                                 }
63582                             });
63583                         });
63584                         return Array.from(s);
63585                     }
63586                 },
63587
63588
63589                 photoOverlaysUsed: function(sources) {
63590                     if (sources) {
63591                         _photoOverlaysUsed = sources;
63592                         return history;
63593                     } else {
63594                         var s = new Set();
63595                         _stack.slice(1, _index + 1).forEach(function(state) {
63596                             if (state.photoOverlaysUsed && Array.isArray(state.photoOverlaysUsed)) {
63597                                 state.photoOverlaysUsed.forEach(function(photoOverlay) {
63598                                     s.add(photoOverlay);
63599                                 });
63600                             }
63601                         });
63602                         return Array.from(s);
63603                     }
63604                 },
63605
63606
63607                 // save the current history state
63608                 checkpoint: function(key) {
63609                     _checkpoints[key] = {
63610                         stack: _stack,
63611                         index: _index
63612                     };
63613                     return history;
63614                 },
63615
63616
63617                 // restore history state to a given checkpoint or reset completely
63618                 reset: function(key) {
63619                     if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
63620                         _stack = _checkpoints[key].stack;
63621                         _index = _checkpoints[key].index;
63622                     } else {
63623                         _stack = [{graph: coreGraph()}];
63624                         _index = 0;
63625                         _tree = coreTree(_stack[0].graph);
63626                         _checkpoints = {};
63627                     }
63628                     dispatch$1.call('change');
63629                     return history;
63630                 },
63631
63632
63633                 // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
63634                 //
63635                 // To use it:
63636                 //  1. Start the walkthrough.
63637                 //  2. Get to a "free editing" tutorial step
63638                 //  3. Make your edits to the walkthrough map
63639                 //  4. In your browser dev console run:
63640                 //        `id.history().toIntroGraph()`
63641                 //  5. This outputs stringified JSON to the browser console
63642                 //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
63643                 toIntroGraph: function() {
63644                     var nextID = { n: 0, r: 0, w: 0 };
63645                     var permIDs = {};
63646                     var graph = this.graph();
63647                     var baseEntities = {};
63648
63649                     // clone base entities..
63650                     Object.values(graph.base().entities).forEach(function(entity) {
63651                         var copy = copyIntroEntity(entity);
63652                         baseEntities[copy.id] = copy;
63653                     });
63654
63655                     // replace base entities with head entities..
63656                     Object.keys(graph.entities).forEach(function(id) {
63657                         var entity = graph.entities[id];
63658                         if (entity) {
63659                             var copy = copyIntroEntity(entity);
63660                             baseEntities[copy.id] = copy;
63661                         } else {
63662                             delete baseEntities[id];
63663                         }
63664                     });
63665
63666                     // swap temporary for permanent ids..
63667                     Object.values(baseEntities).forEach(function(entity) {
63668                         if (Array.isArray(entity.nodes)) {
63669                             entity.nodes = entity.nodes.map(function(node) {
63670                                 return permIDs[node] || node;
63671                             });
63672                         }
63673                         if (Array.isArray(entity.members)) {
63674                             entity.members = entity.members.map(function(member) {
63675                                 member.id = permIDs[member.id] || member.id;
63676                                 return member;
63677                             });
63678                         }
63679                     });
63680
63681                     return JSON.stringify({ dataIntroGraph: baseEntities });
63682
63683
63684                     function copyIntroEntity(source) {
63685                         var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']);
63686
63687                         // Note: the copy is no longer an osmEntity, so it might not have `tags`
63688                         if (copy.tags && !Object.keys(copy.tags)) {
63689                             delete copy.tags;
63690                         }
63691
63692                         if (Array.isArray(copy.loc)) {
63693                             copy.loc[0] = +copy.loc[0].toFixed(6);
63694                             copy.loc[1] = +copy.loc[1].toFixed(6);
63695                         }
63696
63697                         var match = source.id.match(/([nrw])-\d*/);  // temporary id
63698                         if (match !== null) {
63699                             var nrw = match[1];
63700                             var permID;
63701                             do { permID = nrw + (++nextID[nrw]); }
63702                             while (baseEntities.hasOwnProperty(permID));
63703
63704                             copy.id = permIDs[source.id] = permID;
63705                         }
63706                         return copy;
63707                     }
63708                 },
63709
63710
63711                 toJSON: function() {
63712                     if (!this.hasChanges()) return;
63713
63714                     var allEntities = {};
63715                     var baseEntities = {};
63716                     var base = _stack[0];
63717
63718                     var s = _stack.map(function(i) {
63719                         var modified = [];
63720                         var deleted = [];
63721
63722                         Object.keys(i.graph.entities).forEach(function(id) {
63723                             var entity = i.graph.entities[id];
63724                             if (entity) {
63725                                 var key = osmEntity.key(entity);
63726                                 allEntities[key] = entity;
63727                                 modified.push(key);
63728                             } else {
63729                                 deleted.push(id);
63730                             }
63731
63732                             // make sure that the originals of changed or deleted entities get merged
63733                             // into the base of the _stack after restoring the data from JSON.
63734                             if (id in base.graph.entities) {
63735                                 baseEntities[id] = base.graph.entities[id];
63736                             }
63737                             if (entity && entity.nodes) {
63738                                 // get originals of pre-existing child nodes
63739                                 entity.nodes.forEach(function(nodeID) {
63740                                     if (nodeID in base.graph.entities) {
63741                                         baseEntities[nodeID] = base.graph.entities[nodeID];
63742                                     }
63743                                 });
63744                             }
63745                             // get originals of parent entities too
63746                             var baseParents = base.graph._parentWays[id];
63747                             if (baseParents) {
63748                                 baseParents.forEach(function(parentID) {
63749                                     if (parentID in base.graph.entities) {
63750                                         baseEntities[parentID] = base.graph.entities[parentID];
63751                                     }
63752                                 });
63753                             }
63754                         });
63755
63756                         var x = {};
63757
63758                         if (modified.length) x.modified = modified;
63759                         if (deleted.length) x.deleted = deleted;
63760                         if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
63761                         if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
63762                         if (i.annotation) x.annotation = i.annotation;
63763                         if (i.transform) x.transform = i.transform;
63764                         if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
63765
63766                         return x;
63767                     });
63768
63769                     return JSON.stringify({
63770                         version: 3,
63771                         entities: Object.values(allEntities),
63772                         baseEntities: Object.values(baseEntities),
63773                         stack: s,
63774                         nextIDs: osmEntity.id.next,
63775                         index: _index
63776                     });
63777                 },
63778
63779
63780                 fromJSON: function(json, loadChildNodes) {
63781                     var h = JSON.parse(json);
63782                     var loadComplete = true;
63783
63784                     osmEntity.id.next = h.nextIDs;
63785                     _index = h.index;
63786
63787                     if (h.version === 2 || h.version === 3) {
63788                         var allEntities = {};
63789
63790                         h.entities.forEach(function(entity) {
63791                             allEntities[osmEntity.key(entity)] = osmEntity(entity);
63792                         });
63793
63794                         if (h.version === 3) {
63795                             // This merges originals for changed entities into the base of
63796                             // the _stack even if the current _stack doesn't have them (for
63797                             // example when iD has been restarted in a different region)
63798                             var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
63799                             var stack = _stack.map(function(state) { return state.graph; });
63800                             _stack[0].graph.rebase(baseEntities, stack, true);
63801                             _tree.rebase(baseEntities, true);
63802
63803                             // When we restore a modified way, we also need to fetch any missing
63804                             // childnodes that would normally have been downloaded with it.. #2142
63805                             if (loadChildNodes) {
63806                                 var osm = context.connection();
63807                                 var baseWays = baseEntities
63808                                     .filter(function(e) { return e.type === 'way'; });
63809                                 var nodeIDs = baseWays
63810                                     .reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []);
63811                                 var missing = nodeIDs
63812                                     .filter(function(n) { return !_stack[0].graph.hasEntity(n); });
63813
63814                                 if (missing.length && osm) {
63815                                     loadComplete = false;
63816                                     context.redrawEnable(false);
63817
63818                                     var loading = uiLoading(context).blocking(true);
63819                                     context.container().call(loading);
63820
63821                                     var childNodesLoaded = function(err, result) {
63822                                         if (!err) {
63823                                             var visibleGroups = utilArrayGroupBy(result.data, 'visible');
63824                                             var visibles = visibleGroups.true || [];      // alive nodes
63825                                             var invisibles = visibleGroups.false || [];   // deleted nodes
63826
63827                                             if (visibles.length) {
63828                                                 var visibleIDs = visibles.map(function(entity) { return entity.id; });
63829                                                 var stack = _stack.map(function(state) { return state.graph; });
63830                                                 missing = utilArrayDifference(missing, visibleIDs);
63831                                                 _stack[0].graph.rebase(visibles, stack, true);
63832                                                 _tree.rebase(visibles, true);
63833                                             }
63834
63835                                             // fetch older versions of nodes that were deleted..
63836                                             invisibles.forEach(function(entity) {
63837                                                 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
63838                                             });
63839                                         }
63840
63841                                         if (err || !missing.length) {
63842                                             loading.close();
63843                                             context.redrawEnable(true);
63844                                             dispatch$1.call('change');
63845                                             dispatch$1.call('restore', this);
63846                                         }
63847                                     };
63848
63849                                     osm.loadMultiple(missing, childNodesLoaded);
63850                                 }
63851                             }
63852                         }
63853
63854                         _stack = h.stack.map(function(d) {
63855                             var entities = {}, entity;
63856
63857                             if (d.modified) {
63858                                 d.modified.forEach(function(key) {
63859                                     entity = allEntities[key];
63860                                     entities[entity.id] = entity;
63861                                 });
63862                             }
63863
63864                             if (d.deleted) {
63865                                 d.deleted.forEach(function(id) {
63866                                     entities[id] = undefined;
63867                                 });
63868                             }
63869
63870                             return {
63871                                 graph: coreGraph(_stack[0].graph).load(entities),
63872                                 annotation: d.annotation,
63873                                 imageryUsed: d.imageryUsed,
63874                                 photoOverlaysUsed: d.photoOverlaysUsed,
63875                                 transform: d.transform,
63876                                 selectedIDs: d.selectedIDs
63877                             };
63878                         });
63879
63880                     } else { // original version
63881                         _stack = h.stack.map(function(d) {
63882                             var entities = {};
63883
63884                             for (var i in d.entities) {
63885                                 var entity = d.entities[i];
63886                                 entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
63887                             }
63888
63889                             d.graph = coreGraph(_stack[0].graph).load(entities);
63890                             return d;
63891                         });
63892                     }
63893
63894                     var transform = _stack[_index].transform;
63895                     if (transform) {
63896                         context.map().transformEase(transform, 0);   // 0 = immediate, no easing
63897                     }
63898
63899                     if (loadComplete) {
63900                         dispatch$1.call('change');
63901                         dispatch$1.call('restore', this);
63902                     }
63903
63904                     return history;
63905                 },
63906
63907
63908                 save: function() {
63909                     if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
63910                     return history;
63911                 },
63912
63913
63914                 clearSaved: function() {
63915                     context.debouncedSave.cancel();
63916                     if (lock.locked()) {
63917                         context.storage(getKey('saved_history'), null);
63918
63919                         // clear the changeset metadata associated with the saved history
63920                         context.storage('comment', null);
63921                         context.storage('hashtags', null);
63922                         context.storage('source', null);
63923                     }
63924                     return history;
63925                 },
63926
63927
63928                 lock: function() {
63929                     return lock.lock();
63930                 },
63931
63932
63933                 unlock: function() {
63934                     lock.unlock();
63935                 },
63936
63937
63938                 // is iD not open in another window and it detects that
63939                 // there's a history stored in localStorage that's recoverable?
63940                 restorableChanges: function() {
63941                     return lock.locked() && !!context.storage(getKey('saved_history'));
63942                 },
63943
63944
63945                 // load history from a version stored in localStorage
63946                 restore: function() {
63947                     if (!lock.locked()) return;
63948
63949                     var json = context.storage(getKey('saved_history'));
63950                     if (json) history.fromJSON(json, true);
63951                 },
63952
63953
63954                 _getKey: getKey
63955
63956             };
63957
63958
63959             history.reset();
63960
63961             return utilRebind(history, dispatch$1, 'on');
63962         }
63963
63964         /**
63965          * Look for roads that can be connected to other roads with a short extension
63966          */
63967         function validationAlmostJunction(context) {
63968             var type = 'almost_junction';
63969
63970
63971             function isHighway(entity) {
63972                 return entity.type === 'way' &&
63973                     osmRoutableHighwayTagValues[entity.tags.highway];
63974             }
63975
63976             function isTaggedAsNotContinuing(node) {
63977                 return node.tags.noexit === 'yes' ||
63978                     node.tags.amenity === 'parking_entrance' ||
63979                     (node.tags.entrance && node.tags.entrance !== 'no');
63980             }
63981
63982
63983             var validation = function checkAlmostJunction(entity, graph) {
63984                 if (!isHighway(entity)) return [];
63985                 if (entity.isDegenerate()) return [];
63986
63987                 var tree = context.history().tree();
63988                 var issues = [];
63989
63990                 var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
63991                 extendableNodeInfos.forEach(function(extendableNodeInfo) {
63992                     var node = extendableNodeInfo.node;
63993                     var edgeHighway = graph.entity(extendableNodeInfo.wid);
63994
63995                     var fixes = [new validationIssueFix({
63996                         icon: 'iD-icon-abutment',
63997                         title: t('issues.fix.connect_features.title'),
63998                         onClick: function(context) {
63999                             var endNodeId = this.issue.entityIds[1];
64000                             var endNode = context.entity(endNodeId);
64001                             var targetEdge = this.issue.data.edge;
64002                             var crossLoc = this.issue.data.cross_loc;
64003                             var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
64004                             var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
64005
64006                             var annotation = t('issues.fix.connect_almost_junction.annotation');
64007                             // already a point nearby, just connect to that
64008                             if (closestNodeInfo.distance < 0.75) {
64009                                 context.perform(
64010                                     actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
64011                                     annotation
64012                                 );
64013                             // else add the end node to the edge way
64014                             } else {
64015                                 context.perform(
64016                                     actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
64017                                     annotation
64018                                 );
64019                             }
64020                         }
64021                     })];
64022
64023                     if (Object.keys(node.tags).length === 0) {
64024                         // node has no tags, suggest noexit fix
64025                         fixes.push(new validationIssueFix({
64026                             icon: 'maki-barrier',
64027                             title: t('issues.fix.tag_as_disconnected.title'),
64028                             onClick: function(context) {
64029                                 var nodeID = this.issue.entityIds[1];
64030                                 context.perform(
64031                                     actionChangeTags(nodeID, { noexit: 'yes' }),
64032                                     t('issues.fix.tag_as_disconnected.annotation')
64033                                 );
64034                             }
64035                         }));
64036                     }
64037
64038                     issues.push(new validationIssue({
64039                         type: type,
64040                         severity: 'warning',
64041                         message: function(context) {
64042                             var entity1 = context.hasEntity(this.entityIds[0]);
64043                             if (this.entityIds[0] === this.entityIds[2]) {
64044                                 return entity1 ? t('issues.almost_junction.self.message', {
64045                                     feature: utilDisplayLabel(entity1, context)
64046                                 }) : '';
64047                             } else {
64048                                 var entity2 = context.hasEntity(this.entityIds[2]);
64049                                 return (entity1 && entity2) ? t('issues.almost_junction.message', {
64050                                     feature: utilDisplayLabel(entity1, context),
64051                                     feature2: utilDisplayLabel(entity2, context)
64052                                 }) : '';
64053                             }
64054                         },
64055                         reference: showReference,
64056                         entityIds: [entity.id, node.id, edgeHighway.id],
64057                         loc: extendableNodeInfo.node.loc,
64058                         hash: JSON.stringify(extendableNodeInfo.node.loc),
64059                         data: {
64060                             edge: extendableNodeInfo.edge,
64061                             cross_loc: extendableNodeInfo.cross_loc
64062                         },
64063                         fixes: fixes
64064                     }));
64065                 });
64066
64067                 return issues;
64068
64069
64070                 function showReference(selection) {
64071                     selection.selectAll('.issue-reference')
64072                         .data([0])
64073                         .enter()
64074                         .append('div')
64075                         .attr('class', 'issue-reference')
64076                         .text(t('issues.almost_junction.highway-highway.reference'));
64077                 }
64078
64079
64080                 function isExtendableCandidate(node, way) {
64081                     // can not accurately test vertices on tiles not downloaded from osm - #5938
64082                     var osm = services$1.osm;
64083                     if (osm && !osm.isDataLoaded(node.loc)) {
64084                         return false;
64085                     }
64086                     if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
64087                         return false;
64088                     }
64089
64090                     var occurences = 0;
64091                     for (var index in way.nodes) {
64092                         if (way.nodes[index] === node.id) {
64093                             occurences += 1;
64094                             if (occurences > 1) {
64095                                 return false;
64096                             }
64097                         }
64098                     }
64099                     return true;
64100                 }
64101
64102
64103                 function findConnectableEndNodesByExtension(way) {
64104                     var results = [];
64105                     if (way.isClosed()) return results;
64106
64107                     var testNodes;
64108                     var indices = [0, way.nodes.length - 1];
64109                     indices.forEach(function(nodeIndex) {
64110                         var nodeID = way.nodes[nodeIndex];
64111                         var node = graph.entity(nodeID);
64112
64113                         if (!isExtendableCandidate(node, way)) return;
64114
64115                         var connectionInfo = canConnectByExtend(way, nodeIndex);
64116                         if (!connectionInfo) return;
64117
64118                         testNodes = graph.childNodes(way).slice();   // shallow copy
64119                         testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
64120
64121                         // don't flag issue if connecting the ways would cause self-intersection
64122                         if (geoHasSelfIntersections(testNodes, nodeID)) return;
64123
64124                         results.push(connectionInfo);
64125                     });
64126
64127                     return results;
64128                 }
64129
64130                 function hasTag(tags, key) {
64131                     return tags[key] !== undefined && tags[key] !== 'no';
64132                 }
64133
64134                 function canConnectWays(way, way2) {
64135
64136                     // allow self-connections
64137                     if (way.id === way2.id) return true;
64138
64139                     // if one is bridge or tunnel, both must be bridge or tunnel
64140                     if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
64141                         !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
64142                     if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
64143                         !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
64144
64145                     // must have equivalent layers and levels
64146                     var layer1 = way.tags.layer || '0',
64147                         layer2 = way2.tags.layer || '0';
64148                     if (layer1 !== layer2) return false;
64149
64150                     var level1 = way.tags.level || '0',
64151                         level2 = way2.tags.level || '0';
64152                     if (level1 !== level2) return false;
64153
64154                     return true;
64155                 }
64156
64157
64158                 function canConnectByExtend(way, endNodeIdx) {
64159                     var EXTEND_TH_METERS = 5;
64160                     var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
64161                     var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
64162                     var tipNode = graph.entity(tipNid);
64163                     var midNode = graph.entity(midNid);
64164                     var lon = tipNode.loc[0];
64165                     var lat = tipNode.loc[1];
64166                     var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
64167                     var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
64168                     var queryExtent = geoExtent([
64169                         [lon - lon_range, lat - lat_range],
64170                         [lon + lon_range, lat + lat_range]
64171                     ]);
64172
64173                     // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
64174                     var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
64175                     var t = EXTEND_TH_METERS / edgeLen + 1.0;
64176                     var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
64177
64178                     // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
64179                     var intersected = tree.intersects(queryExtent, graph);
64180                     for (var i = 0; i < intersected.length; i++) {
64181                         var way2 = intersected[i];
64182
64183                         if (!isHighway(way2)) continue;
64184
64185                         if (!canConnectWays(way, way2)) continue;
64186
64187                         for (var j = 0; j < way2.nodes.length - 1; j++) {
64188                             var nAid = way2.nodes[j],
64189                                 nBid = way2.nodes[j + 1];
64190
64191                             if (nAid === tipNid || nBid === tipNid) continue;
64192
64193                             var nA = graph.entity(nAid),
64194                                 nB = graph.entity(nBid);
64195                             var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
64196                             if (crossLoc) {
64197                                 return {
64198                                     node: tipNode,
64199                                     wid: way2.id,
64200                                     edge: [nA.id, nB.id],
64201                                     cross_loc: crossLoc
64202                                 };
64203                             }
64204                         }
64205                     }
64206                     return null;
64207                 }
64208             };
64209
64210             validation.type = type;
64211
64212             return validation;
64213         }
64214
64215         function validationCloseNodes(context) {
64216             var type = 'close_nodes';
64217
64218             var pointThresholdMeters = 0.2;
64219
64220             var defaultWayThresholdMeters = 0.2;
64221             // expect some features to be mapped with higher levels of detail
64222             var indoorThresholdMeters = 0.01;
64223             var buildingThresholdMeters = 0.05;
64224             var pathThresholdMeters = 0.1;
64225
64226             var validation = function(entity, graph) {
64227                 if (entity.type === 'node') {
64228                     return getIssuesForNode(entity);
64229                 } else if (entity.type === 'way') {
64230                     return getIssuesForWay(entity);
64231                 }
64232                 return [];
64233
64234                 function featureTypeForWay(way) {
64235
64236                     if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
64237                     if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
64238                     if ((way.tags.building && way.tags.building !== 'no') ||
64239                         (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
64240                     if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
64241
64242                     var parentRelations = graph.parentRelations(way);
64243                     for (var i in parentRelations) {
64244                         var relation = parentRelations[i];
64245
64246                         if (relation.tags.type === 'boundary') return 'boundary';
64247
64248                         if (relation.isMultipolygon()) {
64249                             if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
64250                             if ((relation.tags.building && relation.tags.building !== 'no') ||
64251                                 (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
64252                         }
64253                     }
64254
64255                     return 'other';
64256                 }
64257
64258                 function shouldCheckWay(way) {
64259
64260                     // don't flag issues where merging would create degenerate ways
64261                     if (way.nodes.length <= 2 ||
64262                         (way.isClosed() && way.nodes.length <= 4)) return false;
64263
64264                     var featureType = featureTypeForWay(way);
64265                     if (featureType === 'boundary') return false;
64266
64267                     var bbox = way.extent(graph).bbox();
64268                     var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
64269                     // don't flag close nodes in very small ways
64270                     if (hypotenuseMeters < 1.5) return false;
64271
64272                     return true;
64273                 }
64274
64275                 function getIssuesForWay(way) {
64276                     if (!shouldCheckWay(way)) return [];
64277
64278                     var issues = [],
64279                         nodes = graph.childNodes(way);
64280                     for (var i = 0; i < nodes.length - 1; i++) {
64281                         var node1 = nodes[i];
64282                         var node2 = nodes[i+1];
64283
64284                         var issue = getWayIssueIfAny(node1, node2, way);
64285                         if (issue) issues.push(issue);
64286                     }
64287                     return issues;
64288                 }
64289
64290                 function getIssuesForVertex(node, parentWays) {
64291                     var issues = [];
64292
64293                     function checkForCloseness(node1, node2, way) {
64294                         var issue = getWayIssueIfAny(node1, node2, way);
64295                         if (issue) issues.push(issue);
64296                     }
64297
64298                     for (var i = 0; i < parentWays.length; i++) {
64299                         var parentWay = parentWays[i];
64300
64301                         if (!shouldCheckWay(parentWay)) continue;
64302
64303                         var lastIndex = parentWay.nodes.length - 1;
64304                         for (var j = 0; j < parentWay.nodes.length; j++) {
64305                             if (j !== 0) {
64306                                 if (parentWay.nodes[j-1] === node.id) {
64307                                     checkForCloseness(node, graph.entity(parentWay.nodes[j]), parentWay);
64308                                 }
64309                             }
64310                             if (j !== lastIndex) {
64311                                 if (parentWay.nodes[j+1] === node.id) {
64312                                     checkForCloseness(graph.entity(parentWay.nodes[j]), node, parentWay);
64313                                 }
64314                             }
64315                         }
64316                     }
64317                     return issues;
64318                 }
64319
64320                 function getIssuesForDetachedPoint(node) {
64321
64322                     var issues = [];
64323
64324                     var lon = node.loc[0];
64325                     var lat = node.loc[1];
64326                     var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
64327                     var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
64328                     var queryExtent = geoExtent([
64329                         [lon - lon_range, lat - lat_range],
64330                         [lon + lon_range, lat + lat_range]
64331                     ]);
64332
64333                     var intersected = context.history().tree().intersects(queryExtent, graph);
64334                     for (var j = 0; j < intersected.length; j++) {
64335                         var nearby = intersected[j];
64336
64337                         if (nearby.id === node.id) continue;
64338                         if (nearby.type !== 'node' || nearby.geometry(graph) !== 'point') continue;
64339
64340                         if (nearby.loc === node.loc ||
64341                             geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
64342
64343                             // allow very close points if the z-axis varies
64344                             var zAxisKeys = { layer: true, level: true };
64345                             var zAxisDifferentiates = false;
64346                             for (var key in zAxisKeys) {
64347                                 var nodeValue = node.tags[key] || '0';
64348                                 var nearbyValue = nearby.tags[key] || '0';
64349                                 if (nodeValue !== nearbyValue) {
64350                                     zAxisDifferentiates = true;
64351                                     break;
64352                                 }
64353                             }
64354                             if (zAxisDifferentiates) continue;
64355
64356                             issues.push(new validationIssue({
64357                                 type: type,
64358                                 severity: 'warning',
64359                                 message: function(context) {
64360                                     var entity = context.hasEntity(this.entityIds[0]),
64361                                         entity2 = context.hasEntity(this.entityIds[1]);
64362                                     return (entity && entity2) ? t('issues.close_nodes.detached.message', {
64363                                         feature: utilDisplayLabel(entity, context),
64364                                         feature2: utilDisplayLabel(entity2, context)
64365                                     }) : '';
64366                                 },
64367                                 reference: showReference,
64368                                 entityIds: [node.id, nearby.id],
64369                                 fixes: [
64370                                     new validationIssueFix({
64371                                         icon: 'iD-operation-disconnect',
64372                                         title: t('issues.fix.move_points_apart.title')
64373                                     }),
64374                                     new validationIssueFix({
64375                                         icon: 'iD-icon-layers',
64376                                         title: t('issues.fix.use_different_layers_or_levels.title')
64377                                     })
64378                                 ]
64379                             }));
64380                         }
64381                     }
64382
64383                     return issues;
64384
64385                     function showReference(selection) {
64386                         var referenceText = t('issues.close_nodes.detached.reference');
64387                         selection.selectAll('.issue-reference')
64388                             .data([0])
64389                             .enter()
64390                             .append('div')
64391                             .attr('class', 'issue-reference')
64392                             .text(referenceText);
64393                     }
64394                 }
64395
64396                 function getIssuesForNode(node) {
64397                     var parentWays = graph.parentWays(node);
64398                     if (parentWays.length) {
64399                         return getIssuesForVertex(node, parentWays);
64400                     } else {
64401                         return getIssuesForDetachedPoint(node);
64402                     }
64403                 }
64404
64405                 function getWayIssueIfAny(node1, node2, way) {
64406                     if (node1.id === node2.id ||
64407                         (node1.hasInterestingTags() && node2.hasInterestingTags())) {
64408                         return null;
64409                     }
64410
64411                     if (node1.loc !== node2.loc) {
64412
64413                         var featureType = featureTypeForWay(way);
64414                         var threshold = defaultWayThresholdMeters;
64415                         if (featureType === 'indoor') threshold = indoorThresholdMeters;
64416                         else if (featureType === 'building') threshold = buildingThresholdMeters;
64417                         else if (featureType === 'path') threshold = pathThresholdMeters;
64418
64419                         var distance = geoSphericalDistance(node1.loc, node2.loc);
64420                         if (distance > threshold) return null;
64421                     }
64422
64423                     return new validationIssue({
64424                         type: type,
64425                         severity: 'warning',
64426                         message: function(context) {
64427                             var entity = context.hasEntity(this.entityIds[0]);
64428                             return entity ? t('issues.close_nodes.message', { way: utilDisplayLabel(entity, context) }) : '';
64429                         },
64430                         reference: showReference,
64431                         entityIds: [way.id, node1.id, node2.id],
64432                         loc: node1.loc,
64433                         fixes: [
64434                             new validationIssueFix({
64435                                 icon: 'iD-icon-plus',
64436                                 title: t('issues.fix.merge_points.title'),
64437                                 onClick: function(context) {
64438                                     var entityIds = this.issue.entityIds;
64439                                     var action = actionMergeNodes([entityIds[1], entityIds[2]]);
64440                                     context.perform(action, t('issues.fix.merge_close_vertices.annotation'));
64441                                 }
64442                             }),
64443                             new validationIssueFix({
64444                                 icon: 'iD-operation-disconnect',
64445                                 title: t('issues.fix.move_points_apart.title')
64446                             })
64447                         ]
64448                     });
64449
64450                     function showReference(selection) {
64451                         var referenceText = t('issues.close_nodes.reference');
64452                         selection.selectAll('.issue-reference')
64453                             .data([0])
64454                             .enter()
64455                             .append('div')
64456                             .attr('class', 'issue-reference')
64457                             .text(referenceText);
64458                     }
64459                 }
64460
64461             };
64462
64463
64464             validation.type = type;
64465
64466             return validation;
64467         }
64468
64469         function validationCrossingWays(context) {
64470             var type = 'crossing_ways';
64471
64472             /*
64473             Avoid duplicate work by cacheing issues. The same issues live under two paths.
64474             {
64475                 w-123: {
64476                     w-456: [{issue1}, {issue2}…]
64477                 },
64478                 w-456: {
64479                     w-123: [{issue1}, {issue2}…]
64480                 }
64481             }
64482             */
64483             var _issueCache = {};
64484
64485             // returns the way or its parent relation, whichever has a useful feature type
64486             function getFeatureWithFeatureTypeTagsForWay(way, graph) {
64487                 if (getFeatureTypeForTags(way.tags) === null) {
64488                     // if the way doesn't match a feature type, check its parent relations
64489                     var parentRels = graph.parentRelations(way);
64490                     for (var i = 0; i < parentRels.length; i++) {
64491                         var rel = parentRels[i];
64492                         if (getFeatureTypeForTags(rel.tags) !== null) {
64493                             return rel;
64494                         }
64495                     }
64496                 }
64497                 return way;
64498             }
64499
64500
64501             function hasTag(tags, key) {
64502                 return tags[key] !== undefined && tags[key] !== 'no';
64503             }
64504
64505             function tagsImplyIndoors(tags) {
64506                 return hasTag(tags, 'level') || tags.highway === 'corridor';
64507             }
64508
64509             function allowsStructures(featureType) {
64510                 return allowsBridge(featureType) || allowsTunnel(featureType);
64511             }
64512             function allowsBridge(featureType) {
64513                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64514             }
64515             function allowsTunnel(featureType) {
64516                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64517             }
64518             function canCover(featureType) {
64519                 return featureType === 'building';
64520             }
64521
64522
64523             function getFeatureTypeForCrossingCheck(way, graph) {
64524                 var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
64525                 return getFeatureTypeForTags(tags);
64526             }
64527
64528             // blacklist
64529             var ignoredBuildings = {
64530                 demolished: true, dismantled: true, proposed: true, razed: true
64531             };
64532
64533
64534             function getFeatureTypeForTags(tags) {
64535                 if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
64536
64537                 // don't check non-building areas
64538                 if (hasTag(tags, 'area')) return null;
64539
64540                 if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
64541                 if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
64542                 if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
64543
64544                 return null;
64545             }
64546
64547
64548             function isLegitCrossing(way1, featureType1, way2, featureType2) {
64549                 var tags1 = way1.tags;
64550                 var tags2 = way2.tags;
64551
64552                 // assume 0 by default
64553                 var level1 = tags1.level || '0';
64554                 var level2 = tags2.level || '0';
64555
64556                 if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
64557                     // assume features don't interact if they're indoor on different levels
64558                     return true;
64559                 }
64560
64561                 // assume 0 by default; don't use way.layer() since we account for structures here
64562                 var layer1 = tags1.layer || '0';
64563                 var layer2 = tags2.layer || '0';
64564
64565                 if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
64566                     if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
64567                     if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
64568                     // crossing bridges must use different layers
64569                     if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
64570                 } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
64571                 else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
64572
64573                 if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
64574                     if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
64575                     if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
64576                     // crossing tunnels must use different layers
64577                     if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
64578                 } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
64579                 else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
64580
64581                 if (canCover(featureType1) && canCover(featureType2)) {
64582                     if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
64583                     if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
64584                     // crossing covered features that can themselves cover must use different layers
64585                     if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
64586                 } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
64587                 else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
64588
64589                 // don't flag crossing waterways and pier/highways
64590                 if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
64591                 if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
64592
64593                 if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
64594                     // if no structures are applicable, the layers must be different
64595                     if (layer1 !== layer2) return true;
64596                 }
64597                 return false;
64598             }
64599
64600
64601             // highway values for which we shouldn't recommend connecting to waterways
64602             var highwaysDisallowingFords = {
64603                 motorway: true, motorway_link: true, trunk: true, trunk_link: true,
64604                 primary: true, primary_link: true, secondary: true, secondary_link: true
64605             };
64606             var nonCrossingHighways = { track: true };
64607
64608             function tagsForConnectionNodeIfAllowed(entity1, entity2) {
64609                 var featureType1 = getFeatureTypeForTags(entity1.tags);
64610                 var featureType2 = getFeatureTypeForTags(entity2.tags);
64611                 if (featureType1 === featureType2) {
64612                     if (featureType1 === 'highway') {
64613                         var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
64614                         var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
64615                         if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
64616                             // one feature is a path but not both
64617
64618                             var roadFeature = entity1IsPath ? entity2 : entity1;
64619                             if (nonCrossingHighways[roadFeature.tags.highway]) {
64620                                 // don't mark path connections with certain roads as crossings
64621                                 return {};
64622                             }
64623                             var pathFeature = entity1IsPath ? entity1 : entity2;
64624                             if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
64625                                 // if the path is a crossing, match the crossing type
64626                                 return { highway: 'crossing', crossing: pathFeature.tags.crossing };
64627                             }
64628                             // don't add a `crossing` subtag to ambiguous crossings
64629                             return { highway: 'crossing' };
64630                         }
64631                         return {};
64632                     }
64633                     if (featureType1 === 'waterway') return {};
64634                     if (featureType1 === 'railway') return {};
64635
64636                 } else {
64637                     var featureTypes = [featureType1, featureType2];
64638                     if (featureTypes.indexOf('highway') !== -1) {
64639                         if (featureTypes.indexOf('railway') !== -1) {
64640                             if (osmPathHighwayTagValues[entity1.tags.highway] ||
64641                                 osmPathHighwayTagValues[entity2.tags.highway]) {
64642                                 // path-rail connections use this tag
64643                                 return { railway: 'crossing' };
64644                             } else {
64645                                 // road-rail connections use this tag
64646                                 return { railway: 'level_crossing' };
64647                             }
64648                         }
64649
64650                         if (featureTypes.indexOf('waterway') !== -1) {
64651                             // do not allow fords on structures
64652                             if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
64653                             if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
64654
64655                             if (highwaysDisallowingFords[entity1.tags.highway] ||
64656                                 highwaysDisallowingFords[entity2.tags.highway]) {
64657                                 // do not allow fords on major highways
64658                                 return null;
64659                             }
64660                             return { ford: 'yes' };
64661                         }
64662                     }
64663                 }
64664                 return null;
64665             }
64666
64667
64668             function findCrossingsByWay(way1, graph, tree) {
64669                 var edgeCrossInfos = [];
64670                 if (way1.type !== 'way') return edgeCrossInfos;
64671
64672                 var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
64673                 if (way1FeatureType === null) return edgeCrossInfos;
64674
64675                 var checkedSingleCrossingWays = {};
64676
64677                 // declare vars ahead of time to reduce garbage collection
64678                 var i, j, nodeIndex;
64679                 var extent;
64680                 var n1, n2, nA, nB;
64681                 var segment1, segment2;
64682                 var oneOnly;
64683                 var intersected, way2, way2FeatureType, way2Nodes;
64684                 var way1Nodes = graph.childNodes(way1);
64685                 var comparedWays = {};
64686                 for (i = 0; i < way1Nodes.length - 1; i++) {
64687                     n1 = way1Nodes[i];
64688                     n2 = way1Nodes[i + 1];
64689                     extent = geoExtent([
64690                         [
64691                             Math.min(n1.loc[0], n2.loc[0]),
64692                             Math.min(n1.loc[1], n2.loc[1])
64693                         ],
64694                         [
64695                             Math.max(n1.loc[0], n2.loc[0]),
64696                             Math.max(n1.loc[1], n2.loc[1])
64697                         ]
64698                     ]);
64699
64700                     intersected = tree.intersects(extent, graph);
64701                     for (j = 0; j < intersected.length; j++) {
64702                         way2 = intersected[j];
64703
64704                         if (way2.type !== 'way') continue;
64705
64706                         // don't check for self-intersection in this validation
64707                         if (way2.id === way1.id) continue;
64708
64709                         // skip if this way was already checked and only one issue is needed
64710                         if (checkedSingleCrossingWays[way2.id]) continue;
64711
64712                         // don't re-check previously checked features
64713                         if (_issueCache[way1.id] && _issueCache[way1.id][way2.id]) continue;
64714
64715                         // mark this way as checked even if there are no crossings
64716                         comparedWays[way2.id] = true;
64717
64718                         // only check crossing highway, waterway, building, and railway
64719                         way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
64720                         if (way2FeatureType === null ||
64721                             isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
64722                             continue;
64723                         }
64724
64725                         // create only one issue for building crossings
64726                         oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
64727                         segment1 = [n1.loc, n2.loc];
64728
64729                         way2Nodes = graph.childNodes(way2);
64730                         for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
64731                             nA = way2Nodes[nodeIndex];
64732                             nB = way2Nodes[nodeIndex + 1];
64733                             if (nA.id === n1.id || nA.id === n2.id ||
64734                                 nB.id === n1.id || nB.id === n2.id) {
64735                                 // n1 or n2 is a connection node; skip
64736                                 continue;
64737                             }
64738                             segment2 = [nA.loc, nB.loc];
64739                             var point = geoLineIntersection(segment1, segment2);
64740                             if (point) {
64741                                 edgeCrossInfos.push({
64742                                     ways: [way1, way2],
64743                                     featureTypes: [way1FeatureType, way2FeatureType],
64744                                     edges: [[n1.id, n2.id], [nA.id, nB.id]],
64745                                     crossPoint: point
64746                                 });
64747                                 if (oneOnly) {
64748                                     checkedSingleCrossingWays[way2.id] = true;
64749                                     break;
64750                                 }
64751                             }
64752                         }
64753                     }
64754                 }
64755                 for (var way2ID in comparedWays) {
64756                     if (!_issueCache[way1.id]) _issueCache[way1.id] = {};
64757                     if (!_issueCache[way1.id][way2ID]) _issueCache[way1.id][way2ID] = [];
64758                     if (!_issueCache[way2ID]) _issueCache[way2ID] = {};
64759                     if (!_issueCache[way2ID][way1.id]) _issueCache[way2ID][way1.id] = [];
64760                 }
64761                 return edgeCrossInfos;
64762             }
64763
64764
64765             function waysToCheck(entity, graph) {
64766                 if (!getFeatureTypeForTags(entity.tags)) {
64767                     return [];
64768                 }
64769                 if (entity.type === 'way') {
64770                     return [entity];
64771                 } else if (entity.type === 'relation' &&
64772                     entity.isMultipolygon() &&
64773                     // only check multipolygons if they are buildings
64774                     hasTag(entity.tags, 'building')) {
64775                     return entity.members.reduce(function(array, member) {
64776                         if (member.type === 'way' &&
64777                             //(member.role === 'outer' || member.role === 'inner') &&
64778                             graph.hasEntity(member.id)) {
64779                             var entity = graph.entity(member.id);
64780                             array.push(entity);
64781                         }
64782                         return array;
64783                     }, []);
64784                 }
64785                 return [];
64786             }
64787
64788
64789             var validation = function checkCrossingWays(entity, graph) {
64790
64791                 var tree = context.history().tree();
64792
64793                 var ways = waysToCheck(entity, graph);
64794
64795                 var issues = [];
64796                 // declare these here to reduce garbage collection
64797                 var wayIndex, crossingIndex, key, crossings, crossing, issue;
64798                 for (wayIndex in ways) {
64799                     var way = ways[wayIndex];
64800                     crossings = findCrossingsByWay(way, graph, tree);
64801                     for (crossingIndex in crossings) {
64802                         crossing = crossings[crossingIndex];
64803                         var way2 = crossing.ways[1];
64804                         issue = createIssue(crossing, graph);
64805                         // cache the issues for each way
64806                         _issueCache[way.id][way2.id].push(issue);
64807                         _issueCache[way2.id][way.id].push(issue);
64808                     }
64809                     for (key in _issueCache[way.id]) {
64810                         issues = issues.concat(_issueCache[way.id][key]);
64811                     }
64812                 }
64813                 return issues;
64814             };
64815
64816
64817             function createIssue(crossing, graph) {
64818
64819                 // use the entities with the tags that define the feature type
64820                 var entities = crossing.ways.sort(function(entity1, entity2) {
64821                     var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
64822                     var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
64823                     if (type1 === type2) {
64824                         return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
64825                     } else if (type1 === 'waterway') {
64826                         return true;
64827                     } else if (type2 === 'waterway') {
64828                         return false;
64829                     }
64830                     return type1 < type2;
64831                 });
64832                 entities = entities.map(function(way) {
64833                     return getFeatureWithFeatureTypeTagsForWay(way, graph);
64834                 });
64835
64836                 var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
64837
64838                 var featureType1 = crossing.featureTypes[0];
64839                 var featureType2 = crossing.featureTypes[1];
64840
64841                 var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
64842                 var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
64843                                         allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
64844                 var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
64845                                         allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
64846
64847                 var crossingTypeID;
64848
64849                 if (isCrossingIndoors) {
64850                     crossingTypeID = 'indoor-indoor';
64851                 } else if (isCrossingTunnels) {
64852                     crossingTypeID = 'tunnel-tunnel';
64853                 } else if (isCrossingBridges) {
64854                     crossingTypeID = 'bridge-bridge';
64855                 } else {
64856                     crossingTypeID = crossing.featureTypes.sort().join('-');
64857                 }
64858                 if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
64859                     crossingTypeID += '_connectable';
64860                 }
64861
64862                 var fixes = [];
64863                 if (connectionTags) {
64864                     fixes.push(makeConnectWaysFix());
64865                 }
64866
64867                 var useFixIcon = 'iD-icon-layers';
64868                 var useFixID;
64869                 if (isCrossingIndoors) {
64870                     useFixID = 'use_different_levels';
64871                 } else if (isCrossingTunnels || isCrossingBridges) {
64872                     useFixID = 'use_different_layers';
64873                 // don't recommend bridges for waterways even though they're okay
64874                 } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
64875                         (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
64876                     useFixID = 'use_bridge_or_tunnel';
64877                     useFixIcon = 'maki-bridge';
64878                 } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
64879                     useFixID = 'use_tunnel';
64880                 } else {
64881                     useFixID = 'use_different_layers';
64882                 }
64883                 if (useFixID === 'use_different_layers') {
64884                     fixes.push(makeChangeLayerFix('higher'));
64885                     fixes.push(makeChangeLayerFix('lower'));
64886                 } else {
64887                     fixes.push(new validationIssueFix({
64888                         icon: useFixIcon,
64889                         title: t('issues.fix.' + useFixID + '.title')
64890                     }));
64891                 }
64892                 fixes.push(new validationIssueFix({
64893                     icon: 'iD-operation-move',
64894                     title: t('issues.fix.reposition_features.title')
64895                 }));
64896
64897                 return new validationIssue({
64898                     type: type,
64899                     severity: 'warning',
64900                     message: function(context) {
64901                         var entity1 = context.hasEntity(this.entityIds[0]),
64902                             entity2 = context.hasEntity(this.entityIds[1]);
64903                         return (entity1 && entity2) ? t('issues.crossing_ways.message', {
64904                             feature: utilDisplayLabel(entity1, context),
64905                             feature2: utilDisplayLabel(entity2, context)
64906                         }) : '';
64907                     },
64908                     reference: showReference,
64909                     entityIds: entities.map(function(entity) {
64910                         return entity.id;
64911                     }),
64912                     data: {
64913                         edges: crossing.edges,
64914                         connectionTags: connectionTags
64915                     },
64916                     // differentiate based on the loc since two ways can cross multiple times
64917                     hash: JSON.stringify(crossing.crossPoint) +
64918                         // if the edges change then so does the fix
64919                         JSON.stringify(crossing.edges) +
64920                         // ensure the correct connection tags are added in the fix
64921                         JSON.stringify(connectionTags),
64922                     loc: crossing.crossPoint,
64923                     fixes: fixes
64924                 });
64925
64926                 function showReference(selection) {
64927                     selection.selectAll('.issue-reference')
64928                         .data([0])
64929                         .enter()
64930                         .append('div')
64931                         .attr('class', 'issue-reference')
64932                         .text(t('issues.crossing_ways.' + crossingTypeID + '.reference'));
64933                 }
64934             }
64935
64936             function makeConnectWaysFix() {
64937                 return new validationIssueFix({
64938                     icon: 'iD-icon-crossing',
64939                     title: t('issues.fix.connect_features.title'),
64940                     onClick: function(context) {
64941                         var loc = this.issue.loc;
64942                         var connectionTags = this.issue.data.connectionTags;
64943                         var edges = this.issue.data.edges;
64944
64945                         context.perform(
64946                             function actionConnectCrossingWays(graph) {
64947                                 // create the new node for the points
64948                                 var node = osmNode({ loc: loc, tags: connectionTags });
64949                                 graph = graph.replace(node);
64950
64951                                 var nodesToMerge = [node.id];
64952                                 var mergeThresholdInMeters = 0.75;
64953
64954                                 edges.forEach(function(edge) {
64955                                     var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
64956                                     var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
64957                                     // if there is already a point nearby, use that
64958                                     if (closestNodeInfo.distance < mergeThresholdInMeters) {
64959                                         nodesToMerge.push(closestNodeInfo.node.id);
64960                                     // else add the new node to the way
64961                                     } else {
64962                                         graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
64963                                     }
64964                                 });
64965
64966                                 if (nodesToMerge.length > 1) {
64967                                     // if we're using nearby nodes, merge them with the new node
64968                                     graph = actionMergeNodes(nodesToMerge, loc)(graph);
64969                                 }
64970
64971                                 return graph;
64972                             },
64973                             t('issues.fix.connect_crossing_features.annotation')
64974                         );
64975                     }
64976                 });
64977             }
64978
64979             function makeChangeLayerFix(higherOrLower) {
64980                 return new validationIssueFix({
64981                     icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
64982                     title: t('issues.fix.tag_this_as_' + higherOrLower + '.title'),
64983                     onClick: function(context) {
64984
64985                         var mode = context.mode();
64986                         if (!mode || mode.id !== 'select') return;
64987
64988                         var selectedIDs = mode.selectedIDs();
64989                         if (selectedIDs.length !== 1) return;
64990
64991                         var selectedID = selectedIDs[0];
64992                         if (!this.issue.entityIds.some(function(entityId) {
64993                             return entityId === selectedID;
64994                         })) return;
64995
64996                         var entity = context.hasEntity(selectedID);
64997                         if (!entity) return;
64998
64999                         var tags = Object.assign({}, entity.tags);   // shallow copy
65000                         var layer = tags.layer && Number(tags.layer);
65001                         if (layer && !isNaN(layer)) {
65002                             if (higherOrLower === 'higher') {
65003                                 layer += 1;
65004                             } else {
65005                                 layer -= 1;
65006                             }
65007                         } else {
65008                             if (higherOrLower === 'higher') {
65009                                 layer = 1;
65010                             } else {
65011                                 layer = -1;
65012                             }
65013                         }
65014                         tags.layer = layer;
65015                         context.perform(
65016                             actionChangeTags(entity.id, tags),
65017                             t('operations.change_tags.annotation')
65018                         );
65019                     }
65020                 });
65021             }
65022
65023             validation.reset = function() {
65024                 _issueCache = {};
65025             };
65026
65027             validation.type = type;
65028
65029             return validation;
65030         }
65031
65032         function validationDisconnectedWay() {
65033             var type = 'disconnected_way';
65034
65035             function isTaggedAsHighway(entity) {
65036                 return osmRoutableHighwayTagValues[entity.tags.highway];
65037             }
65038
65039             var validation = function checkDisconnectedWay(entity, graph) {
65040
65041                 var routingIslandWays = routingIslandForEntity(entity);
65042                 if (!routingIslandWays) return [];
65043
65044                 var fixes = [];
65045
65046                 var isSingle = routingIslandWays.size === 1;
65047
65048                 if (isSingle) {
65049
65050                     if (entity.type === 'way' && !entity.isClosed()) {
65051                         var firstID = entity.first();
65052                         var lastID = entity.last();
65053
65054                         var first = graph.entity(firstID);
65055                         if (first.tags.noexit !== 'yes') {
65056                             fixes.push(new validationIssueFix({
65057                                 icon: 'iD-operation-continue-left',
65058                                 title: t('issues.fix.continue_from_start.title'),
65059                                 entityIds: [firstID],
65060                                 onClick: function(context) {
65061                                     var wayId = this.issue.entityIds[0];
65062                                     var way = context.entity(wayId);
65063                                     var vertexId = this.entityIds[0];
65064                                     var vertex = context.entity(vertexId);
65065                                     continueDrawing(way, vertex, context);
65066                                 }
65067                             }));
65068                         }
65069                         var last = graph.entity(lastID);
65070                         if (last.tags.noexit !== 'yes') {
65071                             fixes.push(new validationIssueFix({
65072                                 icon: 'iD-operation-continue',
65073                                 title: t('issues.fix.continue_from_end.title'),
65074                                 entityIds: [lastID],
65075                                 onClick: function(context) {
65076                                     var wayId = this.issue.entityIds[0];
65077                                     var way = context.entity(wayId);
65078                                     var vertexId = this.entityIds[0];
65079                                     var vertex = context.entity(vertexId);
65080                                     continueDrawing(way, vertex, context);
65081                                 }
65082                             }));
65083                         }
65084
65085                     } else {
65086                         fixes.push(new validationIssueFix({
65087                             title: t('issues.fix.connect_feature.title')
65088                         }));
65089                     }
65090
65091                     fixes.push(new validationIssueFix({
65092                         icon: 'iD-operation-delete',
65093                         title: t('issues.fix.delete_feature.title'),
65094                         entityIds: [entity.id],
65095                         onClick: function(context) {
65096                             var id = this.issue.entityIds[0];
65097                             var operation = operationDelete([id], context);
65098                             if (!operation.disabled()) {
65099                                 operation();
65100                             }
65101                         }
65102                     }));
65103                 } else {
65104                     fixes.push(new validationIssueFix({
65105                         title: t('issues.fix.connect_features.title')
65106                     }));
65107                 }
65108
65109                 return [new validationIssue({
65110                     type: type,
65111                     severity: 'warning',
65112                     message: function(context) {
65113                         if (this.entityIds.length === 1) {
65114                             var entity = context.hasEntity(this.entityIds[0]);
65115                             return entity ? t('issues.disconnected_way.highway.message', { highway: utilDisplayLabel(entity, context) }) : '';
65116                         }
65117                         return t('issues.disconnected_way.routable.message.multiple', { count: this.entityIds.length.toString() });
65118                     },
65119                     reference: showReference,
65120                     entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
65121                     fixes: fixes
65122                 })];
65123
65124
65125                 function showReference(selection) {
65126                     selection.selectAll('.issue-reference')
65127                         .data([0])
65128                         .enter()
65129                         .append('div')
65130                         .attr('class', 'issue-reference')
65131                         .text(t('issues.disconnected_way.routable.reference'));
65132                 }
65133
65134                 function routingIslandForEntity(entity) {
65135
65136                     if (entity.type !== 'way') return null;
65137
65138                     if (!isRoutableWay(entity, true)) return null;
65139
65140                     var waysToCheck = [entity];
65141                     var routingIsland = new Set([entity]);
65142
65143                     while (waysToCheck.length) {
65144                         var wayToCheck = waysToCheck.pop();
65145                         var childNodes = graph.childNodes(wayToCheck);
65146                         for (var i in childNodes) {
65147                             var vertex = childNodes[i];
65148                             var result = isConnectedVertex(vertex, routingIsland);
65149                             if (result === true) {
65150                                 return null;
65151                             } else if (result === false) {
65152                                 continue;
65153                             }
65154                             result.forEach(function(connectedWay) {
65155                                 if (!routingIsland.has(connectedWay)) {
65156                                     routingIsland.add(connectedWay);
65157                                     waysToCheck.push(connectedWay);
65158                                 }
65159                             });
65160                         }
65161                     }
65162
65163                     return routingIsland;
65164                 }
65165
65166                 function isConnectedVertex(vertex, routingIslandWays) {
65167                     // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
65168                     var osm = services$1.osm;
65169                     if (osm && !osm.isDataLoaded(vertex.loc)) return true;
65170
65171                     // entrances are considered connected
65172                     if (vertex.tags.entrance &&
65173                         vertex.tags.entrance !== 'no') return true;
65174                     if (vertex.tags.amenity === 'parking_entrance') return true;
65175
65176                     var parentsWays = graph.parentWays(vertex);
65177
65178                     // standalone vertex
65179                     if (parentsWays.length === 1) return false;
65180
65181                     var connectedWays = new Set();
65182
65183                     for (var i in parentsWays) {
65184                         var parentWay = parentsWays[i];
65185
65186                         // ignore any way we've already accounted for
65187                         if (routingIslandWays.has(parentWay)) continue;
65188
65189                         if (isRoutableWay(parentWay, false)) connectedWays.add(parentWay);
65190                     }
65191
65192                     if (connectedWays.size) return connectedWays;
65193
65194                     return false;
65195                 }
65196
65197                 function isRoutableWay(way, ignoreInnerWays) {
65198                     if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
65199
65200                     return graph.parentRelations(way).some(function(parentRelation) {
65201                         if (parentRelation.tags.type === 'route' &&
65202                             parentRelation.tags.route === 'ferry') return true;
65203
65204                         if (parentRelation.isMultipolygon() &&
65205                             isTaggedAsHighway(parentRelation) &&
65206                             (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
65207                     });
65208                 }
65209
65210             };
65211
65212             function continueDrawing(way, vertex, context) {
65213                 // make sure the vertex is actually visible and editable
65214                 var map = context.map();
65215                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65216                     map.zoomToEase(vertex);
65217                 }
65218
65219                 context.enter(
65220                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65221                 );
65222             }
65223
65224
65225             validation.type = type;
65226
65227             return validation;
65228         }
65229
65230         function validationFixmeTag(context) {
65231             var type = 'fixme_tag';
65232
65233
65234             var validation = function checkFixmeTag(entity) {
65235
65236                 if (!entity.tags.fixme) return [];
65237
65238                 // don't flag fixmes on features added by the user
65239                 if (entity.version === undefined) return [];
65240
65241                 if (entity.v !== undefined) {
65242                     var baseEntity = context.history().base().hasEntity(entity.id);
65243                     // don't flag fixmes added by the user on existing features
65244                     if (!baseEntity || !baseEntity.tags.fixme) return [];
65245                 }
65246
65247                 return [new validationIssue({
65248                     type: type,
65249                     severity: 'warning',
65250                     message: function(context) {
65251                         var entity = context.hasEntity(this.entityIds[0]);
65252                         return entity ? t('issues.fixme_tag.message', { feature: utilDisplayLabel(entity, context) }) : '';
65253                     },
65254                     reference: showReference,
65255                     entityIds: [entity.id]
65256                 })];
65257
65258                 function showReference(selection) {
65259                     selection.selectAll('.issue-reference')
65260                         .data([0])
65261                         .enter()
65262                         .append('div')
65263                         .attr('class', 'issue-reference')
65264                         .text(t('issues.fixme_tag.reference'));
65265                 }
65266             };
65267
65268             validation.type = type;
65269
65270             return validation;
65271         }
65272
65273         var brands = {"amenity/bank|ABANCA":{countryCodes:["es"],tags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA",official_name:"ABANCA Corporación Bancaria"}},"amenity/bank|ABN AMRO":{countryCodes:["nl"],tags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO",official_name:"ABN AMRO Bank N.V."}},"amenity/bank|ABSA":{countryCodes:["za"],tags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"}},"amenity/bank|AIB":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB",official_name:"Allied Irish Banks"}},"amenity/bank|ANZ":{countryCodes:["au","nz"],matchNames:["anz bank"],tags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ",official_name:"Australia and New Zealand Banking Group Limited"}},"amenity/bank|ASB Bank":{countryCodes:["nz"],tags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"}},"amenity/bank|ATB Financial":{countryCodes:["ca"],tags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial",official_name:"Alberta Treasury Branches"}},"amenity/bank|AXA":{nomatch:["office/insurance|AXA"],tags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"}},"amenity/bank|Access Bank":{tags:{amenity:"bank",brand:"Access Bank","brand:wikidata":"Q4672418","brand:wikipedia":"en:Access Bank plc",name:"Access Bank"}},"amenity/bank|Addiko Bank":{countryCodes:["ba","hr","me","rs","si"],tags:{amenity:"bank",brand:"Addiko Bank","brand:wikidata":"Q27926559","brand:wikipedia":"en:Addiko Bank",name:"Addiko Bank"}},"amenity/bank|Affinity Credit Union":{countryCodes:["ca"],matchNames:["affinity"],tags:{amenity:"bank",brand:"Affinity Credit Union","brand:wikidata":"Q4688969","brand:wikipedia":"en:Affinity Credit Union",name:"Affinity Credit Union"}},"amenity/bank|Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank Limited"}},"amenity/bank|Agribank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"}},"amenity/bank|Agribank~(Vietnam)":{countryCodes:["vn"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q1924723","brand:wikipedia":"vn:Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam",name:"Agribank",official_name:"Ngân hàng Nông nghiệp và Phát triển Nông thôn Việt Nam","official_name:en":"Vietnam Bank for Agriculture and Rural Development"}},"amenity/bank|Agribank~(Zimbabwe)":{countryCodes:["zw"],tags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693887","brand:wikipedia":"en:Agricultural Development Bank of Zimbabwe",name:"Agribank"}},"amenity/bank|Akbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"}},"amenity/bank|Aktia":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Aktia","brand:wikidata":"Q11850417","brand:wikipedia":"fi:Aktia",name:"Aktia"}},"amenity/bank|Alior Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"pl:Alior Bank",name:"Alior Bank"}},"amenity/bank|Allahabad Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"}},"amenity/bank|Allied Bank~(Pakistan)":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732553","brand:wikipedia":"en:Allied Bank Limited",name:"Allied Bank"}},"amenity/bank|Allied Bank~(defunct bank in Philipiness)":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"}},"amenity/bank|Alpha Bank":{tags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"}},"amenity/bank|Alterna Savings":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Alterna Savings","brand:wikidata":"Q4736322","brand:wikipedia":"en:Alterna Savings",name:"Alterna Savings"}},"amenity/bank|America First Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"America First Credit Union","brand:wikidata":"Q4742758","brand:wikipedia":"en:America First Credit Union",name:"America First Credit Union",short_name:"AFCU"}},"amenity/bank|Andhra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"}},"amenity/bank|Antonveneta":{countryCodes:["it"],tags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"}},"amenity/bank|Apple Bank":{countryCodes:["us"],nomatch:["shop/electronics|Apple Store"],tags:{amenity:"bank",brand:"Apple Bank","brand:wikidata":"Q4781125","brand:wikipedia":"en:Apple Bank for Savings",name:"Apple Bank"}},"amenity/bank|Argenta":{countryCodes:["be","lu","nl"],tags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"}},"amenity/bank|Arvest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"}},"amenity/bank|Asia United Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"}},"amenity/bank|Askari Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"}},"amenity/bank|Associated Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"}},"amenity/bank|Attijariwafa Bank":{tags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"}},"amenity/bank|Axis Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"}},"amenity/bank|BAC":{tags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de América Central",name:"BAC",official_name:"Banco de America Central"}},"amenity/bank|BAWAG PSK":{countryCodes:["at"],tags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"}},"amenity/bank|BB&T":{countryCodes:["us"],tags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T",official_name:"Branch Banking and Trust Company"}},"amenity/bank|BBBank":{countryCodes:["de"],tags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"}},"amenity/bank|BBVA":{tags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA",official_name:"Banco Bilbao Vizcaya Argentaria"}},"amenity/bank|BBVA Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"}},"amenity/bank|BBVA Compass":{countryCodes:["us"],tags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares"}},"amenity/bank|BBVA Continental":{countryCodes:["pe"],tags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"}},"amenity/bank|BBVA Francés":{countryCodes:["ar"],tags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés"}},"amenity/bank|BCA":{matchNames:["bank bca"],tags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA",official_name:"Bank Central Asia"}},"amenity/bank|BCI":{matchNames:["banco bci"],tags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI",official_name:"Banco de Crédito e Inversiones","official_name:en":"Bank of Credit and Investments","official_name:es":"Banco de Crédito e Inversiones"}},"amenity/bank|BCP~(Bolivia)":{countryCodes:["bo"],nomatch:["amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP",official_name:"Banco de Crédito de Bolivia","official_name:en":"Credit Bank of Bolivia","official_name:es":"Banco de Crédito de Bolivia"}},"amenity/bank|BCP~(France)":{countryCodes:["fr"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(Luxembourg)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Luxembourg)":{countryCodes:["lu"],matchNames:["banque bcp","bcp"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Peru)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"}},"amenity/bank|BCP~(Peru)":{countryCodes:["pe"],matchNames:["banco de crédito del perú"],nomatch:["amenity/bank|BCP~(Bolivia)","amenity/bank|BCP~(France)","amenity/bank|BCP~(Luxembourg)"],tags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"}},"amenity/bank|BCR~(Banca Comercială Română)":{countryCodes:["ro"],matchNames:["banca comercială română"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q806149","brand:wikipedia":"en:Banca Comercială Română",name:"BCR",official_name:"Banca Comercială Română","official_name:en":"Romanian Commercial Bank","official_name:ro":"Banca Comercială Română"}},"amenity/bank|BCR~(Costa Rica)":{countryCodes:["cr"],matchNames:["banco de costa rica"],tags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR",official_name:"Banco de Costa Rica","official_name:en":"Bank of Costa Rica","official_name:es":"Banco de Costa Rica"}},"amenity/bank|BDO":{countryCodes:["ph"],tags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO",official_name:"Banco de Oro","official_name:en":"Gold Bank","official_name:es":"Banco de Oro"}},"amenity/bank|BGŻ BNP Paribas":{countryCodes:["pl"],tags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q20744004","brand:wikipedia":"pl:BNP Paribas Bank Polska",name:"BGŻ BNP Paribas"}},"amenity/bank|BIAT":{countryCodes:["tn"],tags:{amenity:"bank",brand:"BIAT","brand:wikidata":"Q690739","brand:wikipedia":"en:Banque Internationale Arabe de Tunisie",name:"BIAT"}},"amenity/bank|BMCE Bank":{countryCodes:["ma"],matchNames:["bmce"],tags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"}},"amenity/bank|BMCI":{countryCodes:["ma"],matchNames:["bmci bank"],tags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"}},"amenity/bank|BMN":{countryCodes:["es"],tags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN",official_name:"Banco Mare Nostrum"}},"amenity/bank|BMO Harris Bank~(USA)":{countryCodes:["us"],matchNames:["BMO","BMO Bank of Montreal","BMO Harris Bank","Bank of Montreal","Harris Bank"],tags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"}},"amenity/bank|BMO~(Canada)":{countryCodes:["ca"],matchNames:["BMO","BMO Bank of Montreal","BMO Banque de Montréal","Bank of Montreal","Banque de Montréal"],tags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO",official_name:"Bank of Montreal"}},"amenity/bank|BNA~(Algeria)":{countryCodes:["dz"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA",official_name:"Banque nationale d'Algérie","official_name:en":"National Bank of Algeria","official_name:fr":"Banque nationale d'Algérie"}},"amenity/bank|BNA~(Tunisia)":{countryCodes:["tn"],tags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883413","brand:wikipedia":"fr:Banque nationale agricole",name:"BNA"}},"amenity/bank|BNI":{matchNames:["bank bni"],tags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI",official_name:"Bank Negara Indonesia","official_name:en":"State Bank of Indonesia","official_name:id":"Bank Negara Indonesia"}},"amenity/bank|BNL":{countryCodes:["it"],tags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL",official_name:"Banca Nazionale del Lavoro","official_name:en":"National Labor Bank","official_name:it":"Banca Nazionale del Lavoro"}},"amenity/bank|BNP Paribas":{tags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"}},"amenity/bank|BNP Paribas Fortis":{countryCodes:["be"],tags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"}},"amenity/bank|BOC":{tags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC",official_name:"Bank of China"}},"amenity/bank|BOQ":{countryCodes:["au"],tags:{amenity:"bank",brand:"BOQ","brand:wikidata":"Q4856173","brand:wikipedia":"en:Bank of Queensland",name:"BOQ",official_name:"Bank of Queensland"}},"amenity/bank|BPI":{matchNames:["bpi family savings bank"],tags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI",official_name:"Bank of the Philippine Islands"}},"amenity/bank|BRD":{countryCodes:["ro"],tags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"}},"amenity/bank|BRED":{countryCodes:["fr"],tags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED",official_name:"Banque régionale d'escompte et de dépôts","official_name:en":"Regional Discount and Deposit Bank","official_name:fr":"Banque régionale d'escompte et de dépôts"}},"amenity/bank|BRI":{countryCodes:["id"],matchNames:["bank bri"],tags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI",official_name:"Bank Rakyat Indonesia","official_name:en":"People's Bank of Indonesia","official_name:id":"Bank Rakyat Indonesia"}},"amenity/bank|BTN":{countryCodes:["id"],tags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:id":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN","name:id":"BTN",official_name:"Bank Tabungan Negara","official_name:en":"State Savings Bank","official_name:id":"Bank Tabungan Negara"}},"amenity/bank|BW-Bank":{countryCodes:["de"],matchNames:["baden-württembergische bank"],tags:{amenity:"bank",brand:"BW-Bank","brand:de":"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:de":"BW-Bank","name:en":"BW-Bank"}},"amenity/bank|Banamex":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex",official_name:"Grupo Financiero Banamex","official_name:en":"Banamex Financial Group","official_name:es":"Grupo Financiero Banamex"}},"amenity/bank|Banca Intesa":{countryCodes:["it","rs"],tags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa","name:en":"Intesa Bank","name:it":"Banca Intesa"}},"amenity/bank|Banca March":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"}},"amenity/bank|Banca Popolare di Milano":{countryCodes:["it"],matchNames:["bpm"],tags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:en":"Popular Bank of Milan","brand:it":"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano","name:en":"Popular Bank of Milan","name:it":"Banca Popolare di Milano"}},"amenity/bank|Banca Popolare di Novara":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:en":"Popular Bank of Novara","brand:it":"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara","name:en":"Popular Bank of Novara","name:it":"Banca Popolare di Novara"}},"amenity/bank|Banca Popolare di Sondrio":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:en":"Popular Bank of Sandrio","brand:it":"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio","name:en":"Popular Bank of Sandrio","name:it":"Banca Popolare di Sondrio"}},"amenity/bank|Banca Popolare di Verona":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:en":"Popular Bank of Verona","brand:it":"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona","name:en":"Popular Bank of Verona","name:it":"Banca Popolare di Verona"}},"amenity/bank|Banca Popolare di Vicenza":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:en":"Popular Bank of Vicenza","brand:it":"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza","name:en":"Popular Bank of Vicena","name:it":"Banca Popolare di Vicenza"}},"amenity/bank|Banca Românească":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Românească","brand:en":"Romanian Bank","brand:ro":"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"ro:Banca Românească",name:"Banca Românească","name:en":"Popular Bank of Vicena","name:ro":"Banca Românească"}},"amenity/bank|Banca Sella":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banca Sella","brand:en":"Sella Bank","brand:it":"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella","name:en":"Sella Bank","name:it":"Banca Sella"}},"amenity/bank|Banca Transilvania":{countryCodes:["ro"],tags:{amenity:"bank",brand:"Banca Transilvania","brand:en":"Transilvania Bank","brand:ro":"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania","name:en":"Transilvania Bank","name:ro":"Banca Transilvania"}},"amenity/bank|Bancaribe":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"}},"amenity/bank|Banco AV Villas":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco AV Villas","brand:en":"Bank of Villas","brand:es":"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas","name:en":"Bank of Villas","name:es":"Banco AV Villas"}},"amenity/bank|Banco Agrario":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Agrario","brand:en":"Agrarian Bank","brand:wikidata":"Q20013358","brand:wikipedia":"es:Banco Agrario de Colombia",name:"Banco Agrario","name:en":"Agrarian Bank","name:es":"Banco Agrario",official_name:"Banco Agrario de Colombia","official_name:en":"Agrarian Bank of Colombia","official_name:es":"Banco Agrario de Colombia"}},"amenity/bank|Banco Azteca":{tags:{amenity:"bank",brand:"Banco Azteca","brand:en":"Aztec Bank","brand:es":"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca","name:en":"Aztec Bank","name:es":"Banco Azteca"}},"amenity/bank|Banco BPM":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco BPM","brand:en":"BPM Bank","brand:es":"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM","name:en":"BPM Bank","name:es":"Banco BPM"}},"amenity/bank|Banco Caja Social":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Caja Social","brand:en":"Social Housing Bank","brand:es":"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social","name:en":"Social Housing Bank","name:es":"Banco Caja Social"}},"amenity/bank|Banco Ciudad":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Ciudad","brand:en":"City Bank","brand:es":"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad","name:en":"City Bank","name:es":"Banco Ciudad",official_name:"Banco Ciudad de Buenos Aires","official_name:en":"Bank of the City of Buenos Aires","official_name:es":"Banco Ciudad de Buenos Aires"}},"amenity/bank|Banco Continental~(Paraguay)":{countryCodes:["py"],tags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q62054564",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"}},"amenity/bank|Banco Continental~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco Continental","brand:en":"Continental Bank","brand:es":"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental","name:en":"Continental Bank","name:es":"Banco Continental"}},"amenity/bank|Banco Estado":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Estado","brand:en":"State Bank","brand:es":"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado","name:en":"State Bank","name:es":"Banco Estado",official_name:"Banco del Estado de Chile","official_name:en":"Bank of the State of Chile","official_name:es":"Banco del Estado de Chile"}},"amenity/bank|Banco Falabella":{countryCodes:["cl","co","pe"],nomatch:["shop/department_store|Falabella"],tags:{amenity:"bank",brand:"Banco Falabella","brand:en":"Falabella Bank","brand:es":"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella","name:en":"Falabella Bank","name:es":"Banco Falabella"}},"amenity/bank|Banco Fassil":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Fassil","brand:en":"Fassil Bank","brand:es":"Banco Fassil","brand:wikidata":"Q62118592",name:"Banco Fassil","name:en":"Fassil Bank","name:es":"Banco Fassil"}},"amenity/bank|Banco G&T Continental":{countryCodes:["gt","sv"],tags:{amenity:"bank",brand:"Banco G&T Continental","brand:en":"G&T Continental Bank","brand:es":"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental","name:en":"G&T Continental Bank","name:es":"Banco G&T Continental"}},"amenity/bank|Banco General":{countryCodes:["cr","pa"],tags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:es":"BW-Bank","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General","name:en":"General Bank","name:es":"Banco General"}},"amenity/bank|Banco Industrial":{tags:{amenity:"bank",brand:"Banco Industrial","brand:en":"Industrial Bank","brand:es":"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial","name:en":"Industrial Bank","name:es":"Banco Industrial"}},"amenity/bank|Banco Internacional~(Chile)":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q56605586","brand:wikipedia":"es:Banco Internacional (Chile)",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Internacional~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco Internacional","brand:en":"International Bank","brand:es":"Banco Internacional","brand:wikidata":"Q806187","brand:wikipedia":"es:Banco Internacional",name:"Banco Internacional","name:en":"International Bank","name:es":"Banco Internacional"}},"amenity/bank|Banco Metropolitano":{countryCodes:["cu"],tags:{amenity:"bank",brand:"Banco Metropolitano","brand:en":"Metroplitan Bank","brand:es":"Banco Metropolitano","brand:wikidata":"Q62118612",name:"Banco Metropolitano","name:en":"Metropolitan Bank","name:es":"Banco Metropolitano"}},"amenity/bank|Banco Nacional":{countryCodes:["cr","pa"],tags:{amenity:"bank",brand:"Banco Nacional de Costa Rica","brand:en":"National Bank of Costa Rica","brand:es":"Banco Nacional de Costa Rica","brand:wikidata":"Q2917708","brand:wikipedia":"es:Banco Nacional de Costa Rica",name:"Banco Nacional","name:en":"National Bank","name:es":"Banco Nacional",official_name:"Banco Nacional de Costa Rica","official_name:en":"National Bank of Costa Rica","official_name:es":"Banco Nacional de Costa Rica",short_name:"BNCR"}},"amenity/bank|Banco Nación":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Nación","brand:en":"Nation Bank","brand:es":"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación","name:en":"Nation Bank","name:es":"Banco Nación",official_name:"Banco de la Nación Argentina","official_name:en":"Bank of the Argentine Nation","official_name:es":"Banco de la Nación Argentina"}},"amenity/bank|Banco Pastor":{countryCodes:["es"],tags:{amenity:"bank",brand:"Banco Pastor","brand:en":"Shepherd Bank","brand:es":"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor","name:en":"Shepherd Bank","name:es":"Banco Pastor",official_name:"Banco Popular Pastor","official_name:en":"Popular Shepherd Bank","official_name:es":"Banco Popular Pastor"}},"amenity/bank|Banco Pichincha":{tags:{amenity:"bank",brand:"Banco Pichincha","brand:en":"Pichincha Bank","brand:es":"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha","name:en":"Pichincha Bank","name:es":"Banco Pichincha"}},"amenity/bank|Banco Popular de Ahorro":{countryCodes:["cu"],matchNames:["bpa"],tags:{amenity:"bank",brand:"Banco Popular de Ahorro","brand:en":"Popular Saving Bank","brand:es":"Banco Popular de Ahorro","brand:wikidata":"Q62118626",name:"Banco Popular de Ahorro","name:en":"Popular Saving Bank","name:es":"Banco Popular de Ahorro"}},"amenity/bank|Banco Provincia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Provincia","brand:en":"Province Bank","brand:es":"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia","name:en":"Province Bank","name:es":"Banco Provincia",official_name:"Banco de la Provincia de Buenos Aires","official_name:en":"Bank of the Province of Buenos Aires","official_name:es":"Banco de la Provincia de Buenos Aires"}},"amenity/bank|Banco Sabadell":{countryCodes:["es"],matchNames:["banc sabadell","sabadell"],tags:{amenity:"bank",brand:"Banco Sabadell","brand:en":"Sabadell Bank","brand:es":"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell","name:en":"Sabadell Bank","name:es":"Banco Sabadell"}},"amenity/bank|Banco Santa Fe":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco Santa Fe","brand:en":"Santa Fe Bank","brand:es":"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe","name:en":"Santa Fe Bank","name:es":"Banco Santa Fe",official_name:"Nuevo Banco de Santa Fe","official_name:en":"New Bank of Santa Fe","official_name:es":"Nuevo Banco de Santa Fe"}},"amenity/bank|Banco Santander":{nomatch:["amenity/bank|Santander"],tags:{amenity:"bank",brand:"Banco Santander","brand:en":"Santander Bank","brand:es":"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander","name:en":"Santander Bank","name:es":"Banco Santander",official_name:"Santander Group"}},"amenity/bank|Banco Sol~(Angola)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"}},"amenity/bank|Banco Sol~(Bolivia)":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Sol","brand:en":"Sol Bank","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","name:en":"Sol Bank","name:pt":"Banco Sol"}},"amenity/bank|Banco Unión":{countryCodes:["bo"],nomatch:["amenity/bank|UnionBank","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"Banco Unión","brand:en":"Union Bank","brand:es":"Banco Unión",name:"Banco Unión","name:en":"Union Bank","name:es":"Banco Unión"}},"amenity/bank|Banco de Bogotá":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco de Bogotá","brand:en":"Bank of Bogota","brand:es":"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá","name:en":"Bank of Bogota","name:es":"Banco de Bogotá"}},"amenity/bank|Banco de Chile":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco de Chile","brand:en":"Bank of Chile","brand:es":"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile","name:en":"Bank of Chile","name:es":"Banco de Chile"}},"amenity/bank|Banco de Desarrollo Banrural":{countryCodes:["gt"],tags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:en":"Bank of Banrural Development","brand:es":"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural","name:en":"Bank of Banrural Development","name:es":"Banco de Desarrollo Banrural"}},"amenity/bank|Banco de Fomento Angola (BFA)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:en":"Angola Development Bank (BFA)","brand:es":"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)","name:en":"Angola Development Bank (BFA)","name:es":"Banco de Fomento Angola (BFA)"}},"amenity/bank|Banco de Occidente":{tags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"}},"amenity/bank|Banco de Venezuela":{countryCodes:["ve"],matchNames:["de venezuela"],tags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"}},"amenity/bank|Banco de la Nación~(Argentina)":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"}},"amenity/bank|Banco de la Nación~(Peru)":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"}},"amenity/bank|Banco del Austro":{countryCodes:["ec"],tags:{amenity:"bank",brand:"Banco del Austro","brand:wikidata":"Q62122344",name:"Banco del Austro"}},"amenity/bank|Banco di Napoli":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"}},"amenity/bank|Banco di Sardegna":{countryCodes:["it"],tags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"}},"amenity/bank|Banco do Brasil":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"}},"amenity/bank|Banco do Nordeste":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"}},"amenity/bank|Bancolombia":{countryCodes:["co"],tags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"}},"amenity/bank|Bancomer":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"}},"amenity/bank|Bancpost":{countryCodes:["ro"],nomatch:["amenity/bank|Postbank"],tags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"}},"amenity/bank|Banesco":{tags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"}},"amenity/bank|Bangkok Bank":{countryCodes:["th"],tags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"}},"amenity/bank|Bank Al Habib":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"}},"amenity/bank|Bank Alfalah":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"}},"amenity/bank|Bank Austria":{countryCodes:["at"],tags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"}},"amenity/bank|Bank Danamon":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"}},"amenity/bank|Bank Mandiri":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"}},"amenity/bank|Bank Mandiri Syariah":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"}},"amenity/bank|Bank Mega":{countryCodes:["id"],tags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"}},"amenity/bank|Bank Muamalat":{countryCodes:["id","my"],tags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"}},"amenity/bank|Bank Pekao":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Bank Pekao"}},"amenity/bank|Bank Rakyat":{countryCodes:["my"],tags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"}},"amenity/bank|Bank of Africa":{tags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"}},"amenity/bank|Bank of America":{countryCodes:["us"],tags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"}},"amenity/bank|Bank of Baroda":{tags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"}},"amenity/bank|Bank of Ceylon":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"}},"amenity/bank|Bank of Commerce":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"}},"amenity/bank|Bank of Cyprus":{countryCodes:["cy","gr"],tags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"}},"amenity/bank|Bank of India":{tags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"}},"amenity/bank|Bank of Ireland":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"}},"amenity/bank|Bank of Maharashtra":{countryCodes:["in"],tags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"}},"amenity/bank|Bank of New Zealand":{countryCodes:["nz"],tags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"}},"amenity/bank|Bank of Scotland":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"}},"amenity/bank|Bank of the West":{countryCodes:["us"],tags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"}},"amenity/bank|Bankia":{countryCodes:["es"],tags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"}},"amenity/bank|Bankinter":{countryCodes:["es","pt"],nomatch:["amenity/bank|Interbank"],tags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"}},"amenity/bank|Bankwest":{countryCodes:["au"],tags:{amenity:"bank",brand:"Bankwest","brand:wikidata":"Q4856817","brand:wikipedia":"en:Bankwest",name:"Bankwest"}},"amenity/bank|Banner Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"}},"amenity/bank|Banorte":{countryCodes:["mx"],tags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"}},"amenity/bank|Banque Atlantique":{tags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"}},"amenity/bank|Banque Laurentienne":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"}},"amenity/bank|Banque Nationale~(Canada)":{countryCodes:["ca"],matchNames:["banque nationale du canada","national bank of canada"],tags:{amenity:"bank",brand:"Banque Nationale","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"Banque Nationale"}},"amenity/bank|Banque Populaire":{tags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"}},"amenity/bank|Banrisul":{countryCodes:["br"],tags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"}},"amenity/bank|Banrural":{countryCodes:["gt","hn"],tags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"}},"amenity/bank|Barclays":{matchNames:["barclays bank"],tags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"}},"amenity/bank|Bcc":{countryCodes:["it"],tags:{amenity:"bank",brand:"Bcc","brand:wikidata":"Q25060394","brand:wikipedia":"en:Banca di Credito Cooperativo di Roma",name:"Bcc"}},"amenity/bank|Belfius":{countryCodes:["be"],tags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"}},"amenity/bank|Bendigo Bank":{countryCodes:["au"],tags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"}},"amenity/bank|Berliner Volksbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"}},"amenity/bank|Bicentenario":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"}},"amenity/bank|Bicici":{countryCodes:["ci"],matchNames:["agence bicici"],tags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"}},"amenity/bank|Bradesco":{countryCodes:["br"],matchNames:["banco bradesco"],tags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"}},"amenity/bank|Budapest Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"}},"amenity/bank|CBAO":{countryCodes:["sn"],tags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"}},"amenity/bank|CEC Bank":{countryCodes:["ro"],tags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"}},"amenity/bank|CIB Bank":{tags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"}},"amenity/bank|CIBC":{countryCodes:["ca"],matchNames:["cibc banking centre"],tags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"}},"amenity/bank|CIC":{countryCodes:["fr"],tags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"}},"amenity/bank|CIH Bank":{countryCodes:["ma"],tags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"}},"amenity/bank|CIMB Bank":{countryCodes:["my"],tags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"}},"amenity/bank|CIMB Niaga":{countryCodes:["id"],tags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"}},"amenity/bank|CNEP":{countryCodes:["dz"],tags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"}},"amenity/bank|CRDB Bank":{countryCodes:["tz"],tags:{amenity:"bank",brand:"CRDB Bank","brand:wikidata":"Q5013848","brand:wikipedia":"en:CRDB Bank",name:"CRDB Bank"}},"amenity/bank|Caisse Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"}},"amenity/bank|Caisse d'Épargne":{tags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"}},"amenity/bank|Caixa Econômica Federal~(Brazil)":{countryCodes:["br"],matchNames:["caixa","caixabank"],nomatch:["amenity/bank|Caixabank~(Spain)"],tags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"}},"amenity/bank|Caixa Geral de Depósitos":{countryCodes:["es","fr","pt"],tags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"}},"amenity/bank|Caixabank~(Spain)":{countryCodes:["es"],nomatch:["amenity/bank|Caixa Econômica Federal~(Brazil)"],tags:{amenity:"bank",brand:"Caixabank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"}},"amenity/bank|Caja Duero":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Duero","brand:wikidata":"Q3821055","brand:wikipedia":"es:Caja Duero",name:"Caja Duero"}},"amenity/bank|Caja España":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"}},"amenity/bank|Caja Rural":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"}},"amenity/bank|Caja Rural de Jaén":{countryCodes:["es"],tags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"}},"amenity/bank|CajaSur":{countryCodes:["es"],tags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"}},"amenity/bank|Cajamar":{countryCodes:["es"],tags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"}},"amenity/bank|California Coast Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"California Coast Credit Union","brand:wikidata":"Q25025281","brand:wikipedia":"en:California Coast Credit Union",name:"California Coast Credit Union"}},"amenity/bank|Canara Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"}},"amenity/bank|Capital Bank":{tags:{amenity:"bank",brand:"Capital Bank","brand:wikidata":"Q5035481","brand:wikipedia":"en:Capital Bank Financial",name:"Capital Bank"}},"amenity/bank|Capital One":{countryCodes:["us"],matchNames:["capital one bank"],tags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"}},"amenity/bank|Carige":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"}},"amenity/bank|Cariparma":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"}},"amenity/bank|Carisbo":{countryCodes:["it"],tags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"}},"amenity/bank|Cassa di Risparmio del Veneto":{countryCodes:["it"],tags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"}},"amenity/bank|CatalunyaCaixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"}},"amenity/bank|Cathay Bank":{countryCodes:["cn","tw","us"],tags:{amenity:"bank",brand:"Cathay Bank","brand:wikidata":"Q4189507","brand:wikipedia":"en:Cathay Bank",name:"Cathay Bank"}},"amenity/bank|Central Bank":{tags:{amenity:"bank",brand:"Central Bank",name:"Central Bank"}},"amenity/bank|Central Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"}},"amenity/bank|Chase":{matchNames:["chase bank"],tags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"}},"amenity/bank|China Bank":{tags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"}},"amenity/bank|China Bank Savings":{countryCodes:["ph"],tags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"}},"amenity/bank|China Construction Bank":{tags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"}},"amenity/bank|Citibank":{tags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank",short_name:"Citi"}},"amenity/bank|Citizens Bank~(Eastern USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122694","brand:wikipedia":"en:Citizens Financial Group",name:"Citizens Bank",short_name:"Citizens"}},"amenity/bank|Citizens Bank~(Kentucky)":{countryCodes:["us"],tags:{alt_name:"Citizens Bank of Kentucky",amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q5122711","brand:wikipedia":"en:Citizens National Bank (Eastern Kentucky)",name:"Citizens Bank",official_name:"Citizens National Bank",short_name:"Citizens"}},"amenity/bank|Citizens Bank~(Nepal)":{countryCodes:["np"],tags:{amenity:"bank",brand:"Citizens Bank International","brand:wikidata":"Q13186934","brand:wikipedia":"en:Citizens Bank International",name:"Citizens Bank",official_name:"Citizens Bank International Ltd.",short_name:"Citizens"}},"amenity/bank|City National Bank~(California)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q5123314","brand:wikipedia":"en:City National Bank (California)",name:"City National Bank"}},"amenity/bank|City National Bank~(Florida)":{countryCodes:["us"],tags:{amenity:"bank",brand:"City National Bank","brand:wikidata":"Q16958644","brand:wikipedia":"en:City National Bank of Florida",name:"City National Bank",official_name:"City National Bank of Florida"}},"amenity/bank|Clydesdale Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikidata":"Q971680","brand:wikipedia":"en:Clydesdale Bank",name:"Clydesdale Bank"}},"amenity/bank|Coast Capital Savings":{countryCodes:["ca"],matchNames:["coast capital","coast capital savings credit union"],tags:{amenity:"bank",brand:"Coast Capital Savings","brand:wikidata":"Q5138088","brand:wikipedia":"en:Coast Capital Savings",name:"Coast Capital Savings",official_name:"Coast Capital Savings Federal Credit Union"}},"amenity/bank|Columbia Bank~(New Jersey)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(Washington)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084096",name:"Columbia Bank"}},"amenity/bank|Columbia Bank~(Washington)":{countryCodes:["us"],nomatch:["amenity/bank|Columbia Bank~(New Jersey)","shop/clothes|Columbia"],tags:{amenity:"bank",brand:"Columbia Bank","brand:wikidata":"Q62084089",name:"Columbia Bank"}},"amenity/bank|Comerica Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"}},"amenity/bank|Commerce Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Commerce Bank",name:"Commerce Bank"}},"amenity/bank|Commercial Bank":{tags:{amenity:"bank",brand:"Commercial Bank",name:"Commercial Bank"}},"amenity/bank|Commercial Bank of Ceylon PLC":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"}},"amenity/bank|Commerzbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"}},"amenity/bank|Commonwealth Bank":{tags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"}},"amenity/bank|Community Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Community Bank","brand:wikidata":"Q5154635","brand:wikipedia":"en:Community Bank, N.A.",name:"Community Bank"}},"amenity/bank|Corporation Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"}},"amenity/bank|Credem":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"}},"amenity/bank|Credicoop":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"}},"amenity/bank|Credit Suisse":{countryCodes:["ch"],tags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"}},"amenity/bank|Credito Valtellinese":{countryCodes:["it"],tags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"}},"amenity/bank|Crelan":{countryCodes:["be"],tags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"}},"amenity/bank|Crédit Agricole":{tags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"}},"amenity/bank|Crédit Maritime":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"}},"amenity/bank|Crédit Mutuel":{tags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"}},"amenity/bank|Crédit Mutuel de Bretagne":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"}},"amenity/bank|Crédit du Nord":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"}},"amenity/bank|Crédito Agrícola":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"}},"amenity/bank|Danske Bank":{countryCodes:["dk","fi","gb","lt","no","se"],tags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"}},"amenity/bank|Davivienda":{tags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"}},"amenity/bank|Denizbank":{tags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"}},"amenity/bank|Desjardins":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"}},"amenity/bank|Deutsche Bank":{tags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"}},"amenity/bank|Dollar Bank":{countryCodes:["us"],nomatch:["amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{amenity:"bank",brand:"Dollar Bank","brand:wikidata":"Q5289205","brand:wikipedia":"en:Dollar Bank",name:"Dollar Bank"}},"amenity/bank|Dubai Islamic Bank":{tags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"}},"amenity/bank|EastWest Unibank":{countryCodes:["ph"],matchNames:["eastwest bank"],tags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"}},"amenity/bank|Ecobank":{matchNames:["agence ecobank"],tags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"}},"amenity/bank|Emigrant Savings Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Emigrant Savings Bank","brand:wikidata":"Q5371104","brand:wikipedia":"en:Emigrant Savings Bank",name:"Emigrant Savings Bank"}},"amenity/bank|Emirates NBD":{countryCodes:["ae"],tags:{amenity:"bank",brand:"Emirates NBD","brand:wikidata":"Q5372575","brand:wikipedia":"en:Emirates NBD",name:"Emirates NBD"}},"amenity/bank|Equity Bank~(Congo)":{countryCodes:["cd"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q21178738","brand:wikipedia":"en:Equity Bank Congo",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Kenya)":{countryCodes:["ke"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384664","brand:wikipedia":"en:Equity Bank Kenya Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Rwanda)":{countryCodes:["rw"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384665","brand:wikipedia":"en:Equity Bank Rwanda Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(South Sudan)":{countryCodes:["ss"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384666","brand:wikipedia":"en:Equity Bank South Sudan Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Tanzania)":{countryCodes:["tz"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384667","brand:wikipedia":"en:Equity Bank Tanzania Limited",name:"Equity Bank"}},"amenity/bank|Equity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q62260414","brand:wikipedia":"en:Equity Bank USA",name:"Equity Bank"}},"amenity/bank|Equity Bank~(Uganda)":{countryCodes:["ug"],tags:{amenity:"bank",brand:"Equity Bank","brand:wikidata":"Q5384668","brand:wikipedia":"en:Equity Bank Uganda Limited",name:"Equity Bank"}},"amenity/bank|Erste Bank":{countryCodes:["at","hr","hu"],tags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"}},"amenity/bank|Eurobank~(Greece)":{countryCodes:["gr"],matchNames:["eurobank ergasias"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q951850","brand:wikipedia":"el:Eurobank",name:"Eurobank"}},"amenity/bank|Eurobank~(Poland)":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q9256201","brand:wikipedia":"pl:Euro Bank",name:"Eurobank"}},"amenity/bank|Eurobank~(Serbia)":{countryCodes:["rs"],tags:{amenity:"bank",brand:"Eurobank","brand:wikidata":"Q5411684","brand:wikipedia":"sr:Eurobanka",name:"Eurobank"}},"amenity/bank|FNB~(South Africa)":{countryCodes:["bw","mz","na","us","za","zm"],tags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB",official_name:"First National Bank"}},"amenity/bank|Faysal Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"}},"amenity/bank|Federal Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"}},"amenity/bank|Fidelity Bank~(Ghana)":{countryCodes:["gh"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446778","brand:wikipedia":"en:Fidelity Bank Ghana",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(Nigeria)":{countryCodes:["ng"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q5446777","brand:wikipedia":"en:Fidelity Bank Nigeria",name:"Fidelity Bank"}},"amenity/bank|Fidelity Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Fidelity Bank","brand:wikidata":"Q1411292","brand:wikipedia":"en:Fidelity Investments",name:"Fidelity Bank"}},"amenity/bank|Fifth Third Bank":{countryCodes:["us"],matchNames:["5/3"],tags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank",short_name:"5/3 Bank"}},"amenity/bank|Finansbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"}},"amenity/bank|First Bank~(North and South Carolina)":{countryCodes:["us"],matchNames:["1st bancorp","1st bank","first bancorp"],tags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452332","brand:wikipedia":"en:First Bancorp",name:"First Bank"}},"amenity/bank|First Bank~(Puerto Rico)":{countryCodes:["us"],matchNames:["1st bancorp","1st bank","first bancorp"],tags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452333","brand:wikipedia":"en:First BanCorp",name:"First Bank"}},"amenity/bank|First Bank~(Western USA)":{countryCodes:["us"],matchNames:["1st bank"],tags:{amenity:"bank",brand:"First Bank","brand:wikidata":"Q5452217","brand:wikipedia":"en:FirstBank Holding Co",name:"First Bank",short_name:"1STBank"}},"amenity/bank|First Citizens Bank~(Trinidad and Tobago)":{countryCodes:["bb","tt"],matchNames:["1st citizens bank"],tags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"}},"amenity/bank|First Citizens Bank~(USA)":{countryCodes:["us"],matchNames:["1st citizens bank"],tags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452733","brand:wikipedia":"en:First Citizens BancShares",name:"First Citizens Bank"}},"amenity/bank|First Financial Bank":{countryCodes:["us"],matchNames:["1st financial bank"],tags:{amenity:"bank",brand:"First Financial Bank","brand:wikidata":"Q5453009","brand:wikipedia":"en:First Financial Bank (Ohio)",name:"First Financial Bank"}},"amenity/bank|First Interstate Bank":{countryCodes:["us"],matchNames:["1st interstate","1st interstate bancsystem","1st interstate bank","first interstate","first interstate bancsystem"],tags:{amenity:"bank",brand:"First Interstate BancSystem","brand:wikidata":"Q5453107","brand:wikipedia":"en:First Interstate BancSystem",name:"First Interstate Bank"}},"amenity/bank|First Midwest Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First Midwest Bank","brand:wikidata":"Q5453331","brand:wikipedia":"en:First Midwest Bank",name:"First Midwest Bank"}},"amenity/bank|First National Bank~(USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"}},"amenity/bank|First State Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"First State Bank",name:"First State Bank"}},"amenity/bank|First West Credit Union":{countryCodes:["ca"],tags:{alt_name:"First West",amenity:"bank",brand:"First West Credit Union","brand:wikidata":"Q5454073","brand:wikipedia":"en:First West Credit Union",name:"First West Credit Union"}},"amenity/bank|Frost Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"}},"amenity/bank|Fulton Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Fulton Bank","brand:wikidata":"Q16976594",name:"Fulton Bank"}},"amenity/bank|GCB Bank":{countryCodes:["gh"],tags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank",name:"GCB Bank"}},"amenity/bank|Galicia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"}},"amenity/bank|Garanti":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"}},"amenity/bank|Garanti Bankası":{tags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"}},"amenity/bank|Getin Bank":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"pl:Getin Bank",name:"Getin Bank"}},"amenity/bank|Golden 1 Credit Union":{countryCodes:["us"],matchNames:["golden 1","golden one","golden one credit union","the golden 1 credit union","the golden one credit union"],tags:{amenity:"bank",brand:"Golden 1 Credit Union","brand:wikidata":"Q7736976","brand:wikipedia":"en:Golden 1 Credit Union",name:"Golden 1 Credit Union"}},"amenity/bank|Great Western Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"}},"amenity/bank|Groupama":{tags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"}},"amenity/bank|HBL Bank":{countryCodes:["pk"],matchNames:["hbl"],tags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"}},"amenity/bank|HDFC Bank":{tags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"}},"amenity/bank|HNB":{tags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"}},"amenity/bank|HSBC UK~(UK)":{countryCodes:["gb"],tags:{amenity:"bank",brand:"HSBC UK","brand:wikidata":"Q64767453",name:"HSBC UK"}},"amenity/bank|HSBC~(Global)":{tags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"}},"amenity/bank|Halifax":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"}},"amenity/bank|Halkbank":{tags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"}},"amenity/bank|Handelsbanken":{countryCodes:["dk","fi","gb","no","se"],tags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"}},"amenity/bank|Heritage Bank":{tags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"}},"amenity/bank|Hong Leong Bank":{countryCodes:["my"],tags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"}},"amenity/bank|Hrvatska poštanska banka":{countryCodes:["hr"],tags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"}},"amenity/bank|Huntington Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"}},"amenity/bank|HypoVereinsbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"}},"amenity/bank|ICBC":{tags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"}},"amenity/bank|ICICI Bank":{countryCodes:["ca","gb","in"],tags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"}},"amenity/bank|IDBI Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"}},"amenity/bank|ING":{matchNames:["ing bank"],tags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"}},"amenity/bank|ING Bank Śląski":{countryCodes:["pl"],tags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"pl:ING Bank Śląski",name:"ING Bank Śląski"}},"amenity/bank|Ibercaja":{countryCodes:["es"],tags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja",name:"Ibercaja"}},"amenity/bank|Indian Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"}},"amenity/bank|Indian Overseas Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"}},"amenity/bank|Interbank":{nomatch:["amenity/bank|Bankinter"],tags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"}},"amenity/bank|Intesa Sanpaolo":{tags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"}},"amenity/bank|Investors Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Investors Bank","brand:wikidata":"Q15109896","brand:wikipedia":"en:Investors Bank",name:"Investors Bank"}},"amenity/bank|Itaú~(Brazil)":{countryCodes:["br"],matchNames:["banco itau"],nomatch:["amenity/bank|Itaú~(Brazil)"],tags:{amenity:"bank",brand:"Itaú Unibanco","brand:wikidata":"Q1424293","brand:wikipedia":"pt:Itaú Unibanco",name:"Itaú"}},"amenity/bank|Itaú~(Chile)":{countryCodes:["cl"],matchNames:["banco itau"],nomatch:["amenity/bank|Itaú~(Chile)"],tags:{amenity:"bank",brand:"Itaú Corpbanca","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"}},"amenity/bank|JS Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"}},"amenity/bank|Janata Bank Limited জনতা ব্যাংক লিমিটেড":{tags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড","brand:bn":"জনতা ব্যাংক লিমিটেড","brand:en":"Janata Bank Limited","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"জনতা ব্যাংক লিমিটেড","name:bn":"জনতা ব্যাংক লিমিটেড","name:en":"Janata Bank Limited"}},"amenity/bank|Jyske Bank":{countryCodes:["dk"],tags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"}},"amenity/bank|K&H Bank":{countryCodes:["hu"],tags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"}},"amenity/bank|KBC":{countryCodes:["be","ie"],tags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"}},"amenity/bank|KBZ Bank":{countryCodes:["mm"],tags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"}},"amenity/bank|Karnataka Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"}},"amenity/bank|Kasa Stefczyka":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"}},"amenity/bank|KeyBank":{countryCodes:["us"],tags:{amenity:"bank",brand:"KeyBank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"KeyBank"}},"amenity/bank|Komerční banka":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"}},"amenity/bank|Kotak Mahindra Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Kotak Mahindra Bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"}},"amenity/bank|Kutxabank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"}},"amenity/bank|Kuveyt Türk":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Kuveyt Türk","brand:wikidata":"Q6036058","brand:wikipedia":"tr:Kuveyt Türk",name:"Kuveyt Türk"}},"amenity/bank|LCL":{countryCodes:["fr"],tags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"}},"amenity/bank|LCNB":{countryCodes:["us"],tags:{alt_name:"Lebanon Citizens National Bank",amenity:"bank",brand:"LCNB","brand:wikidata":"Q65095575",name:"LCNB",official_name:"LCNB National Bank"}},"amenity/bank|La Banque Postale":{countryCodes:["fr"],tags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"}},"amenity/bank|La Caixa":{countryCodes:["es"],tags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"}},"amenity/bank|Laboral Kutxa":{countryCodes:["es"],tags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"}},"amenity/bank|Lake Michigan Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Lake Michigan Credit Union","brand:wikidata":"Q6476906","brand:wikipedia":"en:Lake Michigan Credit Union",name:"Lake Michigan Credit Union",short_name:"LMCU"}},"amenity/bank|Landbank":{countryCodes:["ph"],matchNames:["bangko sa lupa ng pilipinas","land bank of the philippines","lbp"],tags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"}},"amenity/bank|Leeds Building Society":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Leeds Building Society","brand:wikidata":"Q6515848","brand:wikipedia":"en:Leeds Building Society",name:"Leeds Building Society"}},"amenity/bank|Liberbank":{countryCodes:["es"],tags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"}},"amenity/bank|Liberty Bank":{nomatch:["amenity/fuel|Liberty"],tags:{amenity:"bank",brand:"Liberty Bank",name:"Liberty Bank"}},"amenity/bank|Lloyds Bank":{countryCodes:["gb","im"],matchNames:["lloyds","lloyds tsb"],tags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"}},"amenity/bank|M&T Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"}},"amenity/bank|MCB":{matchNames:["mcb bank"],tags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"}},"amenity/bank|MONETA Money Bank":{countryCodes:["cz"],tags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"}},"amenity/bank|Macro":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"}},"amenity/bank|Maybank":{tags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"}},"amenity/bank|Meezan Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"}},"amenity/bank|Mercantil":{tags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"}},"amenity/bank|Meridian Credit Union":{countryCodes:["ca"],tags:{alt_name:"Meridian",amenity:"bank",brand:"Meridian Credit Union","brand:wikidata":"Q6819303","brand:wikipedia":"en:Meridian Credit Union",name:"Meridian Credit Union"}},"amenity/bank|Metro Bank~(UK)":{countryCodes:["gb"],nomatch:["amenity/bank|Metrobank~(Philippines)"],tags:{amenity:"bank",brand:"Metro Bank","brand:wikidata":"Q6824499","brand:wikipedia":"en:Metro Bank (United Kingdom)",name:"Metro Bank"}},"amenity/bank|Metrobank~(Philippines)":{countryCodes:["ph"],nomatch:["amenity/bank|Metro Bank~(UK)"],tags:{amenity:"bank",brand:"Metrobank","brand:wikidata":"Q1925799","brand:wikipedia":"en:Metrobank (Philippines)",name:"Metrobank"}},"amenity/bank|Mibanco":{countryCodes:["pe"],tags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"}},"amenity/bank|MidFirst Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"MidFirst Bank","brand:wikidata":"Q17081131","brand:wikipedia":"en:MidFirst Bank",name:"MidFirst Bank"}},"amenity/bank|Millennium Bank":{countryCodes:["pl"],matchNames:["bank millennium"],tags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"}},"amenity/bank|Millennium bcp":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp",official_name:"Banco Comercial Português","official_name:en":"Portuguese Commercial Bank","official_name:es":"Banco Comercial Português"}},"amenity/bank|Mission Federal Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Mission Federal Credit Union","brand:wikidata":"Q18345955","brand:wikipedia":"en:Mission Federal Credit Union",name:"Mission Federal Credit Union"}},"amenity/bank|Monte dei Paschi di Siena":{countryCodes:["it"],tags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"}},"amenity/bank|Montepio":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"}},"amenity/bank|Mountain America Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Mountain America Credit Union","brand:wikidata":"Q6924862","brand:wikipedia":"en:Mountain America Credit Union",name:"Mountain America Credit Union"}},"amenity/bank|NAB":{tags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"}},"amenity/bank|NSB":{countryCodes:["lk"],matchNames:["national savings bank"],tags:{amenity:"bank",brand:"NSB","brand:wikidata":"Q12500189","brand:wikipedia":"en:National Savings Bank (Sri Lanka)",name:"NSB"}},"amenity/bank|NatWest":{countryCodes:["gb","gg"],tags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"}},"amenity/bank|National Bank":{countryCodes:["ca"],tags:{amenity:"bank",brand:"National Bank","brand:wikidata":"Q634298","brand:wikipedia":"en:National Bank of Canada",name:"National Bank",official_name:"National Bank of Canada"}},"amenity/bank|Nationwide":{countryCodes:["gb"],nomatch:["office/insurance|Nationwide"],tags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"}},"amenity/bank|Navy Federal Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"}},"amenity/bank|Nedbank":{tags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"}},"amenity/bank|Nordea":{tags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"}},"amenity/bank|Novo Banco":{countryCodes:["es","pt"],tags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"}},"amenity/bank|OLB":{countryCodes:["de"],tags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"}},"amenity/bank|OTP":{matchNames:["otp bank"],tags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"}},"amenity/bank|Oberbank":{countryCodes:["at","cz","de","hu"],tags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"}},"amenity/bank|Occidental de Descuento":{countryCodes:["ve"],tags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"}},"amenity/bank|Oldenburgische Landesbank":{countryCodes:["de"],tags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"}},"amenity/bank|One Network Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"}},"amenity/bank|Oriental":{countryCodes:["us"],tags:{alt_name:"Oriental Bank",amenity:"bank",brand:"Oriental","brand:wikidata":"Q64887002",name:"Oriental"}},"amenity/bank|Oriental Bank of Commerce":{countryCodes:["in"],tags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"}},"amenity/bank|Osuuspankki":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Osuuspankki","brand:wikidata":"Q4045597","brand:wikipedia":"fi:OP (finanssiryhmä)",name:"Osuuspankki"}},"amenity/bank|PBZ":{countryCodes:["hr"],tags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"}},"amenity/bank|PKO BP":{countryCodes:["pl"],matchNames:["pko bank polski"],tags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"pl:Powszechna Kasa Oszczędności Bank Polski",name:"PKO BP"}},"amenity/bank|PNB":{countryCodes:["ph"],tags:{amenity:"bank",brand:"PNB","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"PNB",official_name:"Philippine National Bank"}},"amenity/bank|PNC Bank":{countryCodes:["us"],matchNames:["pnc"],tags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"}},"amenity/bank|PSBank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"}},"amenity/bank|Panin Bank":{countryCodes:["id"],tags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"}},"amenity/bank|Patagonia":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"}},"amenity/bank|Pekao SA":{countryCodes:["pl"],tags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"}},"amenity/bank|PenFed Credit Union":{countryCodes:["us"],tags:{alt_name:"Pentagon Federal Credit Union",amenity:"bank",brand:"PenFed Credit Union","brand:wikidata":"Q3374885","brand:wikipedia":"en:Pentagon Federal Credit Union",name:"PenFed Credit Union",short_name:"PenFed"}},"amenity/bank|People's United Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"}},"amenity/bank|Peoples Bank~(Flemingsburg, Kentucky)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Peoples Bank",name:"Peoples Bank",official_name:"Peoples Bank of Kentucky"}},"amenity/bank|Peoples Bank~(Ohio)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q65716607",name:"Peoples Bank"}},"amenity/bank|Peoples Bank~(Washington)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"}},"amenity/bank|Piraeus Bank":{countryCodes:["bg","cy","gr","ro","ua"],tags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"}},"amenity/bank|Popular":{countryCodes:["us"],matchNames:["popular bank"],tags:{alt_name:"Banco Popular","alt_name:en":"Popular Bank","alt_name:es":"Banco Popular",amenity:"bank",brand:"Popular","brand:en":"Popular","brand:es":"Popular","brand:wikidata":"Q7229656","brand:wikipedia":"en:Popular, Inc.",name:"Popular","name:en":"Popular","name:es":"Popular",official_name:"Banco Popular de Puerto Rico","official_name:es":"Banco Popular de Puerto Rico",short_name:"BPPR"}},"amenity/bank|Postbank~(Bulgaria)":{countryCodes:["bg"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q7234083","brand:wikipedia":"en:Bulgarian Postbank",name:"Postbank"}},"amenity/bank|Postbank~(Germany)":{countryCodes:["de"],matchNames:["postbank finanzcenter"],nomatch:["amenity/bank|Bancpost"],tags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"}},"amenity/bank|Prima banka":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"}},"amenity/bank|Provincial":{countryCodes:["ve"],matchNames:["bbva provincial"],tags:{amenity:"bank",brand:"Provincial","brand:wikidata":"Q4835087","brand:wikipedia":"es:BBVA Provincial",name:"Provincial"}},"amenity/bank|Public Bank~(Malaysia)":{matchNames:["public bank berhad"],tags:{amenity:"bank",brand:"Public Bank","brand:wikidata":"Q3046561","brand:wikipedia":"en:Public Bank Berhad",name:"Public Bank"}},"amenity/bank|Punjab National Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"}},"amenity/bank|RBC":{matchNames:["rbc financial group","rbc royal bank","royal bank"],tags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC",official_name:"Royal Bank of Canada"}},"amenity/bank|RBS":{countryCodes:["gb","je","ro"],tags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS",official_name:"Royal Bank of Scotland"}},"amenity/bank|RCBC":{countryCodes:["ph"],matchNames:["rcbc savings bank"],tags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC",official_name:"Rizal Commercial Banking Corporation"}},"amenity/bank|Rabobank":{countryCodes:["au","id","nl","nz","us"],tags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"}},"amenity/bank|Raiffeisen Polbank":{countryCodes:["de","pl"],tags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"}},"amenity/bank|Raiffeisenbank":{matchNames:["raiffeisen","raiffeisenkasse"],nomatch:["amenity/fuel|Raiffeisen"],tags:{amenity:"bank",brand:"Raiffeisenbank","brand:wikidata":"Q24282825","brand:wikipedia":"cs:Raiffeisenbank",name:"Raiffeisenbank"}},"amenity/bank|Regions Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"}},"amenity/bank|Republic Bank":{tags:{amenity:"bank",brand:"Republic Bank",name:"Republic Bank"}},"amenity/bank|Republic Bank (Eastern Caribbean)":{countryCodes:["bb","gd","gy","tt"],tags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"}},"amenity/bank|Republic Bank (USA)":{countryCodes:["us"],tags:{amenity:"bank",brand:"Republic Bank","brand:wikidata":"Q7314387","brand:wikipedia":"en:Republic Bank & Trust Company",name:"Republic Bank",official_name:"Republic Bank & Trust Company"}},"amenity/bank|República":{countryCodes:["uy"],tags:{amenity:"bank",brand:"República","brand:wikidata":"Q4077337","brand:wikipedia":"en:Banco de la República Oriental del Uruguay",name:"República"}},"amenity/bank|S-Pankki":{countryCodes:["fi"],tags:{amenity:"bank",brand:"S-Pankki","brand:wikidata":"Q7387053","brand:wikipedia":"fi:S-Pankki",name:"S-Pankki"}},"amenity/bank|SC제일은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행","brand:wikidata":"Q625531","brand:wikipedia":"en:Standard Chartered Korea",name:"SC제일은행","name:ko":"SC제일은행"}},"amenity/bank|SEB":{countryCodes:["de","ee","lt","lv","se"],tags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"}},"amenity/bank|SGBCI":{countryCodes:["ci"],matchNames:["agence sgbci"],tags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"}},"amenity/bank|SNS Bank":{countryCodes:["nl"],tags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"}},"amenity/bank|Sacombank":{tags:{amenity:"bank",brand:"Sacombank",name:"Sacombank"}},"amenity/bank|Sampath Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"}},"amenity/bank|San Diego County Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"San Diego County Credit Union","brand:wikidata":"Q7413628","brand:wikipedia":"en:San Diego County Credit Union",name:"San Diego County Credit Union",short_name:"SDCCU"}},"amenity/bank|Santander":{matchNames:["santander consumer bank"],nomatch:["amenity/bank|Banco Santander"],tags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"}},"amenity/bank|Santander Río":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"}},"amenity/bank|Santander Totta":{countryCodes:["pt"],tags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"}},"amenity/bank|Sberbank":{tags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"}},"amenity/bank|Scotiabank~(Québec)":{countryCodes:["ca"],matchNames:["Scotia"],nomatch:["amenity/bank|Scotiabank"],tags:{amenity:"bank",brand:"Banque Scotia","brand:wikidata":"Q451476","brand:wikipedia":"fr:Banque Scotia",name:"Banque Scotia"}},"amenity/bank|Scotiabank~(non-Québec)":{matchNames:["Scotia"],nomatch:["amenity/bank|Scotiabank~(Québec)"],tags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"}},"amenity/bank|Security Bank":{countryCodes:["ph"],tags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"}},"amenity/bank|Security Service Federal Credit Union":{countryCodes:["us"],matchNames:["security service fcu"],tags:{amenity:"bank",brand:"Security Service Federal Credit Union","brand:wikidata":"Q7444993","brand:wikipedia":"en:Security Service Federal Credit Union",name:"Security Service Federal Credit Union",short_name:"SSFCU"}},"amenity/bank|Service Credit Union":{countryCodes:["de","us"],tags:{amenity:"bank",brand:"Service Credit Union","brand:wikidata":"Q7455675","brand:wikipedia":"en:Service Credit Union",name:"Service Credit Union"}},"amenity/bank|Servus Credit Union":{countryCodes:["ca"],tags:{alt_name:"Servus",amenity:"bank",brand:"Servus Credit Union","brand:wikidata":"Q2274396","brand:wikipedia":"en:Servus Credit Union",name:"Servus Credit Union"}},"amenity/bank|Seylan Bank":{countryCodes:["lk"],tags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"}},"amenity/bank|Siam Commercial Bank":{countryCodes:["th"],tags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"}},"amenity/bank|Sicoob":{countryCodes:["br"],tags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"}},"amenity/bank|Sicredi":{countryCodes:["br"],tags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"}},"amenity/bank|Simmons Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Simmons Bank","brand:wikidata":"Q28402389","brand:wikipedia":"en:Simmons Bank",name:"Simmons Bank"}},"amenity/bank|Slovenská sporiteľňa":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"}},"amenity/bank|Société Générale":{tags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"}},"amenity/bank|Société Marseillaise de Crédit":{countryCodes:["fr"],tags:{amenity:"bank",brand:"Société Marseillaise de Crédit","brand:wikidata":"Q3488479","brand:wikipedia":"fr:Société marseillaise de crédit",name:"Société Marseillaise de Crédit"}},"amenity/bank|Sonali Bank":{countryCodes:["bd"],matchNames:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],tags:{amenity:"bank",brand:"Sonali Bank","brand:wikidata":"Q3350382","brand:wikipedia":"en:Sonali Bank",name:"Sonali Bank"}},"amenity/bank|South Indian Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"South Indian Bank","brand:wikidata":"Q2044973","brand:wikipedia":"en:South Indian Bank",name:"South Indian Bank"}},"amenity/bank|South State Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"South State Bank","brand:wikidata":"Q55633597","brand:wikipedia":"en:South State Bank",name:"South State Bank"}},"amenity/bank|Sparda-Bank":{countryCodes:["at","de"],tags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"}},"amenity/bank|Stanbic Bank":{tags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"}},"amenity/bank|Standard Bank":{tags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"}},"amenity/bank|Standard Chartered":{matchNames:["standard chartered bank"],tags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"}},"amenity/bank|State Bank of India":{tags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"}},"amenity/bank|State Employees Credit Union":{countryCodes:["us"],tags:{amenity:"bank",brand:"State Employees Credit Union","brand:wikidata":"Q7603196","brand:wikipedia":"en:State Employees Credit Union",name:"State Employees Credit Union",short_name:"SECU"}},"amenity/bank|Summit Bank":{countryCodes:["pk"],tags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"}},"amenity/bank|SunTrust":{countryCodes:["us"],matchNames:["suntrust bank"],tags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"}},"amenity/bank|Suncorp":{countryCodes:["au"],tags:{amenity:"bank",brand:"Suncorp","brand:wikidata":"Q24189567","brand:wikipedia":"en:Suncorp Bank",name:"Suncorp"}},"amenity/bank|Supervielle":{countryCodes:["ar"],tags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"}},"amenity/bank|Swedbank":{countryCodes:["ee","lt","lv","se"],tags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"}},"amenity/bank|Syndicate Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"}},"amenity/bank|TCF Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"}},"amenity/bank|TD Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"}},"amenity/bank|TD Canada Trust":{countryCodes:["ca"],tags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"}},"amenity/bank|TEB":{countryCodes:["tr"],tags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"}},"amenity/bank|TSB":{countryCodes:["gb"],tags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"}},"amenity/bank|Takarékszövetkezet":{countryCodes:["hu"],tags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"}},"amenity/bank|Tangerine":{countryCodes:["ca"],tags:{amenity:"bank",brand:"Tangerine","brand:wikidata":"Q15238797","brand:wikipedia":"en:Tangerine Bank",name:"Tangerine"}},"amenity/bank|Targobank":{countryCodes:["de","es"],tags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"}},"amenity/bank|Tatra banka":{countryCodes:["sk"],tags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"}},"amenity/bank|Türkiye İş Bankası":{tags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"}},"amenity/bank|U.S. Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"U.S. Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"U.S. Bank"}},"amenity/bank|UBA":{tags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"}},"amenity/bank|UBI Banca":{countryCodes:["it"],tags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"}},"amenity/bank|UBL":{countryCodes:["pk"],matchNames:["ubl bank"],tags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"}},"amenity/bank|UBS":{tags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"}},"amenity/bank|UCO Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"}},"amenity/bank|UCPB":{countryCodes:["ph"],tags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"}},"amenity/bank|UIB":{tags:{amenity:"bank",brand:"UIB","brand:wikidata":"Q18636687","brand:wikipedia":"en:United Industrial Bank",name:"UIB"}},"amenity/bank|UNI":{countryCodes:["ca"],matchNames:["caisse populaire","caisse populaire acadienne"],tags:{amenity:"bank",brand:"UNI","brand:wikidata":"Q2933348","brand:wikipedia":"fr:UNI Coopération financière",name:"UNI",official_name:"UNI Coopération financière"}},"amenity/bank|UOB":{tags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"}},"amenity/bank|USAA":{tags:{amenity:"bank",brand:"USAA","brand:wikidata":"Q7865722","brand:wikipedia":"en:USAA",name:"USAA",official_name:"United Services Automobile Association"}},"amenity/bank|Ulster Bank":{countryCodes:["gb","ie"],tags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"}},"amenity/bank|Umpqua Bank":{countryCodes:["us"],tags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"}},"amenity/bank|UniCredit Bank":{matchNames:["unicredit","unicredit banca"],tags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"}},"amenity/bank|Unicaja Banco":{countryCodes:["es"],tags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco",short_name:"Unicaja"}},"amenity/bank|Union Bank of India":{countryCodes:["in"],tags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"}},"amenity/bank|Union Bank~(USA)":{countryCodes:["us"],matchNames:["mufg union bank","union bank of california"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{alt_name:"UnionBank",amenity:"bank",brand:"Union Bank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"Union Bank"}},"amenity/bank|UnionBank~(Philippines)":{countryCodes:["ph"],matchNames:["union bank of the philippines"],nomatch:["amenity/bank|Banco Unión","amenity/money_transfer|Express Union"],tags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"}},"amenity/bank|United Bank~(Connecticut)":{countryCodes:["us"],tags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q64825157",name:"United Bank"}},"amenity/bank|United Bank~(WestVirginia)":{countryCodes:["us"],tags:{amenity:"bank",brand:"United Bank","brand:wikidata":"Q16920636","brand:wikipedia":"en:United Bank (West Virginia)",name:"United Bank"}},"amenity/bank|Vakıfbank":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"}},"amenity/bank|Vancity":{countryCodes:["ca"],matchNames:["vancouver city savings"],tags:{amenity:"bank",brand:"Vancity","brand:wikidata":"Q7914085","brand:wikipedia":"en:Vancity",name:"Vancity",official_name:"Vancouver City Savings Credit Union"}},"amenity/bank|Veneto Banca":{countryCodes:["it"],tags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"}},"amenity/bank|Venezuela":{tags:{amenity:"bank",brand:"Venezuela",name:"Venezuela"}},"amenity/bank|Vijaya Bank":{countryCodes:["in"],tags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"}},"amenity/bank|Volksbank Köln Bonn eG":{countryCodes:["de"],tags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank Köln Bonn eG"}},"amenity/bank|VÚB":{countryCodes:["sk"],tags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"}},"amenity/bank|Washington Federal":{countryCodes:["us"],tags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"}},"amenity/bank|Wells Fargo":{countryCodes:["us"],matchNames:["wells fargo bank"],tags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"}},"amenity/bank|WesBanco":{countryCodes:["us"],tags:{amenity:"bank",brand:"WesBanco","brand:wikidata":"Q7983629","brand:wikipedia":"en:WesBanco",name:"WesBanco"}},"amenity/bank|Western Union":{nomatch:["amenity/money_transfer|Western Union"],tags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/bank|Westpac":{tags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"}},"amenity/bank|Yapı Kredi":{countryCodes:["tr"],tags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"}},"amenity/bank|Yorkshire Bank":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"}},"amenity/bank|Yorkshire Building Society":{countryCodes:["gb"],tags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"}},"amenity/bank|Zagrebačka banka":{countryCodes:["hr"],tags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"}},"amenity/bank|Zenith Bank":{tags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"}},"amenity/bank|Zions Bank":{tags:{amenity:"bank",brand:"Zions Bank",name:"Zions Bank"}},"amenity/bank|Ziraat Bankası":{tags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"}},"amenity/bank|mBank":{tags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"}},"amenity/bank|st.george":{countryCodes:["au"],matchNames:["st.george bank"],tags:{amenity:"bank",brand:"st.george","brand:wikidata":"Q1606050","brand:wikipedia":"en:St.George Bank",name:"st.george"}},"amenity/bank|Ålandsbanken":{countryCodes:["fi"],tags:{amenity:"bank",brand:"Ålandsbanken","brand:wikidata":"Q4349236","brand:wikipedia":"sv:Ålandsbanken",name:"Ålandsbanken"}},"amenity/bank|ČSOB":{countryCodes:["cz","sk"],tags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"}},"amenity/bank|Česká spořitelna":{countryCodes:["cz"],tags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"}},"amenity/bank|İş Bankası":{countryCodes:["tr"],tags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"}},"amenity/bank|Εθνική Τράπεζα":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:el":"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:el":"Εθνική Τράπεζα","name:en":"National Bank of Greece"}},"amenity/bank|Πειραιώς":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Πειραιώς",name:"Πειραιώς"}},"amenity/bank|Τράπεζα Πειραιώς":{countryCodes:["gr"],tags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:el":"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:el":"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"}},"amenity/bank|А-Банк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"А-Банк","brand:wikidata":"Q28705400","brand:wikipedia":"uk:А-Банк",name:"А-Банк"}},"amenity/bank|Авангард":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"}},"amenity/bank|Альфа-Банк":{countryCodes:["by","kz","ru","ua"],tags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:ru":"Альфа-Банк","brand:wikidata":"Q1377835","brand:wikipedia":"ru:Альфа-банк",name:"Альфа-Банк","name:en":"Alfa-Bank","name:ru":"Альфа-Банк"}},"amenity/bank|БПС-Сбербанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"БПС-Сбербанк","brand:wikidata":"Q2074915","brand:wikipedia":"be:БПС-Сбербанк",name:"БПС-Сбербанк"}},"amenity/bank|Банк Дабрабыт":{countryCodes:["by"],tags:{amenity:"bank",brand:"Банк Дабрабыт","brand:wikidata":"Q63981850",name:"Банк Дабрабыт"}},"amenity/bank|Банка ДСК":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Банка ДСК","brand:bg":"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:bg":"Банка ДСК","name:en":"DSK Bank"}},"amenity/bank|Белагропромбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"}},"amenity/bank|Беларусбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"}},"amenity/bank|Белинвестбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"}},"amenity/bank|Бинбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"}},"amenity/bank|ВТБ":{countryCodes:["ru","ua"],matchNames:["втб банк москвы"],tags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"}},"amenity/bank|Возрождение":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"ru:Возрождение (банк)",name:"Возрождение"}},"amenity/bank|Газпромбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"}},"amenity/bank|Генбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Генбанк","brand:wikidata":"Q62122630",name:"Генбанк"}},"amenity/bank|Казкоммерцбанк":{countryCodes:["kz"],tags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"}},"amenity/bank|Московский индустриальный банк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"}},"amenity/bank|Мособлбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"}},"amenity/bank|Народный банк":{countryCodes:["kg","kz","uz"],tags:{amenity:"bank",brand:"Народный банк","brand:wikidata":"Q1046186","brand:wikipedia":"kk:Қазақстан Халық банкі",name:"Народный банк"}},"amenity/bank|ОТП Банк":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"}},"amenity/bank|Обединена Българска Банка":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"}},"amenity/bank|Открытие":{countryCodes:["ru"],matchNames:["банк открытие"],tags:{amenity:"bank",brand:"Открытие","brand:wikidata":"Q4327204","brand:wikipedia":"ru:Банк «Финансовая корпорация Открытие»",name:"Открытие"}},"amenity/bank|Ощадбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"}},"amenity/bank|ПУМБ":{countryCodes:["ua"],tags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"}},"amenity/bank|Почта Банк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"}},"amenity/bank|Пощенска банка":{countryCodes:["bg"],tags:{amenity:"bank",brand:"Пощенска банка","brand:wikidata":"Q7234083","brand:wikipedia":"bg:Пощенска банка",name:"Пощенска банка","name:en":"Postbank"}},"amenity/bank|ПриватБанк":{tags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"}},"amenity/bank|Приднестровский Сбербанк":{countryCodes:["md"],matchNames:["приднестровский cбербанк"],tags:{amenity:"bank",brand:"Приднестровский Сбербанк","brand:en":"Pridnestrovian Savings Bank","brand:ru":"Приднестровский Сбербанк","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Приднестровский Сбербанк","name:en":"Pridnestrovian Savings Bank","name:ru":"Приднестровский Сбербанк"}},"amenity/bank|Приорбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"}},"amenity/bank|Промсвязьбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"}},"amenity/bank|РНКБ":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"}},"amenity/bank|Райффайзен":{countryCodes:["ru","ua"],tags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"}},"amenity/bank|Райффайзен Банк Аваль":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"}},"amenity/bank|Росбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"}},"amenity/bank|Россельхозбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Russian Agricultural Bank",name:"Россельхозбанк","name:en":"Rosselkhozbank"}},"amenity/bank|Русский Стандарт":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"}},"amenity/bank|Сбербанк":{countryCodes:["kz","ru"],matchNames:["cбербанк","cбербанк россии","сбербанк россии"],tags:{amenity:"bank",brand:"Сбербанк","brand:en":"Sberbank","brand:ru":"Сбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Сбербанк","name:en":"Sberbank","name:ru":"Сбербанк"}},"amenity/bank|Совкомбанк":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"}},"amenity/bank|УкрСиббанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"}},"amenity/bank|Укргазбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"}},"amenity/bank|Укрсоцбанк":{countryCodes:["ua"],tags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"}},"amenity/bank|Уралсиб":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"}},"amenity/bank|Хаан банк":{countryCodes:["mn"],tags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"}},"amenity/bank|Хоум Кредит":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"}},"amenity/bank|בנק אגוד":{countryCodes:["il"],tags:{"alt_name:en":"Bank Igud",amenity:"bank",brand:"בנק אגוד","brand:en":"Union Bank of Israel","brand:he":"בנק אגוד","brand:wikidata":"Q2903265","brand:wikipedia":"en:Union Bank of Israel",name:"בנק אגוד","name:en":"Union Bank of Israel","name:he":"בנק אגוד"}},"amenity/bank|בנק אוצר החייל":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק אוצר החייל","brand:en":"Bank Otsar Ha-Hayal","brand:he":"בנק אוצר החייל","brand:wikidata":"Q2900674","brand:wikipedia":"en:Bank Otsar Ha-Hayal",name:"בנק אוצר החייל","name:en":"Bank Otsar Ha-Hayal","name:he":"בנק אוצר החייל"}},"amenity/bank|בנק דיסקונט":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק דיסקונט לישראל","brand:en":"Israel Discount Bank","brand:he":"בנק דיסקונט לישראל","brand:wikidata":"Q250362","brand:wikipedia":"en:Israel Discount Bank",name:"בנק דיסקונט","name:en":"Bank Discount","name:he":"בנק דיסקונט"}},"amenity/bank|בנק הפועלים":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:he":"בנק הפועלים","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim","name:he":"בנק הפועלים"}},"amenity/bank|בנק יהד":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק יהד","brand:en":"Bank Yahav","brand:he":"בנק יהד","brand:wikidata":"Q7187611","brand:wikipedia":"he:בנק יהב",name:"בנק יהד","name:en":"Bank Yahav","name:he":"בנק יהד"}},"amenity/bank|בנק ירושלים":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק ירושלים","brand:en":"Bank of Jerusalem","brand:he":"בנק ירושלים","brand:wikidata":"Q2900227","brand:wikipedia":"en:Bank of Jerusalem",name:"בנק ירושלים","name:en":"Bank of Jerusalem","name:he":"בנק ירושלים"}},"amenity/bank|בנק לאומי":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:he":"בנק לאומי","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi","name:he":"בנק לאומי"}},"amenity/bank|בנק מסד":{countryCodes:["il"],tags:{amenity:"bank",brand:"בנק מסד","brand:en":"Bank Massad","brand:he":"בנק מסד","brand:wikidata":"Q7187667","brand:wikipedia":"en:Bank Massad",name:"בנק מסד","name:en":"Bank Massad","name:he":"בנק מסד"}},"amenity/bank|הבנק הבינלאומי":{countryCodes:["il"],tags:{amenity:"bank",brand:"הבנק הבינלאומי","brand:en":"First International Bank of Israel","brand:he":"הבנק הבינלאומי","brand:wikidata":"Q2777497","brand:wikipedia":"en:First International Bank of Israel",name:"הבנק הבינלאומי","name:en":"First International Bank of Israel","name:he":"הבנק הבינלאומי"}},"amenity/bank|מזרחי טפחות":{countryCodes:["il"],tags:{amenity:"bank",brand:"מזרחי טפחות","brand:en":"Mizrahi-Tefahot","brand:he":"מזרחי טפחות","brand:wikidata":"Q2777129","brand:wikipedia":"en:Bank Mizrahi-Tefahot",name:"בנק מזרחי טפחות","name:en":"Bank Mizrahi-Tefahot","name:he":"בנק מזרחי טפחות"}},"amenity/bank|بانک آینده":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"}},"amenity/bank|بانک اقتصاد نوین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"}},"amenity/bank|بانک انصار":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک انصار","brand:wikidata":"Q5862675","brand:wikipedia":"fa:بانک انصار",name:"بانک انصار"}},"amenity/bank|بانک ایران زمین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"}},"amenity/bank|بانک تجارت":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک تجارت","brand:wikidata":"Q7695198","brand:wikipedia":"en:Tejarat Bank",name:"بانک تجارت"}},"amenity/bank|بانک توسعه تعاون":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک توسعه تعاون","brand:wikidata":"Q5684450","brand:wikipedia":"fa:بانک توسعه تعاون",name:"بانک توسعه تعاون"}},"amenity/bank|بانک رفاه":{countryCodes:["ir"],matchNames:["بانک رفاه کارگران"],tags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"}},"amenity/bank|بانک سامان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"}},"amenity/bank|بانک سرمایه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"}},"amenity/bank|بانک سپه":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"}},"amenity/bank|بانک سینا":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"}},"amenity/bank|بانک شهر":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"}},"amenity/bank|بانک صادرات":{countryCodes:["ir"],matchNames:["بانک صادرات ایران","صادرات"],tags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"}},"amenity/bank|بانک قوامین":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"}},"amenity/bank|بانک مسکن":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"}},"amenity/bank|بانک ملت":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"}},"amenity/bank|بانک ملی":{countryCodes:["ir"],matchNames:["بانک ملی ایران","ملی"],tags:{amenity:"bank",brand:"بانک ملی","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی","name:en":"Bank Melli Iran"}},"amenity/bank|بانک مهر اقتصاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک مهر اقتصاد","brand:wikidata":"Q5942921","brand:wikipedia":"fa:بانک مهر اقتصاد",name:"بانک مهر اقتصاد","name:en":"Mehr Eqtesad Bank"}},"amenity/bank|بانک پارسیان":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"}},"amenity/bank|بانک پاسارگاد":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"}},"amenity/bank|بانک کشاورزی":{countryCodes:["ir"],tags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"}},"amenity/bank|پست بانک":{countryCodes:["ir"],tags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"}},"amenity/bank|অগ্রণী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"অগ্রণী ব্যাংক লিমিটেড","name:en":"Agrani Bank"}},"amenity/bank|গ্রামীণ ব্যাংক":{countryCodes:["bd"],tags:{amenity:"bank",brand:"গ্রামীণ ব্যাংক","brand:wikidata":"Q188567","brand:wikipedia":"en:Grameen Bank",name:"গ্রামীণ ব্যাংক","name:en":"Grameen Bank"}},"amenity/bank|জনতা ব্যাংক লিমিটেড":{tags:{amenity:"bank",brand:"জনতা ব্যাংক লিমিটেড",name:"জনতা ব্যাংক লিমিটেড"}},"amenity/bank|বাংলাদেশ কৃষি ব্যাংক":{countryCodes:["bd"],tags:{amenity:"bank",brand:"বাংলাদেশ কৃষি ব্যাংক","brand:wikidata":"Q16345932","brand:wikipedia":"en:Bangladesh Krishi Bank",name:"বাংলাদেশ কৃষি ব্যাংক","name:en":"Bangladesh Krishi Bank"}},"amenity/bank|সোনালী ব্যাংক লিমিটেড":{countryCodes:["bd"],tags:{amenity:"bank",brand:"সোনালী ব্যাংক লিমিটেড",name:"সোনালী ব্যাংক লিমিটেড"}},"amenity/bank|ธนาคารกรุงเทพ":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:th":"ธนาคารกรุงเทพ","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank","name:th":"ธนาคารกรุงเทพ"}},"amenity/bank|ธนาคารกรุงไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:th":"ธนาคารกรุงไทย","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank","name:th":"ธนาคารกรุงไทย"}},"amenity/bank|ธนาคารกสิกรไทย":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:th":"ธนาคารกสิกรไทย","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank","name:th":"ธนาคารกสิกรไทย"}},"amenity/bank|ธนาคารออมสิน":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:th":"ธนาคารออมสิน","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank","name:th":"ธนาคารออมสิน"}},"amenity/bank|ธนาคารไทยพาณิชย์":{countryCodes:["th"],tags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:th":"ธนาคารไทยพาณิชย์","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank","name:th":"ธนาคารไทยพาณิชย์"}},"amenity/bank|みずほ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:ja":"みずほ銀行","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank","name:ja":"みずほ銀行"}},"amenity/bank|ゆうちょ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"ゆうちょ銀行","brand:en":"Japan Post Bank","brand:ja":"ゆうちょ銀行","brand:wikidata":"Q907103","brand:wikipedia":"ja:ゆうちょ銀行",name:"ゆうちょ銀行","name:en":"Japan Post Bank","name:ja":"ゆうちょ銀行"}},"amenity/bank|りそな銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"りそな銀行","brand:en":"Resona Bank","brand:ja":"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行","name:en":"Resona Bank","name:ja":"りそな銀行"}},"amenity/bank|三井住友銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"}},"amenity/bank|三菱東京UFJ銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"}},"amenity/bank|上海商業儲蓄銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"}},"amenity/bank|上海浦东发展银行":{tags:{amenity:"bank",brand:"上海浦东发展银行",name:"上海浦东发展银行"}},"amenity/bank|东亚银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"东亚银行","brand:wikidata":"Q806679","brand:wikipedia":"en:Bank of East Asia",name:"东亚银行","name:en":"Bank of East Asia"}},"amenity/bank|中信银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"}},"amenity/bank|中国光大银行":{tags:{amenity:"bank",brand:"中国光大银行",name:"中国光大银行"}},"amenity/bank|中国农业银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"}},"amenity/bank|中国工商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|中国建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"}},"amenity/bank|中国民生银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国民生银行","brand:en":"China Minsheng Bank","brand:wikidata":"Q911543","brand:wikipedia":"en:China Minsheng Bank",name:"中国民生银行","name:en":"China Minsheng Bank"}},"amenity/bank|中国邮政储蓄银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"}},"amenity/bank|中国银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"}},"amenity/bank|中國信託商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"}},"amenity/bank|交通银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"}},"amenity/bank|京城商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"}},"amenity/bank|京都中央信用金庫":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"ja:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"}},"amenity/bank|京都銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"}},"amenity/bank|元大商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"}},"amenity/bank|兆豐國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"}},"amenity/bank|兴业银行":{tags:{amenity:"bank",brand:"兴业银行",name:"兴业银行"}},"amenity/bank|农业银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"}},"amenity/bank|北京银行":{tags:{amenity:"bank",brand:"北京银行",name:"北京银行"}},"amenity/bank|北洋銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"}},"amenity/bank|北海道銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"}},"amenity/bank|台中商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"}},"amenity/bank|台北富邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"}},"amenity/bank|台新國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"}},"amenity/bank|合作金庫商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"}},"amenity/bank|國泰世華商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"}},"amenity/bank|大眾商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"}},"amenity/bank|安泰商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"}},"amenity/bank|工商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"}},"amenity/bank|常陽銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"常陽銀行","brand:wikidata":"Q6297774","brand:wikipedia":"en:Joyo Bank",name:"常陽銀行"}},"amenity/bank|建设银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"}},"amenity/bank|彰化商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"}},"amenity/bank|招商银行":{countryCodes:["cn"],tags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"}},"amenity/bank|日本銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"日本銀行","brand:en":"Bank of Japan","brand:wikidata":"Q333101","brand:wikipedia":"ja:日本銀行",name:"日本銀行","name:en":"Bank of Japan"}},"amenity/bank|東亞銀行":{countryCodes:["hk"],tags:{amenity:"bank",brand:"東亞銀行","brand:en":"Bank of East Asia","brand:wikidata":"Q806679","brand:wikipedia":"zh:東亞銀行","brand:zh-Hans":"东亚银行","brand:zh-Hant":"東亞銀行",name:"東亞銀行 BEA","name:en":"Bank of East Asia","name:zh-Hans":"东亚银行","name:zh-Hant":"東亞銀行"}},"amenity/bank|板信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"}},"amenity/bank|横浜銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"}},"amenity/bank|永豐商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"}},"amenity/bank|渣打國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"渣打國際商業銀行","brand:wikidata":"Q62267023",name:"渣打國際商業銀行"}},"amenity/bank|玉山商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"}},"amenity/bank|第一商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"}},"amenity/bank|聯邦商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"}},"amenity/bank|臺灣中小企業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"}},"amenity/bank|臺灣土地銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"}},"amenity/bank|臺灣新光商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"}},"amenity/bank|臺灣銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"}},"amenity/bank|華南商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"}},"amenity/bank|遠東國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"}},"amenity/bank|陽信商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"}},"amenity/bank|静岡銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"}},"amenity/bank|국민은행":{countryCodes:["kr"],matchNames:["국민은행 (gungmin bank)"],tags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:ko":"국민은행","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Financial Group Inc",name:"국민은행","name:en":"KB Kookmin Bank","name:ko":"국민은행"}},"amenity/bank|기업은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:ko":"기업은행","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea","name:ko":"기업은행"}},"amenity/bank|농협":{countryCodes:["kr"],matchNames:["nh농협은행"],tags:{amenity:"bank",brand:"농협","brand:en":"NH","brand:ko":"농협","brand:wikidata":"Q15283673","brand:wikipedia":"ko:NH농협은행",name:"농협","name:en":"NH","name:ko":"농협"}},"amenity/bank|새마을금고":{countryCodes:["kr"],tags:{amenity:"bank",brand:"새마을금고","brand:ko":"새마을금고","brand:wikidata":"Q12600614","brand:wikipedia":"ko:새마을금고",name:"새마을금고","name:ko":"새마을금고"}},"amenity/bank|신한은행":{countryCodes:["kr"],matchNames:["신한은행 (sinhan bank)"],tags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:ko":"신한은행","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank","name:ko":"신한은행"}},"amenity/bank|우리은행":{countryCodes:["kr"],matchNames:["우리은행 (uri bank)"],tags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:ko":"우리은행","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank","name:ko":"우리은행"}},"amenity/bank|하나은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:ko":"하나은행","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank","name:ko":"하나은행"}},"amenity/bar|All Bar One":{countryCodes:["gb"],tags:{amenity:"bar",brand:"All Bar One","brand:wikidata":"Q4728624","brand:wikipedia":"en:All Bar One",name:"All Bar One"}},"amenity/bar|Revolución de Cuba":{countryCodes:["gb"],tags:{amenity:"bar",brand:"Revolución de Cuba","brand:wikidata":"Q64024691",name:"Revolución de Cuba"}},"amenity/bar|Revolution":{countryCodes:["gb"],tags:{amenity:"bar",brand:"Revolution","brand:wikidata":"Q64024398",name:"Revolution"}},"amenity/bicycle_rental|Call a Bike":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"}},"amenity/bicycle_rental|Grid":{countryCodes:["us"],tags:{amenity:"bicycle_rental",brand:"Grid","brand:wikidata":"Q62104168",name:"Grid"}},"amenity/bicycle_rental|MiBici":{countryCodes:["mx"],tags:{amenity:"bicycle_rental",brand:"MiBici","brand:wikidata":"Q60966987","brand:wikipedia":"es:MiBici",name:"MiBici"}},"amenity/bicycle_rental|Swapfiets":{countryCodes:["be","de","dk","nl"],tags:{amenity:"bicycle_rental",brand:"Swapfiets","brand:wikidata":"Q62104374",name:"Swapfiets"}},"amenity/bicycle_rental|metropolradruhr":{countryCodes:["de"],tags:{amenity:"bicycle_rental",brand:"metropolradruhr","brand:wikidata":"Q62104274",name:"metropolradruhr"}},"amenity/bicycle_rental|nextbike":{countryCodes:["at","de"],tags:{amenity:"bicycle_rental",brand:"nextbike","brand:wikidata":"Q2351279","brand:wikipedia":"de:Nextbike",name:"nextbike"}},"amenity/bureau_de_change|CADECA":{countryCodes:["cu"],tags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"}},"amenity/bureau_de_change|Travelex":{tags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"}},"amenity/cafe|85°C":{countryCodes:["au","us"],matchNames:["85 cafe","85 degrees","85 degrees c","85 degrees celsius","85c bakery cafe","85c daily cafe","85oc"],tags:{alt_name:"85C",amenity:"cafe",brand:"85°C","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop;chinese",name:"85°C",takeaway:"yes"}},"amenity/cafe|85度C":{countryCodes:["cn","tw"],tags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",cuisine:"coffee_shop",name:"85度C","name:en":"85C Bakery Cafe",takeaway:"yes"}},"amenity/cafe|Aroma Espresso Bar":{countryCodes:["ca","kz","ro","ua","us"],tags:{amenity:"cafe",brand:"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"Aroma Espresso Bar",takeaway:"yes"}},"amenity/cafe|Barista":{countryCodes:["in","lk","mv","np"],tags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",cuisine:"coffee_shop",name:"Barista",takeaway:"yes"}},"amenity/cafe|Beck's Coffe Shop":{countryCodes:["jp"],tags:{alt_name:"ベックス・コーヒーショップ",amenity:"cafe",brand:"Beck's Coffe Shop","brand:wikidata":"Q11191008","brand:wikipedia":"ja:Beck's Coffe Shop",cuisine:"coffee_shop",name:"Beck's Coffe Shop",takeaway:"yes"}},"amenity/cafe|Biggby Coffee":{countryCodes:["us"],tags:{amenity:"cafe",brand:"Biggby Coffee","brand:wikidata":"Q4906876","brand:wikipedia":"en:Biggby Coffee",cuisine:"coffee_shop",name:"Biggby Coffee",takeaway:"yes"}},"amenity/cafe|Black Rock Coffee":{countryCodes:["us"],tags:{amenity:"cafe",brand:"Black Rock Coffee","brand:wikidata":"Q64225934",cuisine:"coffee_shop",name:"Black Rock Coffee",takeaway:"yes"}},"amenity/cafe|Bonafide":{countryCodes:["ar","cl"],tags:{amenity:"cafe",brand:"Bonafide","brand:wikidata":"Q62122746",cuisine:"coffee_shop",name:"Bonafide",takeaway:"yes"}},"amenity/cafe|Bridgehead":{countryCodes:["ca"],tags:{amenity:"cafe",brand:"Bridgehead","brand:wikidata":"Q4966509","brand:wikipedia":"en:Bridgehead Coffee",cuisine:"coffee_shop",name:"Timothy's",takeaway:"yes"}},"amenity/cafe|Cafe Coffee Day":{tags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",cuisine:"coffee_shop",name:"Cafe Coffee Day",takeaway:"yes"}},"amenity/cafe|Caffè Nero":{countryCodes:["gb","ie","tr","us"],matchNames:["cafe nero"],tags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",cuisine:"coffee_shop",name:"Caffè Nero",takeaway:"yes"}},"amenity/cafe|Café Amazon":{tags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"Café Amazon",takeaway:"yes"}},"amenity/cafe|Café Dépôt":{countryCodes:["ca"],tags:{amenity:"cafe",brand:"Café Dépôt","brand:wikidata":"Q64924449",cuisine:"coffee_shop;cake;bagel;bistro",name:"Café Dépôt",takeaway:"yes"}},"amenity/cafe|Café Martínez":{countryCodes:["ar"],tags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",cuisine:"coffee_shop",name:"Café Martínez",takeaway:"yes"}},"amenity/cafe|Café de Paris":{tags:{amenity:"cafe",brand:"Café de Paris",cuisine:"coffee_shop",name:"Café de Paris",takeaway:"yes"}},"amenity/cafe|Cappuccino":{countryCodes:["at","be","de","es","se"],tags:{amenity:"cafe",brand:"Cappuccino",cuisine:"coffee_shop",name:"Cappuccino",takeaway:"yes"}},"amenity/cafe|Caribou Coffee":{tags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",cuisine:"coffee_shop",name:"Caribou Coffee",takeaway:"yes"}},"amenity/cafe|Chatime":{tags:{amenity:"cafe",brand:"Chatime","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"Chatime","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"}},"amenity/cafe|CoCo":{countryCodes:["au"],tags:{amenity:"cafe",brand:"CoCo","brand:wikidata":"Q64827025",cuisine:"bubble_tea",name:"Coco",takeaway:"yes"}},"amenity/cafe|Coffee Bean":{tags:{amenity:"cafe",brand:"Coffee Bean",cuisine:"coffee_shop",name:"Coffee Bean",takeaway:"yes"}},"amenity/cafe|Coffee Culture":{countryCodes:["ca","nz","us"],tags:{amenity:"cafe",brand:"Coffee Culture",cuisine:"coffee_shop",name:"Coffee Culture",takeaway:"yes"}},"amenity/cafe|Coffee Fellows":{countryCodes:["de","lu","nl"],tags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",cuisine:"coffee_shop",name:"Coffee Fellows",takeaway:"yes"}},"amenity/cafe|Coffee House~(Finland)":{countryCodes:["fi"],nomatch:["amenity/cafe|The Coffee House~(Vietnam)"],tags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",cuisine:"coffee_shop",name:"Coffee House",takeaway:"yes"}},"amenity/cafe|Coffee Island":{countryCodes:["cy","gr"],tags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",cuisine:"coffee_shop",name:"Coffee Island",takeaway:"yes"}},"amenity/cafe|Coffee Like":{countryCodes:["kz","ru"],tags:{amenity:"cafe",brand:"Coffee Like",cuisine:"coffee_shop",name:"Coffee Like",takeaway:"yes"}},"amenity/cafe|Coffee Time":{tags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",cuisine:"coffee_shop",name:"Coffee Time",takeaway:"yes"}},"amenity/cafe|Cofix":{countryCodes:["il","ru"],tags:{amenity:"cafe",brand:"Cofix","brand:en":"Cofix","brand:he":"קפויקס","brand:wikidata":"Q16132717","brand:wikipedia":"he:קופיקס",cuisine:"coffee_shop",name:"Cofix","name:en":"Cofix","name:he":"קופיקס",takeaway:"yes"}},"amenity/cafe|Cofizz":{countryCodes:["il"],tags:{amenity:"cafe",brand:"Cofizz","brand:en":"Cofizz","brand:he":"קופיז","brand:wikidata":"Q64606270",cuisine:"coffee_shop",name:"Cofizz","name:en":"Cofizz","name:he":"קופיז",takeaway:"yes"}},"amenity/cafe|Costa":{matchNames:["costa coffee"],tags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",cuisine:"coffee_shop",name:"Costa",takeaway:"yes"}},"amenity/cafe|Country Style":{countryCodes:["ca"],tags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",cuisine:"coffee_shop",name:"Country Style",takeaway:"yes"}},"amenity/cafe|Cộng Cà Phê":{countryCodes:["kr","vn"],matchNames:["cong"],tags:{amenity:"cafe",brand:"Cộng Cà Phê","brand:wikidata":"Q63864181",cuisine:"coffee_shop;vietnamese",name:"Cộng Cà Phê","name:vi":"Cộng Cà Phê",takeaway:"yes"}},"amenity/cafe|Dolce Vita":{tags:{amenity:"cafe",brand:"Dolce Vita",cuisine:"coffee_shop",name:"Dolce Vita",takeaway:"yes"}},"amenity/cafe|Dutch Bros. Coffee":{countryCodes:["us"],matchNames:["dutch bros","dutch brothers"],tags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee",takeaway:"only"}},"amenity/cafe|Espresso House":{countryCodes:["dk","fi","no","se"],tags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",cuisine:"coffee_shop",name:"Espresso House",takeaway:"yes"}},"amenity/cafe|Fran's Café":{countryCodes:["br"],tags:{amenity:"cafe",brand:"Fran's Café","brand:website":"http://www.franscafe.com.br","brand:wikidata":"Q62075645",cuisine:"coffee_shop",name:"Fran's Café",takeaway:"yes"}},"amenity/cafe|Gong Cha~(Vietnam)":{countryCodes:["vn"],tags:{"alt_name:vi":"Cống Trà",amenity:"cafe",brand:"Gong Cha","brand:vi":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"vi:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",name:"Gong Cha","name:vi":"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|Gong Cha~(worldwide)":{countryCodes:["au","bn","ca","mm","mo","my","nz","ph","sg","us"],tags:{amenity:"cafe",brand:"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"en:Gong Cha","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|Havanna":{countryCodes:["ar","pe"],tags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",cuisine:"coffee_shop",name:"Havanna",takeaway:"yes"}},"amenity/cafe|Highlands Coffee":{countryCodes:["vn"],matchNames:["highlands"],tags:{amenity:"cafe",brand:"Highlands Coffee","brand:wikidata":"Q5759361","brand:wikipedia":"vi:Highlands Coffee",cuisine:"coffee_shop;vietnamese",name:"Highlands Coffee","name:en":"Highlands Coffee",takeaway:"yes"}},"amenity/cafe|Insomnia":{countryCodes:["ie"],tags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",cuisine:"coffee_shop",name:"Insomnia",takeaway:"yes"}},"amenity/cafe|Joe & The Juice":{tags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",cuisine:"coffee_shop",name:"Joe & The Juice",takeaway:"yes"}},"amenity/cafe|La Colombe Coffee Roasters":{countryCodes:["us"],tags:{amenity:"cafe",brand:"La Colombe Coffee Roasters","brand:wikidata":"Q23461663","brand:wikipedia":"en:La Colombe Coffee Roasters",cuisine:"coffee_shop",name:"La Colombe Coffee Roasters",short_name:"La Colombe",takeaway:"yes"}},"amenity/cafe|Le Pain Quotidien":{tags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",cuisine:"coffee_shop",name:"Le Pain Quotidien",takeaway:"yes"}},"amenity/cafe|Mado":{countryCodes:["tr"],tags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",cuisine:"coffee_shop",name:"Mado",takeaway:"yes"}},"amenity/cafe|McCafé":{tags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé",takeaway:"yes"}},"amenity/cafe|Mikel":{countryCodes:["gr"],tags:{amenity:"cafe",brand:"Mikel",cuisine:"coffee_shop",name:"Mikel",takeaway:"yes"}},"amenity/cafe|Patisserie Valerie":{countryCodes:["gb"],tags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"coffee_shop",name:"Patisserie Valerie",takeaway:"yes"}},"amenity/cafe|Peet's Coffee":{countryCodes:["us"],matchNames:["peets","peets coffee & tea"],tags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",cuisine:"coffee_shop",name:"Peet's Coffee",takeaway:"yes"}},"amenity/cafe|Prime":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Prime","brand:wikidata":"Q62122839",cuisine:"coffee_shop",name:"Prime",takeaway:"yes"}},"amenity/cafe|Pronto":{countryCodes:["jp"],matchNames:["プロント"],nomatch:["shop/convenience|Coop Pronto"],tags:{amenity:"cafe",brand:"Pronto","brand:wikidata":"Q11336224","brand:wikipedia":"ja:プロントコーポレーション",cuisine:"coffee_shop",name:"Pronto","name:ja":"プロント",takeaway:"yes"}},"amenity/cafe|Pumpkin":{countryCodes:["gb"],matchNames:["pumpkin cafe","pumpkin cafe shop"],tags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",cuisine:"coffee_shop",name:"Pumpkin",takeaway:"yes"}},"amenity/cafe|Quickly":{tags:{amenity:"cafe",brand:"Quickly","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"en:Quickly","brand:zh":"快可立",cuisine:"bubble_tea",name:"Quickly","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"}},"amenity/cafe|Second Cup":{tags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",cuisine:"coffee_shop",name:"Second Cup",takeaway:"yes"}},"amenity/cafe|Segafredo":{tags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",cuisine:"coffee_shop",name:"Segafredo",takeaway:"yes"}},"amenity/cafe|Sharetea":{countryCodes:["au","us"],tags:{amenity:"cafe",brand:"Sharetea","brand:wikidata":"Q64827032",cuisine:"bubble_tea",name:"Sharetea","name:en":"Sharetea","name:zh":"歇腳亭",takeaway:"yes"}},"amenity/cafe|Starbucks":{tags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",official_name:"Starbucks Coffee",takeaway:"yes"}},"amenity/cafe|The Coffee Bean & Tea Leaf":{tags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",cuisine:"coffee_shop",name:"The Coffee Bean & Tea Leaf",takeaway:"yes"}},"amenity/cafe|The Coffee Club":{tags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",cuisine:"coffee_shop",name:"The Coffee Club",takeaway:"yes"}},"amenity/cafe|The Coffee House~(Vietnam)":{countryCodes:["vn"],matchNames:["coffee house"],nomatch:["amenity/cafe|Coffee House~(Finland)"],tags:{amenity:"cafe",brand:"The Coffee House","brand:wikidata":"Q60775742","brand:wikipedia":"en:The Coffee House (coffeehouse chain)",cuisine:"coffee_shop;vietnamese",name:"The Coffee House","name:en":"The Coffee House",takeaway:"yes"}},"amenity/cafe|The Human Bean":{countryCodes:["us"],matchNames:["human bean"],tags:{amenity:"cafe",brand:"The Human Bean","brand:wikidata":"Q7740821","brand:wikipedia":"en:The Human Bean",cuisine:"coffee_shop",name:"The Human Bean",takeaway:"yes"}},"amenity/cafe|Tim Hortons":{tags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",cuisine:"coffee_shop",name:"Tim Hortons",takeaway:"yes"}},"amenity/cafe|Timothy's":{countryCodes:["ca"],tags:{amenity:"cafe",brand:"Timothy's","brand:wikidata":"Q7807011","brand:wikipedia":"en:Timothy's World Coffee",cuisine:"coffee_shop",name:"Timothy's",takeaway:"yes"}},"amenity/cafe|Traveler's Coffee":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",cuisine:"coffee_shop",name:"Traveler's Coffee",takeaway:"yes"}},"amenity/cafe|Trung Nguyên Coffee":{countryCodes:["vn"],matchNames:["trung nguyen"],tags:{amenity:"cafe",brand:"Trung Nguyên","brand:wikidata":"Q3541154","brand:wikipedia":"vi:Trung Nguyên (công ty)",cuisine:"coffee_shop;vietnamese",name:"Trung Nguyên Coffee","name:en":"Trung Nguyen Coffee","name:vi":"Cà phê Trung Nguyên",takeaway:"yes"}},"amenity/cafe|Wayne's Coffee":{countryCodes:["fi","no","se"],tags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",cuisine:"coffee_shop",name:"Wayne's Coffee",takeaway:"yes"}},"amenity/cafe|Wild Bean Cafe":{tags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",cuisine:"coffee_shop",name:"Wild Bean Cafe",takeaway:"yes"}},"amenity/cafe|Берёзка":{tags:{amenity:"cafe",brand:"Берёзка",cuisine:"coffee_shop",name:"Берёзка",takeaway:"yes"}},"amenity/cafe|Виктория":{tags:{amenity:"cafe",brand:"Виктория",cuisine:"coffee_shop",name:"Виктория",takeaway:"yes"}},"amenity/cafe|Гурман":{tags:{amenity:"cafe",brand:"Гурман",cuisine:"coffee_shop",name:"Гурман",takeaway:"yes"}},"amenity/cafe|Даблби":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Даблби","brand:en":"Double B","brand:wikidata":"Q62501686",cuisine:"coffee_shop",name:"Даблби","name:en":"Double B",takeaway:"yes"}},"amenity/cafe|Лагуна":{countryCodes:["ru","ua"],tags:{amenity:"cafe",brand:"Лагуна",cuisine:"coffee_shop",name:"Лагуна",takeaway:"yes"}},"amenity/cafe|Лакомка":{tags:{amenity:"cafe",brand:"Лакомка",cuisine:"coffee_shop",name:"Лакомка",takeaway:"yes"}},"amenity/cafe|Оазис":{tags:{amenity:"cafe",brand:"Оазис","brand:en":"Oasis",cuisine:"coffee_shop",name:"Оазис","name:en":"Oasis",takeaway:"yes"}},"amenity/cafe|Сказка":{tags:{amenity:"cafe",brand:"Сказка",cuisine:"coffee_shop",name:"Сказка",takeaway:"yes"}},"amenity/cafe|Смак":{countryCodes:["kz","ru","ua","uz"],matchTags:["shop/convenience"],tags:{amenity:"cafe",brand:"Смак","brand:en":"Taste",cuisine:"coffee_shop",name:"Смак","name:en":"Taste",takeaway:"yes"}},"amenity/cafe|Старбакс":{countryCodes:["ru"],tags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Старбакс","name:en":"Starbucks",takeaway:"yes"}},"amenity/cafe|Транзит":{countryCodes:["kz","ru","ua"],tags:{amenity:"cafe",brand:"Транзит",cuisine:"coffee_shop",name:"Транзит",takeaway:"yes"}},"amenity/cafe|Фортуна":{tags:{amenity:"cafe",brand:"Фортуна",cuisine:"coffee_shop",name:"Фортуна",takeaway:"yes"}},"amenity/cafe|Хуторок":{tags:{amenity:"cafe",brand:"Хуторок",cuisine:"coffee_shop",name:"Хуторок",takeaway:"yes"}},"amenity/cafe|Шоколадница":{countryCodes:["ru"],matchNames:["шоколад"],tags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",cuisine:"coffee_shop",name:"Шоколадница","name:en":"Chocolate",takeaway:"yes"}},"amenity/cafe|Штолле":{countryCodes:["by","ru","ua"],tags:{amenity:"cafe",brand:"Штолле","brand:en":"Stolle","brand:wikidata":"Q62502236",cuisine:"coffee_shop",name:"Штолле","name:en":"Stolle",takeaway:"yes"}},"amenity/cafe|ארומה":{countryCodes:["il"],tags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:he":"ארומה","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",cuisine:"coffee_shop",name:"ארומה","name:en":"Aroma Espresso Bar","name:he":"ארומה",takeaway:"yes"}},"amenity/cafe|לנדוור":{countryCodes:["il"],matchNames:["קפה לדנוור"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה לנדוור","brand:en":"Landwer Coffee","brand:he":"קפה לנדוור","brand:wikidata":"Q6485288","brand:wikipedia":"he:קפה לנדוור",cuisine:"coffee_shop",name:"לנדוור","name:en":"Landwer","name:he":"לנדוור",takeaway:"yes"}},"amenity/cafe|סי קפה":{countryCodes:["il"],matchNames:["si cafe","si espresso"],tags:{alt_name:"סי אספרסו","alt_name:en":"Si Espresso","alt_name:he":"סי אספרסו",amenity:"cafe",brand:"סי קפה","brand:en":"Si Cafe","brand:he":"סי קפה","brand:wikidata":"Q64606227",cuisine:"coffee_shop",name:"סי קפה","name:en":"Si Cafe","name:he":"סי קפה",takeaway:"yes"}},"amenity/cafe|קפה ג'ו":{countryCodes:["il"],matchNames:["ג'ו קפה"],tags:{alt_name:"קפה Joe",amenity:"cafe",brand:"קפה ג'ו","brand:en":"Cafe Joe","brand:he":"קפה ג'ו","brand:wikidata":"Q6774425","brand:wikipedia":"he:קפה ג'ו",cuisine:"coffee_shop",name:"קפה ג'ו","name:en":"Cafe Joe","name:he":"קפה ג'ו",takeaway:"yes"}},"amenity/cafe|קפה גרג":{countryCodes:["il"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה גרג","brand:en":"Greg Cafe","brand:he":"קפה גרג","brand:wikidata":"Q43295499","brand:wikipedia":"he:קפה גרג",cuisine:"coffee_shop",name:"קפה גרג","name:en":"Greg Cafe","name:he":"קפה גרג",takeaway:"yes"}},"amenity/cafe|קפה נמרוד":{countryCodes:["il"],matchTags:["amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה נמרוד","brand:en":"Cafe Nimrod","brand:he":"קפה נמרוד","brand:wikidata":"Q64606192",cuisine:"coffee_shop",name:"קפה נמרוד","name:en":"Cafe Nimrod","name:he":"קפה נמרוד",takeaway:"yes"}},"amenity/cafe|קפה קפה":{countryCodes:["il"],matchTags:["amenity/fast_food","amenity/restaurant"],tags:{amenity:"cafe",brand:"קפה קפה","brand:en":"Cafe Cafe","brand:he":"קפה קפה","brand:wikidata":"Q5017233","brand:wikipedia":"he:קפה קפה",cuisine:"coffee_shop",name:"קפה קפה","name:en":"Cafe Cafe","name:he":"קפה קפה",takeaway:"yes"}},"amenity/cafe|רולדין":{countryCodes:["il"],matchTags:["amenity/restaurant","shop/bakery","shop/pastry"],tags:{amenity:"cafe",brand:"רולדין","brand:en":"Roladin","brand:he":"רולדין","brand:wikidata":"Q18390972","brand:wikipedia":"he:רולדין",cuisine:"coffee_shop",name:"רולדין","name:en":"Roladin","name:he":"רולדין",takeaway:"yes"}},"amenity/cafe|คาเฟ่ อเมซอน":{countryCodes:["th"],tags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:th":"คาเฟ่ อเมซอน","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",cuisine:"coffee_shop",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon","name:th":"คาเฟ่ อเมซอน",takeaway:"yes"}},"amenity/cafe|エクセルシオール カフェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:ja":"エクセルシオール カフェ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ","name:ja":"エクセルシオール カフェ",takeaway:"yes"}},"amenity/cafe|カフェ・ド・クリエ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:ja":"カフェ・ド・クリエ","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",cuisine:"coffee_shop",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE","name:ja":"カフェ・ド・クリエ",takeaway:"yes"}},"amenity/cafe|カフェ・ベローチェ":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:ja":"カフェ・ベローチェ","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE","name:ja":"カフェ・ベローチェ",takeaway:"yes"}},"amenity/cafe|コメダ珈琲店":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:ja":"コメダ珈琲店","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop","name:ja":"コメダ珈琲店",takeaway:"yes"}},"amenity/cafe|サンマルクカフェ":{countryCodes:["jp"],tags:{"alt_name:en":"Saint Marc Café",amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:ja":"サンマルクカフェ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ","name:ja":"サンマルクカフェ",takeaway:"yes"}},"amenity/cafe|スターバックス":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:ja":"スターバックス","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks","name:ja":"スターバックス",takeaway:"yes"}},"amenity/cafe|スターバックスコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"スターバックスコーヒー","brand:ja":"スターバックスコーヒー",cuisine:"coffee_shop",name:"スターバックスコーヒー","name:ja":"スターバックスコーヒー",takeaway:"yes"}},"amenity/cafe|タリーズコーヒー":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:ja":"タリーズコーヒー","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",cuisine:"coffee_shop",name:"タリーズコーヒー","name:en":"Tully's Coffee","name:ja":"タリーズコーヒー",takeaway:"yes"}},"amenity/cafe|ドトールコーヒーショップ":{countryCodes:["jp"],matchNames:["ドトールコーヒー"],tags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:ja":"ドトールコーヒーショップ","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop","name:ja":"ドトールコーヒーショップ",takeaway:"yes"}},"amenity/cafe|快可立":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"快可立","brand:en":"Quickly","brand:wikidata":"Q3771463","brand:wikipedia":"zh:快可立","brand:zh":"快可立",cuisine:"bubble_tea",name:"快可立","name:en":"Quickly","name:zh":"快可立",takeaway:"yes"}},"amenity/cafe|日出茶太":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"日出茶太","brand:en":"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"zh:日出茶太","brand:zh":"日出茶太",cuisine:"bubble_tea",name:"日出茶太","name:en":"Chatime","name:zh":"日出茶太",takeaway:"yes"}},"amenity/cafe|星巴克":{countryCodes:["cn","tw"],tags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克","brand:zh":"星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks","name:zh":"星巴克",takeaway:"yes"}},"amenity/cafe|珈琲館":{countryCodes:["jp"],tags:{amenity:"cafe",brand:"珈琲館","brand:en":"Kohikan","brand:ja":"珈琲館","brand:wikidata":"Q11573290","brand:wikipedia":"ja:珈琲館",cuisine:"coffee_shop",name:"珈琲館","name:en":"Kohikan","name:ja":"珈琲館",takeaway:"yes"}},"amenity/cafe|貢茶 Gong Cha":{countryCodes:["hk"],tags:{amenity:"cafe",brand:"貢茶 Gong Cha","brand:en":"Gong Cha","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)","brand:zh":"貢茶",cuisine:"bubble_tea",name:"貢茶 Gong Cha","name:en":"Gong Cha","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|貢茶~(Japan)":{countryCodes:["ja"],tags:{amenity:"cafe",brand:"貢茶","brand:ja":"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"ja:貢茶","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:ja":"貢茶","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|貢茶~(Taiwan)":{countryCodes:["tw"],tags:{amenity:"cafe",brand:"貢茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:貢茶 (連鎖店)",cuisine:"bubble_tea",int_name:"Gong Cha",name:"貢茶","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|贡茶~(China)":{countryCodes:["cn"],tags:{amenity:"cafe",brand:"贡茶","brand:wikidata":"Q5581670","brand:wikipedia":"zh:贡茶 (连锁店)","brand:zh-Hans":"贡茶","brand:zh-Hant":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"贡茶","name:zh-Hans":"贡茶","name:zh-Hant":"貢茶",takeaway:"yes"}},"amenity/cafe|공차":{countryCodes:["kr"],tags:{amenity:"cafe",brand:"공차","brand:ko":"공차","brand:wikidata":"Q5581670","brand:wikipedia":"ko:공차","brand:zh":"貢茶",cuisine:"bubble_tea",int_name:"Gong Cha",name:"공차","name:ko":"공차","name:zh":"貢茶",takeaway:"yes"}},"amenity/cafe|스타벅스":{countryCodes:["kr"],tags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:ko":"스타벅스","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks","name:ko":"스타벅스",takeaway:"yes"}},"amenity/car_rental|Alamo":{tags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"}},"amenity/car_rental|Avis":{matchNames:["avis car rental"],tags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"}},"amenity/car_rental|Budget":{matchNames:["budget car rental"],tags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget",official_name:"Budget Rent a Car"}},"amenity/car_rental|Dollar":{countryCodes:["us"],nomatch:["amenity/bank|Dollar Bank","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar",official_name:"Dollar Rent A Car"}},"amenity/car_rental|Enterprise":{matchNames:["enterprise car rental"],tags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise",official_name:"Enterprise Rent-A-Car"}},"amenity/car_rental|Europcar":{tags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"}},"amenity/car_rental|Hertz":{matchNames:["hertz car rental"],tags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"}},"amenity/car_rental|Localiza":{tags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"}},"amenity/car_rental|National":{countryCodes:["ca","gb","us"],nomatch:["amenity/bank|National Bank"],tags:{amenity:"car_rental",brand:"National","brand:wikidata":"Q1424142","brand:wikipedia":"en:National Car Rental",name:"National",official_name:"National Car Rental"}},"amenity/car_rental|Sixt":{tags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"}},"amenity/car_rental|Thrifty":{matchNames:["thrifty car rental"],tags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"}},"amenity/car_rental|U-Haul":{countryCodes:["ca","us"],matchNames:["uhaul neighborhood dealer"],tags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"}},"amenity/car_rental|オリックスレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:ja":"オリックスレンタカー","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental","name:ja":"オリックスレンタカー"}},"amenity/car_rental|トヨタレンタカー":{countryCodes:["jp"],matchNames:["トヨタレンタリース"],tags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:ja":"トヨタレンタカー","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car","name:ja":"トヨタレンタカー"}},"amenity/car_rental|ニッポンレンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:ja":"ニッポンレンタカー","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental","name:ja":"ニッポンレンタカー"}},"amenity/car_rental|日産レンタカー":{countryCodes:["jp"],tags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:ja":"日産レンタカー","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental","name:ja":"日産レンタカー"}},"amenity/car_sharing|Bluely":{countryCodes:["fr"],matchNames:["station bluely"],tags:{amenity:"car_sharing",brand:"Bluely","brand:wikidata":"Q16039715","brand:wikipedia":"fr:Bluely",name:"Bluely"}},"amenity/car_sharing|Enterprise Car Club":{countryCodes:["gb"],matchNames:["city car club"],tags:{amenity:"car_sharing",brand:"Enterprise Car Club","brand:wikidata":"Q5123055","brand:wikipedia":"en:Enterprise Car Club",name:"Enterprise Car Club"}},"amenity/car_sharing|Greenwheels":{countryCodes:["de","nl"],tags:{amenity:"car_sharing",brand:"Greenwheels","brand:wikidata":"Q316782","brand:wikipedia":"en:Greenwheels",name:"Greenwheels"}},"amenity/car_sharing|Zipcar":{tags:{amenity:"car_sharing",brand:"Zipcar","brand:wikidata":"Q1069924","brand:wikipedia":"en:Zipcar",name:"Zipcar"}},"amenity/car_sharing|stadtmobil":{countryCodes:["de"],matchNames:["stadtmobil carsharing-station"],tags:{amenity:"car_sharing",brand:"stadtmobil","brand:wikidata":"Q2327629","brand:wikipedia":"en:Stadtmobil",name:"stadtmobil"}},"amenity/car_sharing|teilAuto":{countryCodes:["de"],tags:{amenity:"car_sharing",brand:"teilAuto","brand:wikidata":"Q2400658","brand:wikipedia":"de:TeilAuto",name:"teilAuto"}},"amenity/charging_station|Blink":{countryCodes:["us"],tags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q62065645",name:"Blink"}},"amenity/charging_station|ChargePoint":{tags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"}},"amenity/charging_station|Circuit électrique":{countryCodes:["ca"],tags:{amenity:"charging_station",brand:"Circuit électrique","brand:wikidata":"Q64969699",name:"Circuit électrique"}},"amenity/charging_station|E-WALD":{countryCodes:["de"],matchNames:["e-wald ladestation"],tags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"}},"amenity/charging_station|Enel":{countryCodes:["it"],matchNames:["enel - stazione di ricarica"],tags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"}},"amenity/charging_station|FLO":{countryCodes:["ca"],nomatch:["shop/shoes|FLO"],tags:{amenity:"charging_station",brand:"FLO","brand:wikidata":"Q64971203",name:"FLO"}},"amenity/charging_station|Source London":{countryCodes:["gb"],tags:{amenity:"charging_station",brand:"Source London","brand:wikidata":"Q7565133","brand:wikipedia":"en:Source London",name:"Source London"}},"amenity/charging_station|Tesla Supercharger":{tags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"}},"amenity/charging_station|bike-energy Ladestation":{countryCodes:["at","ch","de","fr","it"],tags:{amenity:"charging_station",brand:"bike-energy Ladestation",name:"bike-energy Ladestation"}},"amenity/charging_station|eVgo":{countryCodes:["us"],tags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo"}},"amenity/childcare|Kids 'R' Kids":{countryCodes:["us"],matchNames:["kids are kids"],tags:{after_school:"yes",amenity:"childcare",brand:"Kids 'R' Kids","brand:wikidata":"Q65560342",grades:"PK",name:"Kids 'R' Kids",nursery:"yes",official_name:"Kids 'R' Kids Learning Academies",preschool:"yes"}},"amenity/childcare|YMCA Child Care":{countryCodes:["us"],matchNames:["ymca","ymca child care center"],tags:{amenity:"childcare",brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",name:"YMCA Child Care"}},"amenity/cinema|109シネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"109シネマズ","brand:en":"109 Cinemas","brand:ja":"109シネマズ","brand:wikidata":"Q10854269","brand:wikipedia":"ja:109シネマズ",name:"109シネマズ","name:en":"109 Cinemas","name:ja":"109シネマズ"}},"amenity/cinema|AMC":{countryCodes:["us"],matchNames:["amc cinema","amc cinemas","amc theater","amc theaters","amc theatre","amc theatres"],tags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"}},"amenity/cinema|B&B Theatres":{countryCodes:["us"],matchNames:["b&b theaters"],tags:{amenity:"cinema",brand:"B&B Theatres","brand:wikidata":"Q4833576","brand:wikipedia":"en:B&B Theatres",name:"B&B Theatres",short_name:"B&B"}},"amenity/cinema|Caribbean Cinemas":{countryCodes:["ag","do","fr","gy","kn","lc","nl","pa","tt","us"],tags:{amenity:"cinema",brand:"Caribbean Cinemas","brand:wikidata":"Q5039364","brand:wikipedia":"en:Caribbean Cinemas",name:"Caribbean Cinemas"}},"amenity/cinema|Century Theatres":{countryCodes:["us"],matchNames:["century theater","century theaters","century theatre"],tags:{amenity:"cinema",brand:"Century Theatres","brand:wikidata":"Q2946307","brand:wikipedia":"en:Century Theatres",name:"Century Theatres",short_name:"Century"}},"amenity/cinema|CineStar":{countryCodes:["de"],tags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"}},"amenity/cinema|Cinema City":{countryCodes:["cz","hu","pl","ro"],tags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"}},"amenity/cinema|Cinemark":{tags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"}},"amenity/cinema|Cinemaxx~(Europe)":{countryCodes:["de","dk"],nomatch:["amenity/cinema|Cinemaxx~(Indonesia)"],tags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q881860","brand:wikipedia":"de:CinemaxX",name:"Cinemaxx"}},"amenity/cinema|Cinemaxx~(Indonesia)":{countryCodes:["id"],nomatch:["amenity/cinema|Cinemaxx~(Europe)"],tags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q19942740","brand:wikipedia":"id:Cinemaxx",name:"Cinemaxx"}},"amenity/cinema|Cinemex":{countryCodes:["mx"],tags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"}},"amenity/cinema|Cineplanet":{countryCodes:["cl","pe"],tags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",name:"Cineplanet"}},"amenity/cinema|Cineplexx":{countryCodes:["at","si"],tags:{amenity:"cinema",brand:"Cineplexx","brand:wikidata":"Q873340","brand:wikipedia":"en:Cineplexx Cinemas",name:"Cineplexx"}},"amenity/cinema|Cinepolis":{tags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"}},"amenity/cinema|Cineworld":{countryCodes:["gb"],tags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"}},"amenity/cinema|Event":{countryCodes:["au","nz"],matchNames:["event cinema"],tags:{amenity:"cinema",brand:"Event","brand:wikidata":"Q5416698","brand:wikipedia":"en:Event Cinemas",name:"Event",official_name:"Event Cinemas"}},"amenity/cinema|Harkins Theatres":{countryCodes:["us"],matchNames:["harkins theater","harkins theaters","harkins theatre"],tags:{amenity:"cinema",brand:"Harkins Theatres","brand:wikidata":"Q5658199","brand:wikipedia":"en:Harkins Theatres",name:"Harkins Theatres",short_name:"Harkins"}},"amenity/cinema|Hoyts":{countryCodes:["au","nz"],tags:{amenity:"cinema",brand:"Hoyts","brand:wikidata":"Q5922976","brand:wikipedia":"en:Hoyts",name:"Hoyts"}},"amenity/cinema|Landmark Theatres":{countryCodes:["us"],matchNames:["landmark theater","landmark theaters","landmark theatre"],tags:{amenity:"cinema",brand:"Landmark Theatres","brand:wikidata":"Q6484805","brand:wikipedia":"en:Landmark Theatres",name:"Landmark Theatres",short_name:"Landmark"}},"amenity/cinema|MOVIX":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"MOVIX","brand:wikidata":"Q11532184","brand:wikipedia":"ja:松竹マルチプレックスシアターズ",name:"MOVIX",official_name:"松竹マルチプレックスシアターズ","official_name:en":"Shochiku Multiplex Theatres"}},"amenity/cinema|Marcus Cinema":{countryCodes:["us"],matchNames:["marcus cinemas","marcus theater","marcus theaters","marcus theatre","marcus theatres"],tags:{amenity:"cinema",brand:"Marcus Cinema","brand:wikidata":"Q64083352",name:"Marcus Cinema",short_name:"Marcus"}},"amenity/cinema|Movie Tavern":{countryCodes:["us"],tags:{amenity:"cinema",brand:"Movie Tavern","brand:wikidata":"Q64083534",name:"Movie Tavern"}},"amenity/cinema|Multikino":{countryCodes:["lt","lv","pl"],tags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"}},"amenity/cinema|Odeon":{countryCodes:["gb","gr","ie","it"],matchNames:["odeon cinema"],tags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"}},"amenity/cinema|Regal Cinemas":{countryCodes:["us"],matchNames:["regal cinema"],tags:{amenity:"cinema",brand:"Regal Cinemas","brand:wikidata":"Q835638","brand:wikipedia":"en:Regal Cinemas",name:"Regal Cinemas",short_name:"Regal"}},"amenity/cinema|Showcase Cinemas":{countryCodes:["ar","gb","us"],matchNames:["showcase cinema"],tags:{amenity:"cinema",brand:"Showcase Cinemas","brand:wikidata":"Q7503170","brand:wikipedia":"en:Showcase Cinemas",name:"Showcase Cinemas",short_name:"Showcase"}},"amenity/cinema|TOHOシネマズ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"TOHOシネマズ","brand:en":"TOHO CINEMAS","brand:ja":"TOHOシネマズ","brand:wikidata":"Q11235261","brand:wikipedia":"ja:TOHOシネマズ",name:"TOHOシネマズ","name:en":"Toho Cinemas","name:ja":"TOHOシネマズ",short_name:"TOHO"}},"amenity/cinema|The Space Cinema":{countryCodes:["it"],matchNames:["the space"],tags:{amenity:"cinema",brand:"The Space Cinema","brand:wikidata":"Q3989406","brand:wikipedia":"it:The Space Cinema",name:"The Space Cinema"}},"amenity/cinema|Vue~(IrelandAndUK)":{countryCodes:["gb","ie"],matchNames:["vue cinema","vue cinemas"],nomatch:["amenity/cinema|Vue~(Netherlands)"],tags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2535134","brand:wikipedia":"en:Vue Cinemas",name:"Vue"}},"amenity/cinema|Vue~(Netherlands)":{countryCodes:["nl"],matchNames:["vue cinema"],nomatch:["amenity/cinema|Vue~(IrelandAndUK)"],tags:{amenity:"cinema",brand:"Vue","brand:wikidata":"Q2421690","brand:wikipedia":"nl:Vue (bioscoopketen)",name:"Vue"}},"amenity/cinema|イオンシネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"イオンシネマ","brand:en":"AEON Cinema","brand:ja":"イオンシネマ","brand:wikidata":"Q17192792","brand:wikipedia":"ja:イオンエンターテイメント",name:"イオンシネマ","name:en":"AEON Cinema","name:ja":"イオンシネマ"}},"amenity/cinema|ユナイテッド・シネマ":{countryCodes:["jp"],tags:{amenity:"cinema",brand:"ユナイテッド・シネマ","brand:en":"United Cinemas","brand:ja":"ユナイテッド・シネマ","brand:wikidata":"Q11345629","brand:wikipedia":"ja:ユナイテッド・シネマ",name:"ユナイテッド・シネマ","name:en":"United Cinemas","name:ja":"ユナイテッド・シネマ"}},"amenity/clinic|CityMD":{countryCodes:["us"],tags:{amenity:"clinic",brand:"CityMD","brand:wikidata":"Q22295471","brand:wikipedia":"en:CityMD",healthcare:"clinic",name:"CityMD"}},"amenity/clinic|DaVita Dialysis":{countryCodes:["us"],matchNames:["davita","davita kidney care"],tags:{amenity:"clinic",brand:"DaVita Dialysis","brand:wikidata":"Q5207184",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"DaVita Dialysis"}},"amenity/clinic|Dialysis Clinic":{countryCodes:["us"],matchNames:["dialysis clinic inc"],tags:{amenity:"clinic",brand:"Dialysis Clinic","brand:wikidata":"Q5270633","brand:wikipedia":"en:Dialysis Clinic, Inc.",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Dialysis Clinic",short_name:"DCI"}},"amenity/clinic|Fresenius Kidney Care":{countryCodes:["us"],tags:{amenity:"clinic",brand:"Fresenius Kidney Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Kidney Care"}},"amenity/clinic|Fresenius Medical Care":{countryCodes:["us"],tags:{amenity:"clinic",brand:"Fresenius Medical Care","brand:wikidata":"Q650259","brand:wikipedia":"en:Fresenius Medical Care",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Fresenius Medical Care"}},"amenity/clinic|Planned Parenthood":{countryCodes:["us"],matchTags:["amenity/doctors","amenity/social_facility"],tags:{amenity:"clinic",brand:"Planned Parenthood","brand:wikidata":"Q2553262",healthcare:"counselling","healthcare:counselling":"antenatal;sexual",name:"Planned Parenthood"}},"amenity/clinic|Satellite Healthcare":{countryCodes:["us"],matchNames:["satellite","satellite dialysis"],tags:{amenity:"clinic",brand:"Satellite Healthcare","brand:wikidata":"Q50039787",healthcare:"dialysis","healthcare:speciality":"dialysis",name:"Satellite Healthcare"}},"amenity/clinic|Terveystalo":{countryCodes:["fi"],tags:{amenity:"clinic",brand:"Terveystalo","brand:wikidata":"Q11897034","brand:wikipedia":"fi:Terveystalo",healthcare:"clinic",name:"Terveystalo"}},"amenity/clinic|VA Clinic":{countryCodes:["us"],matchNames:["department of veterans affairs clinic","veterans administration","veterans administration clinic","veterans affairs","veterans affairs clinic"],tags:{amenity:"clinic",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"clinic","healthcare:for":"veterans",name:"VA Clinic",short_name:"VA"}},"amenity/dentist|Aspen Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Aspen Dental","brand:wikidata":"Q4807808","brand:wikipedia":"en:Aspen Dental",healthcare:"dentist",name:"Aspen Dental"}},"amenity/dentist|Comfort Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Comfort Dental","brand:wikidata":"Q22079521","brand:wikipedia":"en:Comfort Dental",healthcare:"dentist",name:"Comfort Dental"}},"amenity/dentist|Dentix":{tags:{amenity:"dentist",brand:"Dentix",name:"Dentix"}},"amenity/dentist|Folktandvården":{tags:{amenity:"dentist",brand:"Folktandvården",name:"Folktandvården"}},"amenity/dentist|Gentle Dental":{countryCodes:["us"],tags:{amenity:"dentist",brand:"Gentle Dental",name:"Gentle Dental"}},"amenity/dentist|Kool Smiles":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{amenity:"dentist",brand:"Kool Smiles","brand:wikidata":"Q6430587","brand:wikipedia":"en:Kool Smiles",healthcare:"dentist",name:"Kool Smiles"}},"amenity/dentist|Vitaldent":{countryCodes:["es","it"],tags:{amenity:"dentist",brand:"Vitaldent",name:"Vitaldent"}},"amenity/dentist|Western Dental":{countryCodes:["us"],matchTags:["healthcare/dentist"],tags:{alt_name:"Western Dental & Orthodontics",amenity:"dentist",brand:"Western Dental","brand:wikidata":"Q64211989","brand:wikipedia":"en:Western Dental",healthcare:"dentist",name:"Western Dental"}},"amenity/doctors|MinuteClinic":{countryCodes:["us"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"MinuteClinic","brand:wikidata":"Q6871141","brand:wikipedia":"en:MinuteClinic",healthcare:"doctor","healthcare:speciality":"community",name:"MinuteClinic"}},"amenity/doctors|RediClinic":{countryCodes:["us"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"RediClinic","brand:wikidata":"Q64138408",healthcare:"doctor","healthcare:speciality":"community",name:"RediClinic"}},"amenity/doctors|The Little Clinic":{countryCodes:["us"],matchNames:["little clinic"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"The Little Clinic","brand:wikidata":"Q64138262",healthcare:"doctor","healthcare:speciality":"community",name:"The Little Clinic"}},"amenity/doctors|Walgreens Healthcare Clinic":{countryCodes:["us"],matchNames:["healthcare clinic","takecare","takecare clinic","walgreens"],matchTags:["amenity/clinic"],tags:{amenity:"doctors",brand:"Walgreens","brand:wikidata":"Q1591889",healthcare:"doctor","healthcare:speciality":"community",name:"Walgreens Healthcare Clinic"}},"amenity/fast_food|A&W~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fast_food|A&W~(USA)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|A&W~(USA)":{countryCodes:["us"],nomatch:["amenity/fast_food|A&W~(Canada)"],tags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W",takeaway:"yes"}},"amenity/fast_food|Andok's":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Andok's","brand:wikidata":"Q62267166",cuisine:"chicken",name:"Andok's",takeaway:"yes"}},"amenity/fast_food|Angel's Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Angel's Burger","brand:wikidata":"Q62267228",cuisine:"burger",name:"Angel's Burger",takeaway:"yes"}},"amenity/fast_food|Arby's":{countryCodes:["ca","tr","us"],tags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's",takeaway:"yes"}},"amenity/fast_food|Au Bon Pain":{countryCodes:["in","th","us"],tags:{amenity:"fast_food",brand:"Au Bon Pain","brand:wikidata":"Q4818942","brand:wikipedia":"en:Au Bon Pain",cuisine:"sandwich",name:"Au Bon Pain",takeaway:"yes"}},"amenity/fast_food|Auntie Anne's":{countryCodes:["us"],matchNames:["auntie annes pretzels"],tags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's",takeaway:"yes"}},"amenity/fast_food|Back Yard Burgers":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Back Yard Burgers","brand:wikidata":"Q2878376","brand:wikipedia":"en:Back Yard Burgers",cuisine:"burger",name:"Back Yard Burgers",takeaway:"yes"}},"amenity/fast_food|Baja Fresh":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh",takeaway:"yes"}},"amenity/fast_food|Barburrito":{countryCodes:["gb"],tags:{amenity:"fast_food",brand:"Barburrito","brand:wikidata":"Q16983668","brand:wikipedia":"en:Barburrito",cuisine:"mexican",name:"Barburrito",takeaway:"yes"}},"amenity/fast_food|Bembos":{countryCodes:["pe"],tags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos",takeaway:"yes"}},"amenity/fast_food|Blimpie":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Blimpie","brand:wikidata":"Q4926479","brand:wikipedia":"en:Blimpie",cuisine:"sandwich",name:"Blimpie",takeaway:"yes"}},"amenity/fast_food|Bob's":{countryCodes:["ao","br","cl","pt"],tags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's",takeaway:"yes"}},"amenity/fast_food|Bojangles'":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'",official_name:"Bojangles' Famous Chicken 'n Biscuits",takeaway:"yes"}},"amenity/fast_food|Booster Juice":{countryCodes:["ca"],matchTags:["shop/beverages"],tags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice",takeaway:"yes"}},"amenity/fast_food|Boston Market":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market",takeaway:"yes"}},"amenity/fast_food|Braum's":{countryCodes:["us"],matchTags:["shop/dairy"],tags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"ice_cream",name:"Braum's",shop:"dairy",takeaway:"yes"}},"amenity/fast_food|Bruegger's Bagels":{countryCodes:["us"],matchNames:["breuger's","breugger's","bruger's","brugger's"],tags:{amenity:"fast_food",brand:"Bruegger's Bagels","brand:wikidata":"Q4978656","brand:wikipedia":"en:Bruegger's",cuisine:"bagel",name:"Bruegger's Bagels",short_name:"Bruegger's",takeaway:"yes"}},"amenity/fast_food|Burger King":{matchNames:["burguer king"],tags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King",takeaway:"yes"}},"amenity/fast_food|Burger Machine":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine",takeaway:"yes"}},"amenity/fast_food|BurgerFi":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi",takeaway:"yes"}},"amenity/fast_food|Burgerim":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"Burgerim","brand:en":"Burgerim","brand:he":"בורגרים","brand:wikidata":"Q64760354",cuisine:"burger",name:"Burgerim","name:en":"Burgerim","name:he":"בורגרים",takeaway:"yes"}},"amenity/fast_food|Burgers Bar":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"Burgers Bar","brand:en":"Burgers Bar","brand:he":"בורגרס בר","brand:wikidata":"Q64760337",cuisine:"burger","diet:kosher":"yes",name:"Burgers Bar","name:en":"Burgers Bar","name:he":"בורגרס בר",takeaway:"yes"}},"amenity/fast_food|Burgerville":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Burgerville","brand:wikidata":"Q4998570","brand:wikipedia":"en:Burgerville",cuisine:"burger",name:"Burgerville",takeaway:"yes"}},"amenity/fast_food|Captain D's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's",takeaway:"yes"}},"amenity/fast_food|Carl's Jr.":{tags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr.",takeaway:"yes"}},"amenity/fast_food|Charleys Philly Steaks":{countryCodes:["us"],matchNames:["charleys"],tags:{amenity:"fast_food",brand:"Charleys Philly Steaks","brand:wikidata":"Q1066777","brand:wikipedia":"en:Charleys Philly Steaks",cuisine:"sandwich",name:"Charleys Philly Steaks",takeaway:"yes"}},"amenity/fast_food|Checkers":{nomatch:["shop/supermarket|Checkers"],tags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q63919315",cuisine:"burger",name:"Checkers",takeaway:"yes"}},"amenity/fast_food|Chester's":{countryCodes:["us"],matchNames:["chesters chicken"],tags:{amenity:"fast_food",brand:"Chester's","brand:wikidata":"Q5093401","brand:wikipedia":"en:Chester's International",cuisine:"chicken",name:"Chester's",takeaway:"yes"}},"amenity/fast_food|Chick-fil-A":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A",takeaway:"yes"}},"amenity/fast_food|Chicken Express":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express",takeaway:"yes"}},"amenity/fast_food|China Wok":{tags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok",takeaway:"yes"}},"amenity/fast_food|Chipotle":{tags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle",official_name:"Chipotle Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Chopt":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Chopt","brand:wikidata":"Q17509305","brand:wikipedia":"en:Chopt",cuisine:"salad",name:"Chopt",takeaway:"yes"}},"amenity/fast_food|Chowking":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking",takeaway:"yes"}},"amenity/fast_food|Church's Chicken":{tags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken",takeaway:"yes"}},"amenity/fast_food|Cinnabon":{matchTags:["shop/confectionery"],tags:{amenity:"fast_food",brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",cuisine:"dessert",name:"Cinnabon",takeaway:"yes"}},"amenity/fast_food|City Döner":{tags:{amenity:"fast_food",brand:"City Döner",name:"City Döner",takeaway:"yes"}},"amenity/fast_food|CoCo壱番屋":{countryCodes:["cn","jp"],tags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"CoCo Ichibanya","brand:ja":"CoCo壱番屋","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"CoCo Ichibanya","name:ja":"CoCo壱番屋",takeaway:"yes"}},"amenity/fast_food|Cook Out":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out",takeaway:"yes"}},"amenity/fast_food|Così":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Così","brand:wikidata":"Q5175243","brand:wikipedia":"en:Così (restaurant)",cuisine:"sandwich",name:"Così",takeaway:"yes"}},"amenity/fast_food|Cultures":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Cultures","brand:wikidata":"Q64876898",cuisine:"sandwich",name:"Cultures",takeaway:"yes"}},"amenity/fast_food|Culver's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's",takeaway:"yes"}},"amenity/fast_food|DQ Grill & Chill":{countryCodes:["ca","us"],nomatch:["amenity/fast_food|Dairy Queen"],tags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"DQ Grill & Chill",takeaway:"yes"}},"amenity/fast_food|Dairy Queen":{matchNames:["dq"],nomatch:["amenity/fast_food|DQ Grill & Chill"],tags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream;burger",name:"Dairy Queen",takeaway:"yes"}},"amenity/fast_food|Daylight Donuts":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts",takeaway:"yes"}},"amenity/fast_food|Del Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco",takeaway:"yes"}},"amenity/fast_food|Dig Inn":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Dig Inn","brand:wikidata":"Q28226241","brand:wikipedia":"en:Dig Inn",cuisine:"regional",name:"Dig Inn",takeaway:"yes"}},"amenity/fast_food|Domino's Pizza":{tags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza",short_name:"Domino's",takeaway:"yes"}},"amenity/fast_food|Dunkin' Donuts":{matchNames:["dunkin doughnuts"],tags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut;coffee",name:"Dunkin' Donuts",takeaway:"yes"}},"amenity/fast_food|Einstein Bros. Bagels":{countryCodes:["us"],matchNames:["einstein bros","einstein brothers"],tags:{alt_name:"Einstein Brothers Bagels",amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels",takeaway:"yes"}},"amenity/fast_food|El Pollo Loco":{countryCodes:["mx","us"],tags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco",takeaway:"yes"}},"amenity/fast_food|Everest":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Everest","brand:wikidata":"Q62273299",cuisine:"burger",name:"Everest",takeaway:"yes"}},"amenity/fast_food|Extreme Pita":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita",takeaway:"yes"}},"amenity/fast_food|Fazoli's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's",takeaway:"yes"}},"amenity/fast_food|Firehouse Subs":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs",takeaway:"yes"}},"amenity/fast_food|Five Guys":{tags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys",official_name:"Five Guys Burgers and Fries",takeaway:"yes"}},"amenity/fast_food|Freddy's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"ice_cream;burger",name:"Freddy's",official_name:"Freddys Frozen Custard & Steakburgers",takeaway:"yes"}},"amenity/fast_food|Freebirds":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds",takeaway:"yes"}},"amenity/fast_food|Gabriel Pizza":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",cuisine:"pizza",name:"Gabriel Pizza",takeaway:"yes"}},"amenity/fast_food|Gino's Pizza":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Gino's Pizza","brand:wikidata":"Q5563205","brand:wikipedia":"en:Gino's Pizza and Spaghetti",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"}},"amenity/fast_food|Gold Star Chili":{countryCodes:["us"],tags:{alt_name:"Gold Star",amenity:"fast_food",brand:"Gold Star Chili","brand:wikidata":"Q16994254","brand:wikipedia":"en:Gold Star Chili",cuisine:"chili",name:"Gold Star Chili",takeaway:"yes"}},"amenity/fast_food|Golden Krust Caribbean Bakery & Grill":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Golden Krust Caribbean Bakery & Grill","brand:wikidata":"Q5579615","brand:wikipedia":"en:Golden Krust Caribbean Bakery & Grill",cuisine:"caribbean",name:"Golden Krust",takeaway:"yes"}},"amenity/fast_food|Great American Cookies":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Great American Cookies","brand:wikidata":"Q5598629","brand:wikipedia":"en:Great American Cookies",cuisine:"cookies",name:"Great American Cookies",takeaway:"yes"}},"amenity/fast_food|Greenwich":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich",takeaway:"yes"}},"amenity/fast_food|Habib's":{countryCodes:["br","mx"],tags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's",takeaway:"yes"}},"amenity/fast_food|Hallo Pizza":{countryCodes:["de"],tags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza",takeaway:"yes"}},"amenity/fast_food|Hardee's":{tags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's",takeaway:"yes"}},"amenity/fast_food|Harvey's":{countryCodes:["ca"],nomatch:["shop/furniture|Harveys"],tags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's",takeaway:"yes"}},"amenity/fast_food|Herfy":{countryCodes:["ae","bd","bh","kw","sa"],tags:{amenity:"fast_food",brand:"Herfy","brand:ar":"هرفي","brand:en":"Herfy","brand:wikidata":"Q5738371","brand:wikipedia":"en:Herfy",cuisine:"burger",name:"Herfy","name:ar":"هرفي","name:en":"Herfy",takeaway:"yes"}},"amenity/fast_food|Hesburger":{tags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger",takeaway:"yes"}},"amenity/fast_food|Hot Dog on a Stick":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick",takeaway:"yes"}},"amenity/fast_food|Hot Head Burritos":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Hot Head Burritos","brand:wikidata":"Q5910008","brand:wikipedia":"en:Hot Head Burritos",cuisine:"mexican",name:"Hot Head Burritos",short_name:"Hot Head",takeaway:"yes"}},"amenity/fast_food|Hungry Howie's":{countryCodes:["us"],matchNames:["hungry howies pizza"],tags:{amenity:"fast_food",brand:"Hungry Howie's","brand:wikidata":"Q16985303","brand:wikipedia":"en:Hungry Howie's Pizza",cuisine:"pizza",name:"Hungry Howie's",takeaway:"yes"}},"amenity/fast_food|Hungry Jacks":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks",takeaway:"yes"}},"amenity/fast_food|In-N-Out Burger":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger",takeaway:"yes"}},"amenity/fast_food|Jack in the Box":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box",takeaway:"yes"}},"amenity/fast_food|Jamba Juice":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice",takeaway:"yes"}},"amenity/fast_food|Jersey Mike's Subs":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs",short_name:"Jersey Mike's",takeaway:"yes"}},"amenity/fast_food|Jimmy John's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's",takeaway:"yes"}},"amenity/fast_food|Jimmy the Greek":{countryCodes:["ae","ca"],tags:{amenity:"fast_food",brand:"Jimmy the Greek","brand:wikidata":"Q17077817","brand:wikipedia":"en:Jimmy the Greek (restaurant)",cuisine:"greek",name:"Jimmy the Greek",takeaway:"yes"}},"amenity/fast_food|Jollibee":{tags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee",takeaway:"yes"}},"amenity/fast_food|Just Salad":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Just Salad","brand:wikidata":"Q23091823","brand:wikipedia":"en:Just Salad",cuisine:"salad",name:"Just Salad",takeaway:"yes"}},"amenity/fast_food|KFC":{tags:{alt_name:"Kentucky Fried Chicken",amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC",takeaway:"yes"}},"amenity/fast_food|Kernels Popcorn":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Kernels Popcorn","brand:wikidata":"Q64876684",cuisine:"popcorn",name:"Kernels Popcorn",takeaway:"yes"}},"amenity/fast_food|Kochlöffel":{countryCodes:["de","tr"],tags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel",takeaway:"yes"}},"amenity/fast_food|Kotipizza":{countryCodes:["fi"],tags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza",takeaway:"yes"}},"amenity/fast_food|Krispy Kreme":{matchNames:["krispy kreme doughnuts"],tags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme",takeaway:"yes"}},"amenity/fast_food|Krystal":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal",takeaway:"yes"}},"amenity/fast_food|L&L Drive-Inn~(Hawaii)":{countryCodes:["us"],matchNames:["l&l","l&l drive-in"],tags:{amenity:"fast_food",brand:"L&L Drive-Inn","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Drive-Inn",takeaway:"yes"}},"amenity/fast_food|L&L Hawaiian Barbecue":{countryCodes:["us"],matchNames:["l&l","l&l hawaiian bbq"],tags:{amenity:"fast_food",brand:"L&L Hawaiian Barbecue","brand:wikidata":"Q6455441","brand:wikipedia":"en:L&L Hawaiian Barbecue",cuisine:"hawaiian",name:"L&L Hawaiian Barbecue",takeaway:"yes"}},"amenity/fast_food|La Belle Province":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"La Belle Province","brand:wikidata":"Q3206579","brand:wikipedia":"fr:La Belle Province (restaurant)",cuisine:"burger;sandwich",name:"La Belle Province",takeaway:"yes"}},"amenity/fast_food|Lee's Sandwiches":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Lee's Sandwiches","brand:wikidata":"Q6512823","brand:wikipedia":"en:Lee's Sandwiches",cuisine:"vietnamese;sandwich",name:"Lee's Sandwiches",takeaway:"yes"}},"amenity/fast_food|Little Caesars":{matchNames:["little caesars pizza","little ceasars","little ceasars pizza"],tags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars",takeaway:"yes"}},"amenity/fast_food|Long John Silver's":{tags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's",takeaway:"yes"}},"amenity/fast_food|Lotteria":{tags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria",takeaway:"yes"}},"amenity/fast_food|MOD Pizza":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza",takeaway:"yes"}},"amenity/fast_food|Manchu Wok":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Manchu Wok","brand:wikidata":"Q6747622","brand:wikipedia":"en:Manchu Wok",cuisine:"chinese",name:"Manchu Wok",takeaway:"yes"}},"amenity/fast_food|Mang Inasal":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal",takeaway:"yes"}},"amenity/fast_food|Manhattan Bagel":{countryCodes:["us"],matchNames:["manhattan bagels"],tags:{amenity:"fast_food",brand:"Manhattan Bagel","brand:wikidata":"Q64517333",cuisine:"bagel",name:"Manhattan Bagel",takeaway:"yes"}},"amenity/fast_food|Marmaris":{countryCodes:["de","fi","fr","gb","nl"],tags:{amenity:"fast_food",brand:"Marmaris",name:"Marmaris",takeaway:"yes"}},"amenity/fast_food|Max":{countryCodes:["se"],tags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max",takeaway:"yes"}},"amenity/fast_food|McDonald's":{tags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's",takeaway:"yes"}},"amenity/fast_food|Meson Sandwiches":{countryCodes:["us"],matchNames:["el meson"],tags:{alt_name:"El Meson Sandwiches",amenity:"fast_food",brand:"Meson Sandwiches","brand:wikidata":"Q5351585","brand:wikipedia":"en:El Meson Sandwiches",cuisine:"sandwich",name:"Meson Sandwiches",short_name:"Meson",takeaway:"yes"}},"amenity/fast_food|Mighty Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Mighty Taco","brand:wikidata":"Q6844210","brand:wikipedia":"en:Mighty Taco",cuisine:"mexican",name:"Mighty Taco",takeaway:"yes"}},"amenity/fast_food|Minute Burger":{countryCodes:["ph"],tags:{amenity:"fast_food",brand:"Minute Burger","brand:wikidata":"Q62273503",cuisine:"burger",name:"Minute Burger",takeaway:"yes"}},"amenity/fast_food|Moe's Southwest Grill":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill",short_name:"Moe's",takeaway:"yes"}},"amenity/fast_food|Mr. Sub":{tags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub",takeaway:"yes"}},"amenity/fast_food|Mucho Burrito":{countryCodes:["ca","gb","us"],tags:{amenity:"fast_food",brand:"Mucho Burrito","brand:wikidata":"Q65148332",cuisine:"mexican",name:"Mucho Burrito",takeaway:"yes"}},"amenity/fast_food|New York Fries":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"New York Fries","brand:wikidata":"Q7013558","brand:wikipedia":"en:New York Fries",cuisine:"fries",name:"New York Fries",takeaway:"yes"}},"amenity/fast_food|New York Pizza":{countryCodes:["nl"],tags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza",takeaway:"yes"}},"amenity/fast_food|Noah's Bagels":{countryCodes:["us"],matchNames:["noahs ny bagels"],tags:{amenity:"fast_food",brand:"Noah's Bagels","brand:wikidata":"Q64517373",cuisine:"bagel",name:"Noah's Bagels",official_name:"Noah's New York Bagels",takeaway:"yes"}},"amenity/fast_food|Nordsee":{countryCodes:["at","ch","de"],tags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee",takeaway:"yes"}},"amenity/fast_food|Num Pang":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Num Pang","brand:wikidata":"Q62079702","brand:wikipedia":"en:Num Pang",cuisine:"cambodian, sandwich",name:"Num Pang",takeaway:"yes"}},"amenity/fast_food|O'Tacos":{countryCodes:["be","fr"],tags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos",takeaway:"yes"}},"amenity/fast_food|Oporto":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",cuisine:"burger;chicken",name:"Oporto",takeaway:"yes"}},"amenity/fast_food|Orange Julius":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Orange Julius","brand:wikidata":"Q3355059","brand:wikipedia":"en:Orange Julius",cuisine:"juice",name:"Orange Julius",takeaway:"yes"}},"amenity/fast_food|Pal's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",official_name:"Pal's Sudden Service",takeaway:"yes"}},"amenity/fast_food|Panago":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago",takeaway:"yes"}},"amenity/fast_food|Panda Express":{matchNames:["panda"],tags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express",takeaway:"yes"}},"amenity/fast_food|Panera Bread":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",short_name:"Panera",takeaway:"yes"}},"amenity/fast_food|Papa John's":{matchNames:["papa john","papa john pizza","papa johns pizza"],tags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's",takeaway:"yes"}},"amenity/fast_food|Papa Murphy's":{countryCodes:["ca","us"],matchNames:["papa murphy","papa murphy pizza","papa murphys pizza"],tags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's",official_name:"Papa Murphy's Take 'N' Bake Pizza",takeaway:"only"}},"amenity/fast_food|Penn Station":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Penn Station","brand:wikidata":"Q7163311","brand:wikipedia":"en:Penn Station (restaurant)",cuisine:"sandwich",name:"Penn Station",takeaway:"yes"}},"amenity/fast_food|Philly Pretzel Factory":{countryCodes:["us"],matchNames:["philadelphia pretzel factory","philadelphia soft pretzel factory","philly soft pretzel factory"],tags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory",takeaway:"yes"}},"amenity/fast_food|Pinulito":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pinulito","brand:wikidata":"Q62273613",cuisine:"chicken",name:"Pinulito",takeaway:"yes"}},"amenity/fast_food|Pita Pit":{tags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Delivery":{tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery",takeaway:"yes"}},"amenity/fast_food|Pizza Hut Express":{nomatch:["amenity/restaurant|Pizza Hut"],tags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Express",takeaway:"yes"}},"amenity/fast_food|Pizza King":{tags:{amenity:"fast_food",brand:"Pizza King",cuisine:"pizza",name:"Pizza King",takeaway:"yes"}},"amenity/fast_food|Pizza Nova":{tags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova",takeaway:"yes"}},"amenity/fast_food|Pizza Pizza":{tags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza",takeaway:"yes"}},"amenity/fast_food|Pizza Schmizza":{tags:{amenity:"fast_food",brand:"Pizza Schmizza","brand:wikidata":"Q7199979","brand:wikipedia":"en:Pizza Schmizza",cuisine:"pizza",name:"Pizza Schmizza",takeaway:"yes"}},"amenity/fast_food|Pollo Campero":{tags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Costa Rica)":{countryCodes:["cr"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273665",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Granjero~(Guatemala)":{countryCodes:["gt"],tags:{amenity:"fast_food",brand:"Pollo Granjero","brand:wikidata":"Q62273652",cuisine:"chicken",name:"Pollo Granjero",takeaway:"yes"}},"amenity/fast_food|Pollo Tropical":{tags:{amenity:"fast_food",brand:"Pollo Tropical","brand:wikidata":"Q3395356","brand:wikipedia":"en:Pollo Tropical",cuisine:"chicken",name:"Pollo Tropical",takeaway:"yes"}},"amenity/fast_food|Pollolandia":{tags:{amenity:"fast_food",brand:"Pollolandia",cuisine:"chicken",name:"Pollolandia",takeaway:"yes"}},"amenity/fast_food|Popeyes":{tags:{amenity:"fast_food",brand:"Popeyes","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeyes",official_name:"Popeyes Louisiana Kitchen",takeaway:"yes"}},"amenity/fast_food|Potbelly":{countryCodes:["us"],matchNames:["potbelly sandwich shop"],tags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Shop",cuisine:"sandwich",name:"Potbelly",official_name:"Potbelly Sandwich Works",takeaway:"yes"}},"amenity/fast_food|Pret A Manger":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",cuisine:"sandwich",name:"Pret A Manger",takeaway:"yes"}},"amenity/fast_food|Pretzelmaker":{countryCodes:["us"],matchNames:["pretzel time"],tags:{amenity:"fast_food",brand:"Pretzelmaker","brand:wikidata":"Q7242321","brand:wikipedia":"en:Pretzelmaker",cuisine:"pretzel",name:"Pretzelmaker",takeaway:"yes"}},"amenity/fast_food|Qdoba":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba",official_name:"Qdoba Mexican Grill",takeaway:"yes"}},"amenity/fast_food|Quick":{countryCodes:["be","fr","lu"],tags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick",takeaway:"yes"}},"amenity/fast_food|Quiznos":{matchNames:["quiznos sub","quiznos subs"],tags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos",takeaway:"yes"}},"amenity/fast_food|Raising Cane's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's",official_name:"Raising Cane's Chicken Fingers",takeaway:"yes"}},"amenity/fast_food|Rally's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q63919323",cuisine:"burger",name:"Rally's",takeaway:"yes"}},"amenity/fast_food|Red Rooster":{countryCodes:["au"],tags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster",takeaway:"yes"}},"amenity/fast_food|Roy Rogers":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Roy Rogers","brand:wikidata":"Q7373311","brand:wikipedia":"en:Roy Rogers Restaurants",cuisine:"burger;sandwich;chicken",name:"Roy Rogers",takeaway:"yes"}},"amenity/fast_food|Rubio's":{countryCodes:["us"],matchNames:["rubios fresh mexican grill"],tags:{amenity:"fast_food",brand:"Rubio's","brand:wikidata":"Q7376154","brand:wikipedia":"en:Rubio's Coastal Grill",cuisine:"mexican",name:"Rubio's",official_name:"Rubio's Coastal Grill",takeaway:"yes"}},"amenity/fast_food|SUSU & Sons":{countryCodes:["il"],matchNames:["סוסו ובניו"],tags:{amenity:"fast_food",brand:"SUSU & Sons","brand:en":"SUSU & Sons","brand:he":"סוסו אנד סאנס","brand:wikidata":"Q64760081",cuisine:"burger",name:"SUSU & Sons","name:en":"SUSU & Sons","name:he":"סוסו אנד סאנס",takeaway:"yes"}},"amenity/fast_food|Sarku Japan":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Sarku Japan","brand:wikidata":"Q7424243",cuisine:"japanese",name:"Sarku Japan",takeaway:"yes"}},"amenity/fast_food|Sbarro":{matchNames:["Sbarro Pizzeria"],tags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro",takeaway:"yes"}},"amenity/fast_food|Schlotzsky's":{countryCodes:["us"],matchNames:["schlotzskys deli"],tags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's",takeaway:"yes"}},"amenity/fast_food|Shake Shack":{countryCodes:["gb","us"],tags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack",takeaway:"yes"}},"amenity/fast_food|Sibylla":{countryCodes:["fi","se"],tags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla",takeaway:"yes"}},"amenity/fast_food|Smashburger":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"}},"amenity/fast_food|Smoothie King":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King",takeaway:"yes"}},"amenity/fast_food|Sonic":{matchNames:["sonic drive in"],nomatch:["amenity/fuel|Sonic"],tags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",drive_in:"yes",name:"Sonic",takeaway:"yes"}},"amenity/fast_food|Specialty's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Specialty's","brand:wikidata":"Q64339210",cuisine:"sandwich;bakery",name:"Specialty's",takeaway:"yes"}},"amenity/fast_food|St-Hubert Express":{countryCodes:["ca"],nomatch:["amenity/restaurant|St-Hubert"],tags:{amenity:"fast_food",brand:"St-Hubert","brand:wikidata":"Q3495225","brand:wikipedia":"en:St-Hubert",cuisine:"chicken;barbecue",name:"St-Hubert Express",takeaway:"yes"}},"amenity/fast_food|Steak Escape":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Steak Escape","brand:wikidata":"Q7605235","brand:wikipedia":"en:Steak Escape",cuisine:"sandwich",name:"Steak Escape",takeaway:"yes"}},"amenity/fast_food|Steers":{tags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers",takeaway:"yes"}},"amenity/fast_food|Subway":{matchNames:["subway sandwiches"],tags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway",takeaway:"yes"}},"amenity/fast_food|Supermac's":{countryCodes:["gb","ie"],tags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's",takeaway:"yes"}},"amenity/fast_food|Sushi Shop":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Sushi Shop","brand:wikidata":"Q64840990",cuisine:"sushi",name:"Sushi Shop",takeaway:"yes"}},"amenity/fast_food|TCBY":{tags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY",takeaway:"yes"}},"amenity/fast_food|Taco Bell":{tags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell",takeaway:"yes"}},"amenity/fast_food|Taco Bueno":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno",takeaway:"yes"}},"amenity/fast_food|Taco Cabana":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana",takeaway:"yes"}},"amenity/fast_food|Taco Del Mar":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar",takeaway:"yes"}},"amenity/fast_food|Taco John's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's",takeaway:"yes"}},"amenity/fast_food|Taco Time":{countryCodes:["ca","us"],tags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time",takeaway:"yes"}},"amenity/fast_food|Ted's Hot Dogs":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Ted's Hot Dogs","brand:wikidata":"Q7692930","brand:wikipedia":"en:Ted's Hot Dogs",cuisine:"sausage",name:"Ted's Hot Dogs",takeaway:"yes"}},"amenity/fast_food|Telepizza":{tags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza",takeaway:"yes"}},"amenity/fast_food|Teriyaki Experience":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Teriyaki Experience","brand:wikidata":"Q7702453",cuisine:"japanese",name:"Teriyaki Experience",takeaway:"yes"}},"amenity/fast_food|Texas Burger":{tags:{amenity:"fast_food",brand:"Texas Burger",cuisine:"burger",name:"Texas Burger",takeaway:"yes"}},"amenity/fast_food|Texas Chicken":{tags:{amenity:"fast_food",brand:"Texas Chicken",cuisine:"chicken",name:"Texas Chicken",takeaway:"yes"}},"amenity/fast_food|Thai Express~(Singapore)":{countryCodes:["sg"],nomatch:["amenity/fast_food|Thaï Express~(North America)"],tags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express",takeaway:"yes"}},"amenity/fast_food|Thaï Express~(North America)":{countryCodes:["ca","us"],matchNames:["thai express"],nomatch:["amenity/fast_food|Thai Express~(Singapore)"],tags:{amenity:"fast_food",brand:"Thaï Express","brand:wikidata":"Q7711610","brand:wikipedia":"en:Thaï Express",cuisine:"thai",name:"Thaï Express",takeaway:"yes"}},"amenity/fast_food|The Habit Burger Grill":{countryCodes:["us"],matchNames:["the habit burger"],tags:{alt_name:"Habit Burger Grill",amenity:"fast_food",brand:"The Habit Burger Grill","brand:wikidata":"Q18158741","brand:wikipedia":"en:The Habit Burger Grill",cuisine:"burger",name:"The Habit Burger Grill",short_name:"Habit Burger",takeaway:"yes"}},"amenity/fast_food|The Pizza Company":{tags:{alt_name:"Pizza Company",amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company",takeaway:"yes"}},"amenity/fast_food|Togo's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Togo's","brand:wikidata":"Q3530375","brand:wikipedia":"en:Togo's",cuisine:"sandwich",name:"Togo's",takeaway:"yes"}},"amenity/fast_food|Tropical Smoothie Cafe":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Tropical Smoothie Cafe","brand:wikidata":"Q7845817","brand:wikipedia":"en:Tropical Smoothie Cafe",cuisine:"juice",name:"Tropical Smoothie Cafe",takeaway:"yes"}},"amenity/fast_food|Valentine":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Valentine","brand:wikidata":"Q3553635","brand:wikipedia":"en:Groupe Valentine Inc.",cuisine:"burger",name:"Valentine",takeaway:"yes"}},"amenity/fast_food|Veggie Grill":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill",cuisine:"american","diet:vegan":"only",name:"Veggie Grill",takeaway:"yes"}},"amenity/fast_food|Villa Madina":{countryCodes:["ca"],tags:{amenity:"fast_food",brand:"Villa Madina","brand:wikidata":"Q64876884",cuisine:"mediterranean",name:"Villa Madina",takeaway:"yes"}},"amenity/fast_food|Wahoo's Fish Taco":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Wahoo's Fish Taco","brand:wikidata":"Q7959827","brand:wikipedia":"en:Wahoo's Fish Taco",cuisine:"seafood",name:"Wahoo's Fish Taco",short_name:"Wahoo's",takeaway:"yes"}},"amenity/fast_food|Wendy's":{tags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's",takeaway:"yes"}},"amenity/fast_food|Whataburger":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger",takeaway:"yes"}},"amenity/fast_food|Which Wich?":{countryCodes:["ae","gb","gt","mx","om","qa","sa","us"],tags:{amenity:"fast_food",brand:"Which Wich?","brand:wikidata":"Q7993556","brand:wikipedia":"en:Which Wich?",cuisine:"sandwich",name:"Which Wich?",takeaway:"yes"}},"amenity/fast_food|White Castle":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle",takeaway:"yes"}},"amenity/fast_food|Wienerschnitzel":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel",takeaway:"yes"}},"amenity/fast_food|Wimpy":{tags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy",takeaway:"yes"}},"amenity/fast_food|Xi'an Famous Foods":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Xi'an Famous Foods","brand:wikidata":"Q8044020","brand:wikipedia":"en:Xi'an Famous Foods",cuisine:"chinese",name:"Xi'an Famous Foods",takeaway:"yes"}},"amenity/fast_food|Zaxby's":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's",official_name:"Zaxby's Chicken Fingers & Buffalo Wings",takeaway:"yes"}},"amenity/fast_food|Zoës Kitchen":{countryCodes:["us"],tags:{amenity:"fast_food",brand:"Zoës Kitchen","brand:wikidata":"Q8074747","brand:wikipedia":"en:Zoës Kitchen",cuisine:"mediterranean",name:"Zoës Kitchen",takeaway:"yes"}},"amenity/fast_food|immergrün":{countryCodes:["de"],matchNames:["immergün"],tags:{amenity:"fast_food",brand:"immergrün","brand:wikidata":"Q62589254",cuisine:"sandwich;salad;juice",name:"immergün",takeaway:"yes"}},"amenity/fast_food|Γρηγόρης":{countryCodes:["gr"],tags:{amenity:"fast_food",brand:"Γρηγόρης","brand:el":"Γρηγόρης","brand:en":"Gregorys","brand:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης","name:el":"Γρηγόρης","name:en":"Gregorys",takeaway:"yes"}},"amenity/fast_food|Бургер Кинг":{countryCodes:["by","kz","ru"],tags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:ru":"Бургер Кинг","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King","name:ru":"Бургер Кинг",takeaway:"yes"}},"amenity/fast_food|Домино'c Пицца":{tags:{amenity:"fast_food",brand:"Домино'c Пицца","brand:en":"Domino's Pizza","brand:ru":"Домино'c Пицца","brand:wikidata":"Q839466","brand:wikipedia":"ru:Domino’s Pizza",name:"Домино'c Пицца","name:en":"Domino's Pizza","name:ru":"Домино'c Пицца",short_name:"Домино'c","short_name:en":"Domino's","short_name:ru":"Домино'c",takeaway:"yes"}},"amenity/fast_food|Крошка Картошка":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Крошка Картошка","brand:en":"Kroshka Kartoshka","brand:ru":"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка","name:en":"Kroshka Kartoshka","name:ru":"Крошка Картошка",takeaway:"yes"}},"amenity/fast_food|Макдоналдс":{tags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:ru":"Макдоналдс","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's","name:ru":"Макдоналдс",takeaway:"yes"}},"amenity/fast_food|Папа Джонс":{countryCodes:["by","ru"],tags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:ru":"Папа Джонс","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's","name:ru":"Папа Джонс",takeaway:"yes"}},"amenity/fast_food|Робин Сдобин":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Робин Сдобин","brand:en":"Robins Dobin","brand:ru":"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин","name:en":"Robins Dobin","name:ru":"Робин Сдобин",takeaway:"yes"}},"amenity/fast_food|Русский Аппетит":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Русский Аппетит","brand:en":"Russkiy Appetit","brand:ru":"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит","name:en":"Russkiy Appetit","name:ru":"Русский Аппетит",takeaway:"yes"}},"amenity/fast_food|Стардог!s":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:ru":"Стардог!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s","name:ru":"Стардог!s",takeaway:"yes"}},"amenity/fast_food|Суши Wok":{countryCodes:["ru","ua"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:ru":"Суши Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok","name:ru":"Суши Wok",takeaway:"yes"}},"amenity/fast_food|Теремок":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:ru":"Теремок","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok","name:ru":"Теремок",takeaway:"yes"}},"amenity/fast_food|אגדיר":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"אגדיר","brand:en":"Agadir","brand:he":"אגדיר","brand:wikidata":"Q64760070",cuisine:"burger",name:"אגדיר","name:en":"Agadir","name:he":"אגדיר",takeaway:"yes"}},"amenity/fast_food|מקדונלד'ס":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:he":"מקדונלד'ס","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's","name:he":"מקדונלד'ס",takeaway:"yes"}},"amenity/fast_food|עד העצם אקספרס":{countryCodes:["il"],tags:{amenity:"fast_food",brand:"עד העצם אקספרס","brand:en":"Ad Haetzem Express","brand:he":"עד העצם אקספרס","brand:wikidata":"Q64760165",cuisine:"burger",name:"עד העצם אקספרס","name:en":"Ad Haetzem Express","name:he":"עד העצם אקספרס",takeaway:"yes"}},"amenity/fast_food|دجاج كنتاكي":{tags:{amenity:"fast_food",brand:"دجاج كنتاكي","brand:ar":"دجاج كنتاكي","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ar:دجاج كنتاكي",cuisine:"chicken",name:"دجاج كنتاكي","name:ar":"دجاج كنتاكي","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|ماكدونالدز":{tags:{amenity:"fast_food",brand:"ماكدونالدز","brand:ar":"ماكدونالدز","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ar:ماكدونالدز",cuisine:"burger",name:"ماكدونالدز","name:ar":"ماكدونالدز","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|هرفي":{countryCodes:["ae","bh","kw","sa"],tags:{amenity:"fast_food",brand:"هرفي","brand:ar":"هرفي","brand:en":"Herfy","brand:wikidata":"Q5738371","brand:wikipedia":"ar:هرفي",cuisine:"burger",name:"هرفي","name:ar":"هرفي","name:en":"Herfy",takeaway:"yes"}},"amenity/fast_food|かっぱ寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:ja":"かっぱ寿司","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi","name:ja":"かっぱ寿司",takeaway:"yes"}},"amenity/fast_food|かつや":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:ja":"かつや","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ja":"かつや","name:ko":"카쯔야","name:zh":"吉豚屋",takeaway:"yes"}},"amenity/fast_food|くら寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:ja":"くら寿司","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くら寿司",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi","name:ja":"くら寿司",takeaway:"yes"}},"amenity/fast_food|すき家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:ja":"すき家","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",cuisine:"beef_bowl",name:"すき家","name:en":"Sukiya","name:ja":"すき家",takeaway:"yes"}},"amenity/fast_food|てんや":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"てんや","brand:en":"Tenya","brand:ja":"てんや","brand:wikidata":"Q11319830","brand:wikipedia":"jp:テンコーポレーション",cuisine:"fries",name:"てんや","name:en":"Tenya","name:ja":"てんや",takeaway:"yes"}},"amenity/fast_food|なか卯":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:ja":"なか卯","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",cuisine:"udon",name:"なか卯","name:en":"Nakau","name:ja":"なか卯",takeaway:"yes"}},"amenity/fast_food|はま寿司":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:ja":"はま寿司","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",cuisine:"sushi",name:"はま寿司","name:en":"Hamazushi","name:ja":"はま寿司",takeaway:"yes"}},"amenity/fast_food|ほっかほっか亭":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:ja":"ほっかほっか亭","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",cuisine:"japanese",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei","name:ja":"ほっかほっか亭",takeaway:"yes"}},"amenity/fast_food|ほっともっと":{countryCodes:["jp"],nomatch:["shop/deli|ほっともっと"],tags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",cuisine:"japanese",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",takeaway:"yes"}},"amenity/fast_food|ゆで太郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ゆで太郎","brand:en":"Yudetaro","brand:ja":"ゆで太郎","brand:wikidata":"Q11280824","brand:wikipedia":"ja:ゆで太郎",cuisine:"noodle",name:"ゆで太郎","name:en":"Yudetaro","name:ja":"ゆで太郎",takeaway:"yes"}},"amenity/fast_food|ウェンディーズ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ウェンディーズ","brand:en":"Wendy's","brand:ja":"ウェンディーズ","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"ウェンディーズ","name:en":"Wendy's","name:ja":"ウェンディーズ",takeaway:"yes"}},"amenity/fast_food|オリジン弁当":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:ja":"オリジン弁当","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",cuisine:"japanese",name:"オリジン弁当","name:en":"Origin Bentō","name:ja":"オリジン弁当",takeaway:"yes"}},"amenity/fast_food|ケンタッキーフライドチキン":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:ja":"ケンタッキーフライドチキン","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC","name:ja":"ケンタッキーフライドチキン",takeaway:"yes"}},"amenity/fast_food|サブウェイ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:ja":"サブウェイ","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway","name:ja":"サブウェイ",takeaway:"yes"}},"amenity/fast_food|スシロー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:ja":"スシロー","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:ja":"スシロー","name:zh":"壽司郎",takeaway:"yes"}},"amenity/fast_food|ドミノ・ピザ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ドミノ・ピザ","brand:en":"Domino's Pizza","brand:ja":"ドミノ・ピザ","brand:wikidata":"Q839466","brand:wikipedia":"ja:ドミノ・ピザ",cuisine:"pizza",name:"ドミノ・ピザ","name:en":"Domino's Pizza","name:ja":"ドミノ・ピザ",short_name:"ドミノ","short_name:en":"Domino's","short_name:ja":"ドミノ",takeaway:"yes"}},"amenity/fast_food|バーガーキング":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"バーガーキング","brand:en":"Burger King","brand:ja":"バーガーキング","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"バーガーキング","name:en":"Burger King","name:ja":"バーガーキング",takeaway:"yes"}},"amenity/fast_food|ピザハット":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:ja":"ピザハット","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut","name:ja":"ピザハット",takeaway:"yes"}},"amenity/fast_food|ピザ・カリフォルニア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザ・カリフォルニア","brand:en":"Pizza California","brand:ja":"ピザ・カリフォルニア","brand:wikidata":"Q75324","brand:wikipedia":"ja:ピザ・カリフォルニア",cuisine:"pizza",name:"ピザ・カリフォルニア","name:en":"Pizza California","name:ja":"ピザ・カリフォルニア",takeaway:"yes"}},"amenity/fast_food|ピザーラ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ピザーラ","brand:en":"Pizza-La","brand:ja":"ピザーラ","brand:wikidata":"Q7199948","brand:wikipedia":"ja:ピザーラ",cuisine:"pizza",name:"ピザーラ","name:en":"Pizza-La","name:ja":"ピザーラ",takeaway:"yes"}},"amenity/fast_food|ファーストキッチン":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ファーストキッチン","brand:en":"First Kitchen","brand:ja":"ファーストキッチン","brand:wikidata":"Q5453133","brand:wikipedia":"ja:ファーストキッチン",cuisine:"pizza",name:"ファーストキッチン","name:en":"First Kitchen","name:ja":"ファーストキッチン",takeaway:"yes"}},"amenity/fast_food|フレッシュネスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"フレッシュネスバーガー","brand:en":"Freshness Burger","brand:ja":"フレッシュネスバーガー","brand:wikidata":"Q5503087","brand:wikipedia":"ja:フレッシュネスバーガー",cuisine:"burger",name:"フレッシュネスバーガー","name:en":"Freshness Burger","name:ja":"フレッシュネスバーガー",takeaway:"yes"}},"amenity/fast_food|マクドナルド":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:ja":"マクドナルド","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's","name:ja":"マクドナルド",takeaway:"yes"}},"amenity/fast_food|ミスタードーナツ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:ja":"ミスタードーナツ","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut","name:ja":"ミスタードーナツ",takeaway:"yes"}},"amenity/fast_food|モスバーガー":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:ja":"モスバーガー","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger","name:ja":"モスバーガー",takeaway:"yes"}},"amenity/fast_food|ラーメン二郎":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ラーメン二郎","brand:en":"Ramen Jiro","brand:ja":"ラーメン二郎","brand:wikidata":"Q11347765","brand:wikipedia":"ja:ラーメン二郎",cuisine:"ramen",name:"ラーメン二郎","name:en":"Ramen Jiro","name:ja":"ラーメン二郎",takeaway:"yes"}},"amenity/fast_food|ロッテリア":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:ja":"ロッテリア","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria","name:ja":"ロッテリア",takeaway:"yes"}},"amenity/fast_food|吉野家":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:ja":"吉野家","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",cuisine:"beef_bowl",name:"吉野家","name:en":"Yoshinoya","name:ja":"吉野家",takeaway:"yes"}},"amenity/fast_food|富士そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:ja":"富士そば","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",cuisine:"soba",name:"富士そば","name:en":"Fuji Soba","name:ja":"富士そば",takeaway:"yes"}},"amenity/fast_food|幸楽苑":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:ja":"幸楽苑","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",cuisine:"ramen",name:"幸楽苑","name:en":"Kourakuen","name:ja":"幸楽苑",takeaway:"yes"}},"amenity/fast_food|摩斯漢堡":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡","brand:zh":"摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger","name:zh":"摩斯漢堡",takeaway:"yes"}},"amenity/fast_food|日高屋":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya",takeaway:"yes"}},"amenity/fast_food|松屋":{countryCodes:["cn","hk","jp","mo","sg","tw"],tags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya","brand:ja":"松屋","brand:wikidata":"Q848773","brand:wikipedia":"ja:松屋フーズ",cuisine:"japanese",name:"松屋","name:en":"Matsuya","name:ja":"松屋",official_name:"松屋フーズ","official_name:en":"Matsuya Foods","official_name:ja":"松屋フーズ",takeaway:"yes"}},"amenity/fast_food|箱根そば":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"箱根そば","brand:en":"Hakone Soba","brand:ja":"箱根そば","brand:wikidata":"Q11603345","brand:wikipedia":"ja:箱根そば",cuisine:"soba",name:"箱根そば","name:en":"Hakone Soba","name:ja":"箱根そば",takeaway:"yes"}},"amenity/fast_food|築地銀だこ":{countryCodes:["jp"],tags:{amenity:"fast_food",brand:"築地銀だこ","brand:en":"Gindaco","brand:ja":"築地銀だこ","brand:wikidata":"Q11603490","brand:wikipedia":"ja:築地銀だこ",cuisine:"takoyaki",name:"築地銀だこ","name:en":"Gindaco","name:ja":"築地銀だこ",takeaway:"yes"}},"amenity/fast_food|肯德基":{countryCodes:["cn","hk","mo","sg","tw"],tags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"}},"amenity/fast_food|麥當勞":{countryCodes:["hk","mo","tw"],tags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麥當勞","brand:zh":"麥當勞","brand:zh-Hant":"麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's","name:zh":"麥當勞","name:zh-Hant":"麥當勞",takeaway:"yes"}},"amenity/fast_food|麦当劳":{countryCodes:["cn","sg"],tags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳","brand:zh":"麦当劳","brand:zh-Hans":"麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's","name:zh":"麦当劳","name:zh-Hans":"麦当劳",takeaway:"yes"}},"amenity/fast_food|롯데리아":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:ko":"롯데리아","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria","name:ko":"롯데리아",takeaway:"yes"}},"amenity/fast_food|맘스터치":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맘스터치","brand:ko":"맘스터치","brand:wikidata":"Q23044856","brand:wikipedia":"en:Mom's Touch",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"}},"amenity/fast_food|맥도날드":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맥도날드","brand:en":"McDonald's","brand:ko":"맥도날드","brand:wikidata":"Q38076","brand:wikipedia":"ko:맥도날드",cuisine:"burger",name:"맥도날드","name:en":"McDonald's","name:ko":"맥도날드",takeaway:"yes"}},"amenity/fuel|1-2-3":{countryCodes:["dk","pl"],tags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"}},"amenity/fuel|7-Eleven":{matchNames:["7-11","seven eleven"],nomatch:["shop/convenience|7-Eleven"],tags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"}},"amenity/fuel|76":{nomatch:["shop/convenience|76"],tags:{amenity:"fuel",brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76"}},"amenity/fuel|ABC":{countryCodes:["fi"],nomatch:["shop/convenience|ABC"],tags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"}},"amenity/fuel|ADNOC":{countryCodes:["ae"],tags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"}},"amenity/fuel|ANP":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"ANP",name:"ANP"}},"amenity/fuel|Aegean":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Aegean","brand:wikidata":"Q28146598","brand:wikipedia":"el:Aegean Oil",name:"Aegean"}},"amenity/fuel|Afriquia":{tags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"}},"amenity/fuel|Agil":{countryCodes:["tn"],tags:{amenity:"fuel",brand:"Agil",name:"Agil"}},"amenity/fuel|Agip":{tags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"}},"amenity/fuel|Agrola":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"}},"amenity/fuel|Aloha Petroleum":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Aloha Petroleum","brand:wikidata":"Q4734197","brand:wikipedia":"en:Aloha Petroleum",name:"Aloha Petroleum",official_name:"Aloha Petroleum Ltd"}},"amenity/fuel|Alon":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Alon","brand:wikidata":"Q62274304",name:"Alon"}},"amenity/fuel|Alpet":{countryCodes:["al","tr"],tags:{amenity:"fuel",brand:"Alpet","brand:wikidata":"Q62131561",name:"Alpet"}},"amenity/fuel|Api":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"}},"amenity/fuel|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],nomatch:["shop/convenience|Aral"],tags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"}},"amenity/fuel|Arco":{countryCodes:["mx","us"],tags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"}},"amenity/fuel|Asda":{countryCodes:["gb"],nomatch:["shop/supermarket|ASDA","shop/supermarket|Asda"],tags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"}},"amenity/fuel|Atem":{countryCodes:["br"],matchNames:["posto atem"],tags:{amenity:"fuel",brand:"Atem","brand:wikidata":"Q62332255",name:"Atem"}},"amenity/fuel|Auchan":{nomatch:["shop/supermarket|Auchan"],tags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"}},"amenity/fuel|Avanti":{countryCodes:["at"],tags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"}},"amenity/fuel|Avia":{matchNames:["station avia"],tags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"}},"amenity/fuel|Avin":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"}},"amenity/fuel|Axion":{countryCodes:["ar","py","uy"],tags:{amenity:"fuel",brand:"Axion","brand:wikidata":"Q62131749",name:"Axion"}},"amenity/fuel|Aytemiz":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Aytemiz","brand:wikidata":"Q62274352",name:"Aytemiz"}},"amenity/fuel|BEBECO":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"BEBECO","brand:wikidata":"Q62274373",name:"BEBECO"}},"amenity/fuel|BHPetrol":{countryCodes:["my"],tags:{amenity:"fuel",brand:"BHPetrol","brand:wikidata":"Q62274381",name:"BHPetrol"}},"amenity/fuel|BP":{matchNames:["BP Gas Station"],nomatch:["shop/convenience|BP Shop"],tags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"}},"amenity/fuel|BR":{countryCodes:["br"],matchNames:["br petrobras","petrobras","posto br"],tags:{amenity:"fuel",brand:"BR","brand:wikidata":"Q4836468","brand:wikipedia":"pt:Petrobras Distribuidora",name:"BR"}},"amenity/fuel|Bangchak":{countryCodes:["th"],tags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"}},"amenity/fuel|Bharat Petroleum":{countryCodes:["in"],tags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"}},"amenity/fuel|Biomax":{countryCodes:["co"],tags:{amenity:"fuel",brand:"Biomax","brand:wikidata":"Q62274413",name:"Biomax"}},"amenity/fuel|Bliska":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"}},"amenity/fuel|CAMPSA":{countryCodes:["es"],tags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"}},"amenity/fuel|CEPSA":{countryCodes:["es","pt"],tags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Cepsa",name:"CEPSA"}},"amenity/fuel|Caltex":{tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"}},"amenity/fuel|Canadian Tire Gas+":{matchNames:["canadian tire","canadian tire gas bar"],nomatch:["shop/department_store|Canadian Tire"],tags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"}},"amenity/fuel|Carrefour":{matchNames:["carrefour market"],nomatch:["shop/convenience|Carrefour Express","shop/supermarket|Carrefour"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour"}},"amenity/fuel|Casey's General Store":{matchNames:["caseys"],nomatch:["shop/convenience|Casey's General Store"],tags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"}},"amenity/fuel|Casino":{tags:{amenity:"fuel",brand:"Casino",name:"Casino"}},"amenity/fuel|Cenex":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"}},"amenity/fuel|Ceypetco":{countryCodes:["lk"],matchNames:["lanka filling station"],tags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"}},"amenity/fuel|Chevron":{nomatch:["shop/convenience|Chevron"],tags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"}},"amenity/fuel|Circle K":{nomatch:["shop/convenience|Circle K"],tags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"}},"amenity/fuel|Citgo":{nomatch:["shop/convenience|Citgo"],tags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"}},"amenity/fuel|Clark":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"}},"amenity/fuel|Classic":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Classic",name:"Classic"}},"amenity/fuel|Co-op~(Canada)":{countryCodes:["ca"],matchNames:["coop"],nomatch:["shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"}},"amenity/fuel|Coles Express":{countryCodes:["au"],nomatch:["shop/convenience|Coles Express"],tags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"}},"amenity/fuel|Conoco":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"}},"amenity/fuel|Copec":{countryCodes:["cl"],tags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"}},"amenity/fuel|Copetrol":{countryCodes:["py"],tags:{amenity:"fuel",brand:"Copetrol","brand:wikidata":"Q62274431",name:"Copetrol"}},"amenity/fuel|Cosmo":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"}},"amenity/fuel|Costco Gasoline":{countryCodes:["au","ca","mx","us"],matchNames:["costco","costco gas","costco wholesale"],nomatch:["amenity/pharmacy|Costco Pharmacy","shop/wholesale|Costco"],tags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"}},"amenity/fuel|Couche-Tard":{countryCodes:["ca"],nomatch:["shop/convenience|Couche-Tard"],tags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"}},"amenity/fuel|Crevier":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"}},"amenity/fuel|Crodux":{countryCodes:["hr"],tags:{amenity:"fuel",brand:"Crodux","brand:wikidata":"Q62274622",name:"Crodux"}},"amenity/fuel|Cumberland Farms":{countryCodes:["us"],nomatch:["shop/convenience|Cumberland Farms"],tags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"}},"amenity/fuel|Delta~(Panama & Costa Rica)":{countryCodes:["cr","us"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274638",name:"Delta"}},"amenity/fuel|Delta~(USA)":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Delta","brand:wikidata":"Q62274661",name:"Delta"}},"amenity/fuel|Depot Tela":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Depot Tela",name:"Depot Tela"}},"amenity/fuel|Diamond Shamrock":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"}},"amenity/fuel|Domo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"}},"amenity/fuel|EKO~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|EKO~(Greece)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"}},"amenity/fuel|EKO~(Greece)":{countryCodes:["bg","cy","gr","me","mk","rs"],matchNames:["εκο"],nomatch:["amenity/fuel|EKO~(Canada)","shop/supermarket|Eko"],tags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"}},"amenity/fuel|ENEOS":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"}},"amenity/fuel|Elan":{countryCodes:["de","fr","nl"],tags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"}},"amenity/fuel|Engen":{tags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"}},"amenity/fuel|Eni":{countryCodes:["at","ch","fr","it"],tags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"}},"amenity/fuel|Erg":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"}},"amenity/fuel|Esso":{matchNames:["station esso"],nomatch:["amenity/fuel|Esso Express","shop/convenience|Esso"],tags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"}},"amenity/fuel|Esso Express":{nomatch:["amenity/fuel|Esso"],tags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"}},"amenity/fuel|Exxon":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"}},"amenity/fuel|F24":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"F24","brand:wikidata":"Q12310853","brand:wikipedia":"da:F24",name:"F24"}},"amenity/fuel|Fas Gas":{countryCodes:["ca"],matchNames:["fas gas plus"],tags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"}},"amenity/fuel|Firezone":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"}},"amenity/fuel|Flying J":{countryCodes:["ca","us"],matchNames:["flying j travel plaza"],tags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q64130592",name:"Flying J"}},"amenity/fuel|Flying V":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Flying V","brand:wikidata":"Q62275048",name:"Flying V"}},"amenity/fuel|Freie Tankstelle":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"}},"amenity/fuel|GALP":{tags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"}},"amenity/fuel|Gazel":{countryCodes:["co","mx","pe"],tags:{amenity:"fuel",brand:"Gazel","brand:wikidata":"Q62529885",name:"Gazel"}},"amenity/fuel|Gazprom":{tags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"}},"amenity/fuel|GetGo":{countryCodes:["us"],tags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"}},"amenity/fuel|Giant":{nomatch:["shop/bicycle|Giant"],tags:{amenity:"fuel",brand:"Giant",name:"Giant"}},"amenity/fuel|Glusco":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Glusco","brand:wikidata":"Q62284719",name:"Glusco"}},"amenity/fuel|Goil":{countryCodes:["gh"],tags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"}},"amenity/fuel|Gulf":{tags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"}},"amenity/fuel|Gull":{countryCodes:["au","nz"],tags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"}},"amenity/fuel|H-E-B Fuel":{countryCodes:["us"],matchNames:["h-e-b gas"],nomatch:["shop/supermarket|H-E-B"],tags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"}},"amenity/fuel|HEM":{countryCodes:["de"],tags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"}},"amenity/fuel|HP":{countryCodes:["in"],matchNames:["hp petrol pump"],tags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"HP",official_name:"Hindustan Petroleum"}},"amenity/fuel|Harnois":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"}},"amenity/fuel|Hess":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"}},"amenity/fuel|Hofer":{countryCodes:["at","si"],nomatch:["shop/supermarket|Hofer"],tags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"}},"amenity/fuel|Holiday":{countryCodes:["us"],nomatch:["shop/convenience|Holiday"],tags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"}},"amenity/fuel|Husky":{countryCodes:["ca"],nomatch:["amenity/restaurant|Husky House","shop/convenience|Husky"],tags:{amenity:"fuel",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky"}},"amenity/fuel|IES":{countryCodes:["it"],tags:{amenity:"fuel",brand:"IES","brand:wikidata":"Q62287387",name:"IES"}},"amenity/fuel|IP":{tags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"}},"amenity/fuel|Indian Oil":{tags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"}},"amenity/fuel|Indian Oil Petrol Pump":{countryCodes:["in"],tags:{amenity:"fuel",brand:"Indian Oil Petrol Pump",name:"Indian Oil Petrol Pump"}},"amenity/fuel|Ingo":{countryCodes:["dk","se"],tags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"}},"amenity/fuel|Intermarché":{matchNames:["intermarché super"],nomatch:["shop/supermarket|Intermarché"],tags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"}},"amenity/fuel|Ipiranga":{countryCodes:["br"],matchNames:["posto ipiranga"],tags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"}},"amenity/fuel|Irving":{nomatch:["shop/convenience|Irving"],tags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"}},"amenity/fuel|JA-SS":{countryCodes:["jp"],matchNames:["ja"],tags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"}},"amenity/fuel|Jet":{nomatch:["shop/clothes|Jet"],tags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"}},"amenity/fuel|Jetti":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Jetti","brand:wikidata":"Q62288720",name:"Jetti"}},"amenity/fuel|Kangaroo Express":{countryCodes:["us"],nomatch:["shop/convenience|Kangaroo Express"],tags:{amenity:"fuel",brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",short_name:"Kangaroo"}},"amenity/fuel|Kobil":{countryCodes:["bi","et","ke","rw","tz","ug","zm"],tags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"}},"amenity/fuel|Kroger":{matchNames:["kroger fuel"],nomatch:["shop/supermarket|Kroger"],tags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"}},"amenity/fuel|Kum & Go":{countryCodes:["us"],nomatch:["shop/convenience|Kum & Go"],tags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"}},"amenity/fuel|Kwik Fill":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Kwik Fill",name:"Kwik Fill"}},"amenity/fuel|Kwik Trip":{countryCodes:["us"],nomatch:["shop/convenience|Kwik Trip"],tags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"}},"amenity/fuel|Liberty":{countryCodes:["au","us"],nomatch:["amenity/bank|Liberty Bank"],tags:{amenity:"fuel",brand:"Liberty",name:"Liberty"}},"amenity/fuel|Lotos":{countryCodes:["pl"],nomatch:["amenity/fuel|Lotos Optima"],tags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos"}},"amenity/fuel|Lotos Optima":{countryCodes:["pl"],nomatch:["amenity/fuel|Lotos"],tags:{amenity:"fuel",brand:"Lotos Optima","brand:wikidata":"Q1256909","brand:wikipedia":"pl:Grupa Lotos",name:"Lotos Optima"}},"amenity/fuel|Love's":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"}},"amenity/fuel|Lukoil":{tags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"}},"amenity/fuel|MEROIL":{countryCodes:["es"],tags:{amenity:"fuel",brand:"MEROIL","brand:wikidata":"Q62292559",name:"MEROIL"}},"amenity/fuel|MOL":{tags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"}},"amenity/fuel|MRS":{countryCodes:["ng"],tags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"}},"amenity/fuel|Mac's":{countryCodes:["ca"],nomatch:["shop/convenience|Mac's"],tags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"}},"amenity/fuel|MacEwen":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"}},"amenity/fuel|Marathon":{matchNames:["Marathon Gas"],nomatch:["shop/convenience|Marathon"],tags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"}},"amenity/fuel|Maverik":{countryCodes:["us"],nomatch:["shop/convenience|Maverik"],tags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q64149010","brand:wikipedia":"en:Maverik, Inc.",name:"Maverik"}},"amenity/fuel|Maxol":{countryCodes:["gb","ie"],tags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"}},"amenity/fuel|Metano":{countryCodes:["it"],tags:{amenity:"fuel",brand:"Metano","brand:wikidata":"Q62294765",name:"Metano"}},"amenity/fuel|Migrol":{countryCodes:["ch"],tags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"}},"amenity/fuel|Mobil":{matchNames:["mobile"],nomatch:["shop/convenience|Mobil Mart"],tags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"}},"amenity/fuel|Moil":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Moil","brand:wikidata":"Q62296914",name:"Moil"}},"amenity/fuel|Morrisons":{countryCodes:["gb"],nomatch:["shop/supermarket|Morrisons"],tags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"}},"amenity/fuel|Moya":{countryCodes:["pl"],tags:{amenity:"fuel",brand:"Moya","brand:wikidata":"Q62297700",name:"Moya"}},"amenity/fuel|Murphy USA":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"}},"amenity/fuel|N1":{countryCodes:["is"],tags:{amenity:"fuel",brand:"N1",name:"N1"}},"amenity/fuel|NP":{countryCodes:["tt"],tags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"}},"amenity/fuel|Neste":{tags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"}},"amenity/fuel|OIL!":{tags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"}},"amenity/fuel|OK":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"}},"amenity/fuel|OKQ8":{countryCodes:["se"],tags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"}},"amenity/fuel|OMV":{tags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"}},"amenity/fuel|Oilibya":{matchNames:["oilibia","oilibiya","oillibia","oilliby","oillibya","oillybia","oilybia","olibya","olybia"],tags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"}},"amenity/fuel|Olerex":{countryCodes:["ee"],tags:{amenity:"fuel",brand:"Olerex",name:"Olerex"}},"amenity/fuel|Opet":{countryCodes:["tr"],tags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"}},"amenity/fuel|Orlen":{nomatch:["shop/convenience|Orlen"],tags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"}},"amenity/fuel|Oxxo":{nomatch:["shop/convenience|Oxxo"],tags:{amenity:"fuel",brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo"}},"amenity/fuel|PSO":{countryCodes:["pk"],matchNames:["pso petrol pump"],tags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"}},"amenity/fuel|PT":{countryCodes:["th"],tags:{amenity:"fuel",brand:"PT","brand:wikidata":"Q62298612",name:"PT"}},"amenity/fuel|PTT":{nomatch:["amenity/post_office|PTT"],tags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"}},"amenity/fuel|PV Oil":{tags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"}},"amenity/fuel|Pacific Pride":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"}},"amenity/fuel|Pecsa":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Pecsa","brand:wikidata":"Q62299262",name:"Pecsa"}},"amenity/fuel|Pemex":{countryCodes:["mx"],tags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"}},"amenity/fuel|Pertamina":{countryCodes:["id"],tags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"}},"amenity/fuel|Petro":{countryCodes:["ca","us"],matchNames:["petro stopping center"],tags:{alt_name:"Petro Stopping Centers",amenity:"fuel",brand:"Petro","brand:wikidata":"Q64051305",name:"Petro"}},"amenity/fuel|Petro-Canada":{countryCodes:["ca"],nomatch:["shop/convenience|Petro-Canada"],tags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"}},"amenity/fuel|Petro-T":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"}},"amenity/fuel|PetroPerú":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"}},"amenity/fuel|Petrochina":{countryCodes:["cn"],tags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"}},"amenity/fuel|Petroecuador":{countryCodes:["ec"],tags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"}},"amenity/fuel|Petrol Ofisi":{tags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"}},"amenity/fuel|Petrolimex":{tags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"}},"amenity/fuel|Petrolina":{countryCodes:["cy"],tags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"}},"amenity/fuel|Petrom":{tags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"}},"amenity/fuel|Petron":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"}},"amenity/fuel|Petronas":{tags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"}},"amenity/fuel|Petronor":{countryCodes:["es"],tags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"}},"amenity/fuel|Phillips 66":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"}},"amenity/fuel|Phoenix":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"}},"amenity/fuel|Pilot":{countryCodes:["ca","us"],matchNames:["pilot travel centers"],tags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q64128179",name:"Pilot"}},"amenity/fuel|Pioneer":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"}},"amenity/fuel|Preem":{countryCodes:["pl","se"],tags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"}},"amenity/fuel|Primax~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332857",name:"Primax"}},"amenity/fuel|Primax~(Peru)":{countryCodes:["pe"],tags:{amenity:"fuel",brand:"Primax","brand:wikidata":"Q62332638",name:"Primax"}},"amenity/fuel|Prio":{countryCodes:["pt"],tags:{amenity:"fuel",brand:"Prio","brand:wikidata":"Q62530421",name:"Prio"}},"amenity/fuel|Puma":{nomatch:["shop/clothes|Puma"],tags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"}},"amenity/fuel|Q1":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Q1","brand:wikidata":"Q62086498",name:"Q1"}},"amenity/fuel|Q8":{countryCodes:["be","dk","es","it","lu","nl","pt"],tags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"}},"amenity/fuel|Q8 Easy":{countryCodes:["be","it"],tags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"}},"amenity/fuel|Qstar":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"}},"amenity/fuel|QuikTrip":{matchNames:["qt"],nomatch:["shop/convenience|QuikTrip"],tags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"}},"amenity/fuel|RaceTrac":{nomatch:["shop/convenience|RaceTrac"],tags:{amenity:"fuel",brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac"}},"amenity/fuel|Raiffeisen":{countryCodes:["de"],nomatch:["amenity/bank|Raiffeisenbank"],tags:{amenity:"fuel",brand:"Raiffeisen",name:"Raiffeisen"}},"amenity/fuel|Repsol":{tags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"}},"amenity/fuel|Revoil":{countryCodes:["gr"],tags:{amenity:"fuel",brand:"Revoil","brand:wikidata":"Q62530755",name:"Revoil"}},"amenity/fuel|Rompetrol":{tags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"}},"amenity/fuel|Royal Farms":{countryCodes:["us"],nomatch:["shop/convenience|Royal Farms"],tags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"}},"amenity/fuel|Rubis":{tags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"}},"amenity/fuel|SK주유소":{countryCodes:["kr"],tags:{amenity:"fuel",brand:"SK주유소","brand:ko":"SK주유소",name:"SK주유소","name:ko":"SK주유소"}},"amenity/fuel|SP":{tags:{amenity:"fuel",brand:"SP",name:"SP"}},"amenity/fuel|Safeway":{nomatch:["shop/supermarket|Safeway"],tags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"}},"amenity/fuel|Sainsbury's":{countryCodes:["gb"],nomatch:["shop/supermarket|Sainsbury's"],tags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"}},"amenity/fuel|Sam's Club":{nomatch:["shop/wholesale|Sam's Club"],tags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club"}},"amenity/fuel|Sasol":{countryCodes:["za"],tags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"}},"amenity/fuel|Sea Oil":{countryCodes:["ph"],tags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"}},"amenity/fuel|Sheetz":{nomatch:["shop/convenience|Sheetz"],tags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"}},"amenity/fuel|Shell":{matchNames:["posto shell","shell gas station","shell petrol station","shell station","station shell"],nomatch:["amenity/fuel|Shell Express","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"}},"amenity/fuel|Shell Express":{nomatch:["amenity/fuel|Shell","shop/convenience|Shell Select"],tags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"}},"amenity/fuel|Sinclair":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"}},"amenity/fuel|Sinopec":{countryCodes:["cn"],matchNames:["sinopec fuel"],tags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec","brand:zh":"中国石化",name:"Sinopec","name:zh":"中国石化"}},"amenity/fuel|Slovnaft":{countryCodes:["cz","pl","sk"],tags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"}},"amenity/fuel|Socar":{tags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"}},"amenity/fuel|Sokimex":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"}},"amenity/fuel|Sonic":{nomatch:["amenity/fast_food|Sonic"],tags:{amenity:"fuel",brand:"Sonic",name:"Sonic"}},"amenity/fuel|Speedway":{nomatch:["shop/convenience|Speedway"],tags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"}},"amenity/fuel|Sprint":{countryCodes:["de"],nomatch:["shop/mobile_phone|Sprint"],tags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"}},"amenity/fuel|St1":{countryCodes:["fi","se"],tags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"}},"amenity/fuel|Star":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"}},"amenity/fuel|Star Oil":{tags:{amenity:"fuel",brand:"Star Oil",name:"Star Oil"}},"amenity/fuel|Station Service E. Leclerc":{matchNames:["e. leclerc"],tags:{amenity:"fuel",brand:"E.Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Station Service E. Leclerc"}},"amenity/fuel|Statoil":{countryCodes:["dk","ee","ie","pl","ru","se"],tags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"}},"amenity/fuel|Stewart's":{countryCodes:["us"],nomatch:["shop/convenience|Stewart's"],tags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"}},"amenity/fuel|Sunoco":{nomatch:["shop/convenience|Sunoco"],tags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"}},"amenity/fuel|Super U":{countryCodes:["fr"],nomatch:["shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"}},"amenity/fuel|Susco":{countryCodes:["th"],tags:{amenity:"fuel",brand:"Susco",name:"Susco"}},"amenity/fuel|TA":{countryCodes:["us"],tags:{amenity:"fuel",brand:"TA","brand:wikidata":"Q7835892","brand:wikipedia":"en:TravelCenters of America",name:"TA"}},"amenity/fuel|Tamoil":{countryCodes:["ch","de","es","fr","it","nl"],tags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"}},"amenity/fuel|Tango":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"}},"amenity/fuel|Tanka":{countryCodes:["se"],tags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"}},"amenity/fuel|Teboil":{countryCodes:["fi"],tags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"}},"amenity/fuel|Tela":{countryCodes:["kh"],tags:{amenity:"fuel",brand:"Tela","brand:wikidata":"Q62534875",name:"Tela"}},"amenity/fuel|Tempo":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"Tempo","brand:wikidata":"Q62535175",name:"Tempo"}},"amenity/fuel|Terpel":{tags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"}},"amenity/fuel|Tesco":{nomatch:["shop/convenience|Tesco"],tags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"}},"amenity/fuel|Tesoro":{countryCodes:["us"],tags:{amenity:"fuel",brand:"Tesoro",name:"Tesoro"}},"amenity/fuel|Texaco":{nomatch:["shop/convenience|Texaco"],tags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"}},"amenity/fuel|Tinq":{countryCodes:["nl"],tags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"}},"amenity/fuel|Topaz":{countryCodes:["ie"],tags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"}},"amenity/fuel|Total":{matchNames:["station total"],nomatch:["shop/convenience|Total"],tags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"}},"amenity/fuel|Total Access":{countryCodes:["fr"],tags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"}},"amenity/fuel|TotalErg":{countryCodes:["it"],tags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"}},"amenity/fuel|Turkey Hill":{countryCodes:["us"],nomatch:["shop/convenience|Turkey Hill"],tags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"}},"amenity/fuel|Turmöl":{countryCodes:["at"],tags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"}},"amenity/fuel|UDF Fuel":{countryCodes:["us"],matchNames:["udf fuels","united dairy farmers"],nomatch:["shop/convenience|United Dairy Farmers"],tags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"}},"amenity/fuel|Ultramar":{nomatch:["shop/convenience|Ultramar"],tags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"}},"amenity/fuel|United":{matchNames:["united petroleum"],nomatch:["amenity/bank|United Bank"],tags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"}},"amenity/fuel|Uno":{countryCodes:["bz","cr","gt","hn","ni","sv"],tags:{amenity:"fuel",brand:"Uno","brand:wikidata":"Q62535574",name:"Uno"}},"amenity/fuel|Uno-X":{countryCodes:["dk"],tags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"}},"amenity/fuel|Valero":{nomatch:["shop/convenience|Valero"],tags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"}},"amenity/fuel|Viada":{countryCodes:["lt","lv"],tags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"}},"amenity/fuel|Vito":{countryCodes:["fr"],tags:{amenity:"fuel",brand:"Vito","brand:wikidata":"Q62536473",name:"Vito"}},"amenity/fuel|WOG":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"}},"amenity/fuel|Walmart":{nomatch:["shop/department_store|Walmart","shop/supermarket|Walmart Neighborhood Market","shop/supermarket|Walmart Supercenter"],tags:{amenity:"fuel",brand:"Walmart","brand:wikidata":"Q62606411","brand:wikipedia":"en:Walmart",name:"Walmart"}},"amenity/fuel|Wawa":{nomatch:["shop/convenience|Wawa"],tags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"}},"amenity/fuel|Westfalen":{countryCodes:["de"],tags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"}},"amenity/fuel|Woolworths Petrol":{countryCodes:["au"],nomatch:["shop/convenience|Woolworths Petrol"],tags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"}},"amenity/fuel|XTR":{countryCodes:["ca"],tags:{amenity:"fuel",brand:"XTR","brand:wikidata":"Q62537250",name:"XTR"}},"amenity/fuel|YPF":{tags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"}},"amenity/fuel|Z":{countryCodes:["nz"],nomatch:["shop/clothes|Z"],tags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"}},"amenity/fuel|bft":{countryCodes:["de"],tags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"}},"amenity/fuel|din-X":{countryCodes:["se"],tags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"}},"amenity/fuel|Авіас":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"}},"amenity/fuel|БРСМ-Нафта":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"}},"amenity/fuel|Башнефть":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"}},"amenity/fuel|Белоруснефть":{countryCodes:["by"],tags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"}},"amenity/fuel|Газпромнефть":{countryCodes:["by","kg","kz","ru","tj"],matchNames:["газпром"],tags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"}},"amenity/fuel|Гелиос":{countryCodes:["kz"],matchNames:["helios"],tags:{amenity:"fuel",brand:"Гелиос","brand:en":"Helios","brand:wikidata":"Q62286471",name:"Гелиос","name:en":"Helios"}},"amenity/fuel|ЕКА":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"ЕКА","brand:wikidata":"Q62543029",name:"ЕКА"}},"amenity/fuel|КЛО":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"КЛО","brand:en":"Klo","brand:wikidata":"Q60966526","brand:wikipedia":"ru:КЛО (сеть АЗС)",name:"КЛО","name:en":"Klo"}},"amenity/fuel|КазМунайГаз":{countryCodes:["kz"],nomatch:["shop/convenience|КазМунайГаз"],tags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"}},"amenity/fuel|Лукойл":{matchNames:["лукоил"],nomatch:["shop/convenience|Лукойл"],tags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"}},"amenity/fuel|Макпетрол":{countryCodes:["mk"],tags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"}},"amenity/fuel|НК Альянс":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"НК Альянс","brand:en":"Alliance Oil","brand:ru":"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс","name:en":"Alliance Oil","name:ru":"НК Альянс"}},"amenity/fuel|Нефтьмагистраль":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Нефтьмагистраль","brand:en":"Neftmagistral","brand:wikidata":"Q62544323",name:"Нефтьмагистраль","name:en":"Neftmagistral"}},"amenity/fuel|ОККО":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"}},"amenity/fuel|ОМВ":{countryCodes:["bg","rs"],tags:{amenity:"fuel",brand:"ОМВ","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"ОМВ"}},"amenity/fuel|ПТК":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"}},"amenity/fuel|Петрол":{countryCodes:["bg"],tags:{amenity:"fuel",brand:"Петрол","brand:en":"Petrol AD","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол","name:en":"Petrol AD"}},"amenity/fuel|Роснефть":{tags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"}},"amenity/fuel|Сургутнефтегаз":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"}},"amenity/fuel|ТНК":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"}},"amenity/fuel|Татнефтепродукт":{countryCodes:["ru"],tags:{amenity:"fuel",brand:"Татнефтепродукт",name:"Татнефтепродукт"}},"amenity/fuel|Татнефть":{countryCodes:["ru","ua"],tags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"}},"amenity/fuel|Укрнафта":{countryCodes:["ua"],tags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"}},"amenity/fuel|דור אלון":{countryCodes:["il"],tags:{amenity:"fuel",brand:"דור אלון","brand:en":"Dor Alon","brand:he":"דור אלון","brand:wikidata":"Q16130352","brand:wikipedia":"he:דור אלון אנרגיה בישראל (1988)",name:"דור אלון","name:en":"Dor Alon","name:he":"דור אלון"}},"amenity/fuel|סונול":{countryCodes:["il"],tags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:he":"סונול","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol","name:he":"סונול"}},"amenity/fuel|פז":{countryCodes:["il"],tags:{amenity:"fuel",brand:"פז","brand:en":"Paz","brand:he":"פז","brand:wikidata":"Q2211731","brand:wikipedia":"en:Paz Oil Company",name:"פז","name:en":"Paz","name:he":"פז"}},"amenity/fuel|ادنوك":{countryCodes:["ae"],tags:{amenity:"fuel",brand:"ادنوك","brand:ar":"ادنوك","brand:en":"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ادنوك","name:ar":"ادنوك","name:en":"ADNOC"}},"amenity/fuel|บางจาก":{countryCodes:["th"],tags:{amenity:"fuel",brand:"บางจาก","brand:en":"Bangchak","brand:th":"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก","name:en":"Bangchak","name:th":"บางจาก"}},"amenity/fuel|ป.ต.ท.":{countryCodes:["th"],tags:{amenity:"fuel",brand:"ป.ต.ท.","brand:en":"PTT","brand:th":"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท.","name:en":"PTT","name:th":"ป.ต.ท."}},"amenity/fuel|เชลล์":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เชลล์","brand:en":"Shell","brand:th":"เชลล์","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"เชลล์","name:en":"Shell","name:th":"เชลล์"}},"amenity/fuel|เอสโซ่":{countryCodes:["th"],tags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:th":"เอสโซ่","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso","name:th":"เอสโซ่"}},"amenity/fuel|エッソ":{countryCodes:["jp"],matchNames:["エッソ石油"],tags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:ja":"エッソ","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso","name:ja":"エッソ"}},"amenity/fuel|エネオス":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:ja":"エネオス","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy","name:ja":"エネオス"}},"amenity/fuel|コスモ石油":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:ja":"コスモ石油","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company","name:ja":"コスモ石油"}},"amenity/fuel|ゼネラル":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"ゼネラル","brand:en":"Tonen General","brand:ja":"ゼネラル","brand:wikidata":"Q11528048","brand:wikipedia":"ja:東燃ゼネラル石油",name:"ゼネラル","name:en":"Tonen General","name:ja":"ゼネラル"}},"amenity/fuel|モービル":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"モービル","brand:ja":"モービル",name:"モービル","name:ja":"モービル"}},"amenity/fuel|中国石化":{countryCodes:["cn"],matchNames:["中国石化 Sinopec"],tags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"}},"amenity/fuel|中国石化加油站":{tags:{amenity:"fuel",brand:"中国石化加油站",name:"中国石化加油站"}},"amenity/fuel|中国石油":{countryCodes:["cn"],tags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"}},"amenity/fuel|全國加油站":{countryCodes:["tw"],tags:{amenity:"fuel",brand:"全國加油站",name:"全國加油站"}},"amenity/fuel|出光":{countryCodes:["jp"],tags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"}},"amenity/fuel|台灣中油":{countryCodes:["tw"],matchNames:["中油"],tags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation, Taiwan",name:"台灣中油","name:en":"CPC Corporation, Taiwan"}},"amenity/fuel|昭和シェル":{countryCodes:["jp"],matchNames:["昭和シェル石油"],tags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:ja":"昭和シェル","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu","name:ja":"昭和シェル"}},"amenity/hospital|VA Medical Center":{countryCodes:["us"],matchNames:["department of veterans affairs medical center","veterans administration","veterans administration hospital","veterans administration medical center","veterans affairs","veterans affairs hospital","veterans affairs medical center"],tags:{amenity:"hospital",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"hospital","healthcare:for":"veterans",name:"VA Medical Center",short_name:"VA"}},"amenity/ice_cream|Amorino":{tags:{amenity:"ice_cream",brand:"Amorino",name:"Amorino"}},"amenity/ice_cream|Baskin-Robbins":{tags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"}},"amenity/ice_cream|Ben & Jerry's":{tags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"}},"amenity/ice_cream|Bruster's Ice Cream":{countryCodes:["us"],matchNames:["brusters"],tags:{amenity:"ice_cream",brand:"Bruster's Ice Cream","brand:wikidata":"Q4979810","brand:wikipedia":"en:Bruster's Ice Cream",cuisine:"ice_cream",name:"Bruster's Ice Cream"}},"amenity/ice_cream|Cold Stone Creamery":{countryCodes:["ng","us"],matchNames:["cold stone"],tags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"}},"amenity/ice_cream|D'Onofrio":{countryCodes:["pe"],tags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"}},"amenity/ice_cream|Freddo":{tags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"}},"amenity/ice_cream|Graeter's":{countryCodes:["us"],matchNames:["greaters"],tags:{amenity:"ice_cream",brand:"Graeter's","brand:wikidata":"Q5592430","brand:wikipedia":"en:Graeter's",cuisine:"ice_cream",name:"Graeter's",takeaway:"yes"}},"amenity/ice_cream|Grido":{countryCodes:["ar"],matchNames:["grido helado"],matchTags:["shop/confectionary"],tags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"}},"amenity/ice_cream|Häagen-Dazs":{tags:{amenity:"ice_cream",brand:"Häagen-Dazs","brand:wikidata":"Q1143333","brand:wikipedia":"en:Häagen-Dazs",name:"Häagen-Dazs"}},"amenity/ice_cream|La Michoacana":{countryCodes:["mx"],matchNames:["paleteria la michoacana"],tags:{amenity:"ice_cream",brand:"La Michoacana","brand:wikidata":"Q17118857","brand:wikipedia":"en:Paletería La Michoacana",name:"La Michoacana"}},"amenity/ice_cream|Marble Slab Creamery":{countryCodes:["ca","us"],tags:{amenity:"ice_cream",brand:"Marble Slab Creamery","brand:wikidata":"Q17020087","brand:wikipedia":"en:Marble Slab Creamery",cuisine:"ice_cream",name:"Marble Slab Creamery"}},"amenity/ice_cream|Menchie's":{countryCodes:["ae","bh","bs","ca","cn","gb","in","jp","kw","qa","sa","us"],matchNames:["menchie's frozen yoghurt","menchie's frozen yogurt"],tags:{amenity:"ice_cream",brand:"Menchie's","brand:wikidata":"Q6816528","brand:wikipedia":"en:Menchie's Frozen Yogurt",cuisine:"frozen_yogurt",name:"Menchie's"}},"amenity/ice_cream|Pinkberry":{tags:{amenity:"ice_cream",brand:"Pinkberry","brand:wikidata":"Q2904053","brand:wikipedia":"en:Pinkberry",cuisine:"frozen_yogurt",name:"Pinkberry",takeaway:"yes"}},"amenity/ice_cream|Ralph's Italian Ices":{countryCodes:["us"],matchNames:["ralphs famous italian ices and ice cream","ralphs italian ice","ralphs italian ices and ice cream"],tags:{amenity:"ice_cream",brand:"Ralph's Italian Ices","brand:wikidata":"Q62576909",cuisine:"ice_cream",name:"Ralph's Italian Ices",official_name:"Ralph's Famous Italian Ices"}},"amenity/ice_cream|Rita's Italian Ice":{countryCodes:["us"],matchNames:["ritas","ritas water ice"],tags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"}},"amenity/ice_cream|Yogen Früz":{tags:{amenity:"ice_cream",brand:"Yogen Früz","brand:wikidata":"Q8054358","brand:wikipedia":"en:Yogen Früz",cuisine:"frozen_yogurt",name:"Yogen Früz",takeaway:"yes"}},"amenity/ice_cream|Yogurtland":{countryCodes:["ae","au","sg","th","us","ve"],tags:{amenity:"ice_cream",brand:"Yogurtland","brand:wikidata":"Q8054428","brand:wikipedia":"en:Yogurtland",cuisine:"frozen_yogurt",name:"Yogurtland",takeaway:"yes"}},"amenity/ice_cream|sweetFrog":{countryCodes:["us"],matchNames:["sweetfrog frozen yogurt","sweetfrog premium frozen yogurt"],tags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"}},"amenity/ice_cream|サーティワンアイスクリーム":{countryCodes:["jp"],tags:{amenity:"ice_cream",brand:"バスキン・ロビンス","brand:en":"Baskin-Robbins","brand:ja":"バスキン・ロビンス","brand:wikidata":"Q584601","brand:wikipedia":"ja:バスキン・ロビンス",cuisine:"ice_cream",name:"サーティワンアイスクリーム","name:en":"Baskin-Robbins","name:ja":"サーティワンアイスクリーム"}},"amenity/kindergarten|Children's Learning Adventure":{countryCodes:["us"],tags:{after_school:"yes",amenity:"kindergarten",brand:"Children's Learning Adventure","brand:wikidata":"Q64821213","brand:wikipedia":"en:Children's Learning Adventure",fee:"yes","isced:level":"0",name:"Children's Learning Adventure",nursery:"yes",preschool:"yes",short_name:"CLA"}},"amenity/kindergarten|Childtime":{countryCodes:["us"],matchNames:["childtime learning center","childtime learning centers"],tags:{amenity:"kindergarten",brand:"Childtime","brand:wikidata":"Q64877793",fee:"yes","isced:level":"0",name:"Childtime",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|KinderCare":{countryCodes:["us"],tags:{after_school:"yes",alt_name:"KinderCare Learning Center",amenity:"kindergarten",brand:"KinderCare","brand:wikidata":"Q6410551","brand:wikipedia":"en:KinderCare Learning Centers",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"KinderCare",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|La Petite Academy":{countryCodes:["us"],matchNames:["la petite"],tags:{amenity:"kindergarten",brand:"La Petite Academy","brand:wikidata":"Q64877784",fee:"yes","isced:level":"0",name:"La Petite Academy",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|New Horizon Academy":{countryCodes:["us"],tags:{after_school:"yes",amenity:"kindergarten",brand:"New Horizon Academy","brand:wikidata":"Q64821306",fee:"yes","isced:level":"0",name:"New Horizon Academy",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|Primrose School":{countryCodes:["us"],matchNames:["primrose"],tags:{after_school:"yes",alt_name:"Primrose Schools",amenity:"kindergarten",brand:"Primrose School","brand:wikidata":"Q7243677",fee:"yes","isced:level":"0",max_age:"12",min_age:"6 weeks",name:"Primrose School",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|The Children's Courtyard":{countryCodes:["us"],matchNames:["children's courtyard"],tags:{amenity:"kindergarten",brand:"The Children's Courtyard","brand:wikidata":"Q64877852",fee:"yes","isced:level":"0",name:"The Children's Courtyard",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|The Goddard School":{countryCodes:["us"],tags:{after_school:"yes",alt_name:"Goddard School",amenity:"kindergarten",brand:"The Goddard School","brand:wikidata":"Q5576260",fee:"yes","isced:level":"0",min_age:"6 weeks",name:"The Goddard School",nursery:"yes",preschool:"yes"}},"amenity/kindergarten|Tutor Time":{countryCodes:["us"],matchNames:["tutor time child care","tutor time child care learning center","tutor time learning center","tutor time learning centers"],tags:{amenity:"kindergarten",brand:"Tutor Time","brand:wikidata":"Q64877826",fee:"yes","isced:level":"0",name:"Tutor Time",nursery:"yes",preschool:"yes"}},"amenity/language_school|AEON":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"AEON","brand:en":"Aeon","brand:ja":"AEON","brand:ja-Hira":"イーオン","brand:ja-Latn":"AEON","brand:wikidata":"Q4687898","brand:wikipedia":"ja:イーオン","language:en":"main",name:"AEON","name:en":"Aeon","name:ja":"AEON","name:ja-Hira":"イーオン","name:ja-Latn":"AEON"}},"amenity/language_school|Berlitz":{tags:{amenity:"language_school",brand:"Berlitz","brand:wikidata":"Q821960","brand:wikipedia":"en:Berlitz Corporation",name:"Berlitz"}},"amenity/language_school|ECC外語学院":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"ECC外語学院","brand:en":"ECC Foreign Language Institute","brand:ja":"ECC外語学院","brand:ja-Hira":"イーシーシーがいごがくいん","brand:ja-Latn":"ECC Gaigo Gakuin","brand:wikidata":"Q5322655","brand:wikipedia":"ja:ECC総合教育機関","language:en":"main",name:"ECC外語学院","name:en":"ECC Foreign Language Institute","name:ja":"ECC外語学院","name:ja-Hira":"イーシーシーがいごがくいん","name:ja-Latn":"ECC Gaigo Gakuin",short_name:"ECC","short_name:en":"ECC","short_name:ja":"ECC","short_name:ja-Hira":"イーシーシー","short_name:ja-Latn":"ECC"}},"amenity/language_school|ELS":{countryCodes:["ca","in","my","pa","sa","tr","us","vn"],tags:{amenity:"language_school",brand:"ELS","brand:en":"ELS","brand:wikidata":"Q5323325","brand:wikipedia":"en:ELS Language Centers","language:en":"main",name:"ELS","name:en":"ELS",official_name:"ELS Language Centers","official_name:en":"ELS Language Centers"}},"amenity/language_school|GABA":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"GABA","brand:en":"Gaba","brand:ja":"GABA","brand:ja-Kana":"ガバ","brand:ja-Latn":"GABA","brand:wikidata":"Q5515241","brand:wikipedia":"ja:GABA (企業)","language:en":"main",name:"GABA","name:en":"Gaba","name:ja":"GABA","name:ja-Kana":"ガバ","name:ja-Latn":"GABA"}},"amenity/language_school|NOVA":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"NOVA","brand:en":"Nova","brand:ja":"NOVA","brand:ja-Hira":"ノヴァ","brand:ja-Latn":"NOVA","brand:wikidata":"Q7064000","brand:wikipedia":"ja:NOVA","language:en":"main",name:"NOVA","name:en":"Nova","name:ja":"NOVA","name:ja-Hira":"ノヴァ","name:ja-Latn":"NOVA"}},"amenity/language_school|Shane English School":{countryCodes:["cn","dz","gb","hk","id","kr","pl","th","tw","vn"],tags:{amenity:"language_school",brand:"Shane English School","brand:en":"Shane English School","brand:ja":"シェーン英会話","brand:ja-Latn":"Shēn Eikaiwa","brand:wikidata":"Q17054332","brand:wikipedia":"en:Shane English School","language:en":"main",name:"Shane English School","name:en":"Shane English School","name:ja":"シェーン英会話","name:ja-Latn":"Shēn Eikaiwa"}},"amenity/language_school|シェーン英会話":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"シェーン英会話","brand:en":"Shane English School","brand:ja":"シェーン英会話","brand:ja-Latn":"Shēn Eikaiwa","brand:wikidata":"Q17054332","brand:wikipedia":"ja:シェーン英会話スクール","language:en":"main",name:"シェーン英会話","name:en":"Shane English School","name:ja":"シェーン英会話","name:ja-Latn":"Shēn Eikaiwa"}},"amenity/language_school|セイハ英語学院":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"セイハ英語学院","brand:en":"Seiha English Academy","brand:ja":"セイハ英語学院","brand:ja-Hani":"セイハえいごがくいん","brand:ja-Latn":"Seiha Eigo Gakuin","brand:wikidata":"Q7446694","language:en":"main",name:"セイハ英語学院","name:en":"Seiha English Academy","name:ja":"セイハ英語学院","name:ja-Hani":"セイハえいごがくいん","name:ja-Latn":"Seiha Eigo Gakuin"}},"amenity/language_school|ベルリッツ":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"ベルリッツ","brand:en":"Berlitz","brand:ja":"ベルリッツ","brand:ja-Hira":"ベルリッツ","brand:wikidata":"Q4892545","brand:wikipedia":"ja:ベルリッツ・ジャパン",name:"ベルリッツ","name:en":"Berlitz","name:ja":"ベルリッツ","name:ja-Hira":"ベルリッツ"}},"amenity/language_school|ペッピーキッズクラブ":{countryCodes:["jp"],tags:{amenity:"language_school",brand:"ペッピーキッズクラブ","brand:en":"Peppy Kids Club","brand:ja":"ペッピーキッズクラブ","brand:ja-Latn":"Peppi Kizzu Kurabu","brand:wikidata":"Q7166471","brand:wikipedia":"ja:ペッピーキッズクラブ","language:en":"main",name:"ペッピーキッズクラブ","name:en":"Peppy Kids Club","name:ja":"ペッピーキッズクラブ","name:ja-Latn":"Peppi Kizzu Kurabu"}},"amenity/money_transfer|Express Union":{countryCodes:["td"],matchTags:["amenity/bank"],nomatch:["amenity/bank|Banco Unión","amenity/bank|UnionBank"],tags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"}},"amenity/money_transfer|Hoa Phát":{countryCodes:["us"],matchNames:["hoa phat goi tien","hoa phat gui tien"],tags:{amenity:"money_transfer",brand:"Hoa Phát","brand:wikidata":"Q65116775",name:"Hoa Phát","name:vi":"Hoa Phát"}},"amenity/money_transfer|MoneyGram":{countryCodes:["de","fr","gr"],tags:{amenity:"money_transfer",brand:"MoneyGram","brand:wikidata":"Q1944412","brand:wikipedia":"en:MoneyGram",name:"MoneyGram"}},"amenity/money_transfer|Orange Money":{countryCodes:["ml"],tags:{amenity:"money_transfer",brand:"Orange Money","brand:wikidata":"Q16668220","brand:wikipedia":"en:Orange Money",name:"Orange Money"}},"amenity/money_transfer|Western Union":{matchTags:["amenity/bureau_de_change"],nomatch:["amenity/bank|Western Union"],tags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"}},"amenity/parking|Parking Company of America":{countryCodes:["us"],tags:{amenity:"parking",brand:"Parking Company of America","brand:wikidata":"Q65491376",fee:"yes",name:"Parking Company of America",short_name:"PCA"}},"amenity/parking|SP+":{countryCodes:["ca","us"],matchNames:["central parking","central parking system","standard parking"],nomatch:["amenity/fuel|SP"],tags:{alt_name:"SP Plus",amenity:"parking",brand:"SP+","brand:wikidata":"Q7598289","brand:wikipedia":"en:SP Plus Corporation",fee:"yes",name:"SP+"}},"amenity/payment_centre|Abitab":{countryCodes:["uy"],matchTags:["amenity/bureau_de_change"],tags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"}},"amenity/payment_centre|Rapipago":{countryCodes:["ar"],tags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"}},"amenity/payment_terminal|Qiwi":{countryCodes:["ru"],tags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"}},"amenity/payment_terminal|ПриватБанк":{countryCodes:["ua"],tags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"}},"amenity/payment_terminal|Сбербанк":{tags:{amenity:"payment_terminal",brand:"Сбербанк",name:"Сбербанк"}},"amenity/payment_terminal|Элекснет":{countryCodes:["ru"],tags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"}},"amenity/pharmacy|36,6":{countryCodes:["ru"],matchNames:["аптека 36,6"],tags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"}},"amenity/pharmacy|Amavita":{countryCodes:["ch"],tags:{amenity:"pharmacy",brand:"Amavita",healthcare:"pharmacy",name:"Amavita"}},"amenity/pharmacy|Amcal":{countryCodes:["au"],matchNames:["amcal pharmacy"],tags:{amenity:"pharmacy",brand:"Amcal","brand:wikidata":"Q63367373",healthcare:"pharmacy",name:"Amcal"}},"amenity/pharmacy|Apollo Pharmacy":{countryCodes:["in"],nomatch:["shop/optician|Apollo-Optik"],tags:{amenity:"pharmacy",brand:"Apollo Pharmacy","brand:wikidata":"Q62562612",healthcare:"pharmacy",name:"Apollo Pharmacy"}},"amenity/pharmacy|Apotek Hjärtat":{countryCodes:["se"],tags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"}},"amenity/pharmacy|Bartell Drugs":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"}},"amenity/pharmacy|Benavides":{countryCodes:["mx"],tags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"}},"amenity/pharmacy|Benu":{tags:{amenity:"pharmacy",brand:"Benu","brand:wikidata":"Q62562792",healthcare:"pharmacy",name:"Benu"}},"amenity/pharmacy|Blooms The Chemist":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Blooms The Chemist","brand:wikidata":"Q63367543",healthcare:"pharmacy",name:"Blooms The Chemist",shop:"chemist"}},"amenity/pharmacy|Boots":{countryCodes:["gb"],matchNames:["boots pharmacy"],nomatch:["shop/chemist|Boots"],tags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"}},"amenity/pharmacy|Boticas y Salud":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Boticas y Salud","brand:wikidata":"Q62563126",healthcare:"pharmacy",name:"Boticas y Salud"}},"amenity/pharmacy|Brookshire Brothers Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"}},"amenity/pharmacy|Brookshire's Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Brookshire's Pharmacy",healthcare:"pharmacy",name:"Brookshire's Pharmacy"}},"amenity/pharmacy|CVS Pharmacy":{countryCodes:["us"],nomatch:["amenity/vending_machine|CVS Pharmacy","shop/chemist|CVS Pharmacy"],tags:{amenity:"pharmacy",brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS Pharmacy",short_name:"CVS"}},"amenity/pharmacy|Camelia":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Camelia","brand:wikidata":"Q15867413","brand:wikipedia":"lt:Nemuno vaistinė",healthcare:"pharmacy",name:"Camelia"}},"amenity/pharmacy|Catena":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"}},"amenity/pharmacy|Chemist King Discount Pharmacy":{countryCodes:["au"],matchNames:["chemist king","chemist king discount pharmacies"],tags:{amenity:"pharmacy",brand:"Chemist King Discount Pharmacy","brand:wikidata":"Q63367667",healthcare:"pharmacy",name:"Chemist King Discount Pharmacy"}},"amenity/pharmacy|Chemist Warehouse":{countryCodes:["au","nz"],tags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"}},"amenity/pharmacy|Clicks":{countryCodes:["za"],tags:{amenity:"pharmacy",brand:"Clicks","brand:wikidata":"Q62563622",healthcare:"pharmacy",name:"Clicks"}},"amenity/pharmacy|Costco Pharmacy":{countryCodes:["us"],nomatch:["amenity/fuel|Costco Gasoline","shop/wholesale|Costco"],tags:{amenity:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",healthcare:"pharmacy",name:"Costco Pharmacy"}},"amenity/pharmacy|Cruz Azul":{countryCodes:["ec"],matchNames:["farmacias cruz azul"],tags:{amenity:"pharmacy",brand:"Cruz Azul","brand:wikidata":"Q62108219",healthcare:"pharmacy",name:"Cruz Azul"}},"amenity/pharmacy|Cruz Verde":{countryCodes:["cl"],matchNames:["farmacias cruz verde"],tags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"}},"amenity/pharmacy|Day Lewis Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Day Lewis Pharmacy","brand:wikidata":"Q62563772",healthcare:"pharmacy",name:"Day Lewis Pharmacy"}},"amenity/pharmacy|Dbam o Zdrowie":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Dbam o Zdrowie","brand:wikidata":"Q62563833",healthcare:"pharmacy",name:"Dbam o Zdrowie"}},"amenity/pharmacy|Dr. Max":{countryCodes:["cz","pl","sk"],tags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"}},"amenity/pharmacy|Droga Raia":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"}},"amenity/pharmacy|Drogaria São Paulo":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"}},"amenity/pharmacy|Drogasil":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil",wheelchair:"yes"}},"amenity/pharmacy|Duane Reade":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"}},"amenity/pharmacy|Eurovaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"}},"amenity/pharmacy|Extrafarma":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Extrafarma","brand:wikidata":"Q20055480","brand:wikipedia":"pt:Extrafarma",healthcare:"pharmacy",name:"Extrafarma"}},"amenity/pharmacy|Familiprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"}},"amenity/pharmacy|Farmacenter~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"Q62563928",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacenter~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Farmacenter","brand:wikidata":"",healthcare:"pharmacy",name:"Farmacenter"}},"amenity/pharmacy|Farmacia Benavides":{countryCodes:["mx"],tags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"}},"amenity/pharmacy|Farmacia Familiei":{countryCodes:["md"],tags:{amenity:"pharmacy",brand:"Farmacia Familiei",healthcare:"pharmacy",name:"Farmacia Familiei"}},"amenity/pharmacy|Farmacia Guadalajara":{countryCodes:["mx"],matchNames:["farmacias guadalajara"],tags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"}},"amenity/pharmacy|Farmacias Ahumada":{tags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"}},"amenity/pharmacy|Farmacias Benavides":{tags:{amenity:"pharmacy",brand:"Farmacias Benavides",healthcare:"pharmacy",name:"Farmacias Benavides"}},"amenity/pharmacy|Farmacias Económicas~(Ecuador)":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108380",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias Económicas~(El Salvador)":{countryCodes:["sv"],tags:{amenity:"pharmacy",brand:"Farmacias Económicas","brand:wikidata":"Q62108397",healthcare:"pharmacy",name:"Farmacias Económicas"}},"amenity/pharmacy|Farmacias Similares":{countryCodes:["cl","gt","mx"],matchNames:["similares"],tags:{amenity:"pharmacy",brand:"Farmacias Similares","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias Similares"}},"amenity/pharmacy|Farmacias del Ahorro":{countryCodes:["mx"],matchNames:["farmacia del ahorro"],tags:{amenity:"pharmacy",brand:"Farmacias del Ahorro","brand:wikidata":"Q62086647",healthcare:"pharmacy",name:"Farmacias del Ahorro"}},"amenity/pharmacy|Farmacias del Dr. Simi":{countryCodes:["cl","gt","mx"],tags:{amenity:"pharmacy",brand:"Farmacias del Dr. Simi","brand:wikidata":"Q62564610",healthcare:"pharmacy",name:"Farmacias del Dr. Simi"}},"amenity/pharmacy|Farmacity":{countryCodes:["ra"],tags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"}},"amenity/pharmacy|Farmacorp":{countryCodes:["bo"],tags:{amenity:"pharmacy",brand:"Farmacorp",healthcare:"pharmacy",name:"Farmacorp"}},"amenity/pharmacy|Farmahorro":{tags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"}},"amenity/pharmacy|Farmatodo":{tags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"}},"amenity/pharmacy|Farmácia São João":{tags:{amenity:"pharmacy",brand:"Farmácia São João",healthcare:"pharmacy",name:"Farmácia São João"}},"amenity/pharmacy|Felicia":{countryCodes:["md"],tags:{amenity:"pharmacy",brand:"Felicia","brand:wikidata":"Q62564805",healthcare:"pharmacy",name:"Felicia"}},"amenity/pharmacy|Fybeca":{countryCodes:["ec"],tags:{amenity:"pharmacy",brand:"Fybeca","brand:wikidata":"Q62564822",healthcare:"pharmacy",name:"Fybeca"}},"amenity/pharmacy|Generika":{countryCodes:["ph"],matchNames:["generika drugstore"],tags:{amenity:"pharmacy",brand:"Generika","brand:wikidata":"Q62564876",healthcare:"pharmacy",name:"Generika"}},"amenity/pharmacy|Gintarinė vaistinė":{countryCodes:["lt"],tags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"}},"amenity/pharmacy|Guardian~(Asia)":{countryCodes:["bn","id","kh","my","sg","vn"],tags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q63371124",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|Guardian~(Australia)":{countryCodes:["au"],matchNames:["guardian pharmacies","guardian pharmacy"],tags:{brand:"Guardian","brand:wikidata":"Q63367814",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|Guardian~(Canada)":{countryCodes:["ca"],nomatch:["amenity/pharmacy|Guardian~(Asia)","amenity/pharmacy|Guardian~(Australia)"],tags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q65553864",healthcare:"pharmacy",name:"Guardian"}},"amenity/pharmacy|H-E-B Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"}},"amenity/pharmacy|Health Mart":{countryCodes:["us"],matchNames:["health mart pharmacy"],tags:{amenity:"pharmacy",brand:"Health Mart","brand:wikidata":"Q5690597","brand:wikipedia":"en:Health Mart",healthcare:"pharmacy",name:"Health Mart"}},"amenity/pharmacy|Hy-Vee Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"}},"amenity/pharmacy|I.D.A.":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"I.D.A.","brand:wikidata":"Q65553883",healthcare:"pharmacy",name:"I.D.A."}},"amenity/pharmacy|Inkafarma":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"}},"amenity/pharmacy|Jean Coutu":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"}},"amenity/pharmacy|Kimia Farma":{countryCodes:["id"],tags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"}},"amenity/pharmacy|Kinney Drugs":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"}},"amenity/pharmacy|Kroger Pharmacy":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Kroger Pharmacy",healthcare:"pharmacy",name:"Kroger Pharmacy"}},"amenity/pharmacy|Kronans Apotek":{countryCodes:["se"],tags:{amenity:"pharmacy",brand:"Kronans Apotek",healthcare:"pharmacy",name:"Kronans Apotek"}},"amenity/pharmacy|Lloyds Pharmacy":{countryCodes:["be","gb","ie","im"],matchNames:["lloyds"],tags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"}},"amenity/pharmacy|London Drugs":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"}},"amenity/pharmacy|Longs Drugs~(Hawaii)":{countryCodes:["us"],tags:{amenity:"pharmacy",brand:"Longs Drugs","brand:wikidata":"Q16931196","brand:wikipedia":"en:Longs Drugs",healthcare:"pharmacy",name:"Longs Drugs",short_name:"Longs"}},"amenity/pharmacy|Mannings":{countryCodes:["cn","hk","mo"],tags:{amenity:"pharmacy",brand:"Mannings","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Mannings"}},"amenity/pharmacy|Marc's Pharmacy":{countryCodes:["us"],nomatch:["shop/supermarket|Marc's"],tags:{amenity:"pharmacy",brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",healthcare:"pharmacy",name:"Marc's Pharmacy"}},"amenity/pharmacy|MedPlus":{countryCodes:["in"],tags:{amenity:"pharmacy",brand:"MedPlus","brand:wikidata":"Q65684234","brand:wikipedia":"en:MedPlus",healthcare:"pharmacy",name:"MedPlus"}},"amenity/pharmacy|Mercury Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"}},"amenity/pharmacy|Mifarma":{countryCodes:["pe"],tags:{amenity:"pharmacy",brand:"Mifarma","brand:wikidata":"Q62564998",healthcare:"pharmacy",name:"Mifarma"}},"amenity/pharmacy|Multipharma":{countryCodes:["be"],tags:{amenity:"pharmacy",brand:"Multipharma","brand:wikidata":"Q62565018",healthcare:"pharmacy",name:"Multipharma"}},"amenity/pharmacy|Mēness aptieka":{countryCodes:["lv"],tags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"}},"amenity/pharmacy|Pague Menos":{countryCodes:["br"],matchNames:["farmácia pague menos"],tags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"}},"amenity/pharmacy|Panvel":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"Panvel","brand:wikipedia":"pt:Panvel","branf:wikidata":"Q10344254",healthcare:"pharmacy",name:"Panvel"}},"amenity/pharmacy|PharmaChoice":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"PharmaChoice","brand:wikidata":"Q7180716","brand:wikipedia":"en:PharmaChoice",healthcare:"pharmacy",name:"PharmaChoice"}},"amenity/pharmacy|PharmaSave~(Australia)":{countryCodes:["au"],nomatch:["amenity/pharmacy|Pharmasave~(Canada)"],tags:{amenity:"pharmacy",brand:"PharmaSave","brand:wikidata":"Q63367906",healthcare:"pharmacy",name:"PharmaSave"}},"amenity/pharmacy|Pharmacie Principale":{tags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:Groupe PP Holding",healthcare:"pharmacy",name:"Pharmacie Principale"}},"amenity/pharmacy|Pharmacy 4 Less":{countryCodes:["au"],tags:{amenity:"pharmacy",brand:"Pharmacy 4 Less","brand:wikidata":"Q63367608",healthcare:"pharmacy",name:"Pharmacy 4 Less"}},"amenity/pharmacy|Pharmaprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"}},"amenity/pharmacy|Pharmasave~(Canada)":{countryCodes:["ca"],nomatch:["amenity/pharmacy|Pharmasave~(Australia)"],tags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"}},"amenity/pharmacy|Priceline Pharmacy":{countryCodes:["au"],matchNames:["priceline"],tags:{amenity:"pharmacy",brand:"Priceline Pharmacy","brand:wikidata":"Q7242652","brand:wikipedia":"en:Priceline (Australia)",healthcare:"pharmacy",name:"Priceline Pharmacy"}},"amenity/pharmacy|Punto Farma~(Colombia)":{countryCodes:["co"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595271",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Honduras)":{countryCodes:["hn"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595229",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Punto Farma~(Paraguay)":{countryCodes:["py"],tags:{amenity:"pharmacy",brand:"Punto Farma","brand:wikidata":"Q62595220",healthcare:"pharmacy",name:"Punto Farma"}},"amenity/pharmacy|Remedy'sRx":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Remedy'sRx","brand:wikidata":"Q65553833",healthcare:"pharmacy",name:"Remedy'sRx"}},"amenity/pharmacy|Rexall":{countryCodes:["ca","us"],tags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"}},"amenity/pharmacy|Rite Aid":{countryCodes:["us"],matchNames:["rite aid pharmacy"],nomatch:["shop/chemist|Rite Aid"],tags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"}},"amenity/pharmacy|Rose Pharmacy":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"Rose Pharmacy","brand:wikidata":"Q62663208",healthcare:"pharmacy",name:"Rose Pharmacy"}},"amenity/pharmacy|Rowlands Pharmacy":{countryCodes:["gb"],tags:{amenity:"pharmacy",brand:"Rowlands Pharmacy","brand:wikidata":"Q62663235",healthcare:"pharmacy",name:"Rowlands Pharmacy"}},"amenity/pharmacy|SalcoBrand":{countryCodes:["cl"],matchNames:["farmacias salcobrand"],tags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"}},"amenity/pharmacy|Sana Sana":{countryCodes:["ec"],matchNames:["farmacias sana sana"],tags:{amenity:"pharmacy",brand:"Sana Sana","brand:wikidata":"Q62564499",healthcare:"pharmacy",name:"Sana Sana"}},"amenity/pharmacy|Sensiblu":{countryCodes:["ro"],tags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"}},"amenity/pharmacy|Shoppers Drug Mart":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"}},"amenity/pharmacy|South Star Drug":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"}},"amenity/pharmacy|Superdrug":{countryCodes:["gb"],nomatch:["shop/chemist|Superdrug"],tags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"}},"amenity/pharmacy|São João":{countryCodes:["br"],tags:{amenity:"pharmacy",brand:"São João","brand:wikidata":"Q62663306",healthcare:"pharmacy",name:"São João"}},"amenity/pharmacy|Słoneczna":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Słoneczna",healthcare:"pharmacy",name:"Słoneczna"}},"amenity/pharmacy|TGP":{countryCodes:["ph"],tags:{amenity:"pharmacy",brand:"The Generics Pharmacy","brand:wikidata":"Q61948677",healthcare:"pharmacy",name:"TGP",official_name:"The Generics Pharmacy"}},"amenity/pharmacy|TerryWhite Chemmart":{countryCodes:["au"],matchNames:["terrywhite","terrywhite chemist","terrywhite chemists"],tags:{amenity:"pharmacy",brand:"TerryWhite Chemmart","brand:wikidata":"Q24089773","brand:wikipedia":"en:Terry White Chemmart",healthcare:"pharmacy",name:"TerryWhite Chemmart"}},"amenity/pharmacy|UFS":{countryCodes:["au"],matchNames:["ufs dispensaries"],tags:{amenity:"pharmacy",brand:"UFS","brand:wikidata":"Q63367573",healthcare:"pharmacy",name:"UFS"}},"amenity/pharmacy|Unichem Pharmacy":{countryCodes:["nz"],tags:{amenity:"pharmacy",brand:"Unichem Pharmacy","brand:wikidata":"Q62663379",healthcare:"pharmacy",name:"Unichem Pharmacy"}},"amenity/pharmacy|Uniprix":{countryCodes:["ca"],tags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"}},"amenity/pharmacy|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],nomatch:["shop/chemist|Walgreens"],tags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"}},"amenity/pharmacy|Walmart Pharmacy":{countryCodes:["ca","us"],tags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy"}},"amenity/pharmacy|Watsons":{nomatch:["shop/chemist|Watsons"],tags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"}},"amenity/pharmacy|Well Pharmacy":{countryCodes:["gb"],matchNames:["well"],tags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"}},"amenity/pharmacy|Ziko Apteka":{countryCodes:["pl"],tags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"}},"amenity/pharmacy|Φαρμακειο":{countryCodes:["cy","gr"],tags:{amenity:"pharmacy",brand:"Φαρμακειο",healthcare:"pharmacy",name:"Φαρμακειο"}},"amenity/pharmacy|А-мега":{tags:{amenity:"pharmacy",brand:"А-мега",healthcare:"pharmacy",name:"А-мега"}},"amenity/pharmacy|А5":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"А5","brand:wikidata":"Q62663476",healthcare:"pharmacy",name:"А5"}},"amenity/pharmacy|Алоэ":{tags:{amenity:"pharmacy",brand:"Алоэ",healthcare:"pharmacy",name:"Алоэ"}},"amenity/pharmacy|Бажаємо здоров'я":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Бажаємо здоров'я",healthcare:"pharmacy",name:"Бажаємо здоров'я"}},"amenity/pharmacy|Бережная аптека":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Бережная аптека","brand:wikidata":"Q62664194",healthcare:"pharmacy",name:"Бережная аптека"}},"amenity/pharmacy|Будь здоров":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Будь здоров",healthcare:"pharmacy",name:"Будь здоров"}},"amenity/pharmacy|Вита":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Вита",healthcare:"pharmacy",name:"Вита"}},"amenity/pharmacy|Горздрав":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Горздрав",healthcare:"pharmacy",name:"Горздрав"}},"amenity/pharmacy|Добрая аптека":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Добрая аптека",healthcare:"pharmacy",name:"Добрая аптека"}},"amenity/pharmacy|Доктор Столетов":{tags:{amenity:"pharmacy",brand:"Доктор Столетов",healthcare:"pharmacy",name:"Доктор Столетов"}},"amenity/pharmacy|Живика":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Живика",healthcare:"pharmacy",name:"Живика"}},"amenity/pharmacy|Здоровье":{countryCodes:["kz","ru","ua"],tags:{amenity:"pharmacy",brand:"Здоровье",healthcare:"pharmacy",name:"Здоровье"}},"amenity/pharmacy|Зеленая аптека":{countryCodes:["by"],tags:{amenity:"pharmacy",brand:"Зеленая аптека",healthcare:"pharmacy",name:"Зеленая аптека"}},"amenity/pharmacy|Имплозия":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Имплозия",healthcare:"pharmacy",name:"Имплозия"}},"amenity/pharmacy|Классика":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Классика",healthcare:"pharmacy",name:"Классика"}},"amenity/pharmacy|Ладушка":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Ладушка",healthcare:"pharmacy",name:"Ладушка"}},"amenity/pharmacy|Максавит":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Максавит",healthcare:"pharmacy",name:"Максавит"}},"amenity/pharmacy|Марешки":{countryCodes:["bg"],tags:{amenity:"pharmacy",brand:"Марешки",healthcare:"pharmacy",name:"Марешки"}},"amenity/pharmacy|Мед-сервіс":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Мед-сервіс",healthcare:"pharmacy",name:"Мед-сервіс"}},"amenity/pharmacy|Мелодия здоровья":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Мелодия здоровья",healthcare:"pharmacy",name:"Мелодия здоровья"}},"amenity/pharmacy|Невис":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Невис",healthcare:"pharmacy",name:"Невис"}},"amenity/pharmacy|Неофарм":{tags:{amenity:"pharmacy",brand:"Неофарм",healthcare:"pharmacy",name:"Неофарм"}},"amenity/pharmacy|Норма":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Норма",healthcare:"pharmacy",name:"Норма"}},"amenity/pharmacy|Озерки":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Озерки",healthcare:"pharmacy",name:"Озерки"}},"amenity/pharmacy|Панацея":{countryCodes:["kz","ru","ua"],tags:{amenity:"pharmacy",brand:"Панацея",healthcare:"pharmacy",name:"Панацея"}},"amenity/pharmacy|Первая помощь":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Первая помощь",healthcare:"pharmacy",name:"Первая помощь"}},"amenity/pharmacy|Планета здоровья":{countryCodes:["by","ru"],tags:{amenity:"pharmacy",brand:"Планета здоровья",healthcare:"pharmacy",name:"Планета здоровья"}},"amenity/pharmacy|Подорожник":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Подорожник",healthcare:"pharmacy",name:"Подорожник"}},"amenity/pharmacy|Радуга":{tags:{amenity:"pharmacy",brand:"Радуга",healthcare:"pharmacy",name:"Радуга"}},"amenity/pharmacy|Ригла":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"}},"amenity/pharmacy|Семейная":{countryCodes:["kz","ru"],tags:{amenity:"pharmacy",brand:"Семейная",healthcare:"pharmacy",name:"Семейная"}},"amenity/pharmacy|Семейная аптека":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Семейная аптека",healthcare:"pharmacy",name:"Семейная аптека"}},"amenity/pharmacy|Социальная аптека":{countryCodes:["ru","ua"],tags:{amenity:"pharmacy",brand:"Социальная аптека",healthcare:"pharmacy",name:"Социальная аптека"}},"amenity/pharmacy|Столички":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Столички",healthcare:"pharmacy",name:"Столички"}},"amenity/pharmacy|Фармакопейка":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармакопейка",healthcare:"pharmacy",name:"Фармакопейка"}},"amenity/pharmacy|Фармакор":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармакор",healthcare:"pharmacy",name:"Фармакор"}},"amenity/pharmacy|Фармація":{countryCodes:["ua"],tags:{amenity:"pharmacy",brand:"Фармація",healthcare:"pharmacy",name:"Фармація"}},"amenity/pharmacy|Фармленд":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармленд",healthcare:"pharmacy",name:"Фармленд"}},"amenity/pharmacy|Центральная аптека":{countryCodes:["by","kz","ru","ua","uz"],tags:{amenity:"pharmacy",brand:"Центральная аптека",healthcare:"pharmacy",name:"Центральная аптека"}},"amenity/pharmacy|סופר-פארם":{countryCodes:["il"],tags:{amenity:"pharmacy",brand:"סופר-פארם","brand:he":"סופר-פארם","brand:wikidata":"Q13220217","brand:wikipedia":"en:Super-Pharm",healthcare:"pharmacy",name:"סופר-פארם","name:he":"סופר-פארם"}},"amenity/pharmacy|くすりの福太郎":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:en":"Kusurino FUKUTARO","brand:ja":"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎","name:en":"Kusurino Fukutaro","name:ja":"くすりの福太郎"}},"amenity/pharmacy|さくら薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"さくら薬局","brand:ja":"さくら薬局",healthcare:"pharmacy",name:"さくら薬局","name:ja":"さくら薬局"}},"amenity/pharmacy|ウェルパーク":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウェルパーク","brand:ja":"ウェルパーク","brand:wikidata":"Q11288610","brand:wikipedia":"ja:ウェルパーク",healthcare:"pharmacy",name:"ウェルパーク","name:en":"Welpark","name:ja":"ウェルパーク"}},"amenity/pharmacy|ウエルシア":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア","brand:en":"Welcia","brand:ja":"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア","name:en":"Welcia","name:ja":"ウエルシア"}},"amenity/pharmacy|ウエルシア薬局":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:en":"Welcia Yakkyoku","brand:ja":"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局","name:en":"Welcia Yakkyoku","name:ja":"ウエルシア薬局"}},"amenity/pharmacy|カワチ薬品":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"カワチ薬品","brand:en":"Cawachi","brand:ja":"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品","name:en":"Cawachi","name:ja":"カワチ薬品"}},"amenity/pharmacy|キリン堂":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"キリン堂","brand:en":"Kirindo","brand:ja":"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂","name:en":"Kirindo","name:ja":"キリン堂"}},"amenity/pharmacy|クスリのアオキ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クスリのアオキ","brand:ja":"クスリのアオキ",healthcare:"pharmacy",name:"クスリのアオキ","name:ja":"クスリのアオキ"}},"amenity/pharmacy|クリエイト":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイト","brand:en":"Create","brand:ja":"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト","name:en":"Create","name:ja":"クリエイト"}},"amenity/pharmacy|クリエイトSD":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"クリエイトSD","brand:ja":"クリエイトSD",healthcare:"pharmacy",name:"クリエイトSD","name:ja":"クリエイトSD"}},"amenity/pharmacy|ココカラファイン":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ココカラファイン","brand:ja":"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン","name:en":"Cocokara Fine","name:ja":"ココカラファイン"}},"amenity/pharmacy|サツドラ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サツドラ","brand:ja":"サツドラ",healthcare:"pharmacy",name:"サツドラ","name:ja":"サツドラ"}},"amenity/pharmacy|サンドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"サンドラッグ","brand:ja":"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ","name:en":"Sundrug","name:ja":"サンドラッグ"}},"amenity/pharmacy|スギ薬局":{countryCodes:["jp"],nomatch:["shop/chemist|スギ薬局"],tags:{amenity:"pharmacy",brand:"スギ薬局","brand:en":"Sugi Pharmacy","brand:ja":"スギ薬局","brand:wikidata":"Q11311460","brand:wikipedia":"ja:スギ薬局",healthcare:"pharmacy",name:"スギ薬局","name:en":"Sugi Pharmacy","name:ja":"スギ薬局"}},"amenity/pharmacy|セイジョー":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"セイジョー","brand:en":"Seijo","brand:ja":"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー","name:en":"Seijo","name:ja":"セイジョー"}},"amenity/pharmacy|ダイコクドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:en":"Daikoku Drug","brand:ja":"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ","name:en":"Daikoku Drug","name:ja":"ダイコクドラッグ"}},"amenity/pharmacy|ツルハドラッグ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ツルハドラッグ","brand:en":"Tsuruha","brand:ja":"ツルハドラッグ","brand:wikidata":"Q11318826","brand:wikipedia":"ja:ツルハ",healthcare:"pharmacy",name:"ツルハドラッグ","name:en":"Tsuruha","name:ja":"ツルハドラッグ"}},"amenity/pharmacy|トモズ":{countryCodes:["jp"],matchNames:["トモズエキスプレス"],tags:{amenity:"pharmacy",brand:"トモズ","brand:en":"Tomod's","brand:ja":"トモズ","brand:wikidata":"Q7820097","brand:wikipedia":"ja:トモズ",healthcare:"pharmacy",name:"トモズ","name:en":"Tomod's","name:ja":"トモズ"}},"amenity/pharmacy|ドラッグセイムス":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"ドラッグセイムス","brand:ja":"ドラッグセイムス",healthcare:"pharmacy",name:"ドラッグセイムス","name:ja":"ドラッグセイムス"}},"amenity/pharmacy|マツモトキヨシ":{countryCodes:["jp"],tags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:en":"Matsukiyo","brand:ja":"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ","name:en":"Matsukiyo","name:ja":"マツモトキヨシ"}},"amenity/pharmacy|丁丁藥局":{nomatch:["shop/chemist|丁丁藥局"],tags:{amenity:"pharmacy",brand:"丁丁藥局",healthcare:"pharmacy",name:"丁丁藥局"}},"amenity/pharmacy|屈臣氏":{nomatch:["shop/chemist|屈臣氏"],tags:{amenity:"pharmacy",brand:"屈臣氏",healthcare:"pharmacy",name:"屈臣氏"}},"amenity/post_box|Canada Post":{countryCodes:["ca"],nomatch:["amenity/post_office|Canada Post"],tags:{amenity:"post_box",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"}},"amenity/post_box|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag"],nomatch:["amenity/post_office|Deutsche Post"],tags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_box|FedEx":{nomatch:["amenity/post_office|FedEx"],tags:{amenity:"post_box",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"}},"amenity/post_box|UPS":{countryCodes:["ca","us"],nomatch:["amenity/post_office|The UPS Store"],tags:{amenity:"post_box",brand:"UPS","brand:wikidata":"Q155026","brand:wikipedia":"en:United Parcel Service",name:"UPS"}},"amenity/post_box|USPS":{countryCodes:["us"],nomatch:["amenity/post_office|USPS"],tags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS"}},"amenity/post_box|差出箱13号":{countryCodes:["jp"],tags:{amenity:"post_box",brand:"差出箱13号",name:"差出箱13号"}},"amenity/post_office|Australia Post":{countryCodes:["au"],tags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"}},"amenity/post_office|CTT":{countryCodes:["mo"],tags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"}},"amenity/post_office|Canada Post":{countryCodes:["ca"],nomatch:["amenity/post_box|Canada Post"],tags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"}},"amenity/post_office|Chilexpress":{countryCodes:["cl"],tags:{amenity:"post_office",brand:"Chilexpress",name:"Chilexpress"}},"amenity/post_office|Correios":{countryCodes:["br"],tags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"}},"amenity/post_office|Correo Argentino":{countryCodes:["ar"],tags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"}},"amenity/post_office|Correos de Chile":{countryCodes:["cl"],tags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"}},"amenity/post_office|Correos de Costa Rica":{countryCodes:["cr"],tags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"}},"amenity/post_office|Correos de México":{countryCodes:["mx"],tags:{amenity:"post_office",brand:"Correos de México","brand:wikidata":"Q5172898","brand:wikipedia":"en:Correos de México",name:"Correos de México"}},"amenity/post_office|DHL":{matchNames:["dhl paketshop"],tags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL"}},"amenity/post_office|DPD Paketshop":{countryCodes:["at","de","pl"],tags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"}},"amenity/post_office|Deutsche Post":{countryCodes:["de"],matchNames:["deutsche post ag","deutsche post filiale"],tags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"}},"amenity/post_office|Fancourier":{countryCodes:["ro"],tags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"}},"amenity/post_office|FedEx":{nomatch:["amenity/post_box|FedEx"],tags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"}},"amenity/post_office|Hermes Paketshop":{countryCodes:["de"],matchNames:["hermes"],tags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"}},"amenity/post_office|LBC":{countryCodes:["ph"],matchNames:["lbc express"],tags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"}},"amenity/post_office|La Poste":{tags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"}},"amenity/post_office|MRW":{tags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"}},"amenity/post_office|OCA":{countryCodes:["ar"],tags:{amenity:"post_office",brand:"OCA",name:"OCA"}},"amenity/post_office|Oficina de Correos":{matchNames:["correos"],tags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"}},"amenity/post_office|PTT":{nomatch:["amenity/fuel|PTT"],tags:{amenity:"post_office",brand:"PTT",name:"PTT"}},"amenity/post_office|Poczta Polska":{countryCodes:["pl"],tags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"pl:Poczta Polska",name:"Poczta Polska"}},"amenity/post_office|PostalAnnex":{countryCodes:["us"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"PostalAnnex","brand:wikidata":"Q61960357",name:"PostalAnnex"}},"amenity/post_office|Postbank Finanzcenter":{tags:{amenity:"post_office",brand:"Postbank Finanzcenter",name:"Postbank Finanzcenter"}},"amenity/post_office|Poste Italiane":{countryCodes:["it"],tags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"}},"amenity/post_office|Serpost":{countryCodes:["pe"],matchNames:["servicios postales del perú"],matchTags:["shop/post_office"],tags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"es:Servicios Postales del Perú",name:"Serpost"}},"amenity/post_office|Servientrega":{tags:{amenity:"post_office",brand:"Servientrega",name:"Servientrega"}},"amenity/post_office|Slovenská pošta":{countryCodes:["sk"],tags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"}},"amenity/post_office|The UPS Store":{countryCodes:["ca","us"],matchNames:["ups store"],matchTags:["shop/copyshop"],nomatch:["amenity/post_box|UPS"],tags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store",short_name:"UPS"}},"amenity/post_office|United States Post Office":{countryCodes:["us"],matchNames:["united states postal service","us post office","us postal service","usps"],tags:{amenity:"post_office",brand:"United States Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"United States Post Office"}},"amenity/post_office|ΕΛΤΑ":{countryCodes:["gr"],tags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"}},"amenity/post_office|Белпошта":{countryCodes:["by"],matchNames:["белпочта"],tags:{amenity:"post_office",brand:"Белпошта","brand:be":"Белпошта","brand:en":"Belposhta","brand:ru":"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"be:Белпошта",name:"Белпошта","name:be":"Белпошта","name:en":"Belposhta","name:ru":"Белпочта"}},"amenity/post_office|Казпочта":{countryCodes:["kz"],tags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"}},"amenity/post_office|Нова Пошта":{countryCodes:["ua"],matchNames:["Нова Пошта №1","Нова Пошта №2","Нова Пошта №3","Нова Пошта №4"],tags:{amenity:"post_office",brand:"Нова Пошта","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта"}},"amenity/post_office|Почта России":{countryCodes:["ru"],tags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"}},"amenity/post_office|СДЭК":{countryCodes:["ru","ua"],tags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"}},"amenity/post_office|Укрпошта":{countryCodes:["ua"],tags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"}},"amenity/post_office|中国邮政":{countryCodes:["cn"],tags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"}},"amenity/prep_school|Huntington Learning Center":{countryCodes:["us"],matchNames:["huntington"],tags:{amenity:"prep_school",brand:"Huntington Learning Center","brand:wikidata":"Q5945399","brand:wikipedia":"en:Huntington Learning Center",name:"Huntington Learning Center"}},"amenity/prep_school|KUMON~(Japan)":{countryCodes:["jp"],matchNames:["くもん","公文"],tags:{amenity:"prep_school",brand:"KUMON","brand:wikidata":"Q142054","brand:wikipedia":"ja:日本公文教育研究会",name:"KUMON","name:ja":"公文","name:ja-Hira":"くもん","name:ja-Latn":"KUMON"}},"amenity/prep_school|Kumon~(International)":{matchNames:["kumon learning center"],tags:{amenity:"prep_school",brand:"Kumon","brand:wikidata":"Q142054","brand:wikipedia":"en:Kumon",name:"Kumon"}},"amenity/prep_school|Mathnasium":{countryCodes:["us"],matchNames:["mathnasium learning center"],tags:{amenity:"prep_school",brand:"Mathnasium","brand:wikidata":"Q6787302","brand:wikipedia":"en:Mathnasium",name:"Mathnasium"}},"amenity/prep_school|Russian School of Mathematics":{countryCodes:["us"],matchNames:["rsm","russian school of math"],tags:{amenity:"prep_school",brand:"Russian School of Mathematics","brand:wikidata":"Q7382122","brand:wikipedia":"en:Russian School of Mathematics",name:"Russian School of Mathematics"}},"amenity/prep_school|Sylvan":{countryCodes:["us"],matchNames:["sylvan learning"],tags:{alt_name:"Sylvan Learning Center",amenity:"prep_school",brand:"Sylvan","brand:wikidata":"Q7660663","brand:wikipedia":"en:Sylvan Learning",name:"Sylvan"}},"amenity/prep_school|栄光ゼミナール":{countryCodes:["jp"],matchNames:["eikoh"],tags:{amenity:"prep_school",brand:"栄光ゼミナール","brand:ja":"栄光ゼミナール","brand:ja-Hira":"えいこうゼミナール","brand:ja-Latn":"Eikō Zemināru","brand:wikidata":"Q11535632","brand:wikipedia":"ja:栄光ゼミナール",name:"栄光ゼミナール","name:en":"Eikoh Seminar","name:ja":"栄光ゼミナール","name:ja-Hira":"えいこうゼミナール","name:ja-Latn":"Eikō Zemināru"}},"amenity/public_bookcase|Little Free Library":{tags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"}},"amenity/public_bookcase|Offener Bücherschrank":{countryCodes:["at","ch","de"],tags:{amenity:"public_bookcase",brand:"Offener Bücherschrank",name:"Offener Bücherschrank"}},"amenity/restaurant|100 Montaditos":{countryCodes:["es","it","pt"],tags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",cuisine:"sandwich",name:"100 Montaditos"}},"amenity/restaurant|3 Brewers~(On)":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"3 Brasseurs","brand:wikidata":"Q3230326","brand:wikipedia":"fr:Les 3 Brasseurs",cuisine:"burger;pizza;seafood",name:"3 Brewers","name:fr":"3 Brasseurs",official_name:"Les 3 Brasseurs"}},"amenity/restaurant|ASK Italian":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"ASK Italian","brand:wikidata":"Q4807056","brand:wikipedia":"en:ASK Italian",cuisine:"italian",name:"ASK Italian"}},"amenity/restaurant|Amici":{tags:{amenity:"restaurant",brand:"Amici",name:"Amici"}},"amenity/restaurant|Applebee's":{matchNames:["applebees bar and grill","applebees grill and bar","applebees neighborhood bar and grill"],tags:{amenity:"restaurant",brand:"Applebee's Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee's",official_name:"Applebee's Neighborhood Grill & Bar"}},"amenity/restaurant|Autogrill":{countryCodes:["at","es","fr","it"],tags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"}},"amenity/restaurant|BBB":{countryCodes:["il"],tags:{alt_name:"Burgus Burger Bar","alt_name:en":"Burgus Burger Bar",amenity:"restaurant",brand:"Burgus Burger Bar","brand:en":"Burgus Burger Bar","brand:wikidata":"Q64760094",cuisine:"burger",name:"BBB","name:en":"BBB"}},"amenity/restaurant|BJ's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"}},"amenity/restaurant|Bella Italia":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"}},"amenity/restaurant|Benihana":{countryCodes:["aw","br","ca","pa","sv","us"],matchNames:["benihana of tokyo"],tags:{amenity:"restaurant",brand:"Benihana","brand:wikidata":"Q4887996","brand:wikipedia":"en:Benihana",cuisine:"japanese;teppanyaki;steak",name:"Benihana"}},"amenity/restaurant|Bertucci's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bertucci's","brand:wikidata":"Q4895917","brand:wikipedia":"en:Bertucci's",cuisine:"pizza;italian",name:"Bertucci's"}},"amenity/restaurant|Big Boy":{tags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy",official_name:"Big Boy Restaurant & Bakery"}},"amenity/restaurant|Black":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"Black Bar Burger","brand:en":"Black Bar Burger","brand:he":"בלאק בורגר","brand:wikidata":"Q64760158",cuisine:"burger",name:"Black","name:en":"Black","name:he":"בלאק"}},"amenity/restaurant|Black Bear Diner":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"}},"amenity/restaurant|Blaze Pizza":{countryCodes:["bh","ca","kw","sa","us"],tags:{amenity:"restaurant",brand:"Blaze Pizza","brand:wikidata":"Q23016666","brand:wikipedia":"en:Blaze Pizza",cuisine:"pizza",name:"Blaze Pizza"}},"amenity/restaurant|Bob Evans":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"}},"amenity/restaurant|Bonanza Steakhouse":{countryCodes:["us"],matchNames:["bonanza"],tags:{amenity:"restaurant",brand:"Bonanza Steakhouse","brand:wikidata":"Q64045992",cuisine:"american;steak;buffet",name:"Bonanza Steakhouse"}},"amenity/restaurant|Bonefish Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"}},"amenity/restaurant|Boston Pizza":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"}},"amenity/restaurant|Bravo":{countryCodes:["us"],nomatch:["shop/supermarket|Bravo"],tags:{alt_name:"Bravo Cucina Italiana",amenity:"restaurant",brand:"Bravo","brand:wikidata":"Q64055574",cuisine:"italian",name:"Bravo"}},"amenity/restaurant|Brio":{countryCodes:["us"],tags:{alt_name:"Brio Tuscan Grille",amenity:"restaurant",brand:"Brio","brand:wikidata":"Q64055835",cuisine:"italian",name:"Brio"}},"amenity/restaurant|Buca di Beppo":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Buca di Beppo","brand:wikidata":"Q4982340","brand:wikipedia":"en:Buca di Beppo",cuisine:"italian",name:"Buca di Beppo"}},"amenity/restaurant|Buffalo Grill":{countryCodes:["es","fr"],tags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"}},"amenity/restaurant|Buffalo Wild Wings":{tags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"}},"amenity/restaurant|Buffalo Wings & Rings":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Buffalo Wings & Rings","brand:wikidata":"Q4985900","brand:wikipedia":"en:Buffalo Wings & Rings",cuisine:"wings",name:"Buffalo Wings & Rings",takeaway:"yes"}},"amenity/restaurant|Cafe Rio":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"}},"amenity/restaurant|California Pizza Kitchen":{tags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"}},"amenity/restaurant|Campanile":{tags:{amenity:"restaurant",brand:"Campanile",name:"Campanile"}},"amenity/restaurant|Carluccio's":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"}},"amenity/restaurant|Carrabba's Italian Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"}},"amenity/restaurant|Cheddar's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cheddar's","brand:wikidata":"Q5089187","brand:wikipedia":"en:Cheddar's Scratch Kitchen",cuisine:"american",name:"Cheddar's",official_name:"Cheddar's Scratch Kitchen"}},"amenity/restaurant|Cheeburger Cheeburger":{countryCodes:["ca","sa","us"],tags:{amenity:"restaurant",brand:"Cheeburger Cheeburger","brand:wikidata":"Q5089247","brand:wikipedia":"en:Cheeburger Cheeburger",cuisine:"burger",name:"Cheeburger Cheeburger"}},"amenity/restaurant|Chevys":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Chevys Fresh Mex","brand:wikidata":"Q5094466","brand:wikipedia":"en:Chevys Fresh Mex",cuisine:"mexican",name:"Chevys",official_name:"Chevys Fresh Mex"}},"amenity/restaurant|Chili's":{tags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's",official_name:"Chili's Grill & Bar"}},"amenity/restaurant|Chiquito":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"}},"amenity/restaurant|Chuck E. Cheese's":{countryCodes:["ca","us"],matchNames:["chuck e cheese"],tags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"}},"amenity/restaurant|Cici's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza;buffet",name:"Cici's Pizza"}},"amenity/restaurant|Claim Jumper":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",name:"Claim Jumper"}},"amenity/restaurant|Coast to Coast":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Coast to Coast","brand:wikidata":"Q22000729","brand:wikipedia":"en:Coast to Coast (restaurant)",cuisine:"american",name:"Coast to Coast"}},"amenity/restaurant|Cora":{countryCodes:["ca"],nomatch:["shop/supermarket|Cora"],tags:{amenity:"restaurant",brand:"Cora","brand:wikidata":"Q2996960","brand:wikipedia":"en:Cora (restaurant)",cuisine:"breakfast",name:"Cora"}},"amenity/restaurant|Cosmo":{countryCodes:["gb","ie"],tags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"}},"amenity/restaurant|Country Pride":{countryCodes:["us"],matchNames:["country pride restaurant"],tags:{amenity:"restaurant",brand:"Country Pride","brand:wikidata":"Q64051992",cuisine:"american",name:"Country Pride"}},"amenity/restaurant|Courtepaille":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"}},"amenity/restaurant|Cracker Barrel":{countryCodes:["us"],nomatch:["shop/gift|Cracker Barrel"],tags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store"}},"amenity/restaurant|Dave & Buster's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Dave & Buster's","brand:wikidata":"Q5228205","brand:wikipedia":"en:Dave & Buster's",cuisine:"american",name:"Dave & Buster's"}},"amenity/restaurant|Denny's":{tags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"}},"amenity/restaurant|Dickey's Barbecue Pit":{countryCodes:["us"],matchNames:["dickeys barbecue"],tags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"}},"amenity/restaurant|Dolce Vita":{tags:{amenity:"restaurant",brand:"Dolce Vita",name:"Dolce Vita"}},"amenity/restaurant|Donatos Pizza":{countryCodes:["us"],matchNames:["donatos"],tags:{amenity:"restaurant",brand:"Donatos Pizza","brand:wikidata":"Q1240741","brand:wikipedia":"en:Donatos Pizza",cuisine:"pizza",name:"Donatos Pizza",takeaway:"yes"}},"amenity/restaurant|East Side Mario's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"}},"amenity/restaurant|Eat'n Park":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Eat'n Park","brand:wikidata":"Q5331211","brand:wikipedia":"en:Eat'n Park",cuisine:"american",name:"Eat'n Park"}},"amenity/restaurant|Famous Dave's":{countryCodes:["us"],matchNames:["famous daves bbq"],tags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"}},"amenity/restaurant|First Watch":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american;breakfast",name:"First Watch"}},"amenity/restaurant|Flunch":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"}},"amenity/restaurant|Foster's Hollywood":{countryCodes:["es"],tags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"}},"amenity/restaurant|Frankie & Benny's":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"}},"amenity/restaurant|Freshii":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"}},"amenity/restaurant|Friendly's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"}},"amenity/restaurant|Frisch's Big Boy":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Frisch's Big Boy","brand:wikidata":"Q5504660","brand:wikipedia":"en:Frisch's",cuisine:"burger",name:"Frisch's Big Boy",takeaway:"yes"}},"amenity/restaurant|Fuddruckers":{tags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"}},"amenity/restaurant|Gatti's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Gatti's Pizza","brand:wikidata":"Q5527509","brand:wikipedia":"en:Gatti's Pizza",cuisine:"pizza",name:"Gatti's Pizza"}},"amenity/restaurant|Giordano's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Giordano's Pizzeria","brand:wikidata":"Q5563393","brand:wikipedia":"en:Giordano's Pizzeria",cuisine:"pizza",name:"Giordano's Pizzeria"}},"amenity/restaurant|Godfather's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Godfather's Pizza","brand:wikidata":"Q5576353","brand:wikipedia":"en:Godfather's Pizza",cuisine:"pizza",name:"Godfather's Pizza"}},"amenity/restaurant|Golden Corral":{countryCodes:["us"],matchNames:["golden corral buffet","golden corral buffet and grill"],tags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american;buffet",name:"Golden Corral"}},"amenity/restaurant|Gourmet Burger Kitchen":{countryCodes:["gb","gr","ie"],tags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"}},"amenity/restaurant|Grotto Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Grotto Pizza","brand:wikidata":"Q20709024","brand:wikipedia":"en:Grotto Pizza",cuisine:"pizza",name:"Grotto Pizza"}},"amenity/restaurant|Gusto":{tags:{amenity:"restaurant",brand:"Gusto",name:"Gusto"}},"amenity/restaurant|Handmade Burger Co.":{countryCodes:["gb"],matchNames:["Handmade Burger Company"],tags:{amenity:"restaurant",brand:"Handmade Burger Co.","brand:wikidata":"Q56154673",cuisine:"burger",name:"Handmade Burger Co."}},"amenity/restaurant|Hans im Glück":{countryCodes:["at","ch","de","sg"],tags:{amenity:"restaurant",brand:"Hans im Glück","brand:wikidata":"Q22569868","brand:wikipedia":"de:Hans im Glück (Restaurantkette)",cuisine:"burger",name:"Hans im Glück"}},"amenity/restaurant|Happy's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Happy's Pizza","brand:wikidata":"Q5652393","brand:wikipedia":"en:Happy's Pizza",cuisine:"pizza",name:"Happy's Pizza"}},"amenity/restaurant|Hard Rock Cafe":{tags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"}},"amenity/restaurant|Harvester":{countryCodes:["gb"],matchTags:["amenity/pub"],tags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"}},"amenity/restaurant|Hippopotamus":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"}},"amenity/restaurant|Hooters":{tags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"}},"amenity/restaurant|Huddle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"}},"amenity/restaurant|Husky House":{countryCodes:["ca"],nomatch:["amenity/fuel|Husky","shop/convenience|Husky"],tags:{amenity:"restaurant",brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",cuisine:"diner",name:"Husky House"}},"amenity/restaurant|IHOP":{matchNames:["international house of pancakes"],tags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"breakfast;pancake",name:"IHOP"}},"amenity/restaurant|IL Патио":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"italian",name:"IL Патио"}},"amenity/restaurant|Il Giardino":{countryCodes:["de","fr","it","nl"],tags:{amenity:"restaurant",brand:"Il Giardino",name:"Il Giardino"}},"amenity/restaurant|Iron Skillet":{countryCodes:["us"],matchNames:["iron skillet restaurant"],tags:{amenity:"restaurant",brand:"Iron Skillet","brand:wikidata":"Q64052855",cuisine:"american;buffet",name:"Iron Skillet"}},"amenity/restaurant|Jack Astor's":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Jack Astor's","brand:wikidata":"Q6111066","brand:wikipedia":"en:Jack Astor's Bar and Grill",cuisine:"american",name:"Jack Astor's"}},"amenity/restaurant|Jason's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"}},"amenity/restaurant|Jet's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"}},"amenity/restaurant|Joe's Crab Shack":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"}},"amenity/restaurant|Johnny Carino's":{countryCodes:["us"],matchNames:["carinios"],tags:{amenity:"restaurant",brand:"Johnny Carino's","brand:wikidata":"Q5039637","brand:wikipedia":"en:Carino's Italian",cuisine:"italian",name:"Johnny Carino's"}},"amenity/restaurant|Johnny Rockets":{matchNames:["johnny rocket"],tags:{amenity:"restaurant",brand:"Johnny Rockets","brand:wikidata":"Q1051593","brand:wikipedia":"en:Johnny Rockets",cuisine:"burger",name:"Johnny Rockets"}},"amenity/restaurant|Kelsey's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"}},"amenity/restaurant|Koliba":{tags:{amenity:"restaurant",brand:"Koliba",name:"Koliba"}},"amenity/restaurant|Kudu":{countryCodes:["sa"],tags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"}},"amenity/restaurant|La Boucherie":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"La Boucherie","brand:wikidata":"Q21427479","brand:wikipedia":"fr:La Boucherie (restaurant)",cuisine:"steak_house",name:"La Boucherie"}},"amenity/restaurant|La Cage":{countryCodes:["ca"],matchNames:["La Cage aux Sports"],tags:{amenity:"restaurant",brand:"La Cage","brand:wikidata":"Q3206980","brand:wikipedia":"fr:La Cage aux Sports",cuisine:"burger;chicken;sandwich;fish;pasta",name:"La Cage"}},"amenity/restaurant|LaRosa's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"LaRosa's Pizzeria","brand:wikidata":"Q6460833","brand:wikipedia":"en:LaRosa's Pizzeria",cuisine:"pizza",name:"LaRosa's Pizzeria",takeaway:"yes"}},"amenity/restaurant|Le Patio":{tags:{amenity:"restaurant",brand:"Le Patio",name:"Le Patio"}},"amenity/restaurant|Legal Sea Foods":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Legal Sea Foods","brand:wikidata":"Q6517417","brand:wikipedia":"en:Legal Sea Foods",cuisine:"seafood",name:"Legal Sea Foods"}},"amenity/restaurant|Lemongrass":{tags:{amenity:"restaurant",brand:"Lemongrass",name:"Lemongrass"}},"amenity/restaurant|Les 3 Brasseurs~(Qc,Br,Fr)":{countryCodes:["br","ca","fr"],matchNames:["3 Brasseurs"],tags:{amenity:"restaurant",brand:"3 Brasseurs","brand:wikidata":"Q3230326","brand:wikipedia":"fr:Les 3 Brasseurs",cuisine:"burger;pizza;seafood",name:"3 Brasseurs","name:en":"3 Brewers",official_name:"Les 3 Brasseurs"}},"amenity/restaurant|Logan's Roadhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"american",name:"Logan's Roadhouse"}},"amenity/restaurant|LongHorn Steakhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"}},"amenity/restaurant|Los Arcos":{tags:{amenity:"restaurant",brand:"Los Arcos",name:"Los Arcos"}},"amenity/restaurant|Lou Malnati's Pizzeria":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Lou Malnati's Pizzeria","brand:wikidata":"Q6685628","brand:wikipedia":"en:Lou Malnati's Pizzeria",cuisine:"pizza",name:"Lou Malnati's Pizzeria"}},"amenity/restaurant|Loving Hut":{tags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",cuisine:"international","diet:vegan":"only","diet:vegetarian":"only",name:"Loving Hut"}},"amenity/restaurant|Léon de Bruxelles":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"}},"amenity/restaurant|MK Restaurants":{countryCodes:["th"],tags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"}},"amenity/restaurant|Marco's Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"}},"amenity/restaurant|Marie Callender's":{countryCodes:["mx","us"],matchNames:["marie calendar","marie calendar's","marie callendar's"],tags:{amenity:"restaurant",brand:"Marie Callender's","brand:wikidata":"Q6762784","brand:wikipedia":"en:Marie Callender's",cuisine:"american",name:"Marie Callender's"}},"amenity/restaurant|Max's Restaurant":{countryCodes:["ph"],matchNames:["Max's"],tags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's Restaurant",cuisine:"asian",name:"Max's Restaurant"}},"amenity/restaurant|McAlister's Deli":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"}},"amenity/restaurant|McCormick & Schmick's":{countryCodes:["us"],matchNames:["mccormick and schmick","mccormick and schmicks grill"],tags:{amenity:"restaurant",brand:"McCormick & Schmick's","brand:wikidata":"Q6800562","brand:wikipedia":"en:McCormick & Schmick's",cuisine:"seafood;steak",name:"McCormick & Schmick's"}},"amenity/restaurant|Mellow Mushroom":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"}},"amenity/restaurant|Mikes":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Mikes","brand:wikidata":"Q3313615","brand:wikipedia":"fr:Mikes",cuisine:"pizza;pasta;sandwich",name:"Mikes"}},"amenity/restaurant|Mimi's Cafe":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Mimi's Cafe","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",cuisine:"french",name:"Mimi's Cafe"}},"amenity/restaurant|Montana's":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Montana's","brand:wikidata":"Q17022490","brand:wikipedia":"en:Montana's BBQ & Bar",cuisine:"barbecue",name:"Montana's",official_name:"Montana's BBQ & Bar"}},"amenity/restaurant|Morton's The Steakhouse":{countryCodes:["us"],matchNames:["mortons"],tags:{amenity:"restaurant",brand:"Morton's The Steakhouse","brand:wikidata":"Q17022759","brand:wikipedia":"en:Morton's The Steakhouse",cuisine:"steak_house",name:"Morton's The Steakhouse"}},"amenity/restaurant|Moses":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"Moses","brand:en":"Moses","brand:he":"מוזס","brand:wikidata":"Q64760150",cuisine:"burger",name:"Moses","name:en":"Moses","name:he":"מוזס"}},"amenity/restaurant|Mountain Mike's":{countryCodes:["us"],tags:{alt_name:"Mountain Mike's Pizza",amenity:"restaurant",brand:"Mountain Mike's","brand:wikidata":"Q6925120","brand:wikipedia":"en:Mountain Mike's Pizza",cuisine:"pizza",name:"Mountain Mike's",takeaway:"yes"}},"amenity/restaurant|Nando's":{tags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"}},"amenity/restaurant|Noodles & Company":{countryCodes:["us"],matchNames:["noodles and co","noodles co","noodles company"],tags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"}},"amenity/restaurant|Norky's":{countryCodes:["pe"],tags:{amenity:"restaurant",brand:"Norky's",cuisine:"peruvian",name:"Norky's"}},"amenity/restaurant|O'Charley's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"}},"amenity/restaurant|Ocean Basket":{countryCodes:["za"],tags:{amenity:"restaurant",brand:"Ocean Basket","brand:wikidata":"Q62075311",cuisine:"seafood",name:"Ocean Basket"}},"amenity/restaurant|Old Chicago":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q64411347",cuisine:"pizza",name:"Old Chicago",official_name:"Old Chicago Pizza & Taproom"}},"amenity/restaurant|Old Wild West":{countryCodes:["it"],tags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"}},"amenity/restaurant|Olive Garden":{tags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"}},"amenity/restaurant|On The Border":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"On The Border","brand:wikidata":"Q7091305","brand:wikipedia":"en:On the Border Mexican Grill & Cantina",cuisine:"tex-mex",name:"On The Border",official_name:"On The Border Mexican Grill & Cantina"}},"amenity/restaurant|Outback Steakhouse":{tags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american;steak",name:"Outback Steakhouse"}},"amenity/restaurant|P.F. Chang's":{countryCodes:["mx","us"],matchNames:["pf chang"],tags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's",official_name:"P.F. Chang's China Bistro"}},"amenity/restaurant|Papa Gino's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Papa Gino's","brand:wikidata":"Q7132333","brand:wikipedia":"en:Papa Gino's",cuisine:"pizza",name:"Papa Gino's"}},"amenity/restaurant|Pardos Chicken":{countryCodes:["pe"],tags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"}},"amenity/restaurant|Pei Wei":{countryCodes:["us"],matchNames:["pei wei asian diner"],tags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"}},"amenity/restaurant|Perkins":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"}},"amenity/restaurant|Phở 24":{countryCodes:["vn"],tags:{amenity:"restaurant",brand:"Phở 24","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"}},"amenity/restaurant|Phở Hòa":{countryCodes:["ca","id","kr","ms","ph","tw","us"],tags:{alt_name:"Phở Hoà","alt_name:en":"Pho Hoa","alt_name:vi":"Phở Hoà",amenity:"restaurant",brand:"Phở Hòa","brand:wikidata":"Q55629932","brand:wikipedia":"en:Phở Hòa",cuisine:"vietnamese;noodle",name:"Phở Hòa","name:vi":"Phở Hòa"}},"amenity/restaurant|Pieology Pizzeria":{countryCodes:["us"],matchNames:["pieology"],tags:{amenity:"restaurant",brand:"Pieology Pizzeria","brand:wikidata":"Q60746053","brand:wikipedia":"en:Pieology",cuisine:"pizza",name:"Pieology Pizzeria"}},"amenity/restaurant|Pizza Factory":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"}},"amenity/restaurant|Pizza Hut":{nomatch:["amenity/fast_food|Pizza Hut Express"],tags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"}},"amenity/restaurant|Pizza Ranch":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"}},"amenity/restaurant|PizzaExpress":{tags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikidata":"Q662845","brand:wikipedia":"en:PizzaExpress",cuisine:"pizza",name:"PizzaExpress"}},"amenity/restaurant|Poivre Rouge":{countryCodes:["fr"],tags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"}},"amenity/restaurant|Ponderosa Steakhouse":{countryCodes:["ae","eg","qa","tw","us"],matchNames:["ponderosa"],tags:{amenity:"restaurant",brand:"Ponderosa Steakhouse","brand:wikidata":"Q64038204",cuisine:"american;steak;buffet",name:"Ponderosa Steakhouse"}},"amenity/restaurant|Prezzo":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"}},"amenity/restaurant|Quaker Steak & Lube":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Quaker Steak & Lube","brand:wikidata":"Q7268570","brand:wikipedia":"en:Quaker Steak & Lube",cuisine:"wings",name:"Quaker Steak & Lube"}},"amenity/restaurant|Red Lobster":{tags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"}},"amenity/restaurant|Red Robin":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin",official_name:"Red Robin Gourmet Burgers and Brews"}},"amenity/restaurant|Romano's Macaroni Grill":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Romano's Macaroni Grill","brand:wikidata":"Q7362714","brand:wikipedia":"en:Romano's Macaroni Grill",cuisine:"italian",name:"Romano's Macaroni Grill"}},"amenity/restaurant|Round Table Pizza":{countryCodes:["us"],matchNames:["round table"],tags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"}},"amenity/restaurant|Ruby Tuesday":{tags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"american",name:"Ruby Tuesday"}},"amenity/restaurant|Ruth's Chris Steak House":{countryCodes:["ca","mx","us"],tags:{amenity:"restaurant",brand:"Ruth's Chris Steak House","brand:wikidata":"Q7382829","brand:wikipedia":"en:Ruth's Chris Steak House",cuisine:"american",name:"Ruth's Chris Steak House"}},"amenity/restaurant|Saltgrass Steak House":{countryCodes:["us"],matchNames:["saltgrass"],tags:{amenity:"restaurant",brand:"Saltgrass Steak House","brand:wikidata":"Q7406113","brand:wikipedia":"en:Saltgrass Steak House",cuisine:"steak_house",name:"Saltgrass Steak House"}},"amenity/restaurant|Scores":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Scores","brand:wikidata":"Q3476059","brand:wikipedia":"fr:Scores",cuisine:"chicken;barbecue",name:"Scores"}},"amenity/restaurant|Shakey's":{tags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"}},"amenity/restaurant|Shari's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"}},"amenity/restaurant|Shoney's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"}},"amenity/restaurant|Sizzler":{tags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",cuisine:"steak_house",name:"Sizzler"}},"amenity/restaurant|Skyline Chili":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"chili",name:"Skyline Chili",takeaway:"yes"}},"amenity/restaurant|Smitty's":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"}},"amenity/restaurant|Snappy Tomato Pizza":{countryCodes:["gb","us"],tags:{amenity:"restaurant",brand:"Snappy Tomato Pizza","brand:wikidata":"Q7547352","brand:wikipedia":"en:Snappy Tomato Pizza",cuisine:"pizza",name:"Snappy Tomato Pizza",takeaway:"yes"}},"amenity/restaurant|Spur":{countryCodes:["za"],matchNames:["spur steak ranches"],tags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"}},"amenity/restaurant|St-Hubert":{countryCodes:["ca"],nomatch:["amenity/fast_food|St-Hubert Express"],tags:{amenity:"restaurant",brand:"St-Hubert","brand:wikidata":"Q3495225","brand:wikipedia":"en:St-Hubert",cuisine:"chicken;barbecue",name:"St-Hubert"}},"amenity/restaurant|St. Louis Bar & Grill":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"St. Louis Bar & Grill","brand:wikidata":"Q65567668",cuisine:"chicken",name:"St. Louis Bar & Grill"}},"amenity/restaurant|Steak 'n Shake":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"}},"amenity/restaurant|Sunset Grill":{countryCodes:["ca","us"],tags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q62112489","brand:wikipedia":"en:Sunset Grill (Canadian restaurant chain)",cuisine:"american",name:"Sunset Grill"}},"amenity/restaurant|Swiss Chalet":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"}},"amenity/restaurant|TGI Friday's":{tags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"}},"amenity/restaurant|Texas Roadhouse":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"}},"amenity/restaurant|The Cheesecake Factory":{countryCodes:["us"],tags:{alt_name:"Cheesecake Factory",amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"The Cheesecake Factory"}},"amenity/restaurant|The Keg":{countryCodes:["ca","us"],matchNames:["keg"],tags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"}},"amenity/restaurant|The Melting Pot":{countryCodes:["us"],tags:{alt_name:"Melting Pot",amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"}},"amenity/restaurant|Toby Carvery":{countryCodes:["gb"],matchTags:["amenity/pub"],tags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",cuisine:"british",name:"Toby Carvery"}},"amenity/restaurant|Toks":{countryCodes:["mx"],tags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"}},"amenity/restaurant|Tony Roma's":{matchNames:["tony roma"],tags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"}},"amenity/restaurant|Toppers Pizza":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Toppers Pizza","brand:wikidata":"Q7825113","brand:wikipedia":"en:Toppers Pizza",cuisine:"pizza",name:"Toppers Pizza"}},"amenity/restaurant|Vapiano":{tags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"}},"amenity/restaurant|Village Inn":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"}},"amenity/restaurant|Vips":{countryCodes:["es","mx"],tags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q48783378","brand:wikipedia":"es:Vips",name:"Vips"}},"amenity/restaurant|Waffle House":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House",opening_hours:"24/7"}},"amenity/restaurant|Wagamama":{tags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"}},"amenity/restaurant|Wasabi":{tags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"}},"amenity/restaurant|Western Sizzlin'":{countryCodes:["us"],matchNames:["western sizzling"],tags:{amenity:"restaurant",brand:"Western Sizzlin'","brand:wikidata":"Q7988295","brand:wikipedia":"en:Western Sizzlin'",cuisine:"american;steak",name:"Western Sizzlin'"}},"amenity/restaurant|White Spot":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"}},"amenity/restaurant|Wild Wing":{countryCodes:["ca"],tags:{amenity:"restaurant",brand:"Wild Wing","brand:wikidata":"Q8000869","brand:wikipedia":"en:Wild Wing Restaurants",cuisine:"chicken",name:"Wild Wing"}},"amenity/restaurant|Wingstop":{countryCodes:["mx","us"],tags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"}},"amenity/restaurant|YO! Sushi":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"}},"amenity/restaurant|Yard House":{countryCodes:["us"],tags:{alcohol:"yes",amenity:"restaurant",brand:"Yard House","brand:wikidata":"Q21189156","brand:wikipedia":"en:Yard House",cuisine:"american",name:"Yard House"}},"amenity/restaurant|Zizzi":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"}},"amenity/restaurant|Евразия":{countryCodes:["ru","ua"],tags:{amenity:"restaurant",brand:"Евразия",name:"Евразия"}},"amenity/restaurant|Планета Суши":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"Планета Суши","brand:wikidata":"Q62739250",cuisine:"sushi",name:"Планета Суши","name:en":"Planet Sushi"}},"amenity/restaurant|Тануки":{countryCodes:["kz","ru","ua"],tags:{amenity:"restaurant",brand:"Тануки","brand:wikidata":"Q62758690",cuisine:"japanese",name:"Тануки","name:en":"Tanuki","name:ru":"Тануки"}},"amenity/restaurant|Якитория":{countryCodes:["ru"],tags:{amenity:"restaurant",brand:"Якитория",name:"Якитория"}},"amenity/restaurant|בורגר סאלון":{countryCodes:["il"],tags:{amenity:"restaurant",brand:"בורגר סאלון","brand:en":"Burger Saloon","brand:he":"בורגר סאלון","brand:wikidata":"Q64760057",cuisine:"burger",name:"בורגר סאלון","name:en":"Burger Saloon","name:he":"בורגר סאלון"}},"amenity/restaurant|いきなり!ステーキ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"いきなり!ステーキ","brand:en":"Ikinari Steak","brand:ja":"いきなり!ステーキ","brand:wikidata":"Q21652405","brand:wikipedia":"ja:いきなり!ステーキ",cuisine:"steak_house",name:"いきなり!ステーキ","name:en":"Ikinari Steak","name:ja":"いきなり!ステーキ"}},"amenity/restaurant|はなまるうどん":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:ja":"はなまるうどん","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",cuisine:"japanese;udon",name:"はなまるうどん","name:en":"Hanamarūdon","name:ja":"はなまるうどん"}},"amenity/restaurant|びっくりドンキー":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:ja":"びっくりドンキー","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",cuisine:"burger",name:"びっくりドンキー","name:en":"Bikkuri Donkey","name:ja":"びっくりドンキー"}},"amenity/restaurant|やよい軒":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"やよい軒","brand:en":"Yayoiken","brand:ja":"やよい軒","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",cuisine:"japanese",name:"やよい軒","name:en":"Yayoiken","name:ja":"やよい軒"}},"amenity/restaurant|カプリチョーザ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"カプリチョーザ","brand:en":"Capricciosa","brand:ja":"カプリチョーザ","brand:wikidata":"Q11294660","brand:wikipedia":"ja:カプリチョーザ",cuisine:"italian",name:"カプリチョーザ","name:en":"Capricciosa","name:ja":"カプリチョーザ"}},"amenity/restaurant|ガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:ja":"ガスト",cuisine:"western;japanese",name:"ガスト","name:en":"Gusto","name:ja":"ガスト"}},"amenity/restaurant|ココス":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:ja":"ココス","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",cuisine:"western;japanese",name:"ココス","name:en":"Coco's","name:ja":"ココス"}},"amenity/restaurant|サイゼリヤ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:ja":"サイゼリヤ","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",cuisine:"italian",name:"サイゼリヤ","name:en":"Saizeriya","name:ja":"サイゼリヤ"}},"amenity/restaurant|ジョイフル":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:ja":"ジョイフル","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",cuisine:"western",name:"ジョイフル","name:en":"Joyfull","name:ja":"ジョイフル"}},"amenity/restaurant|ジョナサン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:ja":"ジョナサン","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",cuisine:"italian;japanese",name:"ジョナサン","name:en":"Jonathan's","name:ja":"ジョナサン"}},"amenity/restaurant|ジョリーパスタ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:ja":"ジョリーパスタ","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",cuisine:"pasta",name:"ジョリーパスタ","name:en":"Jolly-Pasta","name:ja":"ジョリーパスタ"}},"amenity/restaurant|ステーキガスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ステーキガスト","brand:en":"Skylark","brand:ja":"ステーキガスト","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"steak",name:"ステーキガスト","name:en":"Skylark","name:ja":"ステーキガスト"}},"amenity/restaurant|デニーズ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",cuisine:"western;japanese",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"}},"amenity/restaurant|バーミヤン":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",cuisine:"chinese",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"}},"amenity/restaurant|ビッグボーイ":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:ja":"ビッグボーイ","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"ビッグボーイ","name:en":"Big Boy Restaurants","name:ja":"ビッグボーイ"}},"amenity/restaurant|リンガーハット":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:ja":"リンガーハット","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",cuisine:"japanese",name:"リンガーハット","name:en":"Ringer Hut","name:ja":"リンガーハット"}},"amenity/restaurant|ロイヤルホスト":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:ja":"ロイヤルホスト","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",cuisine:"japanese;italian;french",name:"ロイヤルホスト","name:en":"Royal Host","name:ja":"ロイヤルホスト"}},"amenity/restaurant|丸亀製麺":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:ja":"丸亀製麺","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ja":"丸亀製麺"}},"amenity/restaurant|八方雲集":{countryCodes:["cn","tw"],tags:{amenity:"restaurant",brand:"八方雲集","brand:en":"Eight Way","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集","brand:zh":"八方雲集",name:"八方雲集","name:en":"Eight Way","name:zh":"八方雲集"}},"amenity/restaurant|和食さと":{countryCodes:["jp"],matchNames:["さと"],tags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:ja":"和食さと","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",cuisine:"japanese",name:"和食さと","name:en":"Washoku Sato","name:ja":"和食さと"}},"amenity/restaurant|夢庵":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:ja":"夢庵","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",cuisine:"japanese",name:"夢庵","name:en":"Yumean","name:ja":"夢庵"}},"amenity/restaurant|大戸屋":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:ja":"大戸屋","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya","name:ja":"大戸屋"}},"amenity/restaurant|大阪王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:ja":"大阪王将","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",cuisine:"japanese;chinese",name:"大阪王将","name:en":"Osaka Ohsho","name:ja":"大阪王将"}},"amenity/restaurant|天下一品":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",cuisine:"ramen",name:"天下一品","name:en":"Tenkaippin"}},"amenity/restaurant|安楽亭":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"}},"amenity/restaurant|木曽路":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"木曽路","brand:en":"Kisoji","brand:jp":"木曽路","brand:wikidata":"Q11518589","brand:wikipedia":"ja:木曽路 (企業)",cuisine:"japanese",name:"木曽路","name:en":"Kisoji","name:jp":"木曽路"}},"amenity/restaurant|永和豆漿":{countryCodes:["tw"],tags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",cuisine:"chinese;breakfast",name:"永和豆漿","name:en":"Yonghe Soy Milk"}},"amenity/restaurant|海底捞火锅":{tags:{amenity:"restaurant",brand:"海底捞火锅",name:"海底捞火锅"}},"amenity/restaurant|牛角":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"}},"amenity/restaurant|華屋与兵衛":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"華屋与兵衛","brand:en":"Hanaya Yohei","brand:ja":"華屋与兵衛","brand:wikidata":"Q11620063","brand:wikipedia":"ja:華屋与兵衛 (レストラン)",cuisine:"japanese",name:"華屋与兵衛","name:en":"Hanaya Yohei","name:ja":"華屋与兵衛"}},"amenity/restaurant|餃子の王将":{countryCodes:["jp"],tags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:ja":"餃子の王将","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",cuisine:"chinese;gyoza",name:"餃子の王将","name:en":"Gyoza no Ohsho","name:ja":"餃子の王将"}},"amenity/restaurant|바다횟집":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"바다횟집","brand:ko":"바다횟집",name:"바다횟집","name:ko":"바다횟집"}},"amenity/restaurant|빕스":{countryCodes:["kr"],tags:{amenity:"restaurant",brand:"빕스","brand:en":"VIPS","brand:ko":"빕스","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"빕스","name:en":"VIPS","name:ko":"빕스"}},"amenity/school|Imagine Schools":{countryCodes:["us"],matchNames:["imagine","imagine school"],tags:{amenity:"school",brand:"Imagine Schools","brand:wikidata":"Q6002737","brand:wikipedia":"en:Imagine Schools",name:"Imagine Schools","operator:type":"private_non_profit"}},"amenity/school|KIPP":{countryCodes:["us"],tags:{amenity:"school",brand:"KIPP","brand:wikidata":"Q6423304","brand:wikipedia":"en:KIPP (organization)",name:"KIPP",official_name:"Knowledge Is Power Program","operator:type":"private_non_profit"}},"amenity/school|Success Academy":{countryCodes:["us"],tags:{amenity:"school",brand:"Success Academy","brand:wikidata":"Q14707388","brand:wikipedia":"en:Success Academy Charter Schools",name:"Success Academy","operator:type":"private_non_profit"}},"amenity/social_centre|American Legion Hall":{countryCodes:["us"],matchNames:["american legion"],tags:{amenity:"social_centre",brand:"American Legion","brand:wikidata":"Q468865","brand:wikipedia":"en:American Legion",name:"American Legion Hall","social_centre:for":"veterans"}},"amenity/social_centre|Eagles Lodge":{countryCodes:["us"],matchNames:["aeries","eagles","foe"],tags:{alt_name:"Aeries Lodge",amenity:"social_centre",brand:"Fraternal Order of Eagles","brand:wikidata":"Q5493810","brand:wikipedia":"en:Fraternal Order of Eagles",name:"Eagles Lodge",official_name:"Fraternal Order of Eagles"}},"amenity/social_centre|Elks Lodge":{countryCodes:["us"],matchNames:["bpoe","elks"],tags:{amenity:"social_centre",brand:"Benevolent and Protective Order of Elks","brand:wikidata":"Q2895789","brand:wikipedia":"en:Benevolent and Protective Order of Elks",name:"Elks Lodge",official_name:"Benevolent and Protective Order of Elks"}},"amenity/social_centre|Moose Lodge":{countryCodes:["bm","ca","us"],matchNames:["moose"],tags:{amenity:"social_centre",brand:"Loyal Order of Moose","brand:wikidata":"Q6908585","brand:wikipedia":"en:Loyal Order of Moose",name:"Moose Lodge",official_name:"Loyal Order of Moose"}},"amenity/social_centre|Odd Fellows Hall":{matchNames:["ioof","odd fellow","odd fellows"],tags:{amenity:"social_centre",brand:"Independent Order of Odd Fellows","brand:wikidata":"Q1425508","brand:wikipedia":"en:Independent Order of Odd Fellows",name:"Odd Fellows Hall",official_name:"Independent Order of Odd Fellows"}},"amenity/social_centre|VFW Post":{countryCodes:["de","jp","kr","ph","th","us"],matchNames:["vfw"],tags:{amenity:"social_centre",brand:"Veterans of Foreign Wars of the United States","brand:wikidata":"Q3556413","brand:wikipedia":"en:Veterans of Foreign Wars",name:"VFW Post","name:en":"VFW Post",official_name:"Veterans of Foreign Wars of the United States","social_centre:for":"veterans"}},"amenity/social_facility|Vet Center":{countryCodes:["us"],tags:{amenity:"social_facility",brand:"VA","brand:wikidata":"Q6580225","brand:wikipedia":"en:Veterans Health Administration",healthcare:"counselling","healthcare:counselling":"psychiatry","healthcare:for":"veterans",name:"Vet Center",social_facility:"healthcare;outreach","social_facility:for":"veterans"}},"amenity/university|DeVry University":{countryCodes:["us"],tags:{amenity:"university",brand:"DeVry University","brand:wikidata":"Q3298441","brand:wikipedia":"en:DeVry University",name:"DeVry University",short_name:"DeVry"}},"amenity/university|Strayer University":{countryCodes:["us"],tags:{amenity:"university",brand:"Strayer University","brand:wikidata":"Q7622587","brand:wikipedia":"en:Strayer University",name:"Strayer University",short_name:"Strayer"}},"amenity/university|University of Phoenix":{countryCodes:["us"],tags:{amenity:"university",brand:"University of Phoenix","brand:wikidata":"Q1889100","brand:wikipedia":"en:University of Phoenix",name:"University of Phoenix",short_name:"UOPX"}},"amenity/vehicle_inspection|Autosur":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Autosur","brand:wikidata":"Q64224807",name:"Autosur"}},"amenity/vehicle_inspection|Autovision":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Autovision","brand:wikidata":"Q64224842",name:"Autovision"}},"amenity/vehicle_inspection|Dekra":{countryCodes:["de","fr"],tags:{amenity:"vehicle_inspection",brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",official_name:"Dekra Automotive"}},"amenity/vehicle_inspection|Sécuritest":{countryCodes:["fr"],tags:{amenity:"vehicle_inspection",brand:"Sécuritest","brand:wikidata":"Q64224992",name:"Sécuritest"}},"amenity/vending_machine|Amazon Locker":{countryCodes:["de","us"],tags:{amenity:"vending_machine",brand:"Amazon Locker","brand:wikidata":"Q16974764","brand:wikipedia":"en:Amazon Locker",name:"Amazon Locker",vending:"parcel_pickup"}},"amenity/vending_machine|AmeriGas":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"AmeriGas","brand:wikidata":"Q23130318","fuel:lpg":"yes",name:"AmeriGas",vending:"gas"}},"amenity/vending_machine|Automat ŚKUP":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"Automat ŚKUP","brand:wikidata":"Q24945427","brand:wikipedia":"pl:Śląska Karta Usług Publicznych",name:"Automat ŚKUP",vending:"public_transport_tickets"}},"amenity/vending_machine|BKK-automata":{countryCodes:["hu"],tags:{amenity:"vending_machine",brand:"BKK-automata","brand:wikidata":"Q608917","brand:wikipedia":"hu:Budapesti Közlekedési Központ",name:"BKK-automata",vending:"public_transport_tickets"}},"amenity/vending_machine|Blue Rhino":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"Blue Rhino","brand:wikidata":"Q65681213","fuel:lpg":"yes",name:"Blue Rhino",vending:"gas"}},"amenity/vending_machine|CVS Pharmacy":{countryCodes:["us"],nomatch:["amenity/pharmacy|CVS Pharmacy","shop/chemist|CVS Pharmacy"],tags:{amenity:"vending_machine",brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",name:"CVS Pharmacy",short_name:"CVS",vending:"chemist"}},"amenity/vending_machine|DHL Packstation":{countryCodes:["de"],matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Packstation","brand:wikidata":"Q1766703","brand:wikipedia":"en:Packstation",name:"DHL Packstation",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|DHL Paketbox":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Paketbox","brand:wikidata":"Q2046604","brand:wikipedia":"de:Paketbox",name:"DHL Paketbox",vending:"parcel_mail_in"}},"amenity/vending_machine|Dog-Station":{countryCodes:["at","de","dk"],tags:{amenity:"vending_machine",brand:"Dog-Station","brand:wikidata":"Q63720061",name:"Dog-Station",vending:"excrement_bags"}},"amenity/vending_machine|Home City Ice":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"Home City Ice","brand:wikidata":"Q5888287",name:"Home City Ice",vending:"ice_cubes"}},"amenity/vending_machine|KKM":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"}},"amenity/vending_machine|Paczkomat InPost":{countryCodes:["pl"],tags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|ParkPlus~(Calgary)":{countryCodes:["ca"],tags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"}},"amenity/vending_machine|Redbox":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox",vending:"movies"}},"amenity/vending_machine|Reddy Ice":{countryCodes:["us"],tags:{amenity:"vending_machine",brand:"Reddy Ice","brand:wikidata":"Q7305666",name:"Reddy Ice",vending:"ice_cubes"}},"amenity/vending_machine|Robidog":{countryCodes:["ch"],tags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog",vending:"excrement_bags"}},"amenity/vending_machine|Schlauchomat":{countryCodes:["at","de","it"],tags:{amenity:"vending_machine",brand:"Schlauchomat",name:"Schlauchomat",vending:"bicycle_tube"}},"amenity/vending_machine|Smartpost":{countryCodes:["fi"],matchTags:["amenity/post_box"],tags:{amenity:"vending_machine",brand:"Smartpost","brand:wikidata":"Q7543889","brand:wikipedia":"fi:SmartPOST",name:"Smartpost",vending:"parcel_pickup;parcel_mail_in"}},"amenity/vending_machine|Tobaccoland":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland",vending:"cigarettes"}},"amenity/vending_machine|VVO Fahrausweise":{countryCodes:["de"],tags:{amenity:"vending_machine",brand:"VVO Fahrausweise",name:"VVO Fahrausweise",vending:"public_transport_tickets"}},"amenity/vending_machine|Ключ здоровья":{countryCodes:["ru"],matchTags:["shop/water"],tags:{amenity:"vending_machine",brand:"Ключ здоровья",name:"Ключ здоровья",vending:"water"}},"amenity/vending_machine|コカ・コーラ":{countryCodes:["jp"],tags:{amenity:"vending_machine",brand:"コカ・コーラ","brand:en":"Coca-Cola","brand:ja":"コカ・コーラ","brand:wikidata":"Q2813","brand:wikipedia":"ja:コカ・コーラ",drink:"cola",name:"コカ・コーラ","name:en":"Coca-Cola","name:ja":"コカ・コーラ",vending:"drinks"}},"amenity/vending_machine|ポッカサッポロ":{countryCodes:["jp"],matchNames:["pokka sapporo"],tags:{amenity:"vending_machine",brand:"ポッカサッポロ","brand:en":"Pokka Sapporo","brand:ja":"ポッカサッポロ","brand:wikidata":"Q7208665","brand:wikipedia":"ja:ポッカサッポロフード&ビバレッジ",name:"ポッカサッポロ","name:en":"Pokka Sapporo","name:ja":"ポッカサッポロ",vending:"water;food"}},"amenity/veterinary|Banfield Pet Hospital":{countryCodes:["us"],tags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"}},"amenity/veterinary|VCA Animal Hospital":{countryCodes:["ca","us"],tags:{amenity:"veterinary",brand:"VCA Animal Hospital","brand:wikidata":"Q7906620","brand:wikipedia":"en:VCA Animal Hospitals",name:"VCA Animal Hospital"}},"craft/signmaker|Fastsigns":{countryCodes:["ae","ca","cl","gb","ky","mx","sa","us"],matchTags:["shop/sign"],tags:{brand:"Fastsigns","brand:wikidata":"Q5437127","brand:wikipedia":"en:Fastsigns",craft:"signmaker",name:"Fastsigns"}},"healthcare/blood_donation|Australian Red Cross Blood Service":{countryCodes:["au"],tags:{brand:"Australian Red Cross","brand:wikidata":"Q4824610","brand:wikipedia":"en:Australian Red Cross","donation:compensation":"no",healthcare:"blood_donation",name:"Australian Red Cross Blood Service",short_name:"Blood Service"}},"healthcare/clinic|ZoomCare":{countryCodes:["us"],matchTags:["amenity/clinic"],tags:{amenity:"clinic",brand:"ZoomCare","brand:wikidata":"Q64120374","brand:wikipedia":"en:ZoomCare",healthcare:"clinic",name:"ZoomCare",urgent_care:"yes"}},"healthcare/counselling|Jenny Craig":{countryCodes:["au","ca","nz","us"],matchTags:["amenity/doctors","amenity/weight_clinic","leisure/fitness_centre","office/therapist","shop/beauty","shop/diet","shop/food","shop/health_food","shop/herbalist","shop/nutrition","shop/nutrition_supplements","shop/weight_loss"],tags:{brand:"Jenny Craig","brand:wikidata":"Q6179221","brand:wikipedia":"en:Jenny Craig, Inc.",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"Jenny Craig"}},"healthcare/counselling|WW Studio":{matchNames:["ww"],matchTags:["amenity/doctors","amenity/weight_clinic","leisure/fitness_centre","office/therapist","shop/beauty","shop/diet","shop/food","shop/health_food","shop/herbalist","shop/nutrition","shop/nutrition_supplements","shop/weight_loss"],tags:{alt_name:"Weight Watchers",brand:"WW Studio","brand:wikidata":"Q1929466","brand:wikipedia":"en:WW International",healthcare:"counselling","healthcare:counselling":"dietitian","healthcare:speciality":"weight_loss",name:"WW Studio"}},"landuse/residential|Avalon":{countryCodes:["us"],tags:{brand:"Avalon","brand:wikidata":"Q64665938",landuse:"residential",name:"Avalon",residential:"apartments"}},"leisure/escape_game|Escapology":{countryCodes:["us"],matchTags:["tourism/attraction"],tags:{brand:"Escapology","brand:wikidata":"Q64137163",leisure:"escape_game",name:"Escapology"}},"leisure/fitness_centre|24 Hour Fitness":{countryCodes:["us"],tags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"}},"leisure/fitness_centre|Anytime Fitness":{tags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"}},"leisure/fitness_centre|Basic-Fit":{countryCodes:["be","es","fr","lu","nl"],tags:{brand:"Basic-Fit","brand:wikidata":"Q40165577","brand:wikipedia":"nl:Basic-Fit",leisure:"fitness_centre",name:"Basic-Fit"}},"leisure/fitness_centre|Clever fit":{countryCodes:["at","ch","de"],tags:{brand:"Clever fit","brand:wikidata":"Q27909675","brand:wikipedia":"de:Clever fit",leisure:"fitness_centre",name:"Clever fit"}},"leisure/fitness_centre|CorePower Yoga":{countryCodes:["us"],matchNames:["corepower"],matchTags:["club/sport","leisure/sports_centre"],tags:{brand:"CorePower Yoga","brand:wikidata":"Q21015663","brand:wikipedia":"en:CorePower Yoga",leisure:"fitness_centre",name:"CorePower Yoga",sport:"yoga"}},"leisure/fitness_centre|Crunch Fitness":{countryCodes:["au","ca","us"],matchNames:["crunch"],tags:{brand:"Crunch Fitness","brand:wikidata":"Q5190093","brand:wikipedia":"en:Crunch Fitness",leisure:"fitness_centre",name:"Crunch Fitness"}},"leisure/fitness_centre|Curves":{tags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"}},"leisure/fitness_centre|F45 Training":{tags:{brand:"F45 Training","brand:wikidata":"Q64390973",leisure:"fitness_centre",name:"F45 Training"}},"leisure/fitness_centre|Fit4Less ~(Canada)":{countryCodes:["ca"],tags:{brand:"Fit4Less","brand:wikidata":"Q64821050",leisure:"fitness_centre",name:"Fit4Less"}},"leisure/fitness_centre|Fit4less ~(UK)":{countryCodes:["uk"],tags:{brand:"Fit4less","brand:wikidata":"Q64821053",leisure:"fitness_centre",name:"Fit4less"}},"leisure/fitness_centre|Fitness First":{countryCodes:["ae","au","de","gb","ph","th"],tags:{brand:"Fitness First","brand:wikidata":"Q127120","brand:wikipedia":"en:Fitness First",leisure:"fitness_centre",name:"Fitness First"}},"leisure/fitness_centre|Fitness24Seven":{countryCodes:["fi","se"],tags:{brand:"Fitness24Seven","brand:wikidata":"Q61112447","brand:wikipedia":"sv:Fitness24Seven",leisure:"fitness_centre",name:"Fitness24Seven"}},"leisure/fitness_centre|Gold's Gym":{countryCodes:["ae","in","ph","us"],tags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"}},"leisure/fitness_centre|GoodLife Fitness":{countryCodes:["ca"],tags:{brand:"GoodLife Fitness","brand:wikidata":"Q3110654","brand:wikipedia":"en:GoodLife Fitness",leisure:"fitness_centre",name:"GoodLife Fitness"}},"leisure/fitness_centre|Jazzercise":{countryCodes:["us"],matchTags:["leisure/dance"],tags:{brand:"Jazzercise","brand:wikidata":"Q6168434","brand:wikipedia":"en:Jazzercise",leisure:"fitness_centre",name:"Jazzercise"}},"leisure/fitness_centre|LA Fitness":{countryCodes:["ca","gb","us"],tags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"}},"leisure/fitness_centre|Life Time":{countryCodes:["ca","us"],matchNames:["life time athletic","life time fitness"],tags:{brand:"Life Time","brand:wikidata":"Q6545004","brand:wikipedia":"en:Life Time Fitness",leisure:"fitness_centre",name:"Life Time"}},"leisure/fitness_centre|McFit":{countryCodes:["at","de","es","it","pl"],tags:{brand:"McFit","brand:wikidata":"Q871302","brand:wikipedia":"en:McFit",leisure:"fitness_centre",name:"McFit"}},"leisure/fitness_centre|Orangetheory Fitness":{countryCodes:["ca","es","us"],matchNames:["orangetheory"],tags:{brand:"Orangetheory Fitness","brand:wikidata":"Q25005163","brand:wikipedia":"en:Orangetheory Fitness",leisure:"fitness_centre",name:"Orangetheory Fitness"}},"leisure/fitness_centre|Planet Fitness":{countryCodes:["ca","us"],tags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"}},"leisure/fitness_centre|PureGym":{countryCodes:["gb"],tags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"}},"leisure/fitness_centre|Retro Fitness":{countryCodes:["us"],tags:{brand:"Retro Fitness","brand:wikidata":"Q61994955",leisure:"fitness_centre",name:"Retro Fitness"}},"leisure/fitness_centre|Smart Fit":{tags:{brand:"Smart Fit",leisure:"fitness_centre",name:"Smart Fit"}},"leisure/fitness_centre|Snap Fitness":{tags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"}},"leisure/fitness_centre|カーブス":{countryCodes:["jp"],tags:{brand:"カーブス","brand:ja":"カーブス",leisure:"fitness_centre",name:"カーブス","name:ja":"カーブス"}},"leisure/playground|McDonald's PlayPlace":{matchNames:["mcdonald's"],tags:{access:"customers",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",leisure:"playground",name:"McDonald's PlayPlace"}},"leisure/sports_centre|YMCA":{tags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"}},"leisure/sports_centre|iFLY":{tags:{brand:"iFLY","brand:wikidata":"Q64767105",leisure:"sports_centre",name:"iFLY",sport:"indoor_skydiving"}},"leisure/tanning_salon|Palm Beach Tan":{countryCodes:["us"],matchTags:["shop/beauty","shop/solarium"],tags:{beauty:"tanning",brand:"Palm Beach Tan","brand:wikidata":"Q64027086","brand:wikipedia":"en:Palm Beach Tan",leisure:"tanning_salon",name:"Palm Beach Tan",shop:"beauty"}},"office/bail_bond_agent|Aladdin Bail Bonds":{countryCodes:["us"],matchNames:["aladdin","aladin bail bonds","alladin bail bonds"],matchTags:["amenity/bail_bond","amenity/bail_bonds","office/bail_bond","office/bail_bonds","shop/bail_bond","shop/bail_bonds","shop/money_lender"],tags:{brand:"Aladdin Bail Bonds","brand:wikidata":"Q64166257","brand:wikipedia":"en:Aladdin Bail Bonds",name:"Aladdin Bail Bonds",office:"bail_bond_agent",opening_hours:"24/7"}},"office/coworking|Awfis":{countryCodes:["in"],tags:{brand:"Awfis","brand:wikidata":"Q60747757","brand:wikipedia":"en:Awfis",fee:"yes",name:"Awfis",office:"coworking"}},"office/coworking|Ucommune~(China)":{countryCodes:["cn"],tags:{brand:"优客工场","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"优客工场","brand:zh-Hans":"优客工场",fee:"yes",name:"优客工场","name:en":"Ucommune","name:zh":"优客工场","name:zh-Hans":"优客工场",office:"coworking"}},"office/coworking|Ucommune~(Hong Kong)":{countryCodes:["hk"],tags:{brand:"優客工場 Ucommune","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"優客工場","brand:zh-Hans":"优客工场","brand:zh-Hant":"優客工場",fee:"yes",name:"優客工場 Ucommune","name:en":"Ucommune","name:zh":"優客工場","name:zh-Hans":"优客工场","name:zh-Hant":"優客工場",office:"coworking"}},"office/coworking|Ucommune~(Singapore)":{countryCodes:["sg"],tags:{brand:"Ucommune","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"优客工场","brand:zh-Hans":"优客工场",fee:"yes",name:"Ucommune","name:en":"Ucommune","name:zh":"优客工场","name:zh-Hans":"优客工场",office:"coworking"}},"office/coworking|Ucommune~(Taiwan)":{countryCodes:["tw"],tags:{brand:"優客工場","brand:en":"Ucommune","brand:wikidata":"Q60785187","brand:wikipedia":"en:Ucommune","brand:zh":"優客工場","brand:zh-Hans":"优客工场","brand:zh-Hant":"優客工場",fee:"yes",name:"優客工場","name:en":"Ucommune","name:zh":"優客工場","name:zh-Hans":"优客工场","name:zh-Hant":"優客工場",office:"coworking"}},"office/coworking|WeWork":{countryCodes:["us"],tags:{brand:"WeWork","brand:wikidata":"Q19995004","brand:wikipedia":"en:WeWork",fee:"yes",name:"WeWork",office:"coworking"}},"office/employment_agency|Adecco":{tags:{brand:"Adecco","brand:wikidata":"Q353494","brand:wikipedia":"en:The Adecco Group",name:"Adecco",office:"employment_agency"}},"office/employment_agency|Agentur für Arbeit":{countryCodes:["de"],tags:{brand:"Agentur für Arbeit",name:"Agentur für Arbeit",office:"employment_agency"}},"office/employment_agency|Appel Médical":{countryCodes:["fr"],tags:{brand:"Appel Médical",name:"Appel Médical",office:"employment_agency"}},"office/employment_agency|Job Centre Plus":{countryCodes:["gb"],tags:{brand:"Job Centre Plus",name:"Job Centre Plus",office:"employment_agency"}},"office/employment_agency|Manpower":{tags:{brand:"Manpower","brand:wikidata":"Q1472539","brand:wikipedia":"en:ManpowerGroup",name:"Manpower",office:"employment_agency"}},"office/employment_agency|Pôle Emploi":{countryCodes:["fr"],tags:{brand:"Pôle Emploi","brand:wikidata":"Q8901192","brand:wikipedia":"en:Pôle emploi",name:"Pôle Emploi",office:"employment_agency"}},"office/employment_agency|Randstad":{tags:{brand:"Randstad","brand:wikidata":"Q267840","brand:wikipedia":"en:Randstad Holding",name:"Randstad",office:"employment_agency"}},"office/estate_agent|Bairstow Eves":{countryCodes:["gb"],tags:{brand:"Bairstow Eves",name:"Bairstow Eves",office:"estate_agent"}},"office/estate_agent|Century 21":{matchNames:["century 21 real estate"],nomatch:["shop/department_store|Century 21"],tags:{brand:"Century 21","brand:wikidata":"Q1054480","brand:wikipedia":"en:Century 21 (real estate)",name:"Century 21",office:"estate_agent"}},"office/estate_agent|Coldwell Banker":{matchNames:["coldwell banker real estate"],tags:{brand:"Coldwell Banker","brand:wikidata":"Q738853","brand:wikipedia":"en:Coldwell Banker",name:"Coldwell Banker",office:"estate_agent"}},"office/estate_agent|Connells":{countryCodes:["gb"],tags:{brand:"Connells",name:"Connells",office:"estate_agent"}},"office/estate_agent|Engel & Völkers":{tags:{brand:"Engel & Völkers","brand:wikidata":"Q1341765","brand:wikipedia":"en:Engel & Völkers",name:"Engel & Völkers",office:"estate_agent"}},"office/estate_agent|Foncia":{countryCodes:["fr"],tags:{brand:"Foncia","brand:wikidata":"Q1435638","brand:wikipedia":"fr:Foncia",name:"Foncia",office:"estate_agent"}},"office/estate_agent|Guy Hoquet":{countryCodes:["fr"],tags:{brand:"Guy Hoquet","brand:wikidata":"Q25383970","brand:wikipedia":"fr:Guy Hoquet l'immobilier",name:"Guy Hoquet",office:"estate_agent"}},"office/estate_agent|Hamptons International Lettings":{countryCodes:["gb"],tags:{brand:"Hamptons International Lettings",name:"Hamptons International Lettings",office:"estate_agent"}},"office/estate_agent|Hamptons International Sales":{countryCodes:["gb"],tags:{brand:"Hamptons International Sales",name:"Hamptons International Sales",office:"estate_agent"}},"office/estate_agent|Laforêt":{countryCodes:["fr"],tags:{brand:"Laforêt",name:"Laforêt",office:"estate_agent"}},"office/estate_agent|Orpi":{countryCodes:["fr"],tags:{brand:"Orpi","brand:wikidata":"Q3356080","brand:wikipedia":"fr:Organisation régionale des professionnels de l'immobilier",name:"Orpi",office:"estate_agent"}},"office/estate_agent|RE/MAX":{tags:{brand:"RE/MAX","brand:wikidata":"Q965845","brand:wikipedia":"en:RE/MAX",name:"RE/MAX",office:"estate_agent"}},"office/estate_agent|Ray White":{countryCodes:["au","nz"],tags:{brand:"Ray White",name:"Ray White",office:"estate_agent"}},"office/estate_agent|Royal LePage":{countryCodes:["ca"],tags:{brand:"Royal LePage","brand:wikidata":"Q7374385","brand:wikipedia":"en:Royal LePage",name:"Royal LePage",office:"estate_agent"}},"office/estate_agent|Square Habitat":{countryCodes:["fr"],tags:{brand:"Square Habitat","brand:wikidata":"Q64027038","brand:wikipedia":"fr:Square Habitat",name:"Square Habitat",office:"estate_agent"}},"office/estate_agent|Tecnocasa":{countryCodes:["es","it","pl"],tags:{brand:"Tecnocasa",name:"Tecnocasa",office:"estate_agent"}},"office/estate_agent|Your Move":{countryCodes:["gb"],tags:{brand:"Your Move",name:"Your Move",office:"estate_agent"}},"office/estate_agent|アパマンショップ":{countryCodes:["jp"],tags:{brand:"アパマンショップ","brand:ja":"アパマンショップ",name:"アパマンショップ","name:ja":"アパマンショップ",office:"estate_agent"}},"office/estate_agent|エイブル":{countryCodes:["jp"],tags:{brand:"エイブル","brand:ja":"エイブル",name:"エイブル","name:ja":"エイブル",office:"estate_agent"}},"office/estate_agent|ピタットハウス":{countryCodes:["jp"],tags:{brand:"ピタットハウス","brand:ja":"ピタットハウス",name:"ピタットハウス","name:ja":"ピタットハウス",office:"estate_agent"}},"office/estate_agent|信義房屋":{countryCodes:["tw"],tags:{brand:"信義房屋",name:"信義房屋",office:"estate_agent"}},"office/estate_agent|永慶房屋":{countryCodes:["tw"],tags:{brand:"永慶房屋",name:"永慶房屋",office:"estate_agent"}},"office/financial_advisor|Edward Jones":{countryCodes:["ca","us"],tags:{alt_name:"Edward Jones Investments",brand:"Edward Jones","brand:wikidata":"Q5343830","brand:wikipedia":"en:Edward Jones Investments",name:"Edward Jones",office:"financial_advisor"}},"office/insurance|AAA Insurance":{countryCodes:["us"],matchNames:["american automobile association"],nomatch:["office/travel_agency|American Automobile Association"],tags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"AAA Insurance",office:"insurance",short_name:"AAA"}},"office/insurance|AOK":{countryCodes:["de"],tags:{brand:"AOK","brand:wikidata":"Q835141","brand:wikipedia":"de:Allgemeine Ortskrankenkasse",name:"AOK",office:"insurance"}},"office/insurance|AXA":{nomatch:["amenity/bank|AXA"],tags:{brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA",office:"insurance"}},"office/insurance|Allianz":{tags:{brand:"Allianz","brand:wikidata":"Q487292","brand:wikipedia":"en:Allianz",name:"Allianz",office:"insurance"}},"office/insurance|Allstate":{countryCodes:["us"],matchNames:["allstate insurance"],tags:{brand:"Allstate","brand:wikidata":"Q2645636","brand:wikipedia":"en:Allstate",name:"Allstate",office:"insurance"}},"office/insurance|American Family Insurance":{countryCodes:["us"],matchNames:["american family","amfam"],tags:{brand:"American Family Insurance","brand:wikidata":"Q4743730","brand:wikipedia":"en:American Family Insurance",name:"American Family Insurance",office:"insurance"}},"office/insurance|Assu 2000":{countryCodes:["fr"],tags:{brand:"Assu 2000",name:"Assu 2000",office:"insurance"}},"office/insurance|Aviva":{countryCodes:["fr","ie","pl"],tags:{brand:"Aviva","brand:wikidata":"Q791179","brand:wikipedia":"en:Aviva",name:"Aviva",office:"insurance"}},"office/insurance|CUK Ubezpieczenia":{countryCodes:["pl"],tags:{brand:"CUK Ubezpieczenia",name:"CUK Ubezpieczenia",office:"insurance"}},"office/insurance|DEVK":{countryCodes:["de"],tags:{brand:"DEVK","brand:wikidata":"Q1153049","brand:wikipedia":"de:DEVK",name:"DEVK",office:"insurance"}},"office/insurance|Debeka":{countryCodes:["de"],tags:{brand:"Debeka","brand:wikidata":"Q1181452","brand:wikipedia":"de:Debeka",name:"Debeka",office:"insurance"}},"office/insurance|Erie Insurance":{countryCodes:["us"],matchNames:["erie"],tags:{brand:"Erie Insurance","brand:wikidata":"Q5388314","brand:wikipedia":"en:Erie Insurance Group",name:"Erie Insurance",office:"insurance"}},"office/insurance|Farmers Insurance":{countryCodes:["us"],matchNames:["farmers"],tags:{brand:"Farmers Insurance","brand:wikidata":"Q1396863","brand:wikipedia":"en:Farmers Insurance Group",name:"Farmers Insurance",office:"insurance"}},"office/insurance|GEICO":{countryCodes:["us"],tags:{brand:"GEICO","brand:wikidata":"Q1498689","brand:wikipedia":"en:GEICO",name:"GEICO",office:"insurance"}},"office/insurance|GMF":{countryCodes:["fr"],tags:{brand:"GMF",name:"GMF",office:"insurance"}},"office/insurance|Generali":{tags:{brand:"Generali","brand:wikidata":"Q670482","brand:wikipedia":"it:Assicurazioni Generali",name:"Generali",office:"insurance"}},"office/insurance|Grange Insurance":{countryCodes:["us"],matchNames:["grange"],tags:{brand:"Grange Insurance","brand:wikidata":"Q17183481","brand:wikipedia":"en:Grange Insurance",name:"Grange Insurance",office:"insurance"}},"office/insurance|Groupama":{matchTags:["amenity/bank|Groupama"],tags:{brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"fr:Groupama",name:"Groupama",office:"insurance",official_name:"Groupe des Assurances Mutuelles Agricoles"}},"office/insurance|HUK-Coburg":{countryCodes:["de"],tags:{brand:"HUK-Coburg",name:"HUK-Coburg",office:"insurance"}},"office/insurance|Knappschaft":{countryCodes:["de"],tags:{brand:"Knappschaft","brand:wikidata":"Q1313465","brand:wikipedia":"de:Knappschaft (Krankenkasse)",name:"Knappschaft",office:"insurance"}},"office/insurance|MAAF":{countryCodes:["fr"],tags:{brand:"MAAF","brand:wikidata":"Q3331028","brand:wikipedia":"fr:Mutuelle d'assurance des artisans de France",name:"MAAF",office:"insurance"}},"office/insurance|MMA":{countryCodes:["fr"],tags:{brand:"MMA","brand:wikidata":"Q3331046","brand:wikipedia":"fr:MMA (assurance)",name:"MMA",office:"insurance",official_name:"Mutuelles du Mans Assurances"}},"office/insurance|Macif":{countryCodes:["fr"],tags:{brand:"Macif","brand:wikidata":"Q3331021","brand:wikipedia":"fr:Mutuelle assurance des commerçants et industriels de France et des cadres et des salariés de l'industrie et du commerce",name:"Macif",office:"insurance"}},"office/insurance|Maif":{countryCodes:["fr"],tags:{brand:"Maif","brand:wikidata":"Q3331029","brand:wikipedia":"fr:Maif",name:"Maif",office:"insurance",official_name:"Mutuelle d'assurance des instituteurs de France"}},"office/insurance|Mapfre":{tags:{brand:"Mapfre","brand:wikidata":"Q544532","brand:wikipedia":"en:Mapfre",name:"Mapfre",office:"insurance"}},"office/insurance|Matmut":{countryCodes:["fr"],tags:{brand:"Matmut","brand:wikidata":"Q3299185","brand:wikipedia":"fr:Matmut",name:"Matmut",office:"insurance"}},"office/insurance|Nationwide":{countryCodes:["us"],matchNames:["nationwide insurance"],nomatch:["amenity/bank|Nationwide"],tags:{brand:"Nationwide","brand:wikidata":"Q6979886","brand:wikipedia":"en:Nationwide Mutual Insurance Company",name:"Nationwide",office:"insurance"}},"office/insurance|PZU":{countryCodes:["pl"],tags:{brand:"PZU","brand:wikidata":"Q1807170","brand:wikipedia":"pl:Powszechny Zakład Ubezpieczeń",name:"PZU",office:"insurance"}},"office/insurance|Progressive":{countryCodes:["us"],matchNames:["progressive insurance"],tags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",office:"insurance"}},"office/insurance|Provinzial":{countryCodes:["de"],tags:{brand:"Provinzial",name:"Provinzial",office:"insurance"}},"office/insurance|State Farm":{countryCodes:["us"],matchNames:["state farm insurance"],tags:{brand:"State Farm","brand:wikidata":"Q2007336","brand:wikipedia":"en:State Farm",name:"State Farm",office:"insurance"}},"office/insurance|Swinton":{countryCodes:["gb"],tags:{brand:"Swinton","brand:wikidata":"Q7658785",name:"Swinton",office:"insurance"}},"office/insurance|Techniker Krankenkasse":{countryCodes:["de"],tags:{brand:"Techniker Krankenkasse","brand:wikidata":"Q607531","brand:wikipedia":"de:Techniker Krankenkasse",name:"Techniker Krankenkasse",office:"insurance"}},"office/insurance|The Co-operators":{countryCodes:["ca"],tags:{brand:"The Co-operators","brand:wikidata":"Q3520320","brand:wikipedia":"en:The Co-operators",name:"The Co-operators",office:"insurance"}},"office/insurance|Wüstenrot":{countryCodes:["at","cz","de","sk"],tags:{brand:"Wüstenrot",name:"Wüstenrot",office:"insurance"}},"office/insurance|Zurich":{tags:{brand:"Zurich",name:"Zurich",office:"insurance"}},"office/insurance|Белгосстрах":{countryCodes:["by"],tags:{brand:"Белгосстрах",name:"Белгосстрах",office:"insurance"}},"office/insurance|Ингосстрах":{countryCodes:["ru"],tags:{brand:"Ингосстрах",name:"Ингосстрах",office:"insurance"}},"office/insurance|РЕСО-Гарантия":{countryCodes:["ru"],tags:{brand:"РЕСО-Гарантия",name:"РЕСО-Гарантия",office:"insurance"}},"office/insurance|Росгосстрах":{countryCodes:["ru"],tags:{brand:"Росгосстрах","brand:wikidata":"Q4397745","brand:wikipedia":"en:Rosgosstrakh",name:"Росгосстрах",office:"insurance"}},"office/insurance|Согласие":{countryCodes:["ru"],tags:{brand:"Согласие",name:"Согласие",office:"insurance"}},"office/insurance|بیمه ایران":{countryCodes:["ir"],tags:{brand:"بیمه ایران",name:"بیمه ایران",office:"insurance"}},"office/tax_advisor|Block Advisors":{countryCodes:["us"],tags:{brand:"Block Advisors","brand:wikidata":"Q64166231",name:"Block Advisors",office:"tax_advisor"}},"office/tax_advisor|H&R Block":{countryCodes:["au","ca","in","us"],tags:{brand:"H&R Block","brand:wikidata":"Q5627799","brand:wikipedia":"en:H&R Block",name:"H&R Block",office:"tax_advisor"}},"office/tax_advisor|Jackson Hewitt":{countryCodes:["us"],tags:{brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor",official_name:"Jackson Hewitt Tax Service"}},"office/tax_advisor|Liberty Tax":{countryCodes:["us"],tags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"}},"office/telecommunication|Ooredoo":{tags:{brand:"Ooredoo","brand:wikidata":"Q919935","brand:wikipedia":"en:Ooredoo",name:"Ooredoo",office:"telecommunication"}},"office/telecommunication|Velcom":{countryCodes:["by"],tags:{brand:"Velcom","brand:wikidata":"Q1888809","brand:wikipedia":"en:Velcom",name:"Velcom",office:"telecommunication"}},"office/telecommunication|Дом.ru":{tags:{brand:"Дом.ru",name:"Дом.ru",office:"telecommunication"}},"office/telecommunication|Магазин lifecell":{tags:{brand:"Магазин lifecell",name:"Магазин lifecell",office:"telecommunication"}},"office/telecommunication|Ростелеком":{countryCodes:["ru"],tags:{brand:"Ростелеком","brand:wikidata":"Q1477012","brand:wikipedia":"en:Rostelecom",name:"Ростелеком",office:"telecommunication"}},"office/telecommunication|Укртелеком":{countryCodes:["ua"],tags:{brand:"Укртелеком","brand:wikidata":"Q1505321","brand:wikipedia":"en:Ukrtelecom",name:"Укртелеком",office:"telecommunication"}},"office/telecommunication|مخابرات":{tags:{brand:"مخابرات",name:"مخابرات",office:"telecommunication"}},"office/telecommunication|中華電信":{countryCodes:["tw"],tags:{brand:"中華電信",name:"中華電信",office:"telecommunication"}},"office/telecommunication|台灣大哥大":{countryCodes:["tw"],tags:{brand:"台灣大哥大",name:"台灣大哥大",office:"telecommunication"}},"office/telecommunication|遠傳電信":{countryCodes:["tw"],tags:{brand:"遠傳電信",name:"遠傳電信",office:"telecommunication"}},"shop/agrarian|Granngården":{countryCodes:["se"],tags:{brand:"Granngården","brand:wikidata":"Q10508136","brand:wikipedia":"sv:Granngården AB",name:"Granngården",shop:"agrarian"}},"shop/agrarian|Southern States":{countryCodes:["us"],tags:{agrarian:"seed;feed;tools",brand:"Southern States","brand:wikidata":"Q7570508","brand:wikipedia":"en:Southern States Cooperative",name:"Southern States",official_name:"Southern States Cooperative",shop:"agrarian"}},"shop/alcohol|Alko":{countryCodes:["fi"],tags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"}},"shop/alcohol|BC Liquor Store":{countryCodes:["ca"],tags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"}},"shop/alcohol|BWS":{countryCodes:["au"],tags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"}},"shop/alcohol|Bargain Booze":{countryCodes:["gb"],tags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"}},"shop/alcohol|BevMo!":{countryCodes:["us"],tags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"}},"shop/alcohol|Cellarbrations":{countryCodes:["au"],tags:{brand:"Cellarbrations",name:"Cellarbrations",shop:"alcohol"}},"shop/alcohol|Dan Murphy's":{countryCodes:["au"],tags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"}},"shop/alcohol|Fine Wine & Good Spirits":{countryCodes:["us"],tags:{brand:"Fine Wine & Good Spirits","brand:wikidata":"Q64514776",name:"Fine Wine & Good Spirits",shop:"alcohol"}},"shop/alcohol|Gall & Gall":{countryCodes:["nl"],tags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"}},"shop/alcohol|LCBO":{countryCodes:["ca"],tags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"}},"shop/alcohol|Liquor Depot":{countryCodes:["ca"],tags:{brand:"Liquor Depot",name:"Liquor Depot",shop:"alcohol"}},"shop/alcohol|Liquorland":{countryCodes:["au"],tags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"}},"shop/alcohol|Majestic":{countryCodes:["gb"],matchNames:["majestic wine","majestic wine warehouse"],tags:{brand:"Majestic","brand:wikidata":"Q6737725",name:"Majestic",shop:"alcohol"}},"shop/alcohol|Mitra":{countryCodes:["nl"],tags:{brand:"Mitra",name:"Mitra",shop:"alcohol"}},"shop/alcohol|Nicolas":{countryCodes:["be","fr","gb"],tags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"}},"shop/alcohol|Oddbins":{countryCodes:["gb"],tags:{brand:"Oddbins","brand:wikidata":"Q7077472",name:"Oddbins",shop:"alcohol"}},"shop/alcohol|SAQ":{countryCodes:["ca"],nomatch:["shop/alcohol|SAQ Express","shop/alcohol|SAQ Sélection"],tags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"}},"shop/alcohol|SAQ Express":{countryCodes:["ca"],nomatch:["shop/alcohol|SAQ","shop/alcohol|SAQ Sélection"],tags:{brand:"SAQ Express","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ Express",shop:"alcohol"}},"shop/alcohol|SAQ Sélection":{countryCodes:["ca"],nomatch:["shop/alcohol|SAQ","shop/alcohol|SAQ Express"],tags:{brand:"SAQ Sélection","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ Sélection",shop:"alcohol"}},"shop/alcohol|Spec's":{countryCodes:["us"],tags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"}},"shop/alcohol|Super Liquor":{countryCodes:["nz"],tags:{brand:"Super Liquor",name:"Super Liquor",shop:"alcohol"}},"shop/alcohol|Systembolaget":{countryCodes:["se"],tags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"}},"shop/alcohol|The Beer Store":{countryCodes:["ca"],tags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"}},"shop/alcohol|Thirsty Camel":{countryCodes:["au"],tags:{brand:"Thirsty Camel",name:"Thirsty Camel",shop:"alcohol"}},"shop/alcohol|Total Wine":{countryCodes:["us"],tags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",official_name:"Total Wine & More",shop:"alcohol"}},"shop/alcohol|Virginia ABC":{countryCodes:["us"],tags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"}},"shop/alcohol|Алкомаркет":{countryCodes:["kz"],tags:{brand:"Алкомаркет",name:"Алкомаркет",shop:"alcohol"}},"shop/alcohol|Ароматный мир":{countryCodes:["ru"],tags:{brand:"Ароматный мир",name:"Ароматный мир",shop:"alcohol"}},"shop/alcohol|Бристоль":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Бристоль","brand:wikidata":"Q59155583","brand:wikipedia":"ru:Бристоль (сеть магазинов)",name:"Бристоль",shop:"alcohol"}},"shop/alcohol|Винлаб":{countryCodes:["ru"],tags:{brand:"Винлаб",name:"Винлаб",shop:"alcohol"}},"shop/alcohol|Горилка":{countryCodes:["kz","ru"],tags:{brand:"Горилка",name:"Горилка",shop:"alcohol"}},"shop/alcohol|Градус":{countryCodes:["ru","ua"],tags:{brand:"Градус",name:"Градус",shop:"alcohol"}},"shop/alcohol|Градусы":{countryCodes:["ru"],tags:{brand:"Градусы",name:"Градусы",shop:"alcohol"}},"shop/alcohol|Красное & Белое":{countryCodes:["ru"],matchNames:["красное и белое"],tags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Krasnoe & Beloe",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"}},"shop/alcohol|Кристалл":{countryCodes:["by","ru"],matchTags:["shop/convenience"],tags:{brand:"Кристалл",name:"Кристалл",shop:"alcohol"}},"shop/alcohol|Лион":{countryCodes:["ru"],tags:{brand:"Лион",name:"Лион",shop:"alcohol"}},"shop/alcohol|Норман":{countryCodes:["ru"],tags:{brand:"Норман",name:"Норман",shop:"alcohol"}},"shop/alcohol|Отдохни":{countryCodes:["ru"],tags:{brand:"Отдохни",name:"Отдохни",shop:"alcohol"}},"shop/alcohol|Чарка до свята":{tags:{brand:"Чарка до свята",name:"Чарка до свята",shop:"alcohol"}},"shop/alcohol|カクヤス":{countryCodes:["jp"],tags:{brand:"カクヤス","brand:en":"Kakuyasu","brand:ja":"カクヤス","brand:wikidata":"Q11293990","brand:wikipedia":"ja:カクヤス",name:"カクヤス","name:en":"Kakuyasu","name:ja":"カクヤス",shop:"alcohol"}},"shop/art|YellowKorner":{tags:{brand:"YellowKorner","brand:wikidata":"Q3572115","brand:wikipedia":"fr:YellowKorner",name:"YellowKorner",shop:"art"}},"shop/baby_goods|Aubert":{countryCodes:["fr"],tags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"}},"shop/baby_goods|Babies R Us":{countryCodes:["ca","us"],tags:{brand:"Babies R Us","brand:wikidata":"Q17232036",name:"Babies R Us",shop:"baby_goods"}},"shop/baby_goods|BabyOne":{countryCodes:["de"],tags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"}},"shop/baby_goods|Buy Buy Baby":{countryCodes:["ca","us"],tags:{brand:"Buy Buy Baby","brand:wikidata":"Q5003352","brand:wikipedia":"en:Buy Buy Baby",name:"Buy Buy Baby",shop:"baby_goods"}},"shop/baby_goods|Mothercare":{tags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"}},"shop/baby_goods|西松屋":{countryCodes:["jp"],matchTags:["shop/clothes"],tags:{brand:"西松屋","brand:en":"Nishimatsuya Chain","brand:ja":"西松屋","brand:wikidata":"Q11628761","brand:wikipedia":"ja:西松屋",name:"西松屋","name:en":"Nishimatsuya Chain","name:ja":"西松屋",shop:"baby_goods"}},"shop/bag|Carpisa":{countryCodes:["it"],tags:{brand:"Carpisa","brand:wikidata":"Q28035409","brand:wikipedia":"en:Carpisa",name:"Carpisa",shop:"bag"}},"shop/bag|Coach":{countryCodes:["ca","us"],matchNames:["coach new york","coach ny"],tags:{brand:"Coach","brand:wikidata":"Q727697","brand:wikipedia":"en:Coach New York",name:"Coach",shop:"bag"}},"shop/bag|Kipling":{countryCodes:["be","gb"],tags:{brand:"Kipling","brand:wikidata":"Q6414641","brand:wikipedia":"en:Kipling (brand)",name:"Kipling",shop:"bag"}},"shop/bag|Samsonite":{tags:{brand:"Samsonite","brand:wikidata":"Q1203426","brand:wikipedia":"en:Samsonite",name:"Samsonite",shop:"bag"}},"shop/bag|Tumi":{tags:{brand:"Tumi","brand:wikidata":"Q4465402","brand:wikipedia":"en:Tumi Inc.",name:"Tumi",shop:"bag"}},"shop/bag|Vera Bradley":{countryCodes:["us"],tags:{brand:"Vera Bradley","brand:wikidata":"Q7920749","brand:wikipedia":"en:Vera Bradley",name:"Vera Bradley",shop:"bag"}},"shop/bakery|AILI":{countryCodes:["cn"],tags:{brand:"AILI",name:"AILI",shop:"bakery"}},"shop/bakery|Anker":{countryCodes:["at","sk"],tags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"}},"shop/bakery|Awiteks":{countryCodes:["pl"],tags:{brand:"Awiteks","brand:wikidata":"Q62054190",name:"Awiteks",shop:"bakery"}},"shop/bakery|Backwerk":{countryCodes:["at","ch","de","gb","nl"],tags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"}},"shop/bakery|Bakers Delight":{countryCodes:["au","ca","nz","us"],tags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"}},"shop/bakery|Bakker Bart":{countryCodes:["be","nl"],tags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"}},"shop/bakery|Banette":{tags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"}},"shop/bakery|Birds":{countryCodes:["gb"],tags:{brand:"Birds","brand:wikidata":"Q63001935","brand:wikipedia":"en:Birds Bakery",name:"Birds",official_name:"Birds Bakery",shop:"bakery"}},"shop/bakery|Breadtop":{countryCodes:["au"],tags:{brand:"Breadtop","brand:wikidata":"Q4959217","brand:wikipedia":"en:Breadtop",cuisine:"chinese",name:"Breadtop",shop:"bakery"}},"shop/bakery|Bäckerei Fuchs":{countryCodes:["de"],tags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"}},"shop/bakery|Bäckerei Schmidt":{countryCodes:["de"],tags:{brand:"Bäckerei Schmidt",name:"Bäckerei Schmidt",shop:"bakery"}},"shop/bakery|Bäckerei Schneider":{countryCodes:["de"],tags:{brand:"Bäckerei Schneider",name:"Bäckerei Schneider",shop:"bakery"}},"shop/bakery|Büsch":{countryCodes:["de"],tags:{brand:"Büsch",name:"Büsch",shop:"bakery"}},"shop/bakery|COBS Bread":{countryCodes:["ca","us"],tags:{brand:"COBS Bread","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"COBS Bread",shop:"bakery"}},"shop/bakery|Cadera":{countryCodes:["de"],tags:{brand:"Cadera","brand:wikidata":"Q62086410",name:"Cadera",shop:"bakery"}},"shop/bakery|Cooplands":{countryCodes:["gb"],tags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"}},"shop/bakery|Dat Backhus":{countryCodes:["de"],tags:{brand:"Dat Backhus","brand:wikidata":"Q62093175",name:"Dat Backhus",shop:"bakery"}},"shop/bakery|Der Beck":{countryCodes:["de"],tags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"}},"shop/bakery|Der Mann":{countryCodes:["at"],tags:{brand:"Der Mann",name:"Der Mann",shop:"bakery"}},"shop/bakery|Ditsch":{countryCodes:["de"],tags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"}},"shop/bakery|Fischer":{countryCodes:["be","fr"],tags:{brand:"Fischer",name:"Fischer",shop:"bakery"}},"shop/bakery|Fornetti":{tags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"}},"shop/bakery|Goeken backen":{countryCodes:["de"],tags:{brand:"Goeken backen",name:"Goeken backen",shop:"bakery"}},"shop/bakery|Goldilocks":{countryCodes:["ca","ph","th","us"],tags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"}},"shop/bakery|Granier":{countryCodes:["es"],tags:{brand:"Granier",name:"Granier",shop:"bakery"}},"shop/bakery|Greggs":{countryCodes:["gb"],tags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"}},"shop/bakery|Hert":{countryCodes:["pl"],tags:{brand:"Hert",name:"Hert",shop:"bakery"}},"shop/bakery|Hinnerbäcker":{countryCodes:["de"],tags:{brand:"Hinnerbäcker",name:"Hinnerbäcker",shop:"bakery"}},"shop/bakery|Hofpfisterei":{countryCodes:["de"],tags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"}},"shop/bakery|Hosselmann":{tags:{brand:"Hosselmann",name:"Hosselmann",shop:"bakery"}},"shop/bakery|Ihle":{countryCodes:["de"],matchNames:["landbäckerei ihle"],tags:{brand:"Ihle","brand:wikidata":"Q1626371","brand:wikipedia":"de:Landbäckerei Ihle",name:"Ihle",shop:"bakery"}},"shop/bakery|Julie's Bakeshop":{countryCodes:["ph"],tags:{brand:"Julie's Bakeshop",name:"Julie's Bakeshop",shop:"bakery"}},"shop/bakery|K&U Bäckerei":{countryCodes:["de"],matchNames:["k&u"],tags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"}},"shop/bakery|Kamps":{countryCodes:["de"],tags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"}},"shop/bakery|La Mie Câline":{countryCodes:["fr"],tags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"}},"shop/bakery|Le Crobag":{countryCodes:["at","de","pl","ru"],tags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"}},"shop/bakery|Le Fournil":{countryCodes:["fr"],tags:{brand:"Le Fournil",name:"Le Fournil",shop:"bakery"}},"shop/bakery|Lila Bäcker":{countryCodes:["de"],tags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"}},"shop/bakery|Lipóti Pékség":{countryCodes:["hu"],tags:{brand:"Lipóti Pékség",name:"Lipóti Pékség",shop:"bakery"}},"shop/bakery|Löwenbäcker Schaper":{countryCodes:["de"],matchNames:["schaper"],tags:{brand:"Löwenbäcker Schaper","brand:wikidata":"Q62075965",name:"Löwenbäcker Schaper",shop:"bakery"}},"shop/bakery|Marie Blachère":{countryCodes:["fr"],tags:{brand:"Marie Blachère","brand:wikidata":"Q62082410",name:"Marie Blachère",shop:"bakery"}},"shop/bakery|Mlinar":{countryCodes:["ba","hr","sl"],tags:{brand:"Mlinar","brand:wikidata":"Q62082464",name:"Mlinar",shop:"bakery"}},"shop/bakery|Musmanni":{countryCodes:["cr"],tags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"}},"shop/bakery|Nothing Bundt Cakes":{countryCodes:["ca","us"],tags:{brand:"Nothing Bundt Cakes","brand:wikidata":"Q62082526",name:"Nothing Bundt Cakes",shop:"bakery"}},"shop/bakery|Nur Hier":{countryCodes:["de"],tags:{brand:"Nur Hier",name:"Nur Hier",shop:"bakery"}},"shop/bakery|Oebel":{countryCodes:["de"],tags:{brand:"Oebel",name:"Oebel",shop:"bakery"}},"shop/bakery|Pan de Manila":{countryCodes:["ph"],tags:{brand:"Pan de Manila",name:"Pan de Manila",shop:"bakery"}},"shop/bakery|Paris Baguette~(worldwide)":{countryCodes:["sg","us","vn"],matchNames:["paris baguette cafe"],nomatch:["shop/bakery|巴黎贝甜","shop/bakery|파리바게뜨"],tags:{brand:"Paris Baguette","brand:wikidata":"Q62605260",name:"Paris Baguette",shop:"bakery"}},"shop/bakery|Paul":{tags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"}},"shop/bakery|Red Ribbon":{countryCodes:["ph","us"],tags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"}},"shop/bakery|Ronde des Pains":{countryCodes:["be","fr"],tags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"}},"shop/bakery|Schäfer's":{countryCodes:["de"],matchNames:["schäfer"],tags:{brand:"Schäfer's","brand:wikidata":"Q1464562","brand:wikipedia":"de:Schäfers Brot",name:"Schäfer's",shop:"bakery"}},"shop/bakery|Sehne":{countryCodes:["de"],tags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"}},"shop/bakery|Steinecke":{countryCodes:["de"],tags:{brand:"Steinecke","brand:wikidata":"Q57516278","brand:wikipedia":"de:Meisterbäckerei Steinecke",name:"Steinecke",shop:"bakery"}},"shop/bakery|Sternenbäck":{countryCodes:["de"],tags:{brand:"Sternenbäck","brand:wikidata":"Q62595021",name:"Sternenbäck",shop:"bakery"}},"shop/bakery|Ströck":{countryCodes:["at"],tags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"}},"shop/bakery|Wiener Feinbäcker":{countryCodes:["de"],tags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"}},"shop/bakery|Woops!":{countryCodes:["us"],tags:{brand:"Woops!",name:"Woops!",shop:"bakery"}},"shop/bakery|von Allwörden":{countryCodes:["de"],tags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"}},"shop/bakery|Булочная Ф. Вольчека":{countryCodes:["ru"],tags:{brand:"Булочная Ф. Вольчека",name:"Булочная Ф. Вольчека",shop:"bakery"}},"shop/bakery|Кулинария":{tags:{brand:"Кулинария",name:"Кулинария",shop:"bakery"}},"shop/bakery|Кулиничи":{countryCodes:["ua"],tags:{brand:"Кулиничи",name:"Кулиничи",shop:"bakery"}},"shop/bakery|Кулиничі":{countryCodes:["ua"],tags:{brand:"Кулиничі",name:"Кулиничі",shop:"bakery"}},"shop/bakery|サンジェルマン":{countryCodes:["jp"],tags:{brand:"サンジェルマン","brand:en":"Saint-Germain","brand:ja":"サンジェルマン","brand:wikidata":"Q11305612","brand:wikipedia":"ja:サンジェルマン (製パン)",name:"サンジェルマン","name:en":"Saint-Germain","name:ja":"サンジェルマン",shop:"bakery"}},"shop/bakery|ヴィ・ド・フランス":{countryCodes:["jp"],tags:{brand:"ヴィ・ド・フランス","brand:en":"Vie de France","brand:ja":"ヴィ・ド・フランス","brand:wikidata":"Q7928249","brand:wikipedia":"ja:ヴィ・ド・フランス",name:"ヴィ・ド・フランス","name:en":"Vie de France","name:ja":"ヴィ・ド・フランス",shop:"bakery"}},"shop/bakery|巴黎贝甜~(China)":{countryCodes:["cn"],matchNames:["paris baguette","paris baguette cafe","巴黎貝甜"],nomatch:["shop/bakery|Paris Baguette","shop/bakery|파리바게뜨"],tags:{brand:"巴黎贝甜","brand:en":"Paris Baguette","brand:wikidata":"Q62605260","brand:zh":"巴黎贝甜",name:"巴黎贝甜","name:en":"Paris Baguette","name:zh":"巴黎贝甜",shop:"bakery"}},"shop/bakery|뚜레쥬르":{countryCodes:["kr"],matchNames:["뚜레주르"],tags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:ko":"뚜레쥬르","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours","name:ko":"뚜레쥬르",shop:"bakery"}},"shop/bakery|파리바게뜨~(South Korea)":{countryCodes:["kr"],matchNames:["paris baguette","paris baguette cafe","파리바게트"],nomatch:["shop/bakery|Paris Baguette","shop/bakery|巴黎贝甜"],tags:{"alt_name:ko":"파리바게트",brand:"파리바게뜨","brand:en":"Paris Baguette","brand:ko":"파리바게뜨","brand:wikidata":"Q62605260",name:"파리바게뜨","name:en":"Paris Baguette","name:ko":"파리바게뜨",shop:"bakery"}},"shop/beauty|Benefit Brow Bar":{countryCodes:["us"],matchNames:["benefit","ulta brow bar"],tags:{beauty:"eyebrow;eyelash;waxing",brand:"Benefit","brand:wikidata":"Q2895769","brand:wikipedia":"en:Benefit Cosmetics",name:"Benefit Brow Bar",shop:"beauty"}},"shop/beauty|European Wax Center":{countryCodes:["us"],tags:{beauty:"waxing",brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"}},"shop/beauty|Hollywood Nails":{countryCodes:["de","gb","us"],tags:{beauty:"nails",brand:"Hollywood Nails",name:"Hollywood Nails",shop:"beauty"}},"shop/beauty|Indigo Sun":{countryCodes:["gb"],tags:{beauty:"tanning",brand:"Indigo Sun","brand:wikidata":"Q63436906",name:"Indigo Sun",shop:"beauty"}},"shop/beauty|Sola Salons":{countryCodes:["us"],matchNames:["sola","sola salon studios"],tags:{beauty:"hair;nails;skin_care;massage",brand:"Sola Salons","brand:wikidata":"Q64337426",name:"Sola Salons",shop:"beauty"}},"shop/beauty|Star Nails":{tags:{beauty:"nails",brand:"Star Nails",name:"Star Nails",shop:"beauty"}},"shop/beauty|The Skin Bar at Ulta Beauty":{countryCodes:["us"],nomatch:["shop/beauty|Ulta Beauty"],tags:{alt_name:"Ulta Skin Bar",beauty:"skin_care",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Skin Bar at Ulta Beauty",shop:"beauty"}},"shop/beauty|Yves Rocher":{matchTags:["shop/chemist","shop/cosmetics"],tags:{beauty:"cosmetics",brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"}},"shop/bed|Casper":{tags:{brand:"Casper","brand:wikidata":"Q20539294","brand:wikipedia":"en:Casper Sleep",name:"Casper",shop:"bed"}},"shop/bed|Dreams":{countryCodes:["gb"],tags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"}},"shop/bed|Matratzen Concord":{countryCodes:["at","ch","de"],tags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"}},"shop/bed|Mattress Firm":{countryCodes:["us"],matchNames:["sleepys"],tags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"}},"shop/bed|Mattress Warehouse":{countryCodes:["us"],tags:{brand:"Mattress Warehouse","brand:wikidata":"Q61995079",name:"Mattress Warehouse",shop:"bed"}},"shop/bed|Sleep Country":{countryCodes:["ca"],matchNames:["Sleep Country Canada"],tags:{brand:"Sleep Country","brand:wikidata":"Q7539684","brand:wikipedia":"en:Sleep Country Canada",name:"Sleep Country",shop:"bed"}},"shop/bed|Sleep Number":{countryCodes:["us"],tags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"}},"shop/beverages|50嵐":{countryCodes:["cn","tw"],tags:{brand:"50嵐",name:"50嵐",shop:"beverages"}},"shop/beverages|Dursty":{countryCodes:["de"],tags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"}},"shop/beverages|Edeka Getränkemarkt":{countryCodes:["de"],tags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"}},"shop/beverages|Fristo":{countryCodes:["at","de"],matchNames:["fristo getränkemarkt"],tags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"}},"shop/beverages|Getränke Hoffmann":{countryCodes:["de"],tags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"}},"shop/beverages|Getränkeland":{countryCodes:["de"],tags:{brand:"Getränkeland","brand:wikidata":"Q62594849",name:"Getränkeland",shop:"beverages"}},"shop/beverages|Hol'ab":{countryCodes:["de"],tags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"}},"shop/beverages|Orterer Getränkemarkt":{countryCodes:["de"],tags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"}},"shop/beverages|Rewe Getränkemarkt":{countryCodes:["de"],tags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"}},"shop/beverages|Trinkgut":{countryCodes:["de"],tags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"}},"shop/beverages|大苑子":{tags:{brand:"大苑子",name:"大苑子",shop:"beverages"}},"shop/beverages|清心福全":{countryCodes:["tw"],tags:{brand:"清心福全","brand:en":"Ching Shin","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站","brand:zh":"清心福全",name:"清心福全","name:en":"Ching Shin","name:zh":"清心福全",shop:"beverages"}},"shop/beverages|茶湯會":{countryCodes:["tw"],tags:{brand:"茶湯會",name:"茶湯會",shop:"beverages"}},"shop/bicycle|Evans Cycles":{countryCodes:["gb"],tags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"}},"shop/bicycle|Fri BikeShop":{countryCodes:["dk"],tags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"}},"shop/bicycle|Giant":{nomatch:["amenity/fuel|Giant","shop/supermarket|Giant"],tags:{brand:"Giant","brand:wikidata":"Q703557","brand:wikipedia":"en:Giant Bicycles",name:"Giant",shop:"bicycle"}},"shop/bicycle|Trek":{matchNames:["treck","trek bicycle"],tags:{alt_name:"Trek Bicycle Store",brand:"Trek","brand:wikidata":"Q1067617","brand:wikipedia":"en:Trek Bicycle Corporation",name:"Trek",shop:"bicycle"}},"shop/bicycle|サイクルベースあさひ":{countryCodes:["jp"],tags:{brand:"サイクルベースあさひ","brand:en":"Cycle Base Asahi","brand:ja":"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ","name:en":"Cycle Base Asahi","name:ja":"サイクルベースあさひ",shop:"bicycle"}},"shop/bookmaker|Betfred":{countryCodes:["gb"],tags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"}},"shop/bookmaker|Coral":{countryCodes:["gb"],tags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"}},"shop/bookmaker|Fortuna":{countryCodes:["cz","hr","pl","ro","sk"],tags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"}},"shop/bookmaker|Ladbrokes":{countryCodes:["gb"],tags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"}},"shop/bookmaker|Paddy Power":{countryCodes:["gb","ie"],tags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"}},"shop/bookmaker|Tipico":{countryCodes:["at","co","de","gi","hr","mt"],tags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"}},"shop/bookmaker|William Hill":{countryCodes:["gb"],tags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"}},"shop/bookmaker|ΟΠΑΠ":{countryCodes:["gr"],tags:{brand:"ΟΠΑΠ","brand:el":"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:el":"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"}},"shop/bookmaker|Лига ставок":{countryCodes:["ru"],tags:{brand:"Лига ставок","brand:en":"Liga Stavok","brand:ru":"Лига ставок","brand:wikidata":"Q6545804","brand:wikipedia":"ru:Лига Ставок",name:"Лига ставок","name:en":"Liga Stavok","name:ru":"Лига ставок",shop:"bookmaker"}},"shop/bookmaker|Фонбет":{countryCodes:["ru"],tags:{brand:"Фонбет","brand:en":"Fonbet","brand:ru":"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет","name:en":"Fonbet","name:ru":"Фонбет",shop:"bookmaker"}},"shop/books|Akademibokhandeln":{countryCodes:["se"],tags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"}},"shop/books|Akateeminen Kirjakauppa":{countryCodes:["fi"],tags:{brand:"Akateeminen Kirjakauppa","brand:wikidata":"Q10403942","brand:wikipedia":"fi:Akateeminen Kirjakauppa",name:"Akateeminen Kirjakauppa",shop:"books"}},"shop/books|Barnes & Noble":{countryCodes:["us"],tags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"}},"shop/books|Books-A-Million":{countryCodes:["us"],tags:{brand:"Books-A-Million","brand:wikidata":"Q4943266","brand:wikipedia":"en:Books-A-Million",name:"Books-A-Million",shop:"books"}},"shop/books|Bruna":{countryCodes:["nl"],tags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"en:Bruna (company)",name:"Bruna",shop:"books"}},"shop/books|Chapters":{countryCodes:["ca","us"],tags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters (bookstore)",name:"Chapters",shop:"books"}},"shop/books|Cultura":{countryCodes:["fr"],tags:{brand:"Cultura","brand:wikidata":"Q3007154","brand:wikipedia":"fr:Cultura",name:"Cultura",shop:"books"}},"shop/books|Empik":{countryCodes:["pl"],tags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"pl:Empik",name:"Empik",shop:"books"}},"shop/books|Fnac":{countryCodes:["be","ch","es","fr","nl","pt"],tags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"}},"shop/books|Half Price Books":{countryCodes:["us"],tags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"}},"shop/books|Hugendubel":{countryCodes:["de"],tags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"}},"shop/books|Indigo":{countryCodes:["ca","us"],tags:{alt_name:"!ndigo",brand:"Indigo","brand:wikidata":"Q2477358","brand:wikipedia":"en:Indigo Books and Music",name:"Indigo",shop:"books"}},"shop/books|Mondadori":{countryCodes:["it"],tags:{brand:"Mondadori","brand:wikidata":"Q85355","brand:wikipedia":"en:Arnoldo Mondadori Editore",name:"Mondadori",shop:"books"}},"shop/books|National Book Store":{countryCodes:["ph"],tags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"}},"shop/books|Standaard Boekhandel":{countryCodes:["be"],tags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"}},"shop/books|Suomalainen Kirjakauppa":{countryCodes:["fi"],tags:{brand:"Suomalainen Kirjakauppa","brand:wikidata":"Q7641808","brand:wikipedia":"fi:Suomalainen Kirjakauppa",name:"Suomalainen Kirjakauppa",shop:"books"}},"shop/books|TSUTAYA":{countryCodes:["jp"],nomatch:["shop/music|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"}},"shop/books|Thalia":{countryCodes:["at","ch","de"],tags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"}},"shop/books|The Works":{countryCodes:["gb","ie"],tags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"}},"shop/books|Waterstones":{countryCodes:["be","gb","ie","je","nl"],tags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"}},"shop/books|Weltbild":{countryCodes:["de"],tags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"}},"shop/books|Буквоед":{countryCodes:["ru"],tags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"}},"shop/books|Дом книги":{countryCodes:["ru"],tags:{brand:"Дом книги","brand:wikidata":"Q48950742","brand:wikipedia":"ru:Московский дом книги",name:"Дом книги",shop:"books"}},"shop/books|Читай-город":{countryCodes:["ru"],tags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"}},"shop/books|סטימצקי":{countryCodes:["il"],tags:{brand:"סטימצקי","brand:en":"Steimatzky","brand:he":"סטימצקי","brand:wikidata":"Q2903995","brand:wikipedia":"he:סטימצקי",name:"סטימצקי","name:en":"Steimatzky","name:he":"סטימצקי",shop:"books"}},"shop/books|צומת ספרים":{countryCodes:["il"],matchNames:["Zomet Sfarim"],tags:{brand:"צומת ספרים","brand:en":"Tzomet Sfarim","brand:he":"צומת ספרים","brand:wikidata":"Q6743833","brand:wikipedia":"he:צומת ספרים",name:"צומת ספרים","name:en":"Tzomet Sfarm","name:he":"צומת ספרים",shop:"books"}},"shop/books|あおい書店":{countryCodes:["jp"],tags:{brand:"あおい書店","brand:en":"AOI","brand:ja":"あおい書店","brand:wikidata":"Q11256783","brand:wikipedia":"ja:あおい書店",name:"あおい書店","name:en":"AOI","name:ja":"あおい書店",shop:"books"}},"shop/books|ブックオフ":{countryCodes:["jp"],tags:{brand:"ブックオフ","brand:en":"Book Off","brand:ja":"ブックオフ","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off","name:ja":"ブックオフ",shop:"books"}},"shop/books|メロンブックス":{countryCodes:["jp"],tags:{brand:"メロンブックス","brand:en":"Melonbooks","brand:ja":"メロンブックス","brand:wikidata":"Q10851653","brand:wikipedia":"ja:メロンブックス",name:"メロンブックス","name:en":"Melonbooks","name:ja":"メロンブックス",shop:"books"}},"shop/books|リブロ":{countryCodes:["jp"],tags:{brand:"リブロ","brand:en":"LIBRO","brand:ja":"リブロ","brand:wikidata":"Q6542768","brand:wikipedia":"ja:リブロ",name:"リブロ","name:en":"Libro","name:ja":"リブロ",shop:"books"}},"shop/books|三省堂書店":{countryCodes:["jp"],tags:{brand:"三省堂書店","brand:en":"Books Sanseido","brand:ja":"三省堂書店","brand:wikidata":"Q10866539","brand:wikipedia":"ja:三省堂書店",name:"三省堂書店","name:en":"Books Sanseido","name:ja":"三省堂書店",shop:"books"}},"shop/books|文教堂":{countryCodes:["jp"],tags:{brand:"文教堂","brand:en":"Bunkyodo","brand:ja":"文教堂","brand:wikidata":"Q11499974","brand:wikipedia":"ja:文教堂",name:"文教堂","name:en":"Bunkyodo","name:ja":"文教堂",shop:"books"}},"shop/books|新华书店":{countryCodes:["cn"],tags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore","brand:zh":"新华书店",name:"新华书店","name:en":"Xinhua Bookstore","name:zh":"新华书店",shop:"books"}},"shop/books|未来屋書店":{countryCodes:["jp"],tags:{brand:"未来屋書店","brand:en":"Miraiya Shoten","brand:ja":"未来屋書店","brand:wikidata":"Q11519563","brand:wikipedia":"ja:未来屋書店",name:"未来屋書店","name:en":"Miraiya Shoten","name:ja":"未来屋書店",shop:"books"}},"shop/butcher|Coqivoire":{countryCodes:["ci"],tags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"}},"shop/butcher|Fleischerei Richter":{countryCodes:["de"],tags:{brand:"Fleischerei Richter",name:"Fleischerei Richter",shop:"butcher"}},"shop/butcher|Foani":{countryCodes:["ci"],tags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"}},"shop/butcher|Gzella":{countryCodes:["pl"],tags:{brand:"Gzella",name:"Gzella",shop:"butcher"}},"shop/butcher|M&M Food Market":{countryCodes:["ca"],tags:{brand:"M&M Food Market","brand:wikidata":"Q6711827","brand:wikipedia":"en:M&M Food Market",name:"M&M Food Market",shop:"butcher"}},"shop/butcher|Vinzenzmurr":{countryCodes:["de"],tags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"}},"shop/butcher|Ариант":{countryCodes:["ru"],tags:{brand:"Ариант",name:"Ариант",shop:"butcher"}},"shop/butcher|Великолукский мясокомбинат":{countryCodes:["ru"],tags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"}},"shop/butcher|Мясницкий ряд":{countryCodes:["ru"],tags:{brand:"Мясницкий ряд",name:"Мясницкий ряд",shop:"butcher"}},"shop/butcher|Наша Ряба":{countryCodes:["ua"],tags:{brand:"Наша Ряба",name:"Наша Ряба",shop:"butcher"}},"shop/butcher|Родинна ковбаска":{countryCodes:["ua"],tags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"}},"shop/butcher|肉のハナマサ":{countryCodes:["jp"],matchNames:["ハナマサ"],tags:{brand:"ハナマサ","brand:en":"Hanamasa","brand:ja":"ハナマサ","brand:wikidata":"Q11326564","brand:wikipedia":"ja:ハナマサ",butcher:"beef",name:"肉のハナマサ","name:en":"Hanamasa Meat","name:ja":"肉のハナマサ",shop:"butcher"}},"shop/candles|Yankee Candle":{countryCodes:["ca","gb","us"],tags:{brand:"Yankee Candle","brand:wikidata":"Q8048733","brand:wikipedia":"en:Yankee Candle",name:"Yankee Candle",shop:"candles"}},"shop/car_parts|Advance Auto Parts":{countryCodes:["ca","us","vi"],tags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"}},"shop/car_parts|Auto Plus":{countryCodes:["us"],tags:{brand:"Auto Plus","brand:wikidata":"Q65121114",name:"Auto Plus",official_name:"Auto Plus Auto Parts",shop:"car_parts"}},"shop/car_parts|AutoZone":{countryCodes:["br","mx","us"],tags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"}},"shop/car_parts|Brezan":{countryCodes:["be","nl"],tags:{brand:"Brezan",name:"Brezan",shop:"car_parts"}},"shop/car_parts|Halfords":{countryCodes:["gb","ie"],matchTags:["shop/bicycle"],nomatch:["shop/car_repair|Halfords Autocentre"],tags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"}},"shop/car_parts|KOI Auto Parts":{countryCodes:["us"],tags:{brand:"KOI Auto Parts","brand:wikidata":"Q6334934","brand:wikipedia":"en:KOI Auto Parts",name:"KOI Auto Parts",shop:"car_parts",short_name:"KOI"}},"shop/car_parts|Lubrificantes":{countryCodes:["ao"],tags:{brand:"Lubrificantes",name:"Lubrificantes",shop:"car_parts"}},"shop/car_parts|NAPA Auto Parts":{countryCodes:["ca","mx","us"],matchNames:["napa"],tags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"}},"shop/car_parts|O'Reilly Auto Parts":{countryCodes:["us"],matchNames:["o'reilly"],tags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"}},"shop/car_parts|Repco":{countryCodes:["au","nz"],tags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"}},"shop/car_parts|Supercheap Auto":{countryCodes:["au","nz"],tags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"}},"shop/car_parts|Tokić":{countryCodes:["ba","hr"],tags:{brand:"Tokić",name:"Tokić",shop:"car_parts"}},"shop/car_parts|Автомир":{countryCodes:["ru"],tags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"}},"shop/car_parts|Армтек":{countryCodes:["ru"],tags:{brand:"Армтек",name:"Армтек",shop:"car_parts"}},"shop/car_parts|イエローハット":{countryCodes:["jp"],tags:{brand:"イエローハット","brand:en":"Yellow Hat","brand:ja":"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット","name:en":"Yellow Hat","name:ja":"イエローハット",shop:"car_parts"}},"shop/car_parts|オートバックス":{countryCodes:["jp"],tags:{brand:"オートバックス","brand:en":"Autobacs","brand:ja":"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス","name:en":"Autobacs","name:ja":"オートバックス",shop:"car_parts"}},"shop/car_parts|タイヤ館":{countryCodes:["jp"],tags:{brand:"タイヤ館","brand:en":"Taiyakan","brand:ja":"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館","name:en":"Taiyakan","name:ja":"タイヤ館",shop:"car_parts"}},"shop/car_repair|A.T.U":{countryCodes:["at","de"],matchNames:["auto-teile-unger"],tags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"}},"shop/car_repair|AAMCO":{countryCodes:["ca","us"],matchNames:["aamco transmissions","aamco transmissions and total car care"],tags:{brand:"AAMCO","brand:wikidata":"Q4649902","brand:wikipedia":"en:AAMCO Transmissions",name:"AAMCO","service:vehicle:transmission":"yes",shop:"car_repair"}},"shop/car_repair|ATS Euromaster":{countryCodes:["gb"],tags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"}},"shop/car_repair|BestDrive":{countryCodes:["cz","fr","sk"],tags:{brand:"BestDrive","brand:wikidata":"Q63057183",name:"BestDrive",shop:"car_repair"}},"shop/car_repair|Bosch Car Service":{matchNames:["bosch service"],tags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"en:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"}},"shop/car_repair|Brakes Plus":{countryCodes:["us"],tags:{brand:"Brakes Plus","brand:wikidata":"Q62075246",name:"Brakes Plus",shop:"car_repair"}},"shop/car_repair|Car-X":{countryCodes:["us"],tags:{brand:"Car-X","brand:wikidata":"Q63859189",name:"Car-X",shop:"car_repair"}},"shop/car_repair|Carglass":{tags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"}},"shop/car_repair|Carstar":{countryCodes:["ca","us"],matchNames:["carstar auto body repair experts"],tags:{brand:"Carstar","brand:wikidata":"Q64187891",name:"Carstar","service:vehicle:body_repair":"yes",shop:"car_repair"}},"shop/car_repair|Citroën":{nomatch:["shop/car|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car_repair"}},"shop/car_repair|Euromaster":{countryCodes:["ch","de","es","fi","fr","nl","pt"],tags:{brand:"Euromaster","brand:wikidata":"Q3060668","brand:wikipedia":"de:Euromaster",name:"Euromaster",shop:"car_repair"}},"shop/car_repair|Feu Vert":{countryCodes:["fr"],tags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu vert (entreprise)",name:"Feu Vert",shop:"car_repair"}},"shop/car_repair|Firestone":{countryCodes:["ca","cl","us"],tags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",official_name:"Firestone Complete Auto Care",shop:"car_repair"}},"shop/car_repair|Ford":{nomatch:["shop/car|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"}},"shop/car_repair|Goodyear":{countryCodes:["au","ca","cl","pe","us"],tags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"}},"shop/car_repair|Grease Monkey":{countryCodes:["cn","us"],tags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"}},"shop/car_repair|Halfords Autocentre":{countryCodes:["gb"],matchNames:["halfords"],nomatch:["shop/car_parts|Halfords"],tags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"}},"shop/car_repair|Jiffy Lube":{countryCodes:["ca","us"],tags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"}},"shop/car_repair|Kwik Fit":{countryCodes:["gb","ie"],tags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"}},"shop/car_repair|MAACO":{countryCodes:["ca","us"],matchNames:["maaco collision repair & auto painting"],tags:{brand:"MAACO","brand:wikidata":"Q6714015","brand:wikipedia":"en:MAACO",name:"MAACO","service:vehicle:body_repair":"yes","service:vehicle:painting":"yes",shop:"car_repair"}},"shop/car_repair|Meineke":{countryCodes:["us"],tags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",official_name:"Meineke Car Care Center",shop:"car_repair"}},"shop/car_repair|Mekonomen":{countryCodes:["dk","no","se"],tags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"}},"shop/car_repair|Midas":{tags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"}},"shop/car_repair|Monro Muffler Brake":{countryCodes:["us"],matchNames:["monro"],tags:{brand:"Monro Muffler Brake","brand:wikidata":"Q6902090","brand:wikipedia":"en:Monro Muffler Brake",name:"Monro Muffler Brake",shop:"car_repair"}},"shop/car_repair|Mr. Lube":{countryCodes:["ca"],tags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"}},"shop/car_repair|Norauto":{countryCodes:["ar","es","fr","hu","it","pl","pt","ro"],tags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"}},"shop/car_repair|Pep Boys":{countryCodes:["us"],tags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"}},"shop/car_repair|Peugeot":{nomatch:["shop/car|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"}},"shop/car_repair|Pit Stop":{tags:{brand:"Pit Stop",name:"Pit Stop",shop:"car_repair"}},"shop/car_repair|Point S":{tags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"}},"shop/car_repair|Renault":{matchNames:["garage renault"],nomatch:["shop/car|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"}},"shop/car_repair|Roady":{countryCodes:["fr"],tags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"}},"shop/car_repair|Safelite AutoGlass":{countryCodes:["us"],tags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",name:"Safelite AutoGlass",shop:"car_repair"}},"shop/car_repair|Sears Auto Center":{countryCodes:["mx","us"],nomatch:["shop/department_store|Sears"],tags:{brand:"Sears Auto Center","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears Auto Center",shop:"car_repair"}},"shop/car_repair|Speedy":{countryCodes:["fr"],nomatch:["shop/car_repair|Speedy Auto Service"],tags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"}},"shop/car_repair|Speedy Auto Service":{countryCodes:["ca"],nomatch:["shop/car_repair|Speedy"],tags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"}},"shop/car_repair|Taller Mecanico":{tags:{brand:"Taller Mecanico",name:"Taller Mecanico",shop:"car_repair"}},"shop/car_repair|Toyota":{nomatch:["shop/car|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"}},"shop/car_repair|Tuffy":{countryCodes:["us"],matchNames:["tuffy auto service","tuffy auto service center","tuffy auto service centers","tuffy service","tuffy service center","tuffy service centers","tuffy tire and auto service","tuffy tire and auto service center","tuffy tire and auto service centers"],tags:{brand:"Tuffy","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy",shop:"car_repair"}},"shop/car_repair|Valvoline":{countryCodes:["us"],tags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",official_name:"Valvoline Instant Oil Change",shop:"car_repair"}},"shop/car_repair|ÖAMTC":{countryCodes:["at"],tags:{brand:"ÖAMTC","brand:wikidata":"Q306057","brand:wikipedia":"de:Österreichischer Automobil-, Motorrad- und Touring Club",name:"ÖAMTC",shop:"car_repair"}},"shop/car_repair|СТО":{tags:{brand:"СТО",name:"СТО",shop:"car_repair"}},"shop/car|Audi":{tags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"}},"shop/car|BMW":{tags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"}},"shop/car|Cadillac":{tags:{brand:"Cadillac","brand:wikidata":"Q27436","brand:wikipedia":"en:Cadillac",name:"Cadillac",shop:"car"}},"shop/car|CarMax":{countryCodes:["us"],tags:{brand:"CarMax","brand:wikidata":"Q5037190","brand:wikipedia":"en:CarMax",name:"CarMax",second_hand:"only",shop:"car"}},"shop/car|Chevrolet":{tags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"}},"shop/car|Citroën":{nomatch:["shop/car_repair|Citroën"],tags:{brand:"Citroën","brand:wikidata":"Q6746","brand:wikipedia":"fr:Citroën",name:"Citroën",shop:"car"}},"shop/car|Dacia":{tags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"}},"shop/car|Fiat":{tags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"}},"shop/car|Ford":{nomatch:["shop/car_repair|Ford"],tags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"}},"shop/car|Honda":{matchNames:["honda cars"],nomatch:["shop/motorcycle|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"}},"shop/car|Hyundai":{tags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"}},"shop/car|Isuzu":{tags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"}},"shop/car|Jaguar":{tags:{brand:"Jaguar","brand:wikidata":"Q26742231",name:"Jaguar",shop:"car"}},"shop/car|Kia":{matchNames:["kia motors"],tags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"}},"shop/car|Land Rover":{tags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"}},"shop/car|Lexus":{tags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"}},"shop/car|Lincoln":{tags:{brand:"Lincoln","brand:wikidata":"Q216796","brand:wikipedia":"en:Lincoln Motor Company",name:"Lincoln",shop:"car"}},"shop/car|Mazda":{tags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"}},"shop/car|Mercedes-Benz":{matchNames:["mercedes"],tags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"}},"shop/car|Mitsubishi":{matchNames:["mitsubishi motors"],tags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"}},"shop/car|Netz":{countryCodes:["jp"],tags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"}},"shop/car|Nissan":{tags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"}},"shop/car|Opel":{tags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"}},"shop/car|Peugeot":{nomatch:["shop/car_repair|Peugeot"],tags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"}},"shop/car|Porsche":{tags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"}},"shop/car|Renault":{nomatch:["shop/car_repair|Renault"],tags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"}},"shop/car|Seat":{tags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"}},"shop/car|Skoda":{tags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"}},"shop/car|Subaru":{tags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"}},"shop/car|Suzuki":{nomatch:["shop/motorcycle|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"}},"shop/car|Tesla":{matchNames:["tesla motors"],tags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"}},"shop/car|Toyota":{nomatch:["shop/car_repair|Toyota"],tags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"}},"shop/car|Volkswagen":{matchNames:["vw"],tags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"}},"shop/car|Volvo":{tags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"}},"shop/car|Автомир":{tags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир","name:en":"Autoworld","name:ru":"Автомир",shop:"car"}},"shop/car|ダイハツ":{countryCodes:["jp"],tags:{brand:"ダイハツ","brand:en":"Daihatsu","brand:ja":"ダイハツ","brand:wikidata":"Q27511","brand:wikipedia":"ja:ダイハツ工業",name:"ダイハツ","name:en":"Daihatsu","name:ja":"ダイハツ",shop:"car"}},"shop/car|ホンダ":{countryCodes:["jp"],tags:{brand:"ホンダ","brand:en":"Honda","brand:ja":"ホンダ","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda","name:ja":"ホンダ",shop:"car"}},"shop/carpet|Carpetright":{countryCodes:["be","gb","ie","nl"],matchTags:["shop/furniture"],tags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"}},"shop/catalogue|Argos":{countryCodes:["gb","ie"],matchTags:["shop/department_store"],tags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"}},"shop/charity|Age UK":{countryCodes:["gb"],tags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"}},"shop/charity|Barnardo's":{countryCodes:["gb","ie"],tags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"}},"shop/charity|British Heart Foundation":{countryCodes:["gb"],tags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"}},"shop/charity|British Red Cross":{countryCodes:["gb","gg","im"],tags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"}},"shop/charity|Cancer Research UK":{countryCodes:["gb","gg"],tags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"}},"shop/charity|Goodwill":{countryCodes:["ca","us"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"}},"shop/charity|Kirkens Korshær Genbrug":{tags:{brand:"Kirkens Korshær Genbrug",name:"Kirkens Korshær Genbrug",shop:"charity"}},"shop/charity|Mind":{countryCodes:["gb"],tags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"}},"shop/charity|Myrorna":{countryCodes:["se"],matchTags:["shop/clothes","shop/second_hand"],tags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"}},"shop/charity|Oxfam":{countryCodes:["be","de","gb","ie","im"],tags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"}},"shop/charity|RSPCA":{countryCodes:["au","gb"],tags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"}},"shop/charity|Scope":{countryCodes:["gb"],tags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"}},"shop/charity|Sue Ryder":{countryCodes:["gb","ie"],tags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"}},"shop/charity|The Salvation Army":{countryCodes:["au","ca","gb","us"],matchNames:["salvation army"],tags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"}},"shop/charity|Vinnies":{tags:{brand:"Vinnies",name:"Vinnies",shop:"charity"}},"shop/chemist|101 Drogerie":{countryCodes:["sk"],tags:{brand:"101 Drogerie",name:"101 Drogerie",shop:"chemist"}},"shop/chemist|7 Дней":{countryCodes:["ru"],tags:{brand:"7 Дней",name:"7 Дней",shop:"chemist"}},"shop/chemist|Acqua & Sapone":{countryCodes:["it"],tags:{brand:"Acqua & Sapone",name:"Acqua & Sapone",shop:"chemist"}},"shop/chemist|Bipa":{countryCodes:["at","hr"],tags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"}},"shop/chemist|Boots":{countryCodes:["gb"],nomatch:["amenity/pharmacy|Boots"],tags:{brand:"Boots","brand:wikidata":"Q6123139",name:"Boots",shop:"chemist"}},"shop/chemist|Budnikowsky":{countryCodes:["de"],tags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"}},"shop/chemist|CVS Pharmacy":{countryCodes:["us"],nomatch:["amenity/pharmacy|CVS Pharmacy","amenity/vending_machine|CVS Pharmacy"],tags:{brand:"CVS Pharmacy","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",name:"CVS Pharmacy",shop:"chemist",short_name:"CVS"}},"shop/chemist|Clarel":{tags:{brand:"Clarel",name:"Clarel",shop:"chemist"}},"shop/chemist|Drogeria Natura":{countryCodes:["pl"],tags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"}},"shop/chemist|Etos":{countryCodes:["nl"],tags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"}},"shop/chemist|Hebe":{countryCodes:["pl"],tags:{brand:"Hebe",name:"Hebe",shop:"chemist"}},"shop/chemist|Kruidvat":{countryCodes:["be","fr","nl"],tags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"}},"shop/chemist|Matas":{countryCodes:["dk"],tags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"}},"shop/chemist|Müller":{countryCodes:["at","ch","de","es","hr","hu"],tags:{brand:"Müller","brand:wikidata":"Q1958759","brand:wikipedia":"en:Müller (German trade company)",name:"Müller",shop:"chemist"}},"shop/chemist|Rite Aid":{nomatch:["amenity/pharmacy|Rite Aid"],tags:{brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",name:"Rite Aid",shop:"chemist"}},"shop/chemist|Rossmann":{countryCodes:["cz","de","hu","pl"],tags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"}},"shop/chemist|Savers":{countryCodes:["gb"],tags:{brand:"Savers","brand:wikidata":"Q7428189",name:"Savers",official_name:"Savers Health & Beauty",shop:"chemist"}},"shop/chemist|Superdrug":{countryCodes:["gb"],nomatch:["amenity/pharmacy|Superdrug"],tags:{brand:"Superdrug","brand:wikidata":"Q7643261",name:"Superdrug",shop:"chemist"}},"shop/chemist|Teta":{countryCodes:["cz","sk"],tags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"}},"shop/chemist|Tigotà":{countryCodes:["it"],tags:{brand:"Tigotà",name:"Tigotà",shop:"chemist"}},"shop/chemist|Trekpleister":{countryCodes:["nl"],tags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"}},"shop/chemist|Walgreens":{countryCodes:["us"],matchNames:["walgreens pharmacy"],tags:{brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",name:"Walgreens",shop:"chemist"}},"shop/chemist|Watsons":{matchTags:["shop/cosmetics"],nomatch:["amenity/pharmacy|Watsons"],tags:{brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",name:"Watsons",shop:"chemist"}},"shop/chemist|dm":{countryCodes:["at","ba","bg","cz","de","hr","hu","it","mk","ro","rs","si","sk"],matchNames:["dm drogerie markt"],tags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"}},"shop/chemist|Бытовая химия":{countryCodes:["by","ru","ua"],tags:{brand:"Бытовая химия",name:"Бытовая химия",shop:"chemist"}},"shop/chemist|Мила":{countryCodes:["by"],tags:{brand:"Мила",name:"Мила",shop:"chemist"}},"shop/chemist|Новэкс":{countryCodes:["ru"],tags:{brand:"Новэкс",name:"Новэкс",shop:"chemist"}},"shop/chemist|Остров чистоты":{countryCodes:["by"],tags:{brand:"Остров чистоты",name:"Остров чистоты",shop:"chemist"}},"shop/chemist|Рубль Бум":{countryCodes:["ru"],tags:{brand:"Рубль Бум",name:"Рубль Бум",shop:"chemist"}},"shop/chemist|Улыбка радуги":{countryCodes:["ru"],tags:{brand:"Улыбка радуги",name:"Улыбка радуги",shop:"chemist"}},"shop/chemist|スギ薬局":{countryCodes:["jp"],nomatch:["amenity/pharmacy|スギ薬局"],tags:{brand:"スギ薬局","brand:ja":"スギ薬局",name:"スギ薬局","name:ja":"スギ薬局",shop:"chemist"}},"shop/chemist|丁丁藥局":{nomatch:["amenity/pharmacy|丁丁藥局"],tags:{brand:"丁丁藥局",name:"丁丁藥局",shop:"chemist"}},"shop/chemist|屈臣氏":{countryCodes:["cn","hk","tw"],nomatch:["amenity/pharmacy|屈臣氏"],tags:{brand:"屈臣氏","brand:wikidata":"Q7974785","brand:wikipedia":"zh:屈臣氏",name:"屈臣氏",shop:"chemist"}},"shop/chemist|康是美":{countryCodes:["tw"],tags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"}},"shop/chocolate|Cacau Show":{countryCodes:["br"],tags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau Show",name:"Cacau Show",shop:"chocolate"}},"shop/chocolate|Gertrude Hawk Chocolates":{countryCodes:["us"],tags:{brand:"Gertrude Hawk Chocolates","brand:wikidata":"Q5553326","brand:wikipedia":"en:Gertrude Hawk Chocolates",name:"Gertrude Hawk Chocolates",shop:"chocolate",short_name:"Gertrude Hawk"}},"shop/chocolate|Godiva Chocolatier":{countryCodes:["us"],tags:{brand:"Godiva Chocolatier","brand:wikidata":"Q931084","brand:wikipedia":"en:Godiva Chocolatier",name:"Godiva Chocolatier",shop:"chocolate",short_name:"Godiva"}},"shop/chocolate|Jeff de Bruges":{countryCodes:["ca","cz","fr","gb"],tags:{brand:"Jeff de Bruges","brand:wikidata":"Q3176626","brand:wikipedia":"fr:Jeff de Bruges",name:"Jeff de Bruges",shop:"chocolate"}},"shop/chocolate|Laura Secord":{countryCodes:["ca"],tags:{brand:"Laura Secord","brand:wikidata":"Q6499418","brand:wikipedia":"en:Laura Secord Chocolates",name:"Laura Secord",shop:"chocolate"}},"shop/chocolate|Leonidas":{countryCodes:["be","cz","fr","gb","gr","nl"],tags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"}},"shop/chocolate|Lindt":{tags:{brand:"Lindt","brand:wikidata":"Q152822","brand:wikipedia":"en:Lindt & Sprüngli",name:"Lindt",shop:"chocolate"}},"shop/chocolate|Purdys Chocolatier":{countryCodes:["ca"],tags:{brand:"Purdys Chocolatier","brand:wikidata":"Q7261007","brand:wikipedia":"en:Purdy's Chocolates",name:"Purdys Chocolatier",shop:"chocolate"}},"shop/clothes|AOKI":{countryCodes:["jp"],tags:{brand:"AOKI","brand:wikidata":"Q11189480","brand:wikipedia":"ja:AOKIホールディングス",clothes:"men",name:"AOKI","name:ja":"アオキ",shop:"clothes"}},"shop/clothes|AWG":{countryCodes:["bg","de"],tags:{brand:"AWG",name:"AWG",shop:"clothes"}},"shop/clothes|Abercrombie & Fitch":{countryCodes:["de","us"],tags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"}},"shop/clothes|Accessorize":{countryCodes:["gb","it","ru"],tags:{brand:"Accessorize","brand:wikidata":"Q65007482",name:"Accessorize",shop:"clothes"}},"shop/clothes|Ackermans":{tags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"}},"shop/clothes|Adler":{countryCodes:["at","de","lu"],tags:{brand:"Adler",name:"Adler",shop:"clothes"}},"shop/clothes|Aeropostale":{tags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",clothes:"men;women",name:"Aeropostale",shop:"clothes"}},"shop/clothes|AllSaints":{countryCodes:["gb"],tags:{brand:"AllSaints","brand:wikidata":"Q4728473","brand:wikipedia":"en:AllSaints",name:"AllSaints",shop:"clothes"}},"shop/clothes|American Eagle Outfitters":{countryCodes:["ca","us"],tags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",clothes:"men;women",name:"American Eagle Outfitters",shop:"clothes",short_name:"American Eagle"}},"shop/clothes|Ann Taylor":{countryCodes:["ca","us"],tags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",clothes:"women",name:"Ann Taylor",shop:"clothes"}},"shop/clothes|Anthropologie":{countryCodes:["ca","gb","us"],tags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",clothes:"women",name:"Anthropologie",shop:"clothes"}},"shop/clothes|Arc'teryx":{tags:{brand:"Arc'teryx","brand:wikidata":"Q3271455","brand:wikipedia":"en:Arc'teryx",clothes:"men;women",name:"Arc'teryx",shop:"clothes"}},"shop/clothes|Ardene":{countryCodes:["ca","sn"],tags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"}},"shop/clothes|Aritzia":{countryCodes:["ca","us"],tags:{brand:"Aritzia","brand:wikidata":"Q4791147","brand:wikipedia":"en:Aritzia",clothes:"women",name:"Aritzia",shop:"clothes"}},"shop/clothes|Armand Thiery":{countryCodes:["be","fr"],tags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"}},"shop/clothes|Armani Exchange":{countryCodes:["us"],tags:{brand:"Armani Exchange","brand:wikidata":"Q56045740",clothes:"men;women",name:"Armani Exchange",shop:"clothes"}},"shop/clothes|Avenue":{tags:{brand:"Avenue",name:"Avenue",shop:"clothes"}},"shop/clothes|Baby Gap":{countryCodes:["us"],tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Baby Gap",shop:"clothes"}},"shop/clothes|Banana Republic":{countryCodes:["ca","gb","us"],tags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",clothes:"men;women",name:"Banana Republic",shop:"clothes"}},"shop/clothes|Bench":{tags:{brand:"Bench",name:"Bench",shop:"clothes"}},"shop/clothes|Bershka":{tags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"}},"shop/clothes|Betty Barclay":{tags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"}},"shop/clothes|Big Star":{countryCodes:["by","pl"],tags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"}},"shop/clothes|Billabong":{tags:{brand:"Billabong","brand:wikidata":"Q862718","brand:wikipedia":"en:Billabong (clothing)",clothes:"men;women",name:"Billabong",shop:"clothes"}},"shop/clothes|Bluenotes":{countryCodes:["ca"],tags:{brand:"Bluenotes","brand:wikidata":"Q4930395","brand:wikipedia":"en:Bluenotes",name:"Bluenotes",shop:"clothes"}},"shop/clothes|Bonita":{countryCodes:["at","ch","de","nl"],tags:{brand:"Bonita","brand:wikidata":"Q892598","brand:wikipedia":"de:Bonita (Unternehmen)",name:"Bonita",shop:"clothes"}},"shop/clothes|Bonobo":{countryCodes:["fr"],nomatch:["shop/clothes|Bonobos"],tags:{brand:"Bonobo","brand:wikidata":"Q63682093",clothes:"men;women",name:"Bonobo",shop:"clothes"}},"shop/clothes|Bonobos":{countryCodes:["us"],nomatch:["shop/clothes|Bonobo"],tags:{brand:"Bonobos","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",clothes:"men",name:"Bonobos",shop:"clothes"}},"shop/clothes|Brice":{countryCodes:["be","fr"],tags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"}},"shop/clothes|Bristol":{countryCodes:["nl"],tags:{brand:"Bristol",name:"Bristol",shop:"clothes"}},"shop/clothes|Brooks Brothers":{tags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"}},"shop/clothes|Brunello Cucinelli":{tags:{brand:"Brunello Cucinelli","brand:wikidata":"Q3645582","brand:wikipedia":"en:Brunello Cucinelli",name:"Brunello Cucinelli",shop:"clothes"}},"shop/clothes|Buckle":{countryCodes:["us"],tags:{brand:"Buckle","brand:wikidata":"Q4983306","brand:wikipedia":"en:Buckle (clothing retailer)",clothes:"men;women",name:"Buckle",shop:"clothes"}},"shop/clothes|Buffalo Exchange":{countryCodes:["us"],matchTags:["shop/second_hand"],tags:{brand:"Buffalo Exchange","brand:wikidata":"Q4985721","brand:wikipedia":"en:Buffalo Exchange",name:"Buffalo Exchange",second_hand:"only",shop:"clothes"}},"shop/clothes|Burberry":{tags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",clothes:"men;women",name:"Burberry",shop:"clothes"}},"shop/clothes|Burlington Coat Factory":{countryCodes:["us"],tags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"}},"shop/clothes|Burton":{countryCodes:["fr","gb"],tags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"}},"shop/clothes|C&A":{tags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"}},"shop/clothes|COS":{tags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (clothing)",name:"COS",shop:"clothes"}},"shop/clothes|Cache Cache":{countryCodes:["fr","it","lu"],tags:{brand:"Cache Cache","brand:wikidata":"Q63064086",name:"Cache Cache",shop:"clothes"}},"shop/clothes|Calvin Klein":{tags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein (company)",name:"Calvin Klein",shop:"clothes"}},"shop/clothes|Calzedonia":{tags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"}},"shop/clothes|Camaïeu":{countryCodes:["be","cz","fr","it","pl"],tags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"}},"shop/clothes|Camp David":{countryCodes:["at","de","ee","sk"],tags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"}},"shop/clothes|Canada Goose":{tags:{brand:"Canada Goose","brand:wikidata":"Q2988422","brand:wikipedia":"en:Canada Goose",name:"Canada Goose",shop:"clothes"}},"shop/clothes|Carhartt":{countryCodes:["gb","us"],tags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",clothes:"workwear",name:"Carhartt",shop:"clothes"}},"shop/clothes|Carlings":{countryCodes:["fi","no","se"],tags:{brand:"Carlings",name:"Carlings",shop:"clothes"}},"shop/clothes|Caroll":{countryCodes:["ch","fr"],tags:{brand:"Caroll","brand:wikidata":"Q63063871",name:"Caroll",shop:"clothes"}},"shop/clothes|Carter's":{matchNames:["carters babies and kids"],tags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",clothes:"children",name:"Carter's",shop:"clothes"}},"shop/clothes|Catherines":{countryCodes:["us"],tags:{brand:"Catherines","brand:wikidata":"Q64026208",clothes:"oversize;women",name:"Catherines",shop:"clothes"}},"shop/clothes|Cato":{countryCodes:["us"],tags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",clothes:"women",name:"Cato",official_name:"Cato Fashions",shop:"clothes"}},"shop/clothes|Cecil":{countryCodes:["at","de","nl"],tags:{brand:"Cecil",name:"Cecil",shop:"clothes"}},"shop/clothes|Celio":{tags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"}},"shop/clothes|Chanel":{tags:{brand:"Chanel","brand:wikidata":"Q218115","brand:wikipedia":"en:Chanel",name:"Chanel",shop:"clothes"}},"shop/clothes|Charles Vögele":{countryCodes:["at","be","ch","de","hu","nl"],tags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes",short_name:"Vögele"}},"shop/clothes|Charlotte Russe":{countryCodes:["us"],tags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"}},"shop/clothes|Charming Charlie":{countryCodes:["us"],tags:{brand:"Charming Charlie","brand:wikidata":"Q16829286","brand:wikipedia":"en:Charming Charlie",clothes:"women",name:"Charming Charlie",shop:"clothes"}},"shop/clothes|Chico's":{countryCodes:["ar","us"],tags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"}},"shop/clothes|Christopher & Banks":{countryCodes:["us"],tags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"}},"shop/clothes|Club Monaco":{countryCodes:["ca","gb","us"],tags:{brand:"Club Monaco","brand:wikidata":"Q2979949","brand:wikipedia":"en:Club Monaco",name:"Club Monaco",shop:"clothes"}},"shop/clothes|Colin's":{tags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"}},"shop/clothes|Colloseum":{countryCodes:["at","de"],tags:{brand:"Colloseum",name:"Colloseum",shop:"clothes"}},"shop/clothes|Columbia":{nomatch:["amenity/bank|Columbia Bank"],tags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",official_name:"Columbia Sportswear",shop:"clothes"}},"shop/clothes|Cropp":{countryCodes:["cs","hu","pl","ro","ru","sk","ua"],tags:{brand:"Cropp","brand:wikidata":"Q9196793","brand:wikipedia":"pl:Cropp",name:"Cropp",shop:"clothes"}},"shop/clothes|Cubus":{countryCodes:["de","fi","lv","no","pl","se"],tags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"}},"shop/clothes|DTLR":{countryCodes:["us"],tags:{brand:"DTLR",name:"DTLR",shop:"clothes"}},"shop/clothes|DXL Men's Apparel":{countryCodes:["us"],tags:{brand:"DXL Men's Apparel","brand:wikidata":"Q61981830",clothes:"oversize;men",name:"DXL Men's Apparel",shop:"clothes",short_name:"DXL"}},"shop/clothes|Damart":{countryCodes:["be","fr","lu"],tags:{brand:"Damart","brand:wikidata":"Q3012602","brand:wikipedia":"en:Damart",name:"Damart",shop:"clothes"}},"shop/clothes|David's Bridal":{countryCodes:["ca","us"],tags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",clothes:"wedding",name:"David's Bridal",shop:"clothes"}},"shop/clothes|Desigual":{tags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"}},"shop/clothes|Devred":{countryCodes:["be","fr","ma"],tags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"}},"shop/clothes|Didi":{countryCodes:["be","nl"],tags:{brand:"Didi",name:"Didi",shop:"clothes"}},"shop/clothes|Diesel":{tags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"}},"shop/clothes|Dior":{tags:{brand:"Dior","brand:wikidata":"Q542767","brand:wikipedia":"en:Christian Dior (fashion house)",name:"Dior",shop:"clothes"}},"shop/clothes|Diverse":{countryCodes:["pl"],tags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"}},"shop/clothes|Dolce & Gabbana":{matchNames:["d and g","dg","dolce and gabana","dolce and gabanna","dolce and gabbanna","dolce y gabana","dolce y gabanna","dolce y gabbana","dolce y gabbanna"],tags:{brand:"Dolce & Gabbana","brand:wikidata":"Q214480","brand:wikipedia":"en:Dolce & Gabbana",name:"Dolce & Gabbana",shop:"clothes"}},"shop/clothes|Dorothy Perkins":{countryCodes:["gb","gg","ie","im"],tags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"}},"shop/clothes|Dress Barn":{tags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"}},"shop/clothes|Dressmann":{countryCodes:["at","fi","no","se"],tags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"}},"shop/clothes|Dynamite":{countryCodes:["ca","jo","ku","sa","us"],tags:{brand:"Dynamite","brand:wikidata":"Q3117385","brand:wikipedia":"en:Groupe Dynamite",clothes:"women",name:"Dynamite",shop:"clothes"}},"shop/clothes|Eddie Bauer":{countryCodes:["ca","jp","us"],tags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"}},"shop/clothes|Edgars":{tags:{brand:"Edgars",name:"Edgars",shop:"clothes"}},"shop/clothes|Edinburgh Woollen Mill":{countryCodes:["gb"],tags:{brand:"Edinburgh Woollen Mill","brand:wikidata":"Q16834657",name:"Edinburgh Woollen Mill",shop:"clothes"}},"shop/clothes|Engbers":{countryCodes:["at","de"],tags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"}},"shop/clothes|Ermenegildo Zegna":{countryCodes:["ch","it"],tags:{brand:"Ermenegildo Zegna","brand:wikidata":"Q1355904","brand:wikipedia":"en:Ermenegildo Zegna",clothes:"men",name:"Ermenegildo Zegna",shop:"clothes",short_name:"Zegna"}},"shop/clothes|Ernsting's family":{countryCodes:["at","de"],tags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"}},"shop/clothes|Esprit":{tags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"}},"shop/clothes|Etam":{tags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"}},"shop/clothes|Everything But Water":{countryCodes:["us"],tags:{brand:"Everything But Water",clothes:"swimwear",name:"Everything But Water",shop:"clothes"}},"shop/clothes|Express":{nomatch:["shop/convenience|Express"],tags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"}},"shop/clothes|Fairweather":{countryCodes:["ca"],tags:{brand:"Fairweather","brand:wikidata":"Q64861806",clothes:"women",name:"Fairweather",shop:"clothes"}},"shop/clothes|Fat Face":{countryCodes:["gb","gg","ie"],tags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"}},"shop/clothes|Fendi":{countryCodes:["fr","it"],tags:{brand:"Fendi","brand:wikidata":"Q926575","brand:wikipedia":"en:Fendi",name:"Fendi",shop:"clothes"}},"shop/clothes|Forever 21":{tags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"}},"shop/clothes|Free People":{countryCodes:["ca","us"],tags:{brand:"Free People","brand:wikidata":"Q5499945","brand:wikipedia":"en:Free People",name:"Free People",shop:"clothes"}},"shop/clothes|Fussl":{countryCodes:["at","de"],tags:{brand:"Fussl",name:"Fussl",shop:"clothes"}},"shop/clothes|GU":{countryCodes:["cl","jp","tw"],tags:{brand:"GU","brand:wikidata":"Q5512642","brand:wikipedia":"en:GU (retailer)",name:"GU",shop:"clothes"}},"shop/clothes|Gabe's":{countryCodes:["us"],matchNames:["gabriel brothers"],tags:{brand:"Gabe's","brand:wikidata":"Q5515554","brand:wikipedia":"en:Gabe's",name:"Gabe's",shop:"clothes"}},"shop/clothes|Gant":{tags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"}},"shop/clothes|Gap":{matchNames:["the gap"],tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"}},"shop/clothes|Gap Kids":{tags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap Kids",shop:"clothes"}},"shop/clothes|Garage":{countryCodes:["am","ca","jo","om","qa","sa","us"],tags:{brand:"Garage","brand:wikidata":"Q5521860","brand:wikipedia":"en:Garage (clothing retailer)",clothes:"women",name:"Garage",shop:"clothes"}},"shop/clothes|Gerry Weber":{tags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"}},"shop/clothes|Gina Laura":{countryCodes:["at","de"],tags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"}},"shop/clothes|Gloria Jeans":{countryCodes:["ru","ua"],tags:{brand:"Gloria Jeans","brand:wikidata":"Q4139985","brand:wikipedia":"ru:Глория Джинс",name:"Gloria Jeans",shop:"clothes"}},"shop/clothes|Gucci":{tags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"}},"shop/clothes|Guess":{tags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"}},"shop/clothes|Gymboree":{countryCodes:["ca","us"],tags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"}},"shop/clothes|Gémo":{countryCodes:["be","ch","fr"],tags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"}},"shop/clothes|H&M":{tags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"}},"shop/clothes|Haggar":{countryCodes:["us"],matchNames:["haggar clothing"],tags:{alt_name:"Haggar Clothing Co.",brand:"Haggar","brand:wikidata":"Q5638669","brand:wikipedia":"en:Haggar Clothing",name:"Haggar",shop:"clothes"}},"shop/clothes|Hallhuber":{countryCodes:["at","ch","de","lu","nl"],tags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"}},"shop/clothes|Hanna Andersson":{countryCodes:["us"],matchNames:["hanna anderssen"],tags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"}},"shop/clothes|Hermès":{countryCodes:["ch","fr"],nomatch:["amenity/post_office|Hermes Paketshop"],tags:{brand:"Hermès","brand:wikidata":"Q843887","brand:wikipedia":"en:Hermès",name:"Hermès",shop:"clothes"}},"shop/clothes|Hollister":{tags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",official_name:"Hollister Co.",shop:"clothes"}},"shop/clothes|Hot Topic":{countryCodes:["ca","us"],tags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"}},"shop/clothes|House":{tags:{brand:"House",name:"House",shop:"clothes"}},"shop/clothes|Hugo Boss":{tags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes",short_name:"Boss"}},"shop/clothes|Humana":{tags:{brand:"Humana",name:"Humana",shop:"clothes"}},"shop/clothes|Hunkemöller":{countryCodes:["at","be","de","dk","es","lu","nl"],tags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"}},"shop/clothes|Indochino":{countryCodes:["ca","us"],tags:{brand:"Indochino","brand:wikidata":"Q64448127","brand:wikipedia":"en:Indochino",clothes:"suits",name:"Indochino",shop:"clothes"}},"shop/clothes|Intimissimi":{tags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"}},"shop/clothes|J.Crew":{countryCodes:["ca","gb","us"],tags:{brand:"J.Crew","brand:wikidata":"Q5370765","brand:wikipedia":"en:J.Crew",clothes:"men;women;children",name:"J.Crew",shop:"clothes"}},"shop/clothes|J.Jill":{countryCodes:["us"],tags:{brand:"J.Jill","brand:wikidata":"Q64448268","brand:wikipedia":"en:J.Jill",clothes:"women",name:"J.Jill",shop:"clothes"}},"shop/clothes|JBC":{countryCodes:["be","lu"],tags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"}},"shop/clothes|Jack & Jones":{tags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"}},"shop/clothes|Jack Wills":{countryCodes:["ae","gb","hk","ie","kw","lb","mo","sg","us"],tags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"}},"shop/clothes|Janie & Jack":{countryCodes:["ca","us"],tags:{brand:"Janie & Jack","brand:wikidata":"Q64449634","brand:wikipedia":"en:Janie & Jack",clothes:"children",name:"Janie & Jack",shop:"clothes"}},"shop/clothes|Jeans Centre":{countryCodes:["nl"],tags:{brand:"Jeans Centre",name:"Jeans Centre",shop:"clothes"}},"shop/clothes|Jeans Fritz":{countryCodes:["de"],tags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"}},"shop/clothes|Jennyfer":{countryCodes:["fr","it","lu"],tags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"}},"shop/clothes|Jet":{countryCodes:["za"],nomatch:["amenity/fuel|Jet"],tags:{brand:"Jet","brand:wikidata":"Q61995123",name:"Jet",shop:"clothes"}},"shop/clothes|Jigsaw":{countryCodes:["au","gb","us"],tags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"}},"shop/clothes|JoS. A. Bank":{countryCodes:["us"],matchNames:["joseph a bank"],tags:{brand:"JoS. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"JoS. A. Bank",official_name:"Jos. A. Bank Clothiers",shop:"clothes"}},"shop/clothes|Johnny Was":{countryCodes:["us"],tags:{brand:"Johnny Was",clothes:"women",name:"Johnny Was",shop:"clothes"}},"shop/clothes|Joules":{countryCodes:["gb","gg","ie"],tags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"}},"shop/clothes|Jules":{countryCodes:["be","fr","it"],tags:{brand:"Jules","brand:wikidata":"Q3188386","brand:wikipedia":"fr:Jules (enseigne)",clothes:"men",name:"Jules",shop:"clothes"}},"shop/clothes|Justice":{countryCodes:["ca","us"],tags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"}},"shop/clothes|KappAhl":{countryCodes:["fi","no","pl","se"],tags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"}},"shop/clothes|Kate Spade New York":{countryCodes:["ca","us"],matchNames:["kate spade ny"],tags:{brand:"Kate Spade New York","brand:wikidata":"Q6375797","brand:wikipedia":"en:Kate Spade New York",name:"Kate Spade New York",shop:"clothes",short_name:"Kate Spade"}},"shop/clothes|Kendra Scott":{tags:{brand:"Kendra Scott",name:"Kendra Scott",shop:"clothes"}},"shop/clothes|KiK":{tags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"}},"shop/clothes|Kiabi":{tags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"}},"shop/clothes|Koton":{tags:{brand:"Koton",name:"Koton",shop:"clothes"}},"shop/clothes|LC Waikiki":{tags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"}},"shop/clothes|La Halle":{countryCodes:["ch","fr"],tags:{brand:"La Halle",name:"La Halle",shop:"clothes"}},"shop/clothes|La Senza":{countryCodes:["ca","gb"],tags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"}},"shop/clothes|La Vie en Rose":{tags:{brand:"La Vie en Rose","brand:wikidata":"Q4950452","brand:wikipedia":"en:Boutique La Vie en Rose",clothes:"underwear;women",name:"La Vie en Rose",shop:"clothes"}},"shop/clothes|Lacoste":{tags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"}},"shop/clothes|Lane Bryant":{countryCodes:["us"],tags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",clothes:"oversize;women",name:"Lane Bryant",shop:"clothes"}},"shop/clothes|Laura":{countryCodes:["ca"],tags:{brand:"Laura","brand:wikidata":"Q6498590","brand:wikipedia":"en:Laura (clothing retailer)",clothes:"women",name:"Laura",shop:"clothes"}},"shop/clothes|Le Château":{countryCodes:["ae","ca","sa"],tags:{brand:"Le Château","brand:wikidata":"Q6506731","brand:wikipedia":"en:Le Château",name:"Le Château",shop:"clothes"}},"shop/clothes|Levi's":{tags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",clothes:"denim;men;women",name:"Levi's",shop:"clothes"}},"shop/clothes|Lids":{countryCodes:["ca","us"],tags:{brand:"Lids","brand:wikidata":"Q19841609","brand:wikipedia":"en:Lids (store)",clothes:"hats",name:"Lids",shop:"clothes"}},"shop/clothes|Lindex":{countryCodes:["cz","ee","fi","no","se","sk"],tags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"}},"shop/clothes|Loft":{matchNames:["ann taylor loft"],tags:{brand:"Loft","brand:wikidata":"Q62075137",clothes:"women",name:"Loft",shop:"clothes"}},"shop/clothes|Loro Piana":{countryCodes:["fr","it"],tags:{brand:"Loro Piana","brand:wikidata":"Q1686544","brand:wikipedia":"en:Loro Piana",name:"Loro Piana",shop:"clothes"}},"shop/clothes|Louis Vuitton":{tags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"}},"shop/clothes|Lowes":{countryCodes:["au"],nomatch:["shop/doityourself|Lowe's","shop/supermarket|Lowe's Market","shop/supermarket|Lowes Foods"],tags:{brand:"Lowes","brand:wikidata":"Q6693996","brand:wikipedia":"en:Lowes Menswear",name:"Lowes",shop:"clothes"}},"shop/clothes|Lucky Brand":{countryCodes:["ca","us"],matchNames:["lucky brand jeans"],tags:{brand:"Lucky Brand","brand:wikidata":"Q6697865","brand:wikipedia":"en:Lucky Brand Jeans",name:"Lucky Brand",shop:"clothes"}},"shop/clothes|Lululemon":{countryCodes:["au","ca","us"],tags:{brand:"Lululemon","brand:wikidata":"Q6702957","brand:wikipedia":"en:Lululemon Athletica",clothes:"men;women",name:"Lululemon",official_name:"Lululemon Athletica",shop:"clothes"}},"shop/clothes|M&Co":{countryCodes:["gb"],tags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"}},"shop/clothes|MS Mode":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"MS Mode",name:"MS Mode",shop:"clothes"}},"shop/clothes|Mackage":{tags:{brand:"Mackage",name:"Mackage",shop:"clothes"}},"shop/clothes|Madewell":{countryCodes:["us"],tags:{brand:"Madewell","brand:wikidata":"Q64026213",clothes:"men;women",name:"Madewell",shop:"clothes"}},"shop/clothes|Mango":{tags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"}},"shop/clothes|Marc O'Polo":{countryCodes:["at","be","ch","de","nl","pl"],tags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"}},"shop/clothes|Marimekko":{countryCodes:["fi"],tags:{brand:"Marimekko","brand:wikidata":"Q534903","brand:wikipedia":"fi:Marimekko",name:"Marimekko",shop:"clothes"}},"shop/clothes|Marisa":{tags:{brand:"Marisa",name:"Marisa",shop:"clothes"}},"shop/clothes|Mark Formelle":{countryCodes:["by","kz","ru"],tags:{brand:"Mark Formelle",name:"Mark Formelle",shop:"clothes"}},"shop/clothes|Mark's":{countryCodes:["ca"],tags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"}},"shop/clothes|Massimo Dutti":{tags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"}},"shop/clothes|Matalan":{countryCodes:["ae","gb"],tags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"}},"shop/clothes|Maurices":{countryCodes:["ca","fr","us"],tags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"}},"shop/clothes|Max Mara":{tags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"}},"shop/clothes|Melanie Lyne":{countryCodes:["ca"],tags:{brand:"Melanie Lyne","brand:wikidata":"Q64861470",clothes:"women",name:"Melanie Lyne",shop:"clothes"}},"shop/clothes|Men's Wearhouse":{countryCodes:["us"],matchNames:["mens warehouse"],tags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513","brand:wikipedia":"en:Men's Wearhouse",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"}},"shop/clothes|Mexx":{tags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"}},"shop/clothes|Michael Kors":{tags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Capri Holdings",name:"Michael Kors",shop:"clothes"}},"shop/clothes|Miller & Monroe":{countryCodes:["at","de","nl"],tags:{brand:"Miller & Monroe",name:"Miller & Monroe",shop:"clothes"}},"shop/clothes|Mim":{countryCodes:["fr","it"],tags:{brand:"Mim",name:"Mim",shop:"clothes"}},"shop/clothes|Miss Etam":{countryCodes:["nl"],tags:{brand:"Miss Etam",name:"Miss Etam",shop:"clothes"}},"shop/clothes|Mohito":{tags:{brand:"Mohito",name:"Mohito",shop:"clothes"}},"shop/clothes|Monsoon":{countryCodes:["gb","gg","ie"],tags:{brand:"Monsoon","brand:wikidata":"Q65007501",name:"Monsoon",shop:"clothes"}},"shop/clothes|Moores":{countryCodes:["ca"],tags:{brand:"Moores","brand:wikidata":"Q6908309","brand:wikipedia":"en:Moores",clothes:"men",name:"Moores",shop:"clothes"}},"shop/clothes|Motherhood Maternity":{countryCodes:["ca","us"],tags:{brand:"Motherhood Maternity",clothes:"maternity",name:"Motherhood Maternity",shop:"clothes"}},"shop/clothes|Motivi":{tags:{brand:"Motivi",name:"Motivi",shop:"clothes"}},"shop/clothes|Mr Price":{tags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"}},"shop/clothes|NKD":{countryCodes:["at","de","it","si"],tags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"}},"shop/clothes|Naf Naf":{countryCodes:["ch","fr"],tags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"}},"shop/clothes|Napapijri":{tags:{brand:"Napapijri",name:"Napapijri",shop:"clothes"}},"shop/clothes|Nautica":{tags:{brand:"Nautica","brand:wikidata":"Q6981479","brand:wikipedia":"en:Nautica (clothing company)",name:"Nautica",shop:"clothes"}},"shop/clothes|New Look":{countryCodes:["be","de","fr","gb","ie","pl"],tags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"}},"shop/clothes|New York & Company":{countryCodes:["us"],tags:{brand:"New York & Company","brand:wikidata":"Q7012977","brand:wikipedia":"en:New York & Company",name:"New York & Company",shop:"clothes"}},"shop/clothes|New Yorker":{tags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:New Yorker (clothing)",name:"New Yorker",shop:"clothes"}},"shop/clothes|Next":{tags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"}},"shop/clothes|Nike":{tags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"}},"shop/clothes|Nordstrom Rack":{countryCodes:["ca","us"],tags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"}},"shop/clothes|OVS":{countryCodes:["at","ch","fr","it","si"],tags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"}},"shop/clothes|Oasis":{countryCodes:["es","gb","ie"],tags:{brand:"Oasis","brand:wikidata":"Q64532852",name:"Oasis",shop:"clothes"}},"shop/clothes|Okaïdi":{countryCodes:["be","ch","es","fr","it","pl"],tags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"}},"shop/clothes|Old Navy":{tags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"}},"shop/clothes|Only":{tags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only",shop:"clothes"}},"shop/clothes|Orchestra":{tags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"}},"shop/clothes|Original Marines":{countryCodes:["it"],tags:{brand:"Original Marines",name:"Original Marines",shop:"clothes"}},"shop/clothes|Orsay":{tags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"}},"shop/clothes|Outfit":{countryCodes:["de","gb"],tags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"}},"shop/clothes|Oysho":{tags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"}},"shop/clothes|PacSun":{countryCodes:["us"],tags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"}},"shop/clothes|Palmers":{countryCodes:["at","de"],tags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"}},"shop/clothes|Peacocks":{countryCodes:["cy","gb"],tags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"}},"shop/clothes|Peek & Cloppenburg":{countryCodes:["at","be","de","nl","pl"],tags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"}},"shop/clothes|Pep":{tags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"}},"shop/clothes|Pepco":{countryCodes:["cz","hu","pl","ro","sk"],matchTags:["shop/variety_store"],tags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"}},"shop/clothes|Pepe Jeans":{tags:{brand:"Pepe Jeans",name:"Pepe Jeans",shop:"clothes"}},"shop/clothes|Petit Bateau":{countryCodes:["be","de","fr","gb","it","lu"],tags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"}},"shop/clothes|Phase Eight":{countryCodes:["ch","de","gb"],tags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"}},"shop/clothes|Piazza Italia":{countryCodes:["it"],tags:{brand:"Piazza Italia",name:"Piazza Italia",shop:"clothes"}},"shop/clothes|Pierre Cardin":{tags:{brand:"Pierre Cardin","brand:wikidata":"Q22921009",name:"Pierre Cardin",shop:"clothes"}},"shop/clothes|Pimkie":{countryCodes:["at","be","de","es","fr","it"],tags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"}},"shop/clothes|Pink":{tags:{brand:"Pink","brand:wikidata":"Q20716793","brand:wikipedia":"en:Pink (Victoria's Secret)",clothes:"underwear;women",name:"Pink",shop:"clothes"}},"shop/clothes|Plato's Closet":{countryCodes:["ca","us"],tags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",second_hand:"only",shop:"clothes"}},"shop/clothes|Polo Ralph Lauren":{tags:{brand:"Polo Ralph Lauren","brand:wikidata":"Q1641437","brand:wikipedia":"en:Ralph Lauren Corporation",name:"Polo Ralph Lauren",shop:"clothes"}},"shop/clothes|Primark":{tags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"}},"shop/clothes|Promod":{tags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"}},"shop/clothes|Pull & Bear":{tags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"}},"shop/clothes|Puma":{nomatch:["amenity/fuel|Puma"],tags:{brand:"Puma","brand:wikidata":"Q157064","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"}},"shop/clothes|Quicksilver":{tags:{brand:"Quicksilver",name:"Quicksilver",shop:"clothes"}},"shop/clothes|Rainbow":{countryCodes:["de","us"],tags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"}},"shop/clothes|Reebok":{tags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"}},"shop/clothes|Reitmans":{countryCodes:["ca"],tags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"}},"shop/clothes|Reserved":{tags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved",name:"Reserved",shop:"clothes"}},"shop/clothes|River Island":{countryCodes:["gb","ie","im","nl","pl"],tags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"}},"shop/clothes|Robert Graham":{countryCodes:["us"],tags:{brand:"Robert Graham","brand:wikidata":"Q18390679","brand:wikipedia":"en:Robert Graham (fashion brand)",clothes:"men",name:"Robert Graham",shop:"clothes"}},"shop/clothes|Roots":{tags:{brand:"Roots",name:"Roots",shop:"clothes"}},"shop/clothes|Ross":{countryCodes:["us"],tags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"}},"shop/clothes|Saint Laurent":{tags:{alt_name:"Yves Saint Laurent",brand:"Saint Laurent","brand:wikidata":"Q2282172","brand:wikipedia":"en:Yves Saint Laurent (brand)",name:"Saint Laurent",shop:"clothes",short_name:"YSL"}},"shop/clothes|Sandro":{tags:{brand:"Sandro",name:"Sandro",shop:"clothes"}},"shop/clothes|Scotch & Soda":{tags:{brand:"Scotch & Soda",name:"Scotch & Soda",shop:"clothes"}},"shop/clothes|Sela":{countryCodes:["kg","ru"],tags:{brand:"Sela","brand:wikidata":"Q62075111",name:"Sela",shop:"clothes"}},"shop/clothes|Select":{nomatch:["shop/convenience|Select"],tags:{brand:"Select",name:"Select",shop:"clothes"}},"shop/clothes|Sergent Major":{countryCodes:["be","de","es","fr","gb","it"],tags:{brand:"Sergent Major","brand:wikidata":"Q62521738","brand:wikipedia":"fr:Sergent Major (entreprise)",clothes:"babies;children",name:"Sergent Major",shop:"clothes"}},"shop/clothes|Shoeby":{countryCodes:["nl"],tags:{brand:"Shoeby",name:"Shoeby",shop:"clothes"}},"shop/clothes|Sinsay":{countryCodes:["pl"],tags:{brand:"Sinsay",name:"Sinsay",shop:"clothes"}},"shop/clothes|Sisley":{countryCodes:["at","ch","de","hr","it","ru"],tags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",shop:"clothes"}},"shop/clothes|Slaters":{countryCodes:["gb"],tags:{brand:"Slaters","brand:wikidata":"Q7538912",clothes:"suits",name:"Slaters",shop:"clothes"}},"shop/clothes|Spanx":{countryCodes:["us"],tags:{brand:"Spanx","brand:wikidata":"Q1932886","brand:wikipedia":"en:Spanx",clothes:"underwear",name:"Spanx",shop:"clothes"}},"shop/clothes|Springfield":{tags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"}},"shop/clothes|Stefanel":{countryCodes:["at","de","fr","it"],tags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"}},"shop/clothes|Steps":{countryCodes:["nl"],tags:{brand:"Steps",name:"Steps",shop:"clothes"}},"shop/clothes|Stitches":{countryCodes:["ca"],tags:{brand:"Stitches","brand:wikidata":"Q7617652","brand:wikipedia":"en:Stitches (store)",name:"Stitches",shop:"clothes"}},"shop/clothes|Stradivarius":{tags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"}},"shop/clothes|Street One":{countryCodes:["at","be","bg","ch","cz","de","dk","es","fi","fr","hr","hu","ie","it","lt","lu","lv","nl","no","pl","ro","se","si","sk"],tags:{brand:"Street One","brand:wikidata":"Q61997265",name:"Street One",shop:"clothes"}},"shop/clothes|Suburbia":{countryCodes:["mx"],tags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"}},"shop/clothes|Superdry":{tags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"}},"shop/clothes|Suzy Shier":{countryCodes:["ca"],tags:{brand:"Suzy Shier","brand:wikidata":"Q65464976",clothes:"women",name:"Suzy Shier",shop:"clothes"}},"shop/clothes|TJ Maxx":{countryCodes:["us"],tags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"}},"shop/clothes|TK Maxx":{tags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"}},"shop/clothes|Takko":{countryCodes:["at","cz","de","hu","nl"],matchNames:["takko fashion"],tags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"}},"shop/clothes|Talbots":{countryCodes:["ca","us"],tags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"}},"shop/clothes|Tally Weijl":{tags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"}},"shop/clothes|Tati":{countryCodes:["dz","fr"],tags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"}},"shop/clothes|Terranova":{tags:{brand:"Terranova",name:"Terranova",shop:"clothes"}},"shop/clothes|Tezenis":{tags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"}},"shop/clothes|The Children's Place":{countryCodes:["ca","us"],tags:{alt_name:"Children's Place",brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"}},"shop/clothes|The North Face":{tags:{alt_name:"North Face",brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"}},"shop/clothes|The Sting":{countryCodes:["be","de","gb","nl"],tags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"}},"shop/clothes|The Walking Company":{tags:{alt_name:"Walking Company",brand:"The Walking Company","brand:wikidata":"Q30716262","brand:wikipedia":"en:The Walking Company",name:"The Walking Company",shop:"clothes"}},"shop/clothes|Tillys":{countryCodes:["tr"],tags:{brand:"Tillys","brand:wikidata":"Q7802889","brand:wikipedia":"en:Tillys",clothes:"children;men;women",name:"Tillys",shop:"clothes"}},"shop/clothes|Timberland":{tags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"}},"shop/clothes|Tip Top Tailors":{countryCodes:["ca"],tags:{brand:"Tip Top Tailors","brand:wikidata":"Q7808781","brand:wikipedia":"en:Tip Top Tailors",clothes:"men",name:"Tip Top Tailors",shop:"clothes"}},"shop/clothes|Tom Tailor":{tags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"}},"shop/clothes|Tommy Bahama":{countryCodes:["ca","us"],tags:{brand:"Tommy Bahama","brand:wikidata":"Q3531299","brand:wikipedia":"en:Tommy Bahama",name:"Tommy Bahama",shop:"clothes"}},"shop/clothes|Tommy Hilfiger":{tags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"}},"shop/clothes|Top Secret":{countryCodes:["fr","pl","ru"],tags:{brand:"Top Secret",name:"Top Secret",shop:"clothes"}},"shop/clothes|Topshop":{tags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"}},"shop/clothes|Torrid":{countryCodes:["us"],tags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"}},"shop/clothes|Tory Burch":{countryCodes:["us"],tags:{brand:"Tory Burch","brand:wikidata":"Q19988222","brand:wikipedia":"en:Tory Burch (company)",name:"Tory Burch",shop:"clothes"}},"shop/clothes|Triumph":{tags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"}},"shop/clothes|Truworths":{countryCodes:["za"],tags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"}},"shop/clothes|UNTUCKit":{countryCodes:["ca","us"],tags:{brand:"UNTUCKit","brand:wikidata":"Q28207006","brand:wikipedia":"en:Untuckit",name:"UNTUCKit",shop:"clothes"}},"shop/clothes|USC":{countryCodes:["gb","ie"],tags:{brand:"USC","brand:wikidata":"Q7866331","brand:wikipedia":"en:USC (clothing retailer)",name:"USC",shop:"clothes"}},"shop/clothes|Ulla Popken":{countryCodes:["at","be","ch","de","fr","nl"],tags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"}},"shop/clothes|Under Armour":{matchNames:["under armor"],tags:{brand:"Under Armour","brand:wikidata":"Q2031485","brand:wikipedia":"en:Under Armour",clothes:"men;women",name:"Under Armour",shop:"clothes"}},"shop/clothes|Uniqlo":{tags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"}},"shop/clothes|United Colors of Benetton":{tags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes",short_name:"Benetton"}},"shop/clothes|Urban Outfitters":{tags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"}},"shop/clothes|Vero Moda":{tags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"}},"shop/clothes|Victoria's Secret":{tags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",clothes:"underwear;women",name:"Victoria's Secret",shop:"clothes"}},"shop/clothes|Vilebrequin":{countryCodes:["fr","it"],tags:{brand:"Vilebrequin","brand:wikidata":"Q3558391","brand:wikipedia":"en:Vilebrequin",clothes:"swimwear",name:"Vilebrequin",shop:"clothes"}},"shop/clothes|Vineyard Vines":{countryCodes:["us"],tags:{brand:"Vineyard Vines","brand:wikidata":"Q7932495","brand:wikipedia":"en:Vineyard Vines",name:"Vineyard Vines",shop:"clothes"}},"shop/clothes|Volcom":{tags:{brand:"Volcom","brand:wikidata":"Q2021416","brand:wikipedia":"en:Volcom",name:"Volcom",shop:"clothes"}},"shop/clothes|WE":{countryCodes:["be","ch","de","nl"],tags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"}},"shop/clothes|Wacoal":{tags:{brand:"Wacoal","brand:wikidata":"Q909522","brand:wikipedia":"en:Wacoal",clothes:"underwear",name:"Wacoal",shop:"clothes"}},"shop/clothes|West 49":{countryCodes:["ca"],tags:{brand:"West 49","brand:wikidata":"Q7984218","brand:wikipedia":"en:West 49",name:"West 49",shop:"clothes"}},"shop/clothes|White House Black Market":{countryCodes:["ca","us"],matchNames:["white house | black market"],tags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"}},"shop/clothes|White Stuff":{countryCodes:["de","dk","gb","gg"],tags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"}},"shop/clothes|Wibra":{countryCodes:["be","nl"],tags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"}},"shop/clothes|Wilsons Leather":{countryCodes:["ca","us"],tags:{brand:"Wilsons Leather","brand:wikidata":"Q8023296","brand:wikipedia":"en:Wilsons Leather",clothes:"men;women",name:"Wilsons Leather",shop:"clothes"}},"shop/clothes|Winners":{countryCodes:["ca","es"],tags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"}},"shop/clothes|Wolford":{countryCodes:["at","de","fr","gb","it","nl"],tags:{brand:"Wolford","brand:wikidata":"Q431607","brand:wikipedia":"en:Wolford",name:"Wolford",shop:"clothes"}},"shop/clothes|Woolworths":{countryCodes:["za"],nomatch:["shop/supermarket|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths Holdings Limited",name:"Woolworths",shop:"clothes"}},"shop/clothes|XXI Forever":{countryCodes:["us"],tags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"XXI Forever",shop:"clothes"}},"shop/clothes|Yamamay":{countryCodes:["es","it"],tags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"}},"shop/clothes|Z":{nomatch:["amenity/fuel|Z"],tags:{brand:"Z",clothes:"babies;children",name:"Z",shop:"clothes"}},"shop/clothes|Zara":{tags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"}},"shop/clothes|Zeeman":{countryCodes:["be","de","fr","lu","nl"],tags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"}},"shop/clothes|Zumiez":{countryCodes:["ca","us"],tags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"}},"shop/clothes|mister*lady":{countryCodes:["at","de"],tags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:Mister*lady",name:"mister*lady",shop:"clothes"}},"shop/clothes|rue21":{countryCodes:["us"],tags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:Rue21",name:"rue21",shop:"clothes"}},"shop/clothes|s.Oliver":{countryCodes:["at","be","de","fr","hr"],tags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"}},"shop/clothes|Липненски":{countryCodes:["bg"],tags:{brand:"Липненски",name:"Липненски",shop:"clothes"}},"shop/clothes|Московская ярмарка":{countryCodes:["ru","ua"],tags:{brand:"Московская ярмарка",name:"Московская ярмарка",shop:"clothes"}},"shop/clothes|Смешные цены":{countryCodes:["kz","ru"],tags:{brand:"Смешные цены",name:"Смешные цены",shop:"clothes"}},"shop/clothes|しまむら":{countryCodes:["jp"],tags:{brand:"しまむら","brand:en":"Shimamura","brand:ja":"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら","name:en":"Shimamura","name:ja":"しまむら",shop:"clothes"}},"shop/clothes|はるやま":{countryCodes:["jp"],tags:{brand:"はるやま","brand:en":"Haruyama","brand:ja":"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま","name:en":"Haruyama","name:ja":"はるやま",shop:"clothes"}},"shop/clothes|コナカ":{countryCodes:["jp"],tags:{brand:"コナカ","brand:ja":"コナカ",name:"コナカ","name:ja":"コナカ",shop:"clothes"}},"shop/clothes|ユニクロ":{countryCodes:["jp"],tags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:ja":"ユニクロ","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO","name:ja":"ユニクロ",shop:"clothes"}},"shop/clothes|ライトオン":{countryCodes:["jp"],tags:{brand:"ライトオン","brand:en":"Right-on","brand:ja":"ライトオン","brand:wikidata":"Q11346416","brand:wikipedia":"ja:ライトオン",name:"ライトオン","name:en":"Right-on","name:ja":"ライトオン",shop:"clothes"}},"shop/clothes|ワークマン":{countryCodes:["jp"],tags:{brand:"ワークマン","brand:en":"Workman","brand:ja":"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン","name:en":"Workman","name:ja":"ワークマン",shop:"clothes"}},"shop/clothes|洋服の青山":{countryCodes:["jp"],tags:{brand:"洋服の青山","brand:en":"Aoyama Tailor","brand:ja":"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山","name:en":"Aoyama Tailor","name:ja":"洋服の青山",shop:"clothes"}},"shop/coffee|Nespresso":{tags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"}},"shop/coffee|Tchibo":{countryCodes:["at","ch","cz","de","pl","sk"],matchTags:["shop/convenience"],tags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"}},"shop/computer|DNS":{countryCodes:["ru","ua"],tags:{alt_name:"ДНС",brand:"DNS","brand:en":"DNS","brand:ru":"ДНС","brand:wikidata":"Q4036922","brand:wikipedia":"ru:DNS (компания)",name:"DNS","name:en":"DNS","name:ru":"ДНС",shop:"computer"}},"shop/computer|PC World":{countryCodes:["gb"],tags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"}},"shop/confectionery|Adyar Ananda Bhavan":{countryCodes:["in"],matchTags:["amenity/restaurant"],tags:{brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan",shop:"confectionery"}},"shop/confectionery|Hemmakvall":{countryCodes:["se"],tags:{brand:"Hemmakväll","brand:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"}},"shop/confectionery|Hotel Chocolat":{countryCodes:["gb"],tags:{brand:"Hotel Chocolat","brand:wikidata":"Q5911369",name:"Hotel Chocolat",shop:"confectionery"}},"shop/confectionery|Hussel":{countryCodes:["at","de"],tags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"}},"shop/confectionery|Jamin":{countryCodes:["nl"],tags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"}},"shop/confectionery|Kilwins":{countryCodes:["us"],matchTags:["amenity/ice_cream"],tags:{brand:"Kilwins","brand:wikidata":"Q38250832","brand:wikipedia":"en:Kilwins",cuisine:"chocolate;ice_cream;popcorn",name:"Kilwins",shop:"confectionery"}},"shop/confectionery|Rocky Mountain Chocolate Factory":{countryCodes:["ca","us"],tags:{brand:"Rocky Mountain Chocolate Factory","brand:wikidata":"Q7355878","brand:wikipedia":"en:Rocky Mountain Chocolate Factory",name:"Rocky Mountain Chocolate Factory",shop:"confectionery"}},"shop/confectionery|See's Candies":{countryCodes:["us"],matchNames:["sees candy"],tags:{brand:"See's Candies","brand:wikidata":"Q2103510","brand:wikipedia":"en:See's Candies",name:"See's Candies",shop:"confectionery"}},"shop/confectionery|T. SN":{countryCodes:["ec"],tags:{brand:"T. SN",name:"T. SN",shop:"confectionery"}},"shop/confectionery|Thorntons":{countryCodes:["gb"],tags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"}},"shop/confectionery|Вацак":{countryCodes:["ua"],tags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"}},"shop/confectionery|シャトレーゼ":{countryCodes:["jp"],tags:{brand:"シャトレーゼ","brand:en":"Chateraise","brand:ja":"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ","name:en":"Chateraise","name:ja":"シャトレーゼ",shop:"confectionery"}},"shop/confectionery|不二家":{countryCodes:["jp"],tags:{brand:"不二家",name:"不二家",shop:"confectionery"}},"shop/convenience|1st Stop":{countryCodes:["us"],matchNames:["first stop"],tags:{brand:"1st Stop","brand:wikidata":"Q65706152",name:"1st Stop",shop:"convenience"}},"shop/convenience|24 часа":{countryCodes:["by","kz","ru","ua"],tags:{brand:"24 часа",name:"24 часа",shop:"convenience"}},"shop/convenience|7-Eleven":{matchNames:["7-11","seven eleven"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|7-Eleven"],tags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"}},"shop/convenience|76":{nomatch:["amenity/fuel|76"],tags:{brand:"76","brand:wikidata":"Q1658320","brand:wikipedia":"en:76 (gas station)",name:"76",shop:"convenience"}},"shop/convenience|8 à Huit":{countryCodes:["fr"],nomatch:["shop/supermarket|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"convenience"}},"shop/convenience|99 Speedmart":{countryCodes:["br","my","us"],tags:{brand:"99 Speedmart","brand:wikidata":"Q62075061",name:"99 Speedmart",shop:"convenience"}},"shop/convenience|ABC~(Hawaii)":{countryCodes:["us"],matchNames:["abc stores"],nomatch:["amenity/fuel|ABC"],tags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"}},"shop/convenience|Aibė":{countryCodes:["lt"],tags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"}},"shop/convenience|Albert Heijn to go":{countryCodes:["nl"],tags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"}},"shop/convenience|Alepa":{countryCodes:["fi"],tags:{brand:"Alepa","brand:wikidata":"Q4716167","brand:wikipedia":"fi:Alepa",name:"Alepa",shop:"convenience"}},"shop/convenience|Alfamart":{countryCodes:["id"],tags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"id:Alfamart",name:"Alfamart",shop:"convenience"}},"shop/convenience|Alfamidi":{countryCodes:["id"],tags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"}},"shop/convenience|Almacén":{countryCodes:["ar","bo","cl","pe","uy"],tags:{brand:"Almacén",name:"Almacén",shop:"convenience"}},"shop/convenience|Aral":{countryCodes:["de"],matchNames:["aral tankstelle"],matchTags:["shop/kiosk"],nomatch:["amenity/fuel|Aral"],tags:{brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral",shop:"convenience"}},"shop/convenience|BP Shop":{countryCodes:["au","ch","fr","gb","us"],nomatch:["amenity/fuel|BP"],tags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"}},"shop/convenience|Best-one":{countryCodes:["gb"],tags:{brand:"Best-one","brand:wikidata":"Q4896532","brand:wikipedia":"en:Best-one",name:"Best-one",shop:"convenience"}},"shop/convenience|Bonjour":{tags:{brand:"Bonjour",name:"Bonjour",shop:"convenience"}},"shop/convenience|Buc-ee's":{countryCodes:["us"],tags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"}},"shop/convenience|Budgens":{nomatch:["shop/supermarket|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"convenience"}},"shop/convenience|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"convenience"}},"shop/convenience|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/supermarket|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"}},"shop/convenience|CU":{countryCodes:["kr"],tags:{brand:"CU",name:"CU",shop:"convenience"}},"shop/convenience|Carrefour Express":{matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Carrefour","shop/supermarket|Carrefour"],tags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",shop:"convenience"}},"shop/convenience|Casey's General Store":{nomatch:["amenity/fuel|Casey's General Store"],tags:{brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store",shop:"convenience"}},"shop/convenience|Casino":{tags:{brand:"Casino",name:"Casino",shop:"convenience"}},"shop/convenience|Casino Shop":{countryCodes:["fr"],tags:{brand:"Casino Shop",name:"Casino Shop",shop:"convenience"}},"shop/convenience|Centra":{countryCodes:["gb","ie"],tags:{brand:"Centra","brand:wikidata":"Q747678","brand:wikipedia":"en:Centra",name:"Centra",shop:"convenience"}},"shop/convenience|Central Convenience Store":{tags:{brand:"Central Convenience Store",name:"Central Convenience Store",shop:"convenience"}},"shop/convenience|Chata Polska":{nomatch:["shop/supermarket|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"convenience"}},"shop/convenience|Cheers":{countryCodes:["sg","vn"],tags:{brand:"Cheers","brand:wikidata":"Q64154066",name:"Cheers",opening_hours:"24/7",shop:"convenience"}},"shop/convenience|Chevron":{nomatch:["amenity/fuel|Chevron"],tags:{brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron",shop:"convenience"}},"shop/convenience|Circle K":{matchNames:["ok","ok-mart"],nomatch:["amenity/fuel|Circle K"],tags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"}},"shop/convenience|Citgo":{nomatch:["amenity/fuel|Citgo"],tags:{brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo",shop:"convenience"}},"shop/convenience|Clark's Pump-N-Shop":{countryCodes:["us"],tags:{brand:"Clark's Pump-N-Shop","brand:wikidata":"Q65118218",name:"Clark's Pump-N-Shop",shop:"convenience"}},"shop/convenience|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"}},"shop/convenience|CocciMarket":{countryCodes:["fr"],tags:{brand:"CocciMarket",name:"CocciMarket",shop:"convenience"}},"shop/convenience|Coles Express":{nomatch:["amenity/fuel|Coles Express"],tags:{brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express",shop:"convenience"}},"shop/convenience|Coop Pronto":{countryCodes:["ch","li"],nomatch:["amenity/cafe|Pronto"],tags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"}},"shop/convenience|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"convenience"}},"shop/convenience|Costcutter":{nomatch:["shop/supermarket|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"convenience"}},"shop/convenience|Couche-Tard":{nomatch:["amenity/fuel|Couche-Tard"],tags:{brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard",shop:"convenience"}},"shop/convenience|Cumberland Farms":{nomatch:["amenity/fuel|Cumberland Farms"],tags:{brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms",shop:"convenience"}},"shop/convenience|Daisy Mart":{countryCodes:["ca"],tags:{brand:"Daisy Mart","brand:wikidata":"Q61994934",name:"Daisy Mart",shop:"convenience"}},"shop/convenience|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/supermarket|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"convenience"}},"shop/convenience|Express":{nomatch:["shop/clothes|Express"],tags:{brand:"Express",name:"Express",shop:"convenience"}},"shop/convenience|ExtraMile":{countryCodes:["us"],tags:{brand:"ExtraMile","brand:wikidata":"Q64224605",name:"ExtraMile",shop:"convenience"}},"shop/convenience|FamilyMart":{tags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"}},"shop/convenience|Food Mart":{tags:{brand:"Food Mart",name:"Food Mart",shop:"convenience"}},"shop/convenience|Four Square":{countryCodes:["nz"],tags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"}},"shop/convenience|Franprix":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Franprix","brand:wikidata":"Q2420096","brand:wikipedia":"fr:Franprix",name:"Franprix",shop:"convenience"}},"shop/convenience|Fresh":{tags:{brand:"Fresh",name:"Fresh",shop:"convenience"}},"shop/convenience|Freshmarket":{countryCodes:["pl"],tags:{brand:"Freshmarket","brand:wikidata":"Q16546326","brand:wikipedia":"pl:Freshmarket",name:"Freshmarket",shop:"convenience"}},"shop/convenience|GS25":{countryCodes:["kr"],matchTags:["shop/supermarket"],tags:{brand:"GS25","brand:wikidata":"Q624041","brand:wikipedia":"ko:GS25",name:"GS25",shop:"convenience"}},"shop/convenience|Groszek":{countryCodes:["pl"],nomatch:["shop/supermarket|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"convenience"}},"shop/convenience|Hasty Market":{countryCodes:["ca"],tags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"}},"shop/convenience|Holiday":{nomatch:["amenity/fuel|Holiday"],tags:{brand:"Holiday",name:"Holiday",shop:"convenience"}},"shop/convenience|Hruška":{nomatch:["shop/supermarket|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"convenience"}},"shop/convenience|Hudson":{nomatch:["shop/newsagent|Hudson News"],tags:{brand:"Hudson","brand:wikidata":"Q5928787","brand:wikipedia":"en:Hudson Group",name:"Hudson",shop:"convenience"}},"shop/convenience|Husky":{countryCodes:["ca"],nomatch:["amenity/fuel|Husky","amenity/restaurant|Husky House"],tags:{brand:"Husky","brand:wikidata":"Q702049","brand:wikipedia":"en:Husky Energy",name:"Husky",shop:"convenience"}},"shop/convenience|Indomaret":{countryCodes:["id"],matchTags:["shop/supermarket"],tags:{brand:"Indomaret","brand:wikidata":"Q4262825","brand:wikipedia":"en:Indomaret",name:"Indomaret",shop:"convenience"}},"shop/convenience|Indomart":{countryCodes:["id"],tags:{brand:"Indomart",name:"Indomart",shop:"convenience"}},"shop/convenience|Intermarché Contact":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Contact",shop:"convenience"}},"shop/convenience|Irving":{nomatch:["amenity/fuel|Irving"],tags:{brand:"Irving",name:"Irving",shop:"convenience"}},"shop/convenience|Jacksons":{countryCodes:["us"],tags:{brand:"Jacksons","brand:wikidata":"Q64617393",name:"Jacksons",shop:"convenience"}},"shop/convenience|Jiffy":{tags:{brand:"Jiffy",name:"Jiffy",shop:"convenience"}},"shop/convenience|Joker":{countryCodes:["no"],matchTags:["shop/supermarket"],tags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"convenience"}},"shop/convenience|K-Market":{countryCodes:["fi"],matchTags:["shop/supermarket"],tags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"}},"shop/convenience|Kangaroo Express":{countryCodes:["us"],nomatch:["amenity/fuel|Kangaroo Express"],tags:{brand:"Kangaroo Express","brand:wikidata":"Q61747408",name:"Kangaroo Express",shop:"convenience",short_name:"Kangaroo"}},"shop/convenience|Konzum~(Balkans)":{countryCodes:["ba","hr","rs"],nomatch:["shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Balkans)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Konzum~(Czechia)":{countryCodes:["cz","sk"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/supermarket|Konzum~(Balkans)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Kum & Go":{nomatch:["amenity/fuel|Kum & Go"],tags:{brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go",shop:"convenience"}},"shop/convenience|Kwik Shop":{countryCodes:["us"],tags:{brand:"Kwik Shop","brand:wikidata":"Q6450417","brand:wikipedia":"en:Kwik Shop",name:"Kwik Shop",shop:"convenience"}},"shop/convenience|Kwik Trip":{countryCodes:["us"],nomatch:["amenity/fuel|Kwik Trip"],tags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"}},"shop/convenience|Lawson":{tags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"}},"shop/convenience|Lewiatan":{countryCodes:["pl"],nomatch:["shop/supermarket|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"convenience"}},"shop/convenience|Lifestyle Express":{countryCodes:["gb"],tags:{brand:"Lifestyle Express","brand:wikidata":"Q61994869",name:"Lifestyle Express",shop:"convenience"}},"shop/convenience|Livio":{tags:{brand:"Livio",name:"Livio",shop:"convenience"}},"shop/convenience|Loaf 'N Jug":{countryCodes:["us"],tags:{brand:"Loaf 'N Jug","brand:wikidata":"Q6663398","brand:wikipedia":"en:Loaf 'N Jug",name:"Loaf 'N Jug",shop:"convenience"}},"shop/convenience|Londis":{tags:{brand:"Londis",name:"Londis",shop:"convenience"}},"shop/convenience|M&S Simply Food":{nomatch:["shop/supermarket|M&S Simply Food"],tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"convenience"}},"shop/convenience|Mac's":{nomatch:["amenity/fuel|Mac's"],tags:{brand:"Mac's",name:"Mac's",shop:"convenience"}},"shop/convenience|Mace":{countryCodes:["gb","ie"],tags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"}},"shop/convenience|Marathon":{nomatch:["amenity/fuel|Marathon"],tags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"}},"shop/convenience|Maverik":{nomatch:["amenity/fuel|Maverik"],tags:{brand:"Maverik",name:"Maverik",shop:"convenience"}},"shop/convenience|Maxikiosco":{countryCodes:["ar","uy"],tags:{brand:"Maxikiosco",name:"Maxikiosco",shop:"convenience"}},"shop/convenience|Małpka Express":{countryCodes:["pl"],tags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"}},"shop/convenience|McColl's":{countryCodes:["gb"],matchTags:["shop/newsagent"],tags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"}},"shop/convenience|Mercator":{tags:{brand:"Mercator",name:"Mercator",shop:"convenience"}},"shop/convenience|Migrolino":{countryCodes:["ch"],tags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"}},"shop/convenience|Ministop":{tags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"}},"shop/convenience|Minit Mart":{countryCodes:["us"],tags:{brand:"Minit Mart","brand:wikidata":"Q18154470","brand:wikipedia":"en:Minit Mart Foods Inc.",name:"Minit Mart",shop:"convenience"}},"shop/convenience|Mlin i pekare":{countryCodes:["hr"],tags:{brand:"Mlin i pekare",name:"Mlin i pekare",shop:"convenience"}},"shop/convenience|Mobil Mart":{nomatch:["amenity/fuel|Mobil"],tags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"}},"shop/convenience|Nasz Sklep":{countryCodes:["pl"],tags:{brand:"Nasz Sklep","brand:wikidata":"Q62070369",name:"Nasz Sklep",shop:"convenience"}},"shop/convenience|Neste K":{countryCodes:["fi"],tags:{brand:"Neste K","brand:wikidata":"Q42901270","brand:wikipedia":"fi:Neste K",name:"Neste K",shop:"convenience"}},"shop/convenience|NewDays":{countryCodes:["jp"],matchNames:["newdays ミニ"],tags:{alt_name:"ニューデイズ",brand:"NewDays","brand:wikidata":"Q11234763","brand:wikipedia":"ja:NewDays",name:"NewDays",shop:"convenience"}},"shop/convenience|Nisa":{countryCodes:["gb"],tags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"}},"shop/convenience|Nisa Local":{countryCodes:["gb"],tags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"}},"shop/convenience|OK Market":{countryCodes:["cl"],tags:{brand:"OK Market",name:"OK Market",shop:"convenience"}},"shop/convenience|OK便利商店":{countryCodes:["cn","tw"],matchNames:["ok便利店 circle k"],tags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"}},"shop/convenience|Odido":{countryCodes:["pl"],tags:{brand:"Odido",name:"Odido",shop:"convenience"}},"shop/convenience|On the Run":{tags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"}},"shop/convenience|One Stop":{countryCodes:["gb","us"],tags:{brand:"One Stop",name:"One Stop",shop:"convenience"}},"shop/convenience|Orlen":{nomatch:["amenity/fuel|Orlen"],tags:{brand:"Orlen",name:"Orlen",shop:"convenience"}},"shop/convenience|Oxxo":{matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Oxxo"],tags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"}},"shop/convenience|Petit Casino":{countryCodes:["fr"],matchTags:["shop/supermarket"],tags:{brand:"Petit Casino",name:"Petit Casino",shop:"convenience"}},"shop/convenience|Petro-Canada":{nomatch:["amenity/fuel|Petro-Canada"],tags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"}},"shop/convenience|Plaid Pantry":{countryCodes:["us"],tags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"}},"shop/convenience|Premier":{countryCodes:["gb"],tags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"}},"shop/convenience|Proxi":{countryCodes:["ch","fr"],matchTags:["shop/supermarket"],tags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"convenience"}},"shop/convenience|Proxy":{countryCodes:["fr"],tags:{brand:"Proxy",name:"Proxy",shop:"convenience"}},"shop/convenience|Quick Stop":{tags:{brand:"Quick Stop",name:"Quick Stop",shop:"convenience"}},"shop/convenience|QuickChek":{countryCodes:["us"],tags:{brand:"QuickChek",name:"QuickChek",shop:"convenience"}},"shop/convenience|QuikTrip":{nomatch:["amenity/fuel|QuikTrip"],tags:{brand:"QuikTrip",name:"QuikTrip",shop:"convenience"}},"shop/convenience|RaceTrac":{countryCodes:["us"],nomatch:["amenity/fuel|RaceTrac"],tags:{brand:"RaceTrac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"RaceTrac",shop:"convenience"}},"shop/convenience|Royal Farms":{countryCodes:["us"],nomatch:["amenity/fuel|Royal Farms"],tags:{brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms",shop:"convenience"}},"shop/convenience|Rutter's":{countryCodes:["us"],tags:{brand:"Rutter's","brand:wikidata":"Q7383544","brand:wikipedia":"en:Rutter's",name:"Rutter's",shop:"convenience"}},"shop/convenience|Sainsbury's Local":{countryCodes:["gb"],matchTags:["shop/supermarket"],tags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"}},"shop/convenience|Sale":{countryCodes:["fi"],tags:{brand:"Sale","brand:wikidata":"Q11892046","brand:wikipedia":"fi:Sale",name:"Sale",shop:"convenience"}},"shop/convenience|Select":{nomatch:["shop/clothes|Select"],tags:{brand:"Select",name:"Select",shop:"convenience"}},"shop/convenience|Sheetz":{nomatch:["amenity/fuel|Sheetz"],tags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"}},"shop/convenience|Shell":{nomatch:["amenity/fuel|Shell","amenity/fuel|Shell Express"],tags:{brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell",shop:"convenience"}},"shop/convenience|Shell Select":{nomatch:["amenity/fuel|Shell","amenity/fuel|Shell Express"],tags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"}},"shop/convenience|Shop & Go":{tags:{brand:"Shop & Go",name:"Shop & Go",shop:"convenience"}},"shop/convenience|Siwa":{countryCodes:["fi"],tags:{brand:"Siwa","brand:wikidata":"Q11893827","brand:wikipedia":"fi:Siwa",name:"Siwa",shop:"convenience"}},"shop/convenience|Spar":{nomatch:["shop/convenience|Spar Express","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"}},"shop/convenience|Spar Express":{matchTags:["shop/supermarket"],nomatch:["shop/convenience|Spar","shop/supermarket|Spar"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"}},"shop/convenience|Speedway":{nomatch:["amenity/fuel|Speedway"],tags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"}},"shop/convenience|Społem":{nomatch:["shop/supermarket|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"}},"shop/convenience|Star Mart":{tags:{brand:"Star Mart","brand:wikidata":"Q61994857",name:"Star Mart",shop:"convenience"}},"shop/convenience|Stewart's":{nomatch:["amenity/fuel|Stewart's"],tags:{brand:"Stewart's",name:"Stewart's",shop:"convenience"}},"shop/convenience|Stripes":{countryCodes:["cl","us"],tags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"}},"shop/convenience|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"convenience"}},"shop/convenience|Sunoco":{nomatch:["amenity/fuel|Sunoco"],tags:{brand:"Sunoco",name:"Sunoco",shop:"convenience"}},"shop/convenience|Supérette":{tags:{brand:"Supérette",name:"Supérette",shop:"convenience"}},"shop/convenience|Słoneczko":{countryCodes:["pl"],tags:{brand:"Słoneczko",name:"Słoneczko",shop:"convenience"}},"shop/convenience|Tesco":{nomatch:["amenity/fuel|Tesco","shop/convenience|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"convenience"}},"shop/convenience|Tesco Express":{nomatch:["amenity/fuel|Tesco"],tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"convenience"}},"shop/convenience|Tesco Lotus Express":{countryCodes:["th"],tags:{brand:"Tesco Lotus Express",name:"Tesco Lotus Express",shop:"convenience"}},"shop/convenience|Texaco":{nomatch:["amenity/fuel|Texaco"],tags:{brand:"Texaco",name:"Texaco",shop:"convenience"}},"shop/convenience|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"}},"shop/convenience|Tiendita":{countryCodes:["mx"],tags:{brand:"Tiendita",name:"Tiendita",shop:"convenience"}},"shop/convenience|Tiger Mart":{tags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"}},"shop/convenience|Total":{nomatch:["amenity/fuel|Total"],tags:{brand:"Total",name:"Total",shop:"convenience"}},"shop/convenience|Turkey Hill":{nomatch:["amenity/fuel|Turkey Hill"],tags:{brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill",shop:"convenience"}},"shop/convenience|Ultramar":{nomatch:["amenity/fuel|Ultramar"],tags:{brand:"Ultramar",name:"Ultramar",shop:"convenience"}},"shop/convenience|United Dairy Farmers":{countryCodes:["us"],matchTags:["amenity/ice_cream","shop/ice_cream"],nomatch:["amenity/fuel|United Dairy Farmers"],tags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"}},"shop/convenience|Utile":{countryCodes:["fr"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|Super U","shop/supermarket|Hyper U","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"}},"shop/convenience|Valero":{nomatch:["amenity/fuel|Valero"],tags:{brand:"Valero",name:"Valero",shop:"convenience"}},"shop/convenience|VinMart+":{countryCodes:["vn"],nomatch:["shop/supermarket|VinMart"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"}},"shop/convenience|Vival":{countryCodes:["fr","pe"],matchTags:["shop/supermarket"],tags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"}},"shop/convenience|Volg":{tags:{brand:"Volg",name:"Volg",shop:"convenience"}},"shop/convenience|Wawa":{nomatch:["amenity/fuel|Wawa"],tags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"}},"shop/convenience|Weltladen":{countryCodes:["at","ch","de"],tags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"}},"shop/convenience|Woolworths Petrol":{countryCodes:["au"],nomatch:["amenity/fuel|Woolworths Petrol"],tags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"}},"shop/convenience|abc~(Poland)":{countryCodes:["pl"],matchTags:["shop/supermarket"],nomatch:["amenity/fuel|ABC"],tags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"}},"shop/convenience|ampm":{tags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"}},"shop/convenience|miniピアゴ":{countryCodes:["jp"],matchNames:["ミニピアゴ"],tags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"}},"shop/convenience|Żabka":{countryCodes:["pl"],tags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"}},"shop/convenience|АВ Daily":{countryCodes:["ru"],tags:{brand:"АВ Daily",name:"АВ Daily",shop:"convenience"}},"shop/convenience|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"convenience"}},"shop/convenience|Абсолют":{tags:{brand:"Абсолют",name:"Абсолют",shop:"convenience"}},"shop/convenience|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"convenience"}},"shop/convenience|Агрокомплекс":{countryCodes:["ru"],tags:{brand:"Агрокомплекс",name:"Агрокомплекс",shop:"convenience"}},"shop/convenience|Альянс":{countryCodes:["by","kg","ru","ua"],tags:{brand:"Альянс",name:"Альянс",shop:"convenience"}},"shop/convenience|Апельсин":{countryCodes:["by","kg","kz","ru","ua"],tags:{brand:"Апельсин",name:"Апельсин",shop:"convenience"}},"shop/convenience|Ассорти":{countryCodes:["by","kg","kz","ru","ua"],tags:{brand:"Ассорти",name:"Ассорти",shop:"convenience"}},"shop/convenience|Березка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Березка",name:"Березка",shop:"convenience"}},"shop/convenience|Береке":{countryCodes:["kg","kz"],tags:{brand:"Береке",name:"Береке",shop:"convenience"}},"shop/convenience|Берёзка":{tags:{brand:"Берёзка",name:"Берёзка",shop:"convenience"}},"shop/convenience|Бриз":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Бриз",name:"Бриз",shop:"convenience"}},"shop/convenience|Валентина":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Валентина",name:"Валентина",shop:"convenience"}},"shop/convenience|Везунчик":{countryCodes:["ru","ua"],tags:{brand:"Везунчик",name:"Везунчик",shop:"convenience"}},"shop/convenience|Верный":{tags:{brand:"Верный",name:"Верный",shop:"convenience"}},"shop/convenience|ВкусВилл":{countryCodes:["ru"],tags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"}},"shop/convenience|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"convenience"}},"shop/convenience|Гермес":{tags:{brand:"Гермес",name:"Гермес",shop:"convenience"}},"shop/convenience|Гроздь":{nomatch:["shop/supermarketk|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"convenience"}},"shop/convenience|Гурман":{tags:{brand:"Гурман",name:"Гурман",shop:"convenience"}},"shop/convenience|Диана":{tags:{brand:"Диана",name:"Диана",shop:"convenience"}},"shop/convenience|Доброном":{countryCodes:["by","ru"],tags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"}},"shop/convenience|Добрый":{countryCodes:["by","ru"],tags:{brand:"Добрый",name:"Добрый",shop:"convenience"}},"shop/convenience|Дружба":{countryCodes:["by","ru","ua"],tags:{brand:"Дружба",name:"Дружба",shop:"convenience"}},"shop/convenience|Евроопт Market":{countryCodes:["by"],matchNames:["Евроопт Маркет"],tags:{brand:"Евроопт Market","brand:wikidata":"Q65455869",name:"Евроопт Market",shop:"convenience"}},"shop/convenience|Евроопт Минимаркет":{countryCodes:["by"],tags:{brand:"Евроопт Минимаркет","brand:wikidata":"Q65455911",name:"Евроопт Минимаркет",shop:"convenience"}},"shop/convenience|Елена":{tags:{brand:"Елена",name:"Елена",shop:"convenience"}},"shop/convenience|Ермолино":{countryCodes:["ru","ua"],tags:{brand:"Ермолино",name:"Ермолино",shop:"convenience"}},"shop/convenience|КазМунайГаз":{nomatch:["amenity/fuel|КазМунайГаз"],tags:{brand:"КазМунайГаз",name:"КазМунайГаз",shop:"convenience"}},"shop/convenience|Каштан":{countryCodes:["by","ru","ua"],tags:{brand:"Каштан",name:"Каштан",shop:"convenience"}},"shop/convenience|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"convenience"}},"shop/convenience|Кооператор":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Кооператор",name:"Кооператор",shop:"convenience"}},"shop/convenience|Копеечка":{countryCodes:["by","ru","ua"],tags:{brand:"Копеечка",name:"Копеечка",shop:"convenience"}},"shop/convenience|Копейка":{countryCodes:["by","ru","ua"],tags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"}},"shop/convenience|Корзинка":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Корзинка",name:"Корзинка",shop:"convenience"}},"shop/convenience|Кулинария":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Кулинария",name:"Кулинария",shop:"convenience"}},"shop/convenience|Лакомка":{tags:{brand:"Лакомка",name:"Лакомка",shop:"convenience"}},"shop/convenience|Лукойл":{nomatch:["amenity/fuel|Лукойл"],tags:{brand:"Лукойл",name:"Лукойл",shop:"convenience"}},"shop/convenience|Луч":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Луч",name:"Луч",shop:"convenience"}},"shop/convenience|Любава":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Любава",name:"Любава",shop:"convenience"}},"shop/convenience|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"convenience"}},"shop/convenience|Магнит":{matchNames:["магнит у дома"],nomatch:["shop/cosmetics|Магнит Косметик","shop/supermarket|Магнит"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"}},"shop/convenience|Мария-Ра":{countryCodes:["ru"],nomatch:["shop/supermarket|Мария-Ра"],tags:{brand:"Мария-Ра","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра",shop:"convenience"}},"shop/convenience|Маяк":{countryCodes:["kz","ru","ua"],tags:{brand:"Маяк",name:"Маяк",shop:"convenience"}},"shop/convenience|Меркурий":{tags:{brand:"Меркурий",name:"Меркурий",shop:"convenience"}},"shop/convenience|Мини маркет":{tags:{brand:"Мини маркет",name:"Мини маркет",shop:"convenience"}},"shop/convenience|Монетка":{tags:{brand:"Монетка",name:"Монетка",shop:"convenience"}},"shop/convenience|Мрія":{countryCodes:["ua"],tags:{brand:"Мрія",name:"Мрія",shop:"convenience"}},"shop/convenience|Ника":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Ника",name:"Ника",shop:"convenience"}},"shop/convenience|Оазис":{tags:{brand:"Оазис",name:"Оазис",shop:"convenience"}},"shop/convenience|Околица":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Околица",name:"Околица",shop:"convenience"}},"shop/convenience|Парус":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Парус",name:"Парус",shop:"convenience"}},"shop/convenience|Пеликан":{countryCodes:["by","ru"],tags:{brand:"Пеликан",name:"Пеликан",shop:"convenience"}},"shop/convenience|Радуга":{tags:{brand:"Радуга",name:"Радуга",shop:"convenience"}},"shop/convenience|Русь":{countryCodes:["kz","ru","ua"],tags:{brand:"Русь",name:"Русь",shop:"convenience"}},"shop/convenience|Сельпо":{countryCodes:["kz","ru"],tags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"}},"shop/convenience|Сказка":{tags:{brand:"Сказка",name:"Сказка",shop:"convenience"}},"shop/convenience|Солнышко":{countryCodes:["kz","ru","ua"],tags:{brand:"Солнышко",name:"Солнышко",shop:"convenience"}},"shop/convenience|Тройка":{countryCodes:["kz","ru","ua"],tags:{brand:"Тройка",name:"Тройка",shop:"convenience"}},"shop/convenience|У Палыча":{countryCodes:["ru"],tags:{brand:"У Палыча",name:"У Палыча",shop:"convenience"}},"shop/convenience|Удача":{tags:{brand:"Удача",name:"Удача",shop:"convenience"}},"shop/convenience|Фасоль":{countryCodes:["ru","ua"],tags:{brand:"Фасоль",name:"Фасоль",shop:"convenience"}},"shop/convenience|Фортуна":{tags:{brand:"Фортуна",name:"Фортуна",shop:"convenience"}},"shop/convenience|Хуторок":{tags:{brand:"Хуторок",name:"Хуторок",shop:"convenience"}},"shop/convenience|Эдем":{countryCodes:["by","ru","ua"],tags:{brand:"Эдем",name:"Эдем",shop:"convenience"}},"shop/convenience|Юбилейный":{countryCodes:["by","kz","ru"],tags:{brand:"Юбилейный",name:"Юбилейный",shop:"convenience"}},"shop/convenience|Ярче":{countryCodes:["ru"],tags:{brand:"Ярче",name:"Ярче",shop:"convenience"}},"shop/convenience|アンスリー":{countryCodes:["jp"],tags:{brand:"アンスリー","brand:en":"Ansuri","brand:ja":"アンスリー","brand:wikidata":"Q17192555","brand:wikipedia":"ja:アンスリー",name:"アンスリー","name:en":"Ansuri","name:ja":"アンスリー",shop:"convenience"}},"shop/convenience|サンクス":{countryCodes:["jp"],tags:{brand:"サンクス","brand:en":"Sunkus","brand:ja":"サンクス","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus","name:ja":"サンクス",shop:"convenience"}},"shop/convenience|サークルK":{countryCodes:["jp"],tags:{brand:"サークルK","brand:en":"Circle K","brand:ja":"サークルK","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K","name:ja":"サークルK",shop:"convenience"}},"shop/convenience|スリーエフ":{countryCodes:["jp"],tags:{brand:"スリーエフ","brand:en":"Three F","brand:ja":"スリーエフ","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F","name:ja":"スリーエフ",shop:"convenience"}},"shop/convenience|セイコーマート":{countryCodes:["jp"],tags:{brand:"セイコーマート","brand:en":"Seicomart","brand:ja":"セイコーマート","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart","name:ja":"セイコーマート",shop:"convenience"}},"shop/convenience|セブン-イレブン":{countryCodes:["jp"],matchNames:["セブンイレブン(7-11)","セブンイレブン(seven-eleven)"],tags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:ja":"セブン-イレブン","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven","name:ja":"セブン-イレブン","official_name:en":"Seven-Eleven",shop:"convenience"}},"shop/convenience|セーブオン":{countryCodes:["jp"],tags:{brand:"セーブオン","brand:en":"Save On","brand:ja":"セーブオン","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On","name:ja":"セーブオン",shop:"convenience"}},"shop/convenience|デイリーヤマザキ":{countryCodes:["jp"],tags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:ja":"デイリーヤマザキ","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki","name:ja":"デイリーヤマザキ",shop:"convenience"}},"shop/convenience|ナチュラルローソン":{countryCodes:["jp"],tags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:ja":"ナチュラルローソン","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson","name:ja":"ナチュラルローソン",shop:"convenience"}},"shop/convenience|ファミリーマート":{countryCodes:["jp"],tags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:ja":"ファミリーマート","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart","name:ja":"ファミリーマート",shop:"convenience"}},"shop/convenience|ポプラ":{countryCodes:["jp"],tags:{brand:"ポプラ","brand:en":"Poplar","brand:ja":"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar","name:ja":"ポプラ",shop:"convenience"}},"shop/convenience|ミニストップ":{countryCodes:["jp"],tags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"}},"shop/convenience|ヤマザキショップ":{countryCodes:["jp"],tags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"}},"shop/convenience|ローソン":{countryCodes:["jp"],matchNames:["ローソン"],tags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"}},"shop/convenience|ローソンストア100":{countryCodes:["jp"],tags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"}},"shop/convenience|ローソン・スリーエフ":{countryCodes:["jp"],matchNames:["lawson+スリーエフ","ローソン・スリーエフ"],tags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",shop:"convenience"}},"shop/convenience|全家":{countryCodes:["cn","tw"],tags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"}},"shop/convenience|全家便利商店":{countryCodes:["tw"],tags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"}},"shop/convenience|萊爾富":{countryCodes:["tw"],tags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"}},"shop/convenience|미니스톱":{countryCodes:["kr"],tags:{brand:"미니스톱","brand:ko":"미니스톱",name:"미니스톱","name:ko":"미니스톱",shop:"convenience"}},"shop/convenience|세븐일레븐":{countryCodes:["kr"],tags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:ko":"세븐일레븐","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven","name:ko":"세븐일레븐",shop:"convenience"}},"shop/copyshop|Epicier":{countryCodes:["ma"],tags:{brand:"Epicier",name:"Epicier",shop:"copyshop"}},"shop/copyshop|FedEx Office":{countryCodes:["us"],matchNames:["fedex office print and ship center"],matchTags:["amenity/post_office"],tags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"}},"shop/copyshop|Minuteman Press":{tags:{brand:"Minuteman Press","brand:wikidata":"Q64866081",name:"Minuteman Press",shop:"copyshop"}},"shop/copyshop|Photocopie":{tags:{brand:"Photocopie",name:"Photocopie",shop:"copyshop"}},"shop/copyshop|Sir Speedy":{countryCodes:["us"],matchTags:["amenity/post_office"],tags:{brand:"Sir Speedy","brand:wikidata":"Q17088225","brand:wikipedia":"en:Sir Speedy",name:"Sir Speedy",shop:"copyshop"}},"shop/cosmetics|Aveda":{countryCodes:["us"],tags:{brand:"Aveda","brand:wikidata":"Q4827965","brand:wikipedia":"en:Aveda",name:"Aveda",shop:"cosmetics"}},"shop/cosmetics|Bath & Body Works":{tags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"cosmetics"}},"shop/cosmetics|Eva":{countryCodes:["ru","ua"],tags:{brand:"Eva",name:"Eva",shop:"cosmetics"}},"shop/cosmetics|KIKO Milano":{countryCodes:["be","fr","gb","nl"],matchNames:["kiko"],tags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"}},"shop/cosmetics|Kiehl's":{countryCodes:["ca","us"],matchNames:["kiehl's since 1851"],tags:{brand:"Kiehl's","brand:wikidata":"Q3196447","brand:wikipedia":"en:Kiehl's",name:"Kiehl's",shop:"cosmetics"}},"shop/cosmetics|L'Occitane":{matchNames:["l'occitane en provence"],tags:{brand:"L'Occitane","brand:wikidata":"Q1880676","brand:wikipedia":"en:L'Occitane en Provence",name:"L'Occitane",shop:"cosmetics"}},"shop/cosmetics|Lush":{tags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"}},"shop/cosmetics|MAC Cosmetics":{countryCodes:["ca","de","us"],tags:{brand:"MAC Cosmetics","brand:wikidata":"Q2624442","brand:wikipedia":"en:MAC Cosmetics",name:"MAC Cosmetics",shop:"cosmetics",short_name:"M·A·C"}},"shop/cosmetics|Mixit":{countryCodes:["by","kz","ru"],tags:{brand:"Mixit",name:"Mixit",shop:"cosmetics"}},"shop/cosmetics|Nocibé":{countryCodes:["fr"],tags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"}},"shop/cosmetics|Origins":{countryCodes:["us"],tags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"}},"shop/cosmetics|Rituals":{countryCodes:["be","ch","de","es","gb","nl","se"],tags:{brand:"Rituals",name:"Rituals",shop:"cosmetics"}},"shop/cosmetics|Saje":{countryCodes:["ca","us"],tags:{brand:"Saje","brand:wikidata":"Q44631749","brand:wikipedia":"en:Saje Natural Wellness",name:"Saje",shop:"cosmetics"}},"shop/cosmetics|Sephora":{matchTags:["shop/perfumery"],tags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"}},"shop/cosmetics|The Body Shop":{matchTags:["shop/chemist"],tags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"}},"shop/cosmetics|Ulta Beauty":{countryCodes:["us"],matchNames:["ulta"],tags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"cosmetics"}},"shop/cosmetics|Vente de Cosmétique":{countryCodes:["ci"],tags:{brand:"Vente de Cosmétique",name:"Vente de Cosmétique",shop:"cosmetics"}},"shop/cosmetics|bareMinerals":{countryCodes:["us"],tags:{brand:"bareMinerals",name:"bareMinerals",shop:"cosmetics"}},"shop/cosmetics|Л'Этуаль":{countryCodes:["ru"],tags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"}},"shop/cosmetics|Магнит Косметик":{countryCodes:["ru"],matchTags:["shop/chemist"],nomatch:["shop/convenience|Магнит","shop/supermarket|Магнит"],tags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"}},"shop/cosmetics|Подружка":{countryCodes:["ru","ua"],tags:{brand:"Подружка",name:"Подружка",shop:"cosmetics"}},"shop/cosmetics|Чистый дом":{countryCodes:["ru","ua"],tags:{brand:"Чистый дом",name:"Чистый дом",shop:"cosmetics"}},"shop/country_store|Atwoods":{countryCodes:["us"],tags:{brand:"Atwoods","brand:wikidata":"Q4818874","brand:wikipedia":"en:Atwoods",name:"Atwoods",shop:"country_store"}},"shop/country_store|Blain's Farm & Fleet":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Blain's Farm & Fleet","brand:wikidata":"Q4923906","brand:wikipedia":"en:Blain's Farm & Fleet",name:"Blain's Farm & Fleet",shop:"country_store"}},"shop/country_store|Bomgaars":{countryCodes:["us"],tags:{brand:"Bomgaars","brand:wikidata":"Q22059070","brand:wikipedia":"en:Bomgaars",name:"Bomgaars",shop:"country_store"}},"shop/country_store|Fleet Farm":{countryCodes:["us"],matchNames:["mills fleet farm"],tags:{brand:"Fleet Farm","brand:wikidata":"Q6859973","brand:wikipedia":"en:Fleet Farm",name:"Fleet Farm",shop:"country_store"}},"shop/country_store|Grange Co-op":{countryCodes:["us"],tags:{brand:"Grange Co-op","brand:wikidata":"Q5595639","brand:wikipedia":"en:Grange Cooperative",name:"Grange Co-op",shop:"country_store"}},"shop/country_store|Home of Economy":{countryCodes:["us"],tags:{brand:"Home of Economy","brand:wikidata":"Q5889100","brand:wikipedia":"en:Home of Economy",name:"Home of Economy",shop:"country_store"}},"shop/country_store|Norbys Farm Fleet":{countryCodes:["us"],tags:{brand:"Norbys Farm Fleet","brand:wikidata":"Q7050461","brand:wikipedia":"en:Norby's Farm Fleet",name:"Norbys Farm Fleet",shop:"country_store"}},"shop/country_store|Orscheln Farm & Home":{countryCodes:["us"],tags:{brand:"Orscheln Farm & Home","brand:wikidata":"Q22060331","brand:wikipedia":"en:Orscheln Farm & Home",name:"Orscheln Farm & Home",shop:"country_store"}},"shop/country_store|Peavey Mart":{countryCodes:["ca"],tags:{brand:"Peavey Mart","brand:wikidata":"Q7158483","brand:wikipedia":"en:Peavey Mart",name:"Peavey Mart",shop:"country_store"}},"shop/country_store|Rural King":{countryCodes:["us"],tags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"}},"shop/country_store|TSC Stores":{countryCodes:["ca"],tags:{brand:"TSC Stores","brand:wikidata":"Q62720230",name:"TSC Stores",shop:"country_store"}},"shop/country_store|Theisen's":{countryCodes:["us"],tags:{brand:"Theisen's","brand:wikidata":"Q7777850","brand:wikipedia":"en:Theisen's",name:"Theisen's",shop:"country_store"}},"shop/country_store|Tractor Supply Company":{countryCodes:["us"],tags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"}},"shop/country_store|Wynnstay":{countryCodes:["gb"],tags:{brand:"Wynnstay","brand:wikidata":"Q63016351",name:"Wynnstay",shop:"country_store"}},"shop/craft|A.C. Moore":{countryCodes:["us"],tags:{brand:"A.C. Moore","brand:wikidata":"Q4647066","brand:wikipedia":"en:A.C. Moore",name:"A.C. Moore",shop:"craft"}},"shop/craft|Hobby Lobby":{countryCodes:["in","us"],tags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"}},"shop/craft|Hobbycraft":{countryCodes:["gb"],matchTags:["shop/art"],tags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"}},"shop/craft|Jo-Ann":{countryCodes:["us"],tags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"}},"shop/craft|Michaels":{countryCodes:["ca","us"],tags:{brand:"Michaels","brand:wikidata":"Q6835667",name:"Michaels",shop:"craft"}},"shop/craft|Woodcraft":{countryCodes:["us"],matchTags:["craft/carpenter","shop/doityourself","shop/hardware","shop/hobby"],tags:{brand:"Woodcraft","brand:wikidata":"Q22026341","brand:wikipedia":"en:Woodcraft Supply",name:"Woodcraft",shop:"craft"}},"shop/deli|ほっともっと":{countryCodes:["jp"],nomatch:["amenity/fast_food|ほっともっと"],tags:{brand:"ほっともっと","brand:en":"Hotto Motto","brand:ja":"ほっともっと","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto","name:ja":"ほっともっと",shop:"deli"}},"shop/deli|京樽":{countryCodes:["jp"],matchTags:["amenity/fast_food"],tags:{brand:"京樽","brand:en":"Kyotaru","brand:ja":"京樽","brand:wikidata":"Q11374503","brand:wikipedia":"ja:京樽",name:"京樽","name:en":"Kyotaru","name:ja":"京樽",shop:"deli"}},"shop/department_store|Barneys New York":{countryCodes:["us"],matchNames:["barneys"],tags:{brand:"Barneys New York","brand:wikidata":"Q59465","brand:wikipedia":"en:Barneys New York",name:"Barneys New York",shop:"department_store"}},"shop/department_store|Bealls (Florida-based)":{countryCodes:["us"],tags:{brand:"Bealls","brand:wikidata":"Q4876153","brand:wikipedia":"en:Bealls (Florida)",name:"Bealls",shop:"department_store"}},"shop/department_store|Bealls (Texas-based )":{countryCodes:["us"],tags:{brand:"Bealls","brand:wikidata":"Q4876156","brand:wikipedia":"en:Bealls (Texas)",name:"Bealls",shop:"department_store"}},"shop/department_store|Belk":{countryCodes:["us"],tags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"}},"shop/department_store|Bi-Mart":{countryCodes:["us"],tags:{brand:"Bi-Mart","brand:wikidata":"Q4902331","brand:wikipedia":"en:Bi-Mart",name:"Bi-Mart",shop:"department_store"}},"shop/department_store|Big Lots":{countryCodes:["us"],matchTags:["shop/variety_store"],tags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"}},"shop/department_store|Big W":{countryCodes:["au"],tags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"}},"shop/department_store|Bloomingdale's":{countryCodes:["us"],tags:{brand:"Bloomingdale's","brand:wikidata":"Q283383","brand:wikipedia":"en:Bloomingdale's",name:"Bloomingdale's",shop:"department_store"}},"shop/department_store|Canadian Tire":{countryCodes:["ca"],matchTags:["shop/doityourself"],nomatch:["amenity/fuel|Canadian Tire"],tags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"}},"shop/department_store|Casas Bahia":{countryCodes:["br"],tags:{brand:"Casas Bahia","brand:wikidata":"Q5048048","brand:wikipedia":"en:Casas Bahia",name:"Casas Bahia",shop:"department_store"}},"shop/department_store|Century 21":{countryCodes:["us"],matchNames:["c21"],nomatch:["office/estate_agent|Century 21"],tags:{brand:"Century 21","brand:wikidata":"Q5063125","brand:wikipedia":"en:Century 21 (department store)",name:"Century 21",shop:"department_store"}},"shop/department_store|Coppel":{tags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"}},"shop/department_store|David Jones":{countryCodes:["au"],tags:{brand:"David Jones","brand:wikidata":"Q5235753","brand:wikipedia":"en:David Jones Limited",name:"David Jones",shop:"department_store"}},"shop/department_store|Debenhams":{countryCodes:["gb","ie"],tags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"}},"shop/department_store|Dillard's":{countryCodes:["us"],tags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"}},"shop/department_store|El Corte Inglés":{countryCodes:["es"],tags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"}},"shop/department_store|Falabella":{matchNames:["saga falabella"],nomatch:["amenity/bank|Banco Falabella"],tags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"}},"shop/department_store|Galeria Kaufhof":{countryCodes:["de"],tags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"}},"shop/department_store|Giant Tiger":{countryCodes:["ca"],tags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"}},"shop/department_store|Gordmans":{countryCodes:["us"],tags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"}},"shop/department_store|HEMA":{countryCodes:["be","de","nl"],tags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"}},"shop/department_store|Harvey Norman":{countryCodes:["au","nz"],tags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"}},"shop/department_store|Havan":{countryCodes:["br"],tags:{brand:"Havan","brand:wikidata":"Q61968827",name:"Havan",shop:"department_store"}},"shop/department_store|Hudson's Bay":{countryCodes:["ca","nl"],tags:{alt_name:"The Bay",brand:"Hudson's Bay","brand:wikidata":"Q641129","brand:wikipedia":"en:Hudson's Bay (retailer)",name:"Hudson's Bay",shop:"department_store"}},"shop/department_store|JCPenney":{countryCodes:["us"],tags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"}},"shop/department_store|John Lewis":{countryCodes:["gb"],tags:{brand:"John Lewis","brand:wikidata":"Q1918981","brand:wikipedia":"en:John Lewis & Partners",name:"John Lewis",shop:"department_store"}},"shop/department_store|Karstadt":{countryCodes:["de"],tags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"}},"shop/department_store|Kmart~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(USA)"],tags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"}},"shop/department_store|Kmart~(USA)":{countryCodes:["us"],matchNames:["k-mart"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Kmart~(Australia)"],tags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"}},"shop/department_store|Kohl's":{countryCodes:["us"],tags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"}},"shop/department_store|Lojas Americanas":{countryCodes:["br"],tags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"}},"shop/department_store|Lord & Taylor":{countryCodes:["us"],tags:{brand:"Lord & Taylor","brand:wikidata":"Q2749082","brand:wikipedia":"en:Lord & Taylor",name:"Lord & Taylor",shop:"department_store"}},"shop/department_store|Lotte Department Store":{matchNames:["lotte"],tags:{brand:"Lotte Department Store","brand:wikidata":"Q489905","brand:wikipedia":"en:Lotte Department Store",name:"Lotte Department Store",shop:"department_store"}},"shop/department_store|Macy's":{countryCodes:["us"],tags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"}},"shop/department_store|Marks & Spencer":{countryCodes:["gb","gr","ie"],matchNames:["m and s"],tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"}},"shop/department_store|Marshalls":{countryCodes:["ca","us"],tags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"}},"shop/department_store|Muji":{countryCodes:["it"],tags:{brand:"Muji","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"en:Muji",name:"Muji","name:en":"Muji","name:ja":"無印良品",shop:"department_store"}},"shop/department_store|Myer":{countryCodes:["au"],tags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"}},"shop/department_store|Neiman Marcus":{countryCodes:["us"],tags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"}},"shop/department_store|Nordstrom":{countryCodes:["ca","us"],tags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"}},"shop/department_store|Oechsle":{countryCodes:["pe"],tags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"}},"shop/department_store|París":{countryCodes:["cl","pe"],tags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"}},"shop/department_store|Printemps":{countryCodes:["ad","cn","fr","jp","sa"],tags:{brand:"Printemps","brand:wikidata":"Q1535260","brand:wikipedia":"fr:Printemps (grands magasins)",name:"Printemps",shop:"department_store"}},"shop/department_store|Ripley":{countryCodes:["cl","pe"],tags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"}},"shop/department_store|Saks Fifth Avenue":{countryCodes:["ca","us"],tags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"}},"shop/department_store|Saks Off 5th":{countryCodes:["ca","us"],tags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"}},"shop/department_store|Sears":{countryCodes:["mx","us"],nomatch:["shop/car_repair|Sears Auto Center"],tags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"}},"shop/department_store|Shopko":{countryCodes:["us"],tags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"}},"shop/department_store|Stein Mart":{countryCodes:["us"],tags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",shop:"department_store"}},"shop/department_store|Stockmann":{countryCodes:["fi"],tags:{brand:"Stockmann","brand:wikidata":"Q1543093","brand:wikipedia":"fi:Stockmann",name:"Stockmann",shop:"department_store"}},"shop/department_store|Target~(Australia)":{countryCodes:["au"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(USA)"],tags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"}},"shop/department_store|Target~(USA)":{countryCodes:["us"],matchNames:["Super Target"],matchTags:["shop/supermarket"],nomatch:["shop/department_store|Target~(Australia)"],tags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"}},"shop/department_store|The Warehouse":{countryCodes:["nz"],tags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"}},"shop/department_store|Walmart":{matchTags:["shop/supermarket"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",shop:"department_store"}},"shop/department_store|Woolworth":{countryCodes:["de"],tags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"}},"shop/department_store|Åhléns":{countryCodes:["se"],tags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"}},"shop/department_store|Épicerie":{countryCodes:["ma"],tags:{brand:"Épicerie",name:"Épicerie",shop:"department_store"}},"shop/department_store|Евроопт Market":{tags:{brand:"Евроопт Market",name:"Евроопт Market",shop:"department_store"}},"shop/department_store|Евроопт Минимаркет":{tags:{brand:"Евроопт Минимаркет",name:"Евроопт Минимаркет",shop:"department_store"}},"shop/department_store|東急ハンズ":{countryCodes:["jp"],tags:{brand:"東急ハンズ","brand:en":"Tokyu Hands","brand:ja":"東急ハンズ","brand:wikidata":"Q859212","brand:wikipedia":"ja:東急ハンズ",name:"東急ハンズ","name:en":"Tokyu Hands","name:ja":"東急ハンズ",shop:"department_store"}},"shop/department_store|無印良品":{countryCodes:["jp","tw"],tags:{brand:"無印良品","brand:en":"Muji","brand:ja":"無印良品","brand:wikidata":"Q708789","brand:wikipedia":"ja:無印良品",name:"無印良品","name:en":"Muji","name:ja":"無印良品",shop:"department_store"}},"shop/department_store|롯데백화점":{countryCodes:["kr"],tags:{brand:"롯데백화점","brand:ko":"롯데백화점","brand:wikidata":"Q489905","brand:wikipedia":"ko:롯데백화점",name:"롯데백화점","name:en":"Lotte Department Store","name:ko":"롯데백화점",shop:"department_store"}},"shop/doityourself|Ace Hardware":{tags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"}},"shop/doityourself|B&Q":{tags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"}},"shop/doityourself|Bauhaus":{tags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"}},"shop/doityourself|Biltema":{countryCodes:["dk","fi","no","se"],tags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"}},"shop/doityourself|Brico":{countryCodes:["be","fr","it"],tags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"}},"shop/doityourself|Brico Dépôt":{countryCodes:["fr","ro"],tags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"}},"shop/doityourself|Bricoman":{countryCodes:["fr","it","pl"],tags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"}},"shop/doityourself|Bricomarché":{countryCodes:["fr","pl","pt"],tags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"}},"shop/doityourself|Bricorama":{countryCodes:["es","fr"],tags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"}},"shop/doityourself|Bunnings Warehouse":{countryCodes:["au","nz"],tags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"}},"shop/doityourself|Castorama":{tags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"}},"shop/doityourself|Chausson Matériaux":{countryCodes:["fr"],tags:{brand:"Chausson Matériaux",name:"Chausson Matériaux",shop:"doityourself"}},"shop/doityourself|Clas Ohlson":{countryCodes:["fi","no","se"],tags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"}},"shop/doityourself|Easy":{tags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"}},"shop/doityourself|Gamma":{countryCodes:["be","nl"],tags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"}},"shop/doityourself|Gedimat":{countryCodes:["fr"],tags:{brand:"Gedimat",name:"Gedimat",shop:"doityourself"}},"shop/doityourself|Globus Baumarkt":{countryCodes:["de","lu"],tags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"}},"shop/doityourself|Hagebaumarkt":{countryCodes:["at","be","ch","de","es","fr","lu","nl"],matchNames:["hagebau"],tags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"}},"shop/doityourself|Hammer":{countryCodes:["de"],tags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"}},"shop/doityourself|Hellweg":{countryCodes:["at","de"],tags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"}},"shop/doityourself|Home Building Centre~(Canada)":{countryCodes:["ca"],nomatch:["shop/hardware|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"}},"shop/doityourself|Home Hardware Building Centre~(Canada)":{countryCodes:["ca"],matchNames:["home hardware"],nomatch:["shop/hardware|Home Hardware"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"}},"shop/doityourself|Home Timber & Hardware~(Australia)":{countryCodes:["au"],tags:{alt_name:"Home Hardware",brand:"Home Timber & Hardware","brand:wikidata":"Q17006984","brand:wikipedia":"en:Home Timber & Hardware",name:"Home Timber & Hardware",shop:"doityourself",short_name:"Home"}},"shop/doityourself|Homebase":{countryCodes:["gb","ie"],tags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"}},"shop/doityourself|Hornbach":{tags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"}},"shop/doityourself|Hubo":{countryCodes:["be","nl"],tags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"}},"shop/doityourself|Jewson":{countryCodes:["gb"],tags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"}},"shop/doityourself|Karwei":{countryCodes:["nl"],tags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"}},"shop/doityourself|Leroy Merlin":{tags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Lowe's":{countryCodes:["ca","mx","us"],matchNames:["lowes home improvement"],nomatch:["shop/clothes|Lowes","shop/supermarket|Lowe's Market","shop/supermarket|Lowes Foods"],tags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"}},"shop/doityourself|Menards":{countryCodes:["us"],tags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"}},"shop/doityourself|Mitre 10":{countryCodes:["au"],tags:{brand:"Mitre 10","brand:wikidata":"Q6882393","brand:wikipedia":"en:Mitre 10",name:"Mitre 10",shop:"doityourself"}},"shop/doityourself|Mr.Bricolage":{countryCodes:["be","fr"],tags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"}},"shop/doityourself|OBI":{tags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"}},"shop/doityourself|Point P":{countryCodes:["fr"],tags:{brand:"Point P",name:"Point P",shop:"doityourself"}},"shop/doityourself|Praktiker":{countryCodes:["bg","gr","hu","ro"],tags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"}},"shop/doityourself|Praxis":{countryCodes:["nl"],tags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"}},"shop/doityourself|Promart":{countryCodes:["pe"],tags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"}},"shop/doityourself|Rona":{countryCodes:["ca"],tags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"}},"shop/doityourself|Screwfix":{countryCodes:["de","gb"],tags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"}},"shop/doityourself|Sodimac":{matchNames:["sodimac constructor"],tags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"}},"shop/doityourself|Sonderpreis Baumarkt":{countryCodes:["de"],tags:{brand:"Sonderpreis Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"}},"shop/doityourself|Tekzen":{countryCodes:["tr"],tags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"}},"shop/doityourself|The Home Depot":{countryCodes:["ca","mx","us"],tags:{alt_name:"Home Depot",brand:"The Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"The Home Depot",shop:"doityourself"}},"shop/doityourself|Toolstation":{countryCodes:["fr","gb","nl"],tags:{brand:"Toolstation","brand:wikidata":"Q7824103","brand:wikipedia":"en:Toolstation",name:"Toolstation",shop:"doityourself"}},"shop/doityourself|Toom Baumarkt":{countryCodes:["de"],matchNames:["toom"],tags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"}},"shop/doityourself|Travis Perkins":{countryCodes:["gb"],tags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"}},"shop/doityourself|Weldom":{countryCodes:["fr"],tags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"}},"shop/doityourself|Wickes":{countryCodes:["gb"],tags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"}},"shop/doityourself|jem & fix":{countryCodes:["dk"],tags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:Jem & fix",name:"jem & fix",shop:"doityourself"}},"shop/doityourself|Леруа Мерлен":{countryCodes:["ru","ua"],tags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Мастер":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Мастер",name:"Мастер",shop:"doityourself"}},"shop/doityourself|カインズホーム":{countryCodes:["jp"],tags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:ja":"カインズホーム","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home","name:ja":"カインズホーム",shop:"doityourself"}},"shop/doityourself|コメリ":{countryCodes:["jp"],tags:{brand:"コメリ","brand:ja":"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri","name:ja":"コメリ",shop:"doityourself"}},"shop/doityourself|コーナン":{countryCodes:["jp"],tags:{brand:"コーナン","brand:ja":"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan","name:ja":"コーナン",shop:"doityourself"}},"shop/doityourself|ナフコ":{countryCodes:["jp"],tags:{brand:"ナフコ","brand:ja":"ナフコ",name:"ナフコ","name:ja":"ナフコ",shop:"doityourself"}},"shop/doors|Юркас":{countryCodes:["by"],tags:{brand:"Юркас",name:"Юркас",shop:"doors"}},"shop/dry_cleaning|5àsec":{tags:{brand:"5àsec","brand:wikidata":"Q2817899","brand:wikipedia":"fr:5àsec",name:"5àsec",shop:"dry_cleaning"}},"shop/dry_cleaning|Martinizing Dry Cleaning":{tags:{brand:"Martinizing Dry Cleaning","brand:wikidata":"Q6777169","brand:wikipedia":"en:Martinizing Dry Cleaning",name:"Martinizing Dry Cleaning",shop:"dry_cleaning"}},"shop/dry_cleaning|Диана":{countryCodes:["ru"],tags:{brand:"Диана","brand:wikidata":"Q62105088",name:"Диана",shop:"dry_cleaning"}},"shop/dry_cleaning|タカケンサンシャイン":{countryCodes:["jp"],matchNames:["タカケンクリーング"],tags:{brand:"タカケンサンシャイン","brand:en":"Takaken Sunshine","brand:ja":"タカケンサンシャイン","brand:wikidata":"Q11315914","brand:wikipedia":"ja:タカケンサンシャイン",name:"タカケンサンシャイン","name:en":"Takaken Sunshine","name:ja":"タカケンサンシャイン",shop:"dry_cleaning"}},"shop/dry_cleaning|ホワイト急便":{countryCodes:["jp"],tags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:ja":"ホワイト急便","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin","name:ja":"ホワイト急便",shop:"dry_cleaning"}},"shop/dry_cleaning|白洋舎":{countryCodes:["jp"],tags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"}},"shop/electronics|Apple Store":{matchNames:["apple"],nomatch:["amenity/bank|Apple Bank"],tags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"}},"shop/electronics|BCC":{countryCodes:["nl"],nomatch:["amenity/bank|Bcc"],tags:{brand:"BCC",name:"BCC",shop:"electronics"}},"shop/electronics|Batteries Plus Bulbs":{countryCodes:["us"],matchNames:["batteries plus"],tags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157","brand:wikipedia":"en:Batteries Plus Bulbs",name:"Batteries Plus Bulbs",shop:"electronics"}},"shop/electronics|Best Buy":{tags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"}},"shop/electronics|Boulanger":{countryCodes:["fr"],tags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"}},"shop/electronics|CeX":{countryCodes:["au","es","gb","ie","in","it","mx","nl","pl","pt"],tags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"}},"shop/electronics|Currys":{countryCodes:["gb","ie"],tags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"}},"shop/electronics|Currys PC World":{countryCodes:["gb","ie"],tags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"}},"shop/electronics|Darty":{countryCodes:["fr"],tags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"}},"shop/electronics|Elektra":{countryCodes:["gt","hn","pa","pe","sv"],tags:{brand:"Elektra","brand:wikidata":"Q1142753","brand:wikipedia":"es:Grupo Elektra",name:"Elektra",shop:"electronics"}},"shop/electronics|Elgiganten":{countryCodes:["dk","se"],tags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"}},"shop/electronics|Euronics":{tags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"}},"shop/electronics|Expert":{tags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"}},"shop/electronics|Gigantti":{countryCodes:["fi"],tags:{brand:"Gigantti","brand:wikidata":"Q42512186","brand:wikipedia":"fi:Gigantti (tavarataloketju)",name:"Gigantti",shop:"electronics"}},"shop/electronics|Hartlauer":{countryCodes:["at"],tags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"}},"shop/electronics|Interdiscount":{countryCodes:["ch"],tags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"}},"shop/electronics|JB Hi-Fi":{countryCodes:["au","nz"],tags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"}},"shop/electronics|Jaycar":{countryCodes:["au","nz"],tags:{brand:"Jaycar","brand:wikidata":"Q6167713","brand:wikipedia":"en:Jaycar",name:"Jaycar",shop:"electronics"}},"shop/electronics|Kjell & Company":{countryCodes:["no","se"],matchNames:["kjell och company"],tags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"}},"shop/electronics|Komputronik":{countryCodes:["pl"],tags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"}},"shop/electronics|La Curacao":{tags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"}},"shop/electronics|Maplin":{countryCodes:["gb"],tags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"}},"shop/electronics|Media Expert":{countryCodes:["pl"],tags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"}},"shop/electronics|Media Markt":{tags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"}},"shop/electronics|Medimax":{countryCodes:["de"],tags:{brand:"Medimax","brand:wikidata":"Q62872450",name:"Medimax",shop:"electronics"}},"shop/electronics|Musimundo":{countryCodes:["ar"],tags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"}},"shop/electronics|Neonet":{countryCodes:["pl"],tags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"}},"shop/electronics|Power":{countryCodes:["dk","fi","no"],tags:{brand:"Power",name:"Power",shop:"electronics"}},"shop/electronics|RTV Euro AGD":{countryCodes:["pl"],tags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"pl:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"}},"shop/electronics|RadioShack":{tags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"}},"shop/electronics|Samsung":{tags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"}},"shop/electronics|Saturn":{countryCodes:["at","de","lu","pl"],tags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"}},"shop/electronics|Sony":{tags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"}},"shop/electronics|Teknikmagasinet":{countryCodes:["fi","no","se"],tags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"}},"shop/electronics|The Good Guys":{countryCodes:["au"],tags:{brand:"The Good Guys","brand:wikidata":"Q7737217","brand:wikipedia":"en:The Good Guys (Australian company)",name:"The Good Guys",shop:"electronics"}},"shop/electronics|The Source":{countryCodes:["ca"],tags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"}},"shop/electronics|Trony":{countryCodes:["it"],tags:{brand:"Trony",name:"Trony",shop:"electronics"}},"shop/electronics|Unieuro":{countryCodes:["it"],tags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"}},"shop/electronics|Worten":{countryCodes:["es","pt"],tags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"}},"shop/electronics|b8ta":{countryCodes:["us"],tags:{brand:"b8ta","brand:wikidata":"Q55604609","brand:wikipedia":"en:B8ta",name:"b8ta",shop:"electronics"}},"shop/electronics|М.Видео":{countryCodes:["ru"],tags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"}},"shop/electronics|Фокстрот":{countryCodes:["ua"],tags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"}},"shop/electronics|Эксперт":{countryCodes:["ru"],tags:{brand:"Эксперт",name:"Эксперт",shop:"electronics"}},"shop/electronics|Эльдорадо":{countryCodes:["ru","ua"],tags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"}},"shop/electronics|エディオン":{countryCodes:["jp"],tags:{brand:"エディオン","brand:en":"EDION","brand:ja":"エディオン","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION","name:ja":"エディオン",shop:"electronics"}},"shop/electronics|ケーズデンキ":{countryCodes:["jp"],matchTags:["shop/appliance"],tags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:ja":"ケーズデンキ","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki","name:ja":"ケーズデンキ",shop:"electronics"}},"shop/electronics|コジマ":{countryCodes:["jp"],tags:{brand:"コジマ","brand:en":"Kojima","brand:ja":"コジマ","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima","name:ja":"コジマ",shop:"electronics"}},"shop/electronics|ソフマップ":{countryCodes:["jp"],tags:{brand:"ソフマップ","brand:en":"Sofmap","brand:ja":"ソフマップ","brand:wikidata":"Q7553789","brand:wikipedia":"ja:ソフマップ",name:"ソフマップ","name:en":"Sofmap","name:ja":"ソフマップ",shop:"electronics"}},"shop/electronics|ビックカメラ":{countryCodes:["jp"],tags:{brand:"ビックカメラ","brand:en":"Bic Camera","brand:ja":"ビックカメラ","brand:wikidata":"Q4903531","brand:wikipedia":"ja:ビックカメラ",name:"ビックカメラ","name:en":"Bic Camera","name:ja":"ビックカメラ",shop:"electronics"}},"shop/electronics|ヤマダ電機":{countryCodes:["jp"],tags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:ja":"ヤマダ電機","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki","name:ja":"ヤマダ電機",shop:"electronics"}},"shop/electronics|ヨドバシカメラ":{countryCodes:["jp"],tags:{brand:"ヨドバシカメラ","brand:en":"Yodobashi Camera","brand:ja":"ヨドバシカメラ","brand:wikidata":"Q168467","brand:wikipedia":"ja:ヨドバシカメラ",name:"ヨドバシカメラ","name:en":"Yodobashi Camera","name:ja":"ヨドバシカメラ",shop:"electronics"}},"shop/electronics|全國電子":{countryCodes:["tw"],tags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"}},"shop/electronics|燦坤3C":{countryCodes:["tw"],tags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"}},"shop/erotic|Ann Summers":{countryCodes:["gb","ie"],tags:{brand:"Ann Summers","brand:wikidata":"Q579524","brand:wikipedia":"en:Ann Summers",name:"Ann Summers",shop:"erotic"}},"shop/erotic|Orion":{countryCodes:["at","de"],tags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"}},"shop/fabric|Mondial Tissus":{countryCodes:["fr"],matchTags:["shop/curtain","shop/department_store"],tags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"}},"shop/fashion_accessories|Brighton Collectibles":{countryCodes:["us"],matchNames:["brighton"],tags:{brand:"Brighton Collectibles","brand:wikidata":"Q4967623","brand:wikipedia":"en:Brighton Collectibles",name:"Brighton Collectibles",shop:"fashion_accessories"}},"shop/fashion_accessories|Bvlgari":{matchNames:["bulgari"],tags:{brand:"Bulgari","brand:wikidata":"Q752515","brand:wikipedia":"en:Bulgari",name:"Bvlgari",shop:"fashion_accessories"}},"shop/fashion_accessories|Claire's":{matchTags:["shop/jewelry"],tags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"fashion_accessories"}},"shop/fashion_accessories|Jimmy Choo":{tags:{brand:"Jimmy Choo","brand:wikidata":"Q5213855","brand:wikipedia":"en:Jimmy Choo Ltd",name:"Jimmy Choo",shop:"fashion_accessories"}},"shop/fashion_accessories|Prada":{tags:{brand:"Prada","brand:wikidata":"Q193136","brand:wikipedia":"en:Prada",name:"Prada",shop:"fashion_accessories"}},"shop/fashion_accessories|Salvatore Ferragamo":{tags:{brand:"Salvatore Ferragamo","brand:wikidata":"Q3946053","brand:wikipedia":"en:Salvatore Ferragamo S.p.A.",name:"Salvatore Ferragamo",shop:"fashion_accessories"}},"shop/fashion_accessories|Van Cleef & Arpels":{matchNames:["van cleef & arples"],tags:{brand:"Van Cleef & Arpels","brand:wikidata":"Q2708181","brand:wikipedia":"en:Van Cleef & Arpels",name:"Van Cleef & Arpels",shop:"fashion_accessories"}},"shop/florist|Blume 2000":{countryCodes:["de"],tags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"}},"shop/florist|Blumen Risse":{countryCodes:["de"],tags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"}},"shop/florist|Interflora":{countryCodes:["fr","gb","no","se"],tags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"}},"shop/florist|Monceau Fleurs":{countryCodes:["be","fr"],tags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"}},"shop/florist|Азалия":{tags:{brand:"Азалия",name:"Азалия",shop:"florist"}},"shop/florist|Мосцветторг":{countryCodes:["ru"],tags:{brand:"Мосцветторг",name:"Мосцветторг",shop:"florist"}},"shop/frame|Aaron Brothers":{countryCodes:["us"],matchNames:["aaron brothers art & framing","aaron brothers custom framing"],tags:{brand:"Aaron Brothers","brand:wikidata":"Q64979251",name:"Aaron Brothers",shop:"frame"}},"shop/frozen_food|Dream Dinners":{countryCodes:["us"],matchTags:["amenity/fast_food","amenity/restaurant"],tags:{brand:"Dream Dinners","brand:wikidata":"Q5306355","brand:wikipedia":"en:Dream Dinners",name:"Dream Dinners",opening_hours:"\"by appointment\"",shop:"frozen_food"}},"shop/frozen_food|Iceland":{matchTags:["shop/convenience"],tags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"frozen_food"}},"shop/frozen_food|Picard":{countryCodes:["fr"],tags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"}},"shop/funeral_directors|PFG":{countryCodes:["fr"],tags:{brand:"PFG","brand:wikidata":"Q3396087","brand:wikipedia":"fr:Pompes funèbres générales",name:"PFG",official_name:"Pompes Funèbres Générales",shop:"funeral_directors"}},"shop/funeral_directors|Roblot":{countryCodes:["fr"],tags:{brand:"Roblot","brand:wikidata":"Q63247414",name:"Roblot",shop:"funeral_directors"}},"shop/funeral_directors|Roc-Eclerc":{countryCodes:["fr"],tags:{brand:"Roc-Eclerc","brand:wikidata":"Q62558102",name:"Roc-Eclerc",shop:"funeral_directors"}},"shop/funeral_directors|The Co-operative Funeralcare":{countryCodes:["gb"],tags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"}},"shop/furniture|Aaron's":{countryCodes:["ca","us"],tags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"}},"shop/furniture|American Signature Furniture":{countryCodes:["us"],tags:{brand:"American Signature Furniture","brand:wikidata":"Q63859411",name:"American Signature Furniture",shop:"furniture"}},"shop/furniture|Arhaus":{countryCodes:["us"],tags:{brand:"Arhaus","brand:wikidata":"Q35689887","brand:wikipedia":"en:Arhaus",name:"Arhaus",shop:"furniture"}},"shop/furniture|Ashley HomeStore":{countryCodes:["ca","us"],matchNames:["ashley furniture homestore"],tags:{alt_name:"Ashley Furniture",brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley HomeStore",shop:"furniture"}},"shop/furniture|Asko":{countryCodes:["fi"],tags:{brand:"Asko","brand:wikidata":"Q11853132","brand:wikipedia":"fi:Asko",name:"Asko",shop:"furniture"}},"shop/furniture|Askona":{countryCodes:["ru"],tags:{brand:"Askona","brand:wikidata":"Q4071319","brand:wikipedia":"ru:Аскона (компания)",name:"Askona",shop:"furniture"}},"shop/furniture|Black Red White":{tags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"}},"shop/furniture|BoConcept":{tags:{brand:"BoConcept","brand:wikidata":"Q11338915","brand:wikipedia":"en:BoConcept",name:"BoConcept",shop:"furniture"}},"shop/furniture|Bob's Discount Furniture":{countryCodes:["us"],tags:{brand:"Bob's Discount Furniture","brand:wikidata":"Q4931582","brand:wikipedia":"en:Bob's Discount Furniture",name:"Bob's Discount Furniture",shop:"furniture"}},"shop/furniture|Bodzio":{countryCodes:["pl"],tags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"}},"shop/furniture|But":{countryCodes:["fr"],tags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"}},"shop/furniture|Cabinets To Go":{countryCodes:["us"],tags:{brand:"Cabinets To Go","brand:wikidata":"Q25245346","brand:wikipedia":"en:Cabinets To Go",name:"Cabinets To Go",shop:"furniture"}},"shop/furniture|Casa":{countryCodes:["be","ch","es","fr","it","pt"],matchTags:["shop/interior_decoration"],tags:{brand:"Casa",name:"Casa",shop:"furniture"}},"shop/furniture|Conforama":{countryCodes:["ch","es","fr","it"],tags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"}},"shop/furniture|Crate & Barrel":{countryCodes:["us"],tags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"}},"shop/furniture|DFS":{countryCodes:["gb"],tags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"}},"shop/furniture|Dänisches Bettenlager":{countryCodes:["at","de"],matchTags:["shop/bed"],tags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"}},"shop/furniture|Ethan Allen":{countryCodes:["ca","us"],tags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"}},"shop/furniture|Fly":{countryCodes:["fr"],tags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"}},"shop/furniture|Freedom":{countryCodes:["au"],matchNames:["freedom furniture"],tags:{brand:"Freedom","brand:wikidata":"Q5500546","brand:wikipedia":"en:Freedom Furniture",name:"Freedom",shop:"furniture"}},"shop/furniture|HSL":{countryCodes:["gb"],tags:{brand:"HSL","brand:wikidata":"Q64284324",name:"HSL",official_name:"High Seat Limited",shop:"furniture"}},"shop/furniture|Harveys":{countryCodes:["gb"],nomatch:["amenity/fast_food|Harvey's"],tags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"}},"shop/furniture|Havertys":{countryCodes:["us"],tags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"}},"shop/furniture|IKEA":{tags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"}},"shop/furniture|Isku":{countryCodes:["fi"],tags:{brand:"Isku","brand:wikidata":"Q11865127","brand:wikipedia":"fi:Isku (yritys)",name:"Isku",shop:"furniture"}},"shop/furniture|JYSK":{tags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"}},"shop/furniture|Jerome’s Furniture":{countryCodes:["us"],tags:{brand:"Jerome’s Furniture","brand:wikidata":"Q16997693","brand:wikipedia":"en:Jerome's",name:"Jerome’s Furniture",shop:"furniture",short_name:"Jerome’s"}},"shop/furniture|Kwantum":{countryCodes:["nl"],tags:{brand:"Kwantum","brand:wikidata":"Q2262591","brand:wikipedia":"nl:Kwantum (winkelketen)",name:"Kwantum",shop:"furniture"}},"shop/furniture|La-Z-Boy":{countryCodes:["ca","us"],tags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"}},"shop/furniture|Leen Bakker":{countryCodes:["nl"],tags:{brand:"Leen Bakker","brand:wikidata":"Q3333662","brand:wikipedia":"nl:Leen Bakker",name:"Leen Bakker",shop:"furniture"}},"shop/furniture|LoveSac":{countryCodes:["us"],tags:{brand:"LoveSac","brand:wikidata":"Q6690181","brand:wikipedia":"en:LoveSac",name:"LoveSac",shop:"furniture"}},"shop/furniture|Maisons du Monde":{countryCodes:["be","ch","de","es","fr","gb","it","lu"],tags:{brand:"Maisons du Monde","brand:wikidata":"Q3280364","brand:wikipedia":"fr:Maisons du Monde",name:"Maisons du Monde",shop:"furniture"}},"shop/furniture|Möbelix":{countryCodes:["at","cz","hu","sk"],tags:{brand:"Möbelix","brand:wikidata":"Q877547","brand:wikipedia":"hu:Möbelix",name:"Möbelix",shop:"furniture"}},"shop/furniture|Pottery Barn":{countryCodes:["au","ca","mx","ph","us"],tags:{brand:"Pottery Barn","brand:wikidata":"Q3400126","brand:wikipedia":"en:Pottery Barn",name:"Pottery Barn",shop:"furniture"}},"shop/furniture|Raymour & Flanigan":{countryCodes:["us"],tags:{brand:"Raymour & Flanigan","brand:wikidata":"Q7299290","brand:wikipedia":"en:Raymour & Flanigan",name:"Raymour & Flanigan",shop:"furniture"}},"shop/furniture|Rent-A-Center":{countryCodes:["mx","us"],tags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"}},"shop/furniture|Restoration Hardware":{countryCodes:["ca","us"],tags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"}},"shop/furniture|Roche Bobois":{tags:{brand:"Roche Bobois",name:"Roche Bobois",shop:"furniture"}},"shop/furniture|Roller":{countryCodes:["de"],tags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"}},"shop/furniture|Rooms To Go":{countryCodes:["us"],tags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"}},"shop/furniture|ScS":{countryCodes:["gb"],tags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"}},"shop/furniture|The Brick":{countryCodes:["ca"],tags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"}},"shop/furniture|Urban Barn":{countryCodes:["ca"],tags:{brand:"Urban Barn","brand:wikidata":"Q62515207",name:"Urban Barn",shop:"furniture"}},"shop/furniture|Value City Furniture":{countryCodes:["us"],tags:{brand:"Value City Furniture","brand:wikidata":"Q63859417",name:"Value City Furniture",shop:"furniture"}},"shop/furniture|XXXLutz":{tags:{brand:"XXXLutz",name:"XXXLutz",shop:"furniture"}},"shop/furniture|İstikbal":{countryCodes:["tr"],tags:{brand:"İstikbal","brand:wikidata":"Q6031999","brand:wikipedia":"tr:İstikbal",name:"İstikbal",shop:"furniture"}},"shop/furniture|Много мебели":{countryCodes:["ru"],tags:{brand:"Много мебели",name:"Много мебели",shop:"furniture"}},"shop/furniture|ニトリ":{countryCodes:["jp"],tags:{brand:"ニトリ","brand:en":"Nitori","brand:ja":"ニトリ","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori","name:ja":"ニトリ",shop:"furniture"}},"shop/games|Games Workshop":{countryCodes:["de","fr","gb","nl","us"],tags:{brand:"Games Workshop","brand:wikidata":"Q587270","brand:wikipedia":"en:Games Workshop",name:"Games Workshop",shop:"games"}},"shop/garden_centre|Dehner":{countryCodes:["at","de"],tags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"}},"shop/garden_centre|Gamm Vert":{countryCodes:["fr"],tags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"}},"shop/garden_centre|Jardiland":{countryCodes:["fr"],tags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"}},"shop/garden_centre|Point Vert":{countryCodes:["fr"],tags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"}},"shop/garden_centre|Truffaut":{countryCodes:["fr"],tags:{brand:"Truffaut","brand:wikidata":"Q3162640","brand:wikipedia":"fr:Jardineries Truffaut",name:"Truffaut",shop:"garden_centre"}},"shop/garden_centre|Welkoop":{countryCodes:["nl"],tags:{brand:"Welkoop",name:"Welkoop",shop:"garden_centre"}},"shop/gas|Airgas":{countryCodes:["us"],matchTags:["amenity/fuel","shop/fuel","shop/trade"],tags:{brand:"Airgas","brand:wikidata":"Q80635","brand:wikipedia":"en:Airgas",name:"Airgas",shop:"gas"}},"shop/gas|AmeriGas":{countryCodes:["us"],nomatch:["amenity/vending_machine|AmeriGas"],tags:{brand:"AmeriGas","brand:wikidata":"Q23130318","fuel:lpg":"yes",name:"AmeriGas",shop:"gas"}},"shop/gas|Ferrellgas":{countryCodes:["us"],tags:{brand:"Ferrellgas","brand:wikidata":"Q5445299","fuel:lpg":"yes",name:"Ferrellgas",shop:"gas"}},"shop/gift|American Greetings":{countryCodes:["us"],tags:{brand:"American Greetings","brand:wikidata":"Q464767","brand:wikipedia":"en:American Greetings",name:"American Greetings",shop:"gift"}},"shop/gift|Card Factory":{countryCodes:["gb","im"],tags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"}},"shop/gift|Carlton Cards":{countryCodes:["ca"],matchNames:["carlton"],tags:{brand:"Carlton Cards","brand:wikidata":"Q5042968","brand:wikipedia":"en:Carlton Cards",name:"Carlton Cards",shop:"gift"}},"shop/gift|Clintons":{countryCodes:["gb"],tags:{brand:"Clintons","brand:wikidata":"Q5134299","brand:wikipedia":"en:Clintons",name:"Clintons",shop:"gift"}},"shop/gift|Cracker Barrel":{countryCodes:["us"],tags:{brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel",official_name:"Cracker Barrel Old Country Store",shop:"gift"}},"shop/gift|Disney Store":{countryCodes:["ca","fr","us"],matchNames:["the disney store"],matchTags:["shop/toys"],tags:{brand:"Disney Store","brand:wikidata":"Q1047009","brand:wikipedia":"en:Disney Store",name:"Disney Store",shop:"gift"}},"shop/gift|Edible Arrangements":{countryCodes:["ca","us"],tags:{brand:"Edible Arrangements","brand:wikidata":"Q5337996","brand:wikipedia":"en:Edible Arrangements",name:"Edible Arrangements",shop:"gift"}},"shop/gift|Hallmark":{countryCodes:["ca","gb","us"],matchNames:["hallmark gold crown"],tags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"}},"shop/gift|Nanu-Nana":{countryCodes:["at","de"],tags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"}},"shop/gift|Papyrus":{countryCodes:["us"],tags:{brand:"Papyrus","brand:wikidata":"Q28222692","brand:wikipedia":"en:Papyrus (company)",name:"Papyrus",shop:"gift"}},"shop/gift|Showcase":{countryCodes:["ca","us"],tags:{brand:"Showcase","brand:wikidata":"Q7503163","brand:wikipedia":"en:Showcase (retailer)",name:"Showcase",shop:"gift"}},"shop/gift|Spencer's":{countryCodes:["ca","us"],tags:{brand:"Spencer Gifts","brand:wikidata":"Q7576055","brand:wikipedia":"en:Spencer Gifts",name:"Spencer's",official_name:"Spencer Gifts",shop:"gift"}},"shop/gift|Things Remembered":{countryCodes:["ca","us"],tags:{brand:"Things Remembered","brand:wikidata":"Q54958287","brand:wikipedia":"en:Things Remembered",name:"Things Remembered",shop:"gift"}},"shop/gift|Wereldwinkel":{countryCodes:["be","nl"],tags:{brand:"Wereldwinkel",name:"Wereldwinkel",shop:"gift"}},"shop/greengrocer|Produce Junction":{countryCodes:["us"],tags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"}},"shop/hairdresser_supply|Sally Beauty Supply":{countryCodes:["ca","mx","us"],tags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"}},"shop/hairdresser|Camille Albane":{countryCodes:["fr"],tags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"}},"shop/hairdresser|Coiff&Co":{countryCodes:["fr"],tags:{brand:"Coiff&Co",name:"Coiff&Co",shop:"hairdresser"}},"shop/hairdresser|Cost Cutters":{countryCodes:["us"],tags:{brand:"Cost Cutters","brand:wikidata":"Q62029366",name:"Cost Cutters",shop:"hairdresser"}},"shop/hairdresser|Dessange":{tags:{brand:"Dessange","brand:wikidata":"Q62979914",name:"Dessange",shop:"hairdresser"}},"shop/hairdresser|Fantastic Sams":{countryCodes:["us"],tags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"}},"shop/hairdresser|First Choice Haircutters":{countryCodes:["ca"],tags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"}},"shop/hairdresser|Fodrászat":{tags:{brand:"Fodrászat",name:"Fodrászat",shop:"hairdresser"}},"shop/hairdresser|Franck Provost":{countryCodes:["be","fr","pl"],tags:{brand:"Franck Provost","brand:wikidata":"Q62805922","brand:wikipedia":"fr:Franck Provost (Salons de coiffure)",name:"Franck Provost",shop:"hairdresser"}},"shop/hairdresser|Great Clips":{countryCodes:["ca","us"],tags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"}},"shop/hairdresser|Hair Cuttery":{countryCodes:["us"],tags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"}},"shop/hairdresser|Hair Express":{countryCodes:["de","us"],tags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"}},"shop/hairdresser|Hair Studio":{tags:{brand:"Hair Studio",name:"Hair Studio",shop:"hairdresser"}},"shop/hairdresser|Hairkiller":{countryCodes:["at","de","lu"],tags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"}},"shop/hairdresser|Jean Louis David":{countryCodes:["es","fr","it","pl"],tags:{brand:"Jean Louis David","brand:wikidata":"Q64445174",name:"Jean Louis David",shop:"hairdresser"}},"shop/hairdresser|Kirpykla":{countryCodes:["lt"],tags:{brand:"Kirpykla",name:"Kirpykla",shop:"hairdresser"}},"shop/hairdresser|Klier":{countryCodes:["at","cz","de","sk"],tags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"}},"shop/hairdresser|Klipp":{countryCodes:["at"],tags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"}},"shop/hairdresser|Marco Aldany":{tags:{brand:"Marco Aldany",name:"Marco Aldany",shop:"hairdresser"}},"shop/hairdresser|Mastercuts":{countryCodes:["ca","us"],tags:{brand:"Mastercuts","brand:wikidata":"Q64026258",name:"Mastercuts",shop:"hairdresser"}},"shop/hairdresser|Saint Algue":{tags:{brand:"Saint Algue","brand:wikidata":"Q62973210",name:"Saint Algue",shop:"hairdresser"}},"shop/hairdresser|Sport Clips":{countryCodes:["ca","us"],matchNames:["sport clips haircuts","sports clips"],tags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"}},"shop/hairdresser|Super Cut":{tags:{brand:"Super Cut","brand:wikidata":"Q64139077",name:"Super Cut",shop:"hairdresser"}},"shop/hairdresser|Supercuts":{countryCodes:["ca","gb","us"],tags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"}},"shop/hairdresser|Tchip":{countryCodes:["fr"],tags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",shop:"hairdresser"}},"shop/hairdresser|The Salon at Ulta Beauty":{countryCodes:["us"],tags:{alt_name:"Ulta Salon",brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"The Salon at Ulta Beauty",shop:"hairdresser"}},"shop/hairdresser|Toni & Guy":{tags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"}},"shop/hairdresser|Top Hair":{countryCodes:["de"],tags:{brand:"Top Hair","brand:wikidata":"Q62523343",name:"Top Hair",shop:"hairdresser"}},"shop/hairdresser|Виктория":{tags:{brand:"Виктория",name:"Виктория",shop:"hairdresser"}},"shop/hairdresser|Елена":{tags:{brand:"Елена",name:"Елена",shop:"hairdresser"}},"shop/hairdresser|Каприз":{countryCodes:["ru","ua"],tags:{brand:"Каприз",name:"Каприз",shop:"hairdresser"}},"shop/hairdresser|Фея":{countryCodes:["ru","ua"],tags:{brand:"Фея",name:"Фея",shop:"hairdresser"}},"shop/hairdresser|Чио Чио":{tags:{brand:"Чио Чио",name:"Чио Чио",shop:"hairdresser"}},"shop/hardware|220 вольт":{countryCodes:["by","ru","ua"],tags:{brand:"220 вольт","brand:en":"220 Volt","brand:ru":"220 вольт","brand:wikidata":"Q18635304","brand:wikipedia":"ru:220 Вольт (компания)",name:"220 вольт","name:en":"220 Volt","name:ru":"220 вольт",shop:"hardware"}},"shop/hardware|Harbor Freight Tools":{countryCodes:["us"],tags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"}},"shop/hardware|Home Hardware":{countryCodes:["ca"],nomatch:["shop/doityourself|Home Hardware Building Centre"],tags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"}},"shop/hardware|K-Rauta":{countryCodes:["fi"],tags:{brand:"K-Rauta","brand:wikidata":"Q4206187","brand:wikipedia":"fi:K-Rauta",name:"K-Rauta",shop:"hardware"}},"shop/hardware|Kodin Terra":{countryCodes:["fi"],tags:{brand:"Kodin Terra","brand:wikidata":"Q11872038","brand:wikipedia":"fi:Kodin Terra",name:"Kodin Terra",shop:"hardware"}},"shop/hardware|True Value":{countryCodes:["us"],tags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"}},"shop/hardware|Würth":{countryCodes:["be","de","fi","fr","it","no"],tags:{brand:"Würth","brand:wikidata":"Q679750","brand:wikipedia":"de:Würth-Gruppe",name:"Würth",shop:"hardware"}},"shop/hardware|Мосхозторг":{countryCodes:["ru"],tags:{brand:"Мосхозторг","brand:wikidata":"Q62499092",name:"Мосхозторг",shop:"hardware"}},"shop/hardware|Хозяин":{countryCodes:["by","ru","ua"],tags:{brand:"Хозяин",name:"Хозяин",shop:"hardware"}},"shop/health_food|Holland & Barrett":{countryCodes:["gb","ie","nl"],matchTags:["shop/chemist","shop/health","shop/herbalist","shop/supermarket"],tags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"}},"shop/health_food|Зеленая аптека":{tags:{brand:"Зеленая аптека",name:"Зеленая аптека",shop:"health_food"}},"shop/hearing_aids|Amplifon":{tags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"}},"shop/hearing_aids|Audika":{countryCodes:["ch","fr"],tags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"}},"shop/hearing_aids|Beter Horen":{countryCodes:["nl"],tags:{brand:"Beter Horen",name:"Beter Horen",shop:"hearing_aids"}},"shop/hearing_aids|Geers":{countryCodes:["de","pl"],tags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"}},"shop/hearing_aids|Kind Hörgeräte":{countryCodes:["de"],matchNames:["kind"],tags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"}},"shop/hearing_aids|Miracle-Ear":{countryCodes:["ca","us"],tags:{brand:"Miracle-Ear","brand:wikidata":"Q17108572","brand:wikipedia":"en:Miracle-Ear",name:"Miracle-Ear",shop:"hearing_aids"}},"shop/hearing_aids|Neuroth":{countryCodes:["at","de"],tags:{brand:"Neuroth","brand:wikidata":"Q15836645","brand:wikipedia":"de:Neuroth AG",name:"Neuroth",shop:"hearing_aids"}},"shop/hifi|Bang & Olufsen":{tags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"}},"shop/hifi|Bose":{tags:{brand:"Bose","brand:wikidata":"Q328568","brand:wikipedia":"en:Bose Corporation",name:"Bose",shop:"hifi"}},"shop/hobby|アニメイト":{countryCodes:["jp"],tags:{brand:"アニメイト","brand:en":"Animate","brand:ja":"アニメイト","brand:wikidata":"Q1041890","brand:wikipedia":"ja:アニメイト",name:"アニメイト","name:en":"Animate","name:ja":"アニメイト",shop:"hobby"}},"shop/houseware|At Home":{countryCodes:["us"],matchNames:["garden ridge"],tags:{brand:"At Home (store)","brand:wikidata":"Q5522290",name:"At Home",shop:"houseware"}},"shop/houseware|Bed Bath & Beyond":{countryCodes:["ca","mx","nz","us"],matchTags:["shop/department_store"],tags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"}},"shop/houseware|Blokker":{countryCodes:["be","nl"],tags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"}},"shop/houseware|Cervera":{countryCodes:["se"],tags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"}},"shop/houseware|HomeGoods":{countryCodes:["us"],tags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"}},"shop/houseware|Kitchen Collection":{countryCodes:["us"],tags:{brand:"Kitchen Collection","brand:wikidata":"Q64149036",name:"Kitchen Collection",shop:"houseware"}},"shop/houseware|Lagerhaus":{matchTags:["shop/doityourself"],tags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"houseware"}},"shop/houseware|Le Creuset":{matchTags:["shop/kitchen"],tags:{brand:"Le Creuset","brand:wikidata":"Q555861","brand:wikipedia":"en:Le Creuset",name:"Le Creuset",shop:"houseware"}},"shop/houseware|Marskramer":{countryCodes:["nl"],tags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"}},"shop/houseware|Old Time Pottery":{countryCodes:["us"],tags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"}},"shop/houseware|Sur La Table":{countryCodes:["us"],tags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"}},"shop/houseware|The Container Store":{countryCodes:["us"],tags:{brand:"The Container Store","brand:wikidata":"Q7727445","brand:wikipedia":"en:The Container Store",name:"The Container Store",shop:"houseware"}},"shop/houseware|Tuesday Morning":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/gift","shop/variety_store"],tags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"}},"shop/houseware|WMF":{countryCodes:["at","de"],tags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"}},"shop/houseware|Williams-Sonoma":{countryCodes:["ca","us"],matchNames:["william sonoma"],matchTags:["shop/furniture"],tags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"houseware"}},"shop/houseware|World Market":{countryCodes:["us"],matchNames:["cost plus"],matchTags:["shop/department_store","shop/furniture","shop/interior_decoration","shop/supermarket"],tags:{brand:"World Market","brand:wikidata":"Q5174750","brand:wikipedia":"en:Cost Plus World Market",name:"World Market",official_name:"Cost Plus World Market",shop:"interior_decoration"}},"shop/houseware|Xenos":{countryCodes:["de","nl"],tags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"}},"shop/houseware|Еврочехол":{countryCodes:["ru"],tags:{brand:"Еврочехол",name:"Еврочехол",shop:"houseware"}},"shop/interior_decoration|Centrakor":{countryCodes:["fr"],matchTags:["shop/variety_store"],tags:{brand:"Centrakor","brand:wikidata":"Q64079345",name:"Centrakor",shop:"interior_decoration"}},"shop/interior_decoration|Depot":{countryCodes:["at","ch","de"],tags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"}},"shop/interior_decoration|Fired Earth":{countryCodes:["gb"],matchTags:["shop/bathroom_furnishing","shop/tiles"],tags:{brand:"Fired Earth","brand:wikidata":"Q20594569",name:"Fired Earth",shop:"interior_decoration"}},"shop/interior_decoration|Hemtex":{countryCodes:["ee","fi","se"],tags:{brand:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",name:"Hemtex",shop:"interior_decoration"}},"shop/interior_decoration|HomeSense":{countryCodes:["ca"],matchTags:["shop/department_store","shop/furniture","shop/houseware"],tags:{brand:"HomeSense","brand:wikidata":"Q16844433","brand:wikipedia":"en:HomeSense",name:"HomeSense",shop:"interior_decoration"}},"shop/interior_decoration|Kirkland's":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Kirkland's","brand:wikidata":"Q6415714","brand:wikipedia":"en:Kirkland's",name:"Kirkland's",shop:"interior_decoration"}},"shop/interior_decoration|Pier 1 Imports":{countryCodes:["ca","us"],matchTags:["shop/furniture"],tags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"}},"shop/interior_decoration|Ten Thousand Villages":{countryCodes:["ca","us"],matchNames:["10 thousand villages","10,000 villages"],matchTags:["shop/boutique","shop/gift"],tags:{brand:"Ten Thousand Villages","brand:wikidata":"Q2403252","brand:wikipedia":"en:Ten Thousand Villages",fair_trade:"only",name:"Ten Thousand Villages",shop:"interior_decoration"}},"shop/jewelry|Alex and Ani":{countryCodes:["us"],tags:{brand:"Alex and Ani","brand:wikidata":"Q16198810","brand:wikipedia":"en:Alex and Ani",name:"Alex and Ani",shop:"jewelry"}},"shop/jewelry|Apart":{countryCodes:["pl"],tags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"}},"shop/jewelry|Bijou Brigitte":{tags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"}},"shop/jewelry|Cartier":{tags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"}},"shop/jewelry|Christ":{countryCodes:["ch","de","nl"],tags:{brand:"Christ","brand:wikidata":"Q1077957","brand:wikipedia":"de:Christ (Juwelier)",name:"Christ",shop:"jewelry"}},"shop/jewelry|David Yurman":{countryCodes:["us"],tags:{brand:"David Yurman","brand:wikidata":"Q5241390","brand:wikipedia":"en:David Yurman",name:"David Yurman",shop:"jewelry"}},"shop/jewelry|Ernest Jones":{countryCodes:["gb"],tags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"}},"shop/jewelry|Guldfynd":{countryCodes:["se"],tags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"}},"shop/jewelry|H.Samuel":{countryCodes:["gb"],tags:{brand:"H.Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H.Samuel",shop:"jewelry"}},"shop/jewelry|Histoire d'Or":{countryCodes:["be","fr","it","nl"],tags:{brand:"Histoire d'Or","brand:wikidata":"Q62529245",name:"Histoire d'Or",shop:"jewelry"}},"shop/jewelry|Icing":{countryCodes:["ca","us"],tags:{brand:"Icing",name:"Icing",shop:"jewelry"}},"shop/jewelry|James Avery Jewelry":{countryCodes:["us"],tags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"}},"shop/jewelry|Jared":{countryCodes:["us"],tags:{brand:"Jared","brand:wikidata":"Q62029282",name:"Jared",shop:"jewelry"}},"shop/jewelry|Julien d'Orcel":{countryCodes:["fr"],tags:{brand:"Julien d'Orcel","brand:wikidata":"Q62497463",name:"Julien d'Orcel",shop:"jewelry"}},"shop/jewelry|Kay Jewelers":{countryCodes:["us"],tags:{brand:"Kay Jewelers","brand:wikidata":"Q62029290",name:"Kay Jewelers",shop:"jewelry"}},"shop/jewelry|Michael Hill":{countryCodes:["au","ca","nz","us"],tags:{brand:"Michael Hill","brand:wikidata":"Q3308250","brand:wikipedia":"en:Michael Hill Jeweller",name:"Michael Hill",shop:"jewelry"}},"shop/jewelry|PNJ":{countryCodes:["vn"],tags:{brand:"PNJ","brand:wikidata":"Q61129183","brand:wikipedia":"vi:PNJ",name:"PNJ",shop:"jewelry"}},"shop/jewelry|Pandora":{tags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"}},"shop/jewelry|Peoples Jewellers":{countryCodes:["ca"],tags:{brand:"Peoples Jewellers","brand:wikidata":"Q64995558",name:"Peoples Jewellers",shop:"jewelry"}},"shop/jewelry|Piercing Pagoda":{countryCodes:["us"],tags:{brand:"Piercing Pagoda",name:"Piercing Pagoda",shop:"jewelry"}},"shop/jewelry|Swarovski":{tags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"}},"shop/jewelry|Tiffany & Company":{countryCodes:["us"],matchNames:["tiffany","tiffany's"],tags:{brand:"Tiffany & Company","brand:wikidata":"Q1066858","brand:wikipedia":"en:Tiffany & Co.",name:"Tiffany & Company",official_name:"Tiffany & Co.",shop:"jewelry"}},"shop/jewelry|Tous":{tags:{brand:"Tous",name:"Tous",shop:"jewelry"}},"shop/jewelry|Warren James":{countryCodes:["gb"],tags:{brand:"Warren James","brand:wikidata":"Q19604616","brand:wikipedia":"en:Warren James Jewellers",name:"Warren James",shop:"jewelry"}},"shop/jewelry|Zales":{countryCodes:["us"],tags:{brand:"Zales","brand:wikidata":"Q8065305","brand:wikipedia":"en:Zale Corporation",name:"Zales",shop:"jewelry"}},"shop/jewelry|Адамас":{countryCodes:["ru"],tags:{brand:"Адамас","brand:en":"Adamas","brand:ru":"Адамас","brand:wikidata":"Q62393709",name:"Адамас","name:en":"Adamas","name:ru":"Адамас",shop:"jewelry"}},"shop/jewelry|Золотая мечта":{countryCodes:["by"],tags:{brand:"Золотая мечта","brand:en":"Gold Dream","brand:ru":"Золотая мечта",name:"Золотая мечта","name:en":"Gold Dream","name:ru":"Золотая мечта",shop:"jewelry"}},"shop/kiosk|Lietuvos spauda":{countryCodes:["lt"],tags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"}},"shop/kiosk|Narvesen":{countryCodes:["lt","lv","no"],tags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"}},"shop/kiosk|Pressbyrån":{countryCodes:["se"],tags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"}},"shop/kiosk|R-Kioski":{countryCodes:["fi"],tags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"}},"shop/kiosk|Ruch":{countryCodes:["pl"],tags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"}},"shop/kiosk|Tisak":{countryCodes:["hr"],tags:{brand:"Tisak","brand:wikidata":"Q12643627","brand:wikipedia":"hr:Tisak (tvrtka)",name:"Tisak",shop:"kiosk"}},"shop/kiosk|k kiosk":{countryCodes:["ch"],nomatch:["shop/newsagent|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"}},"shop/kiosk|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"kiosk"}},"shop/kiosk|キヨスク":{countryCodes:["jp"],tags:{brand:"キヨスク","brand:en":"KIOSK","brand:ja":"キヨスク","brand:wikidata":"Q1334796","brand:wikipedia":"ja:キヨスク",name:"キヨスク","name:en":"KIOSK","name:ja":"キヨスク",shop:"kiosk"}},"shop/kitchen|Cuisinella":{countryCodes:["fr","tn"],tags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"}},"shop/kitchen|Ixina":{countryCodes:["be","fr"],tags:{brand:"Ixina",name:"Ixina",shop:"kitchen"}},"shop/kitchen|Magnet":{countryCodes:["gb"],matchNames:["magnet kitchens"],tags:{brand:"Magnet","brand:wikidata":"Q6731427",name:"Magnet",shop:"kitchen"}},"shop/kitchen|Mobalpa":{countryCodes:["be","fr","gb"],tags:{brand:"Mobalpa","brand:wikidata":"Q3317571","brand:wikipedia":"fr:Mobalpa",name:"Mobalpa",shop:"kitchen"}},"shop/kitchen|Schmidt":{countryCodes:["be","es","fr","gb"],tags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"}},"shop/kitchen|SoCoo'c":{countryCodes:["fr"],tags:{brand:"SoCoo'c","brand:wikidata":"Q62783840","brand:wikipedia":"fr:SoCoo'c",name:"SoCoo'c",shop:"kitchen"}},"shop/massage|Massage Envy":{countryCodes:["us"],matchNames:["massage envy spa"],tags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"}},"shop/massage|Massage Heights":{countryCodes:["ca","us"],tags:{brand:"Massage Heights","brand:wikidata":"Q64573956",name:"Massage Heights",shop:"massage"}},"shop/medical_supply|Pofam-Poznań":{countryCodes:["pl"],tags:{brand:"Pofam-Poznań","brand:wikidata":"Q62057457",name:"Pofam-Poznań",shop:"medical_supply"}},"shop/medical_supply|Ортека":{countryCodes:["ru"],tags:{brand:"Ортека","brand:wikidata":"Q62393660",name:"Ортека",shop:"medical_supply"}},"shop/mobile_phone|3 Store":{countryCodes:["gb","it"],matchNames:["3","three","three store"],tags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"}},"shop/mobile_phone|AT&T":{countryCodes:["mx","us"],matchNames:["att mobile","att mobility","att wireless"],tags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"}},"shop/mobile_phone|Bell":{countryCodes:["ca"],matchNames:["bell mobile","bell mobility","bell wireless"],tags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"}},"shop/mobile_phone|Best Buy Mobile":{countryCodes:["ca"],tags:{brand:"Best Buy Mobile","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Bitė":{countryCodes:["lt"],tags:{brand:"Bitė","brand:wikidata":"Q796010","brand:wikipedia":"lt:Bitės grupė",name:"Bitė",shop:"mobile_phone"}},"shop/mobile_phone|Boost Mobile":{countryCodes:["us"],matchNames:["boost"],tags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Bouygues Telecom":{countryCodes:["fr"],tags:{brand:"Bouygues Telecom",name:"Bouygues Telecom",shop:"mobile_phone"}},"shop/mobile_phone|Carphone Warehouse":{countryCodes:["by","gb","ie"],matchNames:["the carphone warehouse"],tags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"}},"shop/mobile_phone|Chatr":{countryCodes:["ca"],matchNames:["Chatr Mobile"],tags:{brand:"Chatr","brand:wikidata":"Q5087766","brand:wikipedia":"en:Chatr",name:"Chatr",shop:"mobile_phone"}},"shop/mobile_phone|Claro":{tags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"}},"shop/mobile_phone|Cricket Wireless":{countryCodes:["us"],matchNames:["cricket"],tags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Digicel":{tags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"}},"shop/mobile_phone|EE":{countryCodes:["gb"],tags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"}},"shop/mobile_phone|Entel":{countryCodes:["cl","pe"],tags:{brand:"Entel","brand:wikidata":"Q450420","brand:wikipedia":"en:Entel (Chile)",name:"Entel",shop:"mobile_phone"}},"shop/mobile_phone|Fido":{countryCodes:["ca"],tags:{brand:"Fido","brand:wikidata":"Q3071471","brand:wikipedia":"en:Fido Solutions",name:"Fido",shop:"mobile_phone"}},"shop/mobile_phone|Freedom Mobile":{countryCodes:["ca"],matchNames:["freedom","wind mobile"],tags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Koodo":{countryCodes:["ca"],tags:{brand:"Koodo","brand:wikidata":"Q6430529","brand:wikipedia":"en:Koodo Mobile",name:"Koodo",shop:"mobile_phone"}},"shop/mobile_phone|MTN":{matchNames:["agence mtn"],matchTags:["office/telecommunication"],tags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"}},"shop/mobile_phone|MetroPCS":{countryCodes:["us"],tags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"}},"shop/mobile_phone|Mobilcom Debitel":{countryCodes:["de","ir"],matchNames:["debitel"],tags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"}},"shop/mobile_phone|Moov":{countryCodes:["ci","tg"],matchNames:["agence moov"],matchTags:["office/telecommunication"],tags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"}},"shop/mobile_phone|Movistar":{tags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"}},"shop/mobile_phone|O2":{countryCodes:["cz","de","gb","ie","sk"],tags:{brand:"O2","brand:wikidata":"Q1759255","brand:wikipedia":"en:Telefónica Europe",name:"O2",shop:"mobile_phone"}},"shop/mobile_phone|Optie1":{countryCodes:["nl"],tags:{brand:"Optie1","brand:wikidata":"Q62393564",name:"Optie1",shop:"mobile_phone"}},"shop/mobile_phone|Orange":{matchNames:["agence orange"],matchTags:["office/telecommunication"],tags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange (entreprise)",name:"Orange",shop:"mobile_phone"}},"shop/mobile_phone|Personal":{countryCodes:["ar","py"],tags:{brand:"Personal","brand:wikidata":"Q10933021","brand:wikipedia":"es:Personal (Argentina)",name:"Personal",shop:"mobile_phone"}},"shop/mobile_phone|Phone House":{countryCodes:["de","es","fr","nl","pt"],matchNames:["the phone house"],tags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"}},"shop/mobile_phone|Play":{countryCodes:["pl"],tags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"pl:Play (sieć telefonii komórkowej)",name:"Play",shop:"mobile_phone"}},"shop/mobile_phone|Plus":{countryCodes:["pl"],nomatch:["shop/supermarket|PLUS"],tags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"}},"shop/mobile_phone|Rogers":{countryCodes:["ca"],tags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"}},"shop/mobile_phone|SFR":{countryCodes:["fr","lu"],matchNames:["espace sfr"],tags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"}},"shop/mobile_phone|Sprint":{nomatch:["amenity/fuel|Sprint"],tags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"}},"shop/mobile_phone|T-Mobile":{tags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"}},"shop/mobile_phone|TIM":{countryCodes:["br","it"],tags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"}},"shop/mobile_phone|Tbooth Wireless":{countryCodes:["ca"],tags:{brand:"Tbooth Wireless","brand:wikidata":"Q7690597",name:"Tbooth Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Telcel":{countryCodes:["cu","mx"],tags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"}},"shop/mobile_phone|Tele2":{tags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|Telekom":{countryCodes:["de","hu","ro","si","sk"],matchNames:["telekom shop"],tags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"}},"shop/mobile_phone|Telenor":{tags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"}},"shop/mobile_phone|Telia":{countryCodes:["dk","fi","lt","no","se"],tags:{brand:"Telia",name:"Telia",shop:"mobile_phone"}},"shop/mobile_phone|Telstra":{countryCodes:["au"],tags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"}},"shop/mobile_phone|Telus":{countryCodes:["ca"],tags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"}},"shop/mobile_phone|Turkcell":{countryCodes:["cy","tr"],tags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"}},"shop/mobile_phone|U.S. Cellular":{countryCodes:["us"],tags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"}},"shop/mobile_phone|Verizon Wireless":{countryCodes:["us"],matchNames:["verizon"],tags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"}},"shop/mobile_phone|Vidéotron":{countryCodes:["ca"],tags:{brand:"Vidéotron","brand:wikidata":"Q2396830","brand:wikipedia":"en:Vidéotron",name:"Vidéotron",shop:"mobile_phone"}},"shop/mobile_phone|Virgin Mobile~(Canada)":{countryCodes:["ca"],tags:{brand:"Virgin Mobile","brand:wikidata":"Q3560641","brand:wikipedia":"en:Virgin Mobile Canada",name:"Virgin Mobile",shop:"mobile_phone"}},"shop/mobile_phone|Vivo":{tags:{brand:"Vivo",name:"Vivo",shop:"mobile_phone"}},"shop/mobile_phone|Vodafone":{matchNames:["vodafone shop"],tags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"}},"shop/mobile_phone|WIFI_ETECSA":{countryCodes:["cu"],tags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"}},"shop/mobile_phone|WOW! Mobile Boutique":{countryCodes:["ca"],tags:{brand:"WOW! Mobile Boutique","brand:wikidata":"Q64847598",name:"WOW! Mobile Boutique",shop:"mobile_phone"}},"shop/mobile_phone|Wind":{countryCodes:["it"],tags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"}},"shop/mobile_phone|WirelessWave":{countryCodes:["ca"],tags:{brand:"WirelessWave","brand:wikidata":"Q8026815",name:"WirelessWave",shop:"mobile_phone"}},"shop/mobile_phone|Yoigo":{countryCodes:["es"],tags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"}},"shop/mobile_phone|auショップ":{countryCodes:["jp"],matchNames:["au"],tags:{brand:"au","brand:ja":"au","brand:wikidata":"Q307110","brand:wikipedia":"ja:Au (携帯電話)",name:"auショップ","name:en":"au","name:ja":"auショップ",shop:"mobile_phone"}},"shop/mobile_phone|Алло":{countryCodes:["md","ua"],tags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"}},"shop/mobile_phone|Билайн":{countryCodes:["kg","kz","ru"],tags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"}},"shop/mobile_phone|Евросеть":{countryCodes:["by","kz","ru","ua"],tags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"}},"shop/mobile_phone|Київстар":{countryCodes:["ua"],tags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"}},"shop/mobile_phone|МТС":{countryCodes:["by","ru","ua"],tags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"}},"shop/mobile_phone|Мегафон":{countryCodes:["ru","tj"],tags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"}},"shop/mobile_phone|НА'СВЯЗИ":{countryCodes:["by"],tags:{brand:"НА'СВЯЗИ",name:"НА'СВЯЗИ",shop:"mobile_phone"}},"shop/mobile_phone|Связной":{countryCodes:["by","ru","uz"],tags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"}},"shop/mobile_phone|Теле2":{countryCodes:["ru"],tags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンク":{countryCodes:["jp"],tags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:ja":"ソフトバンク","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom","name:ja":"ソフトバンク",shop:"mobile_phone"}},"shop/mobile_phone|ソフトバンクショップ":{countryCodes:["jp"],tags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:ja":"ソフトバンクショップ","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop","name:ja":"ソフトバンクショップ",shop:"mobile_phone"}},"shop/mobile_phone|ドコモショップ":{countryCodes:["jp"],tags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:ja":"ドコモショップ","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop","name:ja":"ドコモショップ",shop:"mobile_phone"}},"shop/mobile_phone|ワイモバイル":{countryCodes:["jp"],tags:{brand:"ワイモバイル","brand:ja":"ワイモバイル",name:"ワイモバイル","name:ja":"ワイモバイル",shop:"mobile_phone"}},"shop/money_lender|ACE Cash Express":{countryCodes:["us"],matchNames:["ace"],tags:{brand:"ACE Cash Express","brand:wikidata":"Q24260962",name:"ACE Cash Express",shop:"money_lender"}},"shop/money_lender|Advance America":{countryCodes:["us"],tags:{brand:"Advance America","brand:wikidata":"Q4686044",name:"Advance America",shop:"money_lender"}},"shop/money_lender|California Check Cashing Stores":{countryCodes:["us"],matchNames:["california check cashing"],tags:{brand:"California Check Cashing Stores","brand:wikidata":"Q64390932",name:"California Check Cashing Stores",shop:"money_lender"}},"shop/money_lender|Cash Store":{countryCodes:["us"],tags:{brand:"Cash Store","brand:wikidata":"Q61943411",name:"Cash Store",shop:"money_lender"}},"shop/money_lender|Check Into Cash":{countryCodes:["us"],tags:{brand:"Check Into Cash","brand:wikidata":"Q16961246","brand:wikipedia":"en:Check Into Cash",name:"Check Into Cash",shop:"money_lender"}},"shop/money_lender|CheckSmart":{countryCodes:["us"],tags:{alt_name:"Check$mart",brand:"CheckSmart","brand:wikidata":"Q65640213",name:"CheckSmart",shop:"money_lender"}},"shop/money_lender|First Virginia":{countryCodes:["us"],matchNames:["1st virginia"],tags:{brand:"First Virginia","brand:wikidata":"Q65640051",name:"First Virginia",shop:"money_lender"}},"shop/money_lender|Money Mart":{countryCodes:["ca","us"],tags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"}},"shop/motorcycle|Harley-Davidson":{tags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"}},"shop/motorcycle|Honda":{nomatch:["shop/car|Honda"],tags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"}},"shop/motorcycle|Kawasaki":{tags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"}},"shop/motorcycle|Motortrade":{countryCodes:["ph"],tags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"}},"shop/motorcycle|Suzuki":{nomatch:["shop/car|Suzuki"],tags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"}},"shop/motorcycle|Yamaha":{tags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"}},"shop/motorcycle|レッドバロン":{countryCodes:["jp"],tags:{brand:"レッドバロン","brand:ja":"レッドバロン",name:"レッドバロン","name:ja":"レッドバロン",shop:"motorcycle"}},"shop/music|FYE":{countryCodes:["us"],tags:{brand:"FYE","brand:wikidata":"Q5424141","brand:wikipedia":"en:FYE (retailer)",name:"FYE",shop:"music"}},"shop/music|HMV":{countryCodes:["ca","gb"],tags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"}},"shop/music|Sunrise Records":{countryCodes:["ca","gb"],tags:{brand:"Sunrise Records","brand:wikidata":"Q30600373","brand:wikipedia":"en:Sunrise Records (retailer)",name:"Sunrise Records",shop:"music"}},"shop/music|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/video|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"}},"shop/musical_instrument|Guitar Center":{countryCodes:["us"],tags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"}},"shop/musical_instrument|Long & McQuade":{countryCodes:["ca"],tags:{brand:"Long & McQuade","brand:wikidata":"Q6672180","brand:wikipedia":"en:Long & McQuade",name:"Long & McQuade",shop:"musical_instrument"}},"shop/newsagent|Cigo":{countryCodes:["de","nl"],tags:{brand:"Cigo","brand:wikidata":"Q62391977",name:"Cigo",shop:"newsagent"}},"shop/newsagent|Hudson News":{tags:{brand:"Hudson News",name:"Hudson News",shop:"newsagent"}},"shop/newsagent|Inmedio":{countryCodes:["hu","pl","ro"],tags:{brand:"Inmedio",name:"Inmedio",shop:"newsagent"}},"shop/newsagent|Kolporter":{countryCodes:["pl"],matchTags:["shop/kiosk"],tags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"}},"shop/newsagent|Maison de la Presse":{countryCodes:["fr"],matchTags:["shop/books"],tags:{brand:"Maison de la Presse","brand:wikidata":"Q62085960",name:"Maison de la Presse",shop:"newsagent"}},"shop/newsagent|Martin's":{countryCodes:["gb"],matchTags:["shop/convenience"],tags:{brand:"Martin's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"Martin's",shop:"newsagent"}},"shop/newsagent|Primera":{countryCodes:["nl"],tags:{brand:"Primera","brand:wikidata":"Q2176149","brand:wikipedia":"nl:Primera (winkelketen)",name:"Primera",shop:"newsagent"}},"shop/newsagent|Relay":{matchTags:["shop/kiosk"],tags:{brand:"Relay","brand:wikidata":"Q3424298","brand:wikipedia":"en:Relay (shop)",name:"Relay",shop:"newsagent"}},"shop/newsagent|WHSmith":{countryCodes:["gb"],matchTags:["shop/books","shop/convenience","shop/kiosk","shop/stationery"],tags:{brand:"WHSmith","brand:wikidata":"Q1548712","brand:wikipedia":"en:WHSmith",name:"WHSmith",shop:"newsagent"}},"shop/newsagent|k kiosk":{countryCodes:["ch"],nomatch:["shop/kiosk|k kiosk"],tags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"newsagent"}},"shop/newsagent|Белсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Витебскоблсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Белсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Белсоюзпечать",shop:"newsagent"}},"shop/newsagent|Витебскоблсоюзпечать":{countryCodes:["by"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Союзпечать"],tags:{brand:"Витебскоблсоюзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Витебскоблсоюзпечать",shop:"newsagent"}},"shop/newsagent|Первая полоса":{countryCodes:["ru"],tags:{brand:"Первая полоса","brand:wikidata":"Q62736412",name:"Первая полоса",shop:"newsagent"}},"shop/newsagent|Роспечать":{tags:{brand:"Роспечать",name:"Роспечать",shop:"newsagent"}},"shop/newsagent|Союзпечать":{countryCodes:["by","kz","ru","ua"],matchTags:["shop/kiosk"],nomatch:["shop/newsagent|Белсоюзпечать","shop/newsagent|Витебскоблсоюзпечать"],tags:{brand:"Союзпечать","brand:wikidata":"Q4430611","brand:wikipedia":"ru:Союзпечать",name:"Союзпечать",shop:"newsagent"}},"shop/newsagent|読売新聞":{countryCodes:["jp"],tags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"}},"shop/nutrition_supplements|GNC":{matchNames:["gnc live well"],tags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"}},"shop/nutrition_supplements|The Vitamin Shoppe":{countryCodes:["us"],matchTags:["shop/chemist"],tags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"}},"shop/nutrition_supplements|Vitamin World":{countryCodes:["us"],tags:{brand:"Vitamin World","brand:wikidata":"Q7936979","brand:wikipedia":"en:Vitamin World",name:"Vitamin World",shop:"nutrition_supplements"}},"shop/optician|Alain Afflelou":{countryCodes:["be","ch","es","fr","pt"],tags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"}},"shop/optician|America's Best Contacts & Eyeglasses":{countryCodes:["us"],tags:{brand:"America's Best Contacts & Eyeglasses","brand:wikidata":"Q4742504","brand:wikipedia":"en:America's Best Contacts & Eyeglasses",name:"America's Best Contacts & Eyeglasses",shop:"optician",short_name:"America's Best"}},"shop/optician|Apollo-Optik":{countryCodes:["de"],nomatch:["amenity/pharmacy|Apollo Pharmacy"],tags:{brand:"Apollo-Optik","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo-Optik",shop:"optician",short_name:"Apollo"}},"shop/optician|Atol":{countryCodes:["fr"],tags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"}},"shop/optician|Boots Opticians":{countryCodes:["gb"],tags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician",short_name:"Boots"}},"shop/optician|Clarkson Eyecare":{countryCodes:["us"],tags:{brand:"Clarkson Eyecare","brand:wikidata":"Q64027001",healthcare:"optometrist",name:"Clarkson Eyecare",shop:"optician",short_name:"Clarkson"}},"shop/optician|Cohen's Fashion Optical":{countryCodes:["us"],matchNames:["cohen's optical"],tags:{brand:"Cohen's Fashion Optical","brand:wikidata":"Q5141313","brand:wikipedia":"en:Cohen's Fashion Optical",healthcare:"optometrist",name:"Cohen's Fashion Optical",shop:"optician",short_name:"Cohen's"}},"shop/optician|Die Brille":{countryCodes:["de"],tags:{brand:"Die Brille",name:"Die Brille",shop:"optician"}},"shop/optician|Eye Wish":{countryCodes:["nl"],tags:{brand:"Eye Wish","brand:wikidata":"Q62391641",name:"Eye Wish",shop:"optician"}},"shop/optician|Fielmann":{tags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"}},"shop/optician|GMO":{countryCodes:["cl","co","ec","pe"],tags:{brand:"GMO",name:"GMO",shop:"optician"}},"shop/optician|General Óptica":{countryCodes:["es"],tags:{brand:"General Óptica","brand:wikidata":"Q62391672",name:"General Óptica",shop:"optician"}},"shop/optician|Grand Optical":{countryCodes:["fr"],tags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"}},"shop/optician|Générale d'Optique":{countryCodes:["fr"],tags:{brand:"Générale d'Optique","brand:wikidata":"Q62391701",name:"Générale d'Optique",shop:"optician"}},"shop/optician|Hakim Optical":{countryCodes:["ca"],tags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"}},"shop/optician|Hans Anders":{countryCodes:["be","fr","nl"],tags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"}},"shop/optician|Instrumentarium":{countryCodes:["fi"],tags:{brand:"Instrumentarium","brand:wikidata":"Q11864937","brand:wikipedia":"fi:Instrumentarium",name:"Instrumentarium",shop:"optician"}},"shop/optician|Krys":{countryCodes:["fr"],tags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"}},"shop/optician|LensCrafters":{countryCodes:["ca","us"],tags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"}},"shop/optician|Les Opticiens Mutualistes":{countryCodes:["fr"],tags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"}},"shop/optician|Lissac":{countryCodes:["fr"],tags:{brand:"Lissac","brand:wikidata":"Q63102559",name:"Lissac",shop:"optician"}},"shop/optician|Multiópticas~(Portugal)":{countryCodes:["pt"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391722",name:"Multiópticas",shop:"optician"}},"shop/optician|Multiópticas~(Spain)":{countryCodes:["es"],tags:{brand:"Multiópticas","brand:wikidata":"Q62391719",name:"Multiópticas",shop:"optician"}},"shop/optician|Nissen":{countryCodes:["fi"],tags:{brand:"Nissen",name:"Nissen",shop:"optician"}},"shop/optician|Oakley":{countryCodes:["us"],matchTags:["shop/clothes","shop/sports"],tags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"}},"shop/optician|Oliver Peoples":{tags:{brand:"Oliver Peoples","brand:wikidata":"Q7087746","brand:wikipedia":"en:Oliver Peoples",name:"Oliver Peoples",shop:"optician"}},"shop/optician|Optic 2000":{countryCodes:["ch","fr"],tags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"}},"shop/optician|Optical Center":{tags:{brand:"Optical Center","brand:wikidata":"Q3354448","brand:wikipedia":"fr:Optical Center",name:"Optical Center",shop:"optician"}},"shop/optician|Opticalia":{tags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"}},"shop/optician|Pearle Vision":{countryCodes:["ca","us"],tags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician",short_name:"Pearle"}},"shop/optician|Silmäasema":{countryCodes:["fi"],tags:{brand:"Silmäasema","brand:wikidata":"Q15994200","brand:wikipedia":"fi:Silmäasema",name:"Silmäasema",shop:"optician"}},"shop/optician|Solstice Sunglasses":{tags:{brand:"Solstice Sunglasses",name:"Solstice Sunglasses",shop:"optician",short_name:"Solstice"}},"shop/optician|Specsavers":{tags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"}},"shop/optician|Sunglass Hut":{matchTags:["shop/sunglasses"],tags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"}},"shop/optician|Synoptik":{countryCodes:["se"],tags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"}},"shop/optician|Synsam":{countryCodes:["fi","no","se"],tags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"}},"shop/optician|Target Optical":{countryCodes:["us"],tags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"}},"shop/optician|Vision Express":{tags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"}},"shop/optician|Visionworks":{countryCodes:["us"],tags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"}},"shop/optician|Warby Parker":{countryCodes:["ca","us"],tags:{brand:"Warby Parker","brand:wikidata":"Q7968882","brand:wikipedia":"en:Warby Parker",name:"Warby Parker",shop:"optician"}},"shop/optician|Оптимист Оптика":{countryCodes:["ru"],tags:{brand:"Оптимист Оптика",name:"Оптимист Оптика",shop:"optician"}},"shop/optician|แว่นท็อปเจริญ":{countryCodes:["th"],tags:{brand:"แว่นท็อปเจริญ","brand:th":"แว่นท็อปเจริญ","brand:wikidata":"Q62391732",name:"แว่นท็อปเจริญ","name:th":"แว่นท็อปเจริญ",shop:"optician"}},"shop/optician|メガネストアー":{countryCodes:["jp"],tags:{brand:"メガネストアー","brand:ja":"メガネストアー",name:"メガネストアー","name:ja":"メガネストアー",shop:"optician"}},"shop/optician|メガネスーパー":{countryCodes:["jp"],tags:{brand:"メガネスーパー","brand:ja":"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー","name:en":"Meganesuper","name:ja":"メガネスーパー",shop:"optician"}},"shop/optician|寶島眼鏡":{countryCodes:["zh"],tags:{brand:"寶島眼鏡","brand:wikidata":"Q62391741",name:"寶島眼鏡",shop:"optician"}},"shop/optician|眼鏡市場":{countryCodes:["jp"],tags:{brand:"眼鏡市場","brand:en":"Megane Ichiba","brand:wikidata":"Q11343506","brand:wikipedia":"ja:メガネトップ",name:"眼鏡市場","name:en":"Megane Ichiba",shop:"optician"}},"shop/outdoor|Bass Pro Shops":{countryCodes:["ca","us"],tags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"outdoor"}},"shop/outdoor|Blacks":{countryCodes:["gb"],tags:{brand:"Blacks","brand:wikidata":"Q64822933",name:"Blacks",shop:"outdoor"}},"shop/outdoor|Cabela's":{countryCodes:["ca","us"],tags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"outdoor"}},"shop/outdoor|Gander Outdoors":{countryCodes:["us"],matchNames:["gander mountain"],tags:{brand:"Gander Outdoors","brand:wikidata":"Q64357426","brand:wikipedia":"en:Gander Outdoors",name:"Gander Outdoors",shop:"outdoor"}},"shop/outdoor|Jack Wolfskin":{countryCodes:["ch","de","fr"],matchTags:["shop/clothes"],tags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"}},"shop/outdoor|Kathmandu":{countryCodes:["au","nz"],tags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"}},"shop/outdoor|Millets":{countryCodes:["gb"],tags:{brand:"Millets","brand:wikidata":"Q64822903",name:"Millets",shop:"outdoor"}},"shop/outdoor|Mountain Warehouse":{countryCodes:["gb","pl"],tags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"}},"shop/outdoor|REI":{countryCodes:["id","us"],tags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",official_name:"Recreational Equipment, Inc.",shop:"outdoor"}},"shop/outdoor|Sportsman's Warehouse":{countryCodes:["us"],tags:{brand:"Sportsman's Warehouse","brand:wikidata":"Q7579979","brand:wikipedia":"en:Sportsman's Warehouse",name:"Sportsman's Warehouse",shop:"outdoor"}},"shop/outdoor|Trespass":{countryCodes:["fr","gb","ie"],tags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"}},"shop/outpost|Wildberries":{countryCodes:["by","ru"],matchTags:["shop/clothes"],tags:{brand:"Wildberries","brand:wikidata":"Q24933714","brand:wikipedia":"ru:Wildberries",name:"Wildberries",shop:"outpost"}},"shop/paint|Benjamin Moore":{countryCodes:["ca","us"],tags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"}},"shop/paint|Comex":{tags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"}},"shop/paint|Jotun":{tags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"}},"shop/paint|National Paints":{countryCodes:["ae","qa"],tags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"}},"shop/paint|Sherwin-Williams":{matchNames:["sherwin williams paint store","sherwin williams paints"],tags:{brand:"Sherwin-Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin-Williams",shop:"paint"}},"shop/party|Party City":{countryCodes:["ca","us"],tags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"}},"shop/pastry|Cookies by Design":{countryCodes:["us"],matchTags:["shop/confectionery","shop/gift"],tags:{brand:"Cookies by Design","brand:wikidata":"Q5167112",craft:"bakery",name:"Cookies by Design",shop:"pastry"}},"shop/pastry|Smallcakes":{countryCodes:["us"],tags:{brand:"Smallcakes","brand:wikidata":"Q62384749",name:"Smallcakes",shop:"pastry"}},"shop/pawnbroker|Cash Converters":{tags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"}},"shop/pawnbroker|Cebuana Lhuillier":{countryCodes:["ph"],matchNames:["agencia cebuana","m lhuillier"],tags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker",short_name:"Cebuana"}},"shop/pawnbroker|Loombard":{countryCodes:["pl"],tags:{brand:"Loombard",name:"Loombard",shop:"pawnbroker"}},"shop/pawnbroker|Palawan Pawnshop":{countryCodes:["ph"],tags:{brand:"Palawan Pawnshop","brand:wikidata":"Q62391488",name:"Palawan Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|RD Pawnshop":{countryCodes:["ph"],tags:{brand:"RD Pawnshop",name:"RD Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Villarica Pawnshop":{countryCodes:["ph"],tags:{brand:"Villarica Pawnshop","brand:wikidata":"Q62391438",name:"Villarica Pawnshop",shop:"pawnbroker"}},"shop/pawnbroker|Скарбниця":{countryCodes:["ua"],tags:{brand:"Скарбниця",name:"Скарбниця",shop:"pawnbroker"}},"shop/perfumery|Douglas":{countryCodes:["at","ch","de","es","it","nl","pl"],matchTags:["shop/beauty","shop/chemist","shop/cosmetics"],tags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"}},"shop/perfumery|FAnn":{countryCodes:["cz","sk"],tags:{brand:"FAnn","brand:wikidata":"Q62391353",name:"FAnn",shop:"perfumery"}},"shop/perfumery|ICI PARIS XL":{countryCodes:["be","lu","nl"],tags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"}},"shop/perfumery|Marionnaud":{countryCodes:["at","ch","es","fr","it","sk"],matchTags:["shop/beauty","shop/cosmetics"],tags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud",name:"Marionnaud",shop:"perfumery"}},"shop/perfumery|O Boticário":{countryCodes:["br"],tags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"}},"shop/pet|Das Futterhaus":{countryCodes:["at","de"],tags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"}},"shop/pet|Faunatar":{countryCodes:["fi"],tags:{brand:"Faunatar","brand:wikidata":"Q11859415","brand:wikipedia":"fi:Faunatar",name:"Faunatar",shop:"pet"}},"shop/pet|Fressnapf":{countryCodes:["at","ch","de","hu","lu"],tags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"}},"shop/pet|Global Pet Foods":{countryCodes:["ca"],tags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"}},"shop/pet|Maxi Zoo":{countryCodes:["be","ch","dk","fr","ie","it","pl"],tags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"}},"shop/pet|Mud Bay":{countryCodes:["us"],tags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"}},"shop/pet|Musti ja Mirri":{countryCodes:["fi"],tags:{brand:"Musti ja Mirri","brand:wikidata":"Q11883558","brand:wikipedia":"fi:Musti ja Mirri",name:"Musti ja Mirri",shop:"pet"}},"shop/pet|Pet Food Express":{countryCodes:["us"],tags:{brand:"Pet Food Express","brand:wikidata":"Q7171541","brand:wikipedia":"en:Pet Food Express",name:"Pet Food Express",shop:"pet"}},"shop/pet|Pet Supermarket":{countryCodes:["us"],tags:{brand:"Pet Supermarket","brand:wikidata":"Q61968363",name:"Pet Supermarket",shop:"pet"}},"shop/pet|Pet Supplies Plus":{countryCodes:["us"],tags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"}},"shop/pet|Pet Valu":{countryCodes:["ca","us"],tags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"}},"shop/pet|PetSmart":{countryCodes:["ca","us"],tags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"}},"shop/pet|Petco":{countryCodes:["us"],tags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"}},"shop/pet|Petland":{countryCodes:["us"],tags:{brand:"Petland","brand:wikidata":"Q17111474","brand:wikipedia":"en:Petland",name:"Petland",shop:"pet"}},"shop/pet|Petland Discounts":{countryCodes:["us"],tags:{brand:"Petland Discounts","brand:wikidata":"Q7178463","brand:wikipedia":"en:Petland Discounts",name:"Petland Discounts",shop:"pet"}},"shop/pet|Pets at Home":{countryCodes:["gb"],tags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"}},"shop/pet|Unleashed":{countryCodes:["us"],tags:{alt_name:"Unleashed by Petco",brand:"Unleashed","brand:wikidata":"Q62122874",name:"Unleashed",shop:"pet"}},"shop/pet|Wild Birds Unlimited":{countryCodes:["us"],tags:{brand:"Wild Birds Unlimited","brand:wikidata":"Q8000542","brand:wikipedia":"en:Wild Birds Unlimited",name:"Wild Birds Unlimited",shop:"pet"}},"shop/pet|Бетховен":{countryCodes:["ru"],tags:{brand:"Бетховен","brand:wikidata":"Q62390798",name:"Бетховен",shop:"pet"}},"shop/pet|Четыре лапы":{countryCodes:["kz","ru"],tags:{brand:"Четыре лапы","brand:wikidata":"Q62390783",name:"Четыре лапы",shop:"pet"}},"shop/photo|Kodak Express":{matchNames:["kodak"],tags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"}},"shop/photo|Max Spielmann":{countryCodes:["gb"],tags:{brand:"Max Spielmann",name:"Max Spielmann",shop:"photo"}},"shop/photo|カメラのキタムラ":{countryCodes:["jp"],tags:{brand:"カメラのキタムラ","brand:ja":"カメラのキタムラ",name:"カメラのキタムラ","name:ja":"カメラのキタムラ",shop:"photo"}},"shop/printer_ink|Cartridge World":{matchTags:["shop/computer"],tags:{brand:"Cartridge World","brand:wikidata":"Q5047439",name:"Cartridge World",shop:"printer_ink"}},"shop/second_hand|Value Village":{countryCodes:["ca","us"],tags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"}},"shop/shoes|ABCマート":{countryCodes:["jp"],tags:{brand:"ABCマート","brand:ja":"ABCマート","brand:wikidata":"Q11188787","brand:wikipedia":"en:ABC-Mart",name:"ABCマート","name:ja":"ABCマート",shop:"shoes"}},"shop/shoes|Aldo":{tags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"}},"shop/shoes|Allen Edmonds":{countryCodes:["us"],tags:{brand:"Allen Edmonds","brand:wikidata":"Q4731627","brand:wikipedia":"en:Allen Edmonds",name:"Allen Edmonds",shop:"shoes"}},"shop/shoes|André":{countryCodes:["fr"],tags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"}},"shop/shoes|Bata":{tags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"}},"shop/shoes|Belwest":{countryCodes:["by","ru"],tags:{brand:"Belwest",name:"Belwest",shop:"shoes"}},"shop/shoes|Besson Chaussures":{countryCodes:["fr"],tags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"}},"shop/shoes|Birkenstock":{tags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"}},"shop/shoes|Brantano":{countryCodes:["be","gb","lu"],tags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"}},"shop/shoes|Browns":{countryCodes:["ca"],tags:{brand:"Browns","brand:wikidata":"Q16954153","brand:wikipedia":"en:Browns Shoes",name:"Browns",shop:"shoes"}},"shop/shoes|CCC":{tags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"}},"shop/shoes|Call It Spring":{tags:{brand:"Call It Spring","brand:wikidata":"Q7580363","brand:wikipedia":"en:Call It Spring",name:"Call It Spring",shop:"shoes"}},"shop/shoes|Camper":{tags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"}},"shop/shoes|Chaussea":{countryCodes:["be","es","fr","lu"],tags:{brand:"Chaussea","brand:wikidata":"Q62082044",name:"Chaussea",shop:"shoes"}},"shop/shoes|Christian Louboutin":{countryCodes:["gb"],tags:{brand:"Christian Louboutin",name:"Christian Louboutin",shop:"shoes"}},"shop/shoes|Clarks":{tags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"}},"shop/shoes|Cole Haan":{countryCodes:["us"],tags:{brand:"Cole Haan","brand:wikidata":"Q4356504","brand:wikipedia":"en:Cole Haan",name:"Cole Haan",shop:"shoes"}},"shop/shoes|Converse":{tags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"}},"shop/shoes|Crocs":{tags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"}},"shop/shoes|DSW":{countryCodes:["ca","us"],matchNames:["designer shoe warehouse","dsw shoes"],tags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:Designer Brands",name:"DSW",shop:"shoes"}},"shop/shoes|Deichmann":{tags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"}},"shop/shoes|Din sko":{countryCodes:["no","se"],tags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"}},"shop/shoes|Dosenbach":{countryCodes:["ch"],tags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"}},"shop/shoes|Dune London":{countryCodes:["ch","de","fr","gb","nl"],tags:{brand:"Dune London","brand:wikidata":"Q65557112",name:"Dune London",shop:"shoes",short_name:"Dune"}},"shop/shoes|Ecco":{tags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"}},"shop/shoes|FLO":{countryCodes:["al","tr"],nomatch:["amenity/charging_station|FLO"],tags:{brand:"FLO","brand:wikidata":"Q61994802",name:"FLO",shop:"shoes"}},"shop/shoes|Famous Footwear":{countryCodes:["us"],tags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"}},"shop/shoes|Foot Locker":{tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"}},"shop/shoes|G.H. Bass & Co.":{countryCodes:["gb","us"],tags:{brand:"G.H. Bass & Co.","brand:wikidata":"Q16993893","brand:wikipedia":"en:G.H. Bass & Co.",name:"G.H. Bass & Co.",shop:"shoes"}},"shop/shoes|Gabor":{countryCodes:["de","it"],tags:{brand:"Gabor","brand:wikidata":"Q1488760","brand:wikipedia":"de:Gabor Shoes",name:"Gabor",shop:"shoes"}},"shop/shoes|Geox":{tags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"}},"shop/shoes|Görtz":{countryCodes:["de"],tags:{brand:"Görtz","brand:wikidata":"Q1559593","brand:wikipedia":"de:Ludwig Görtz",name:"Görtz",shop:"shoes"}},"shop/shoes|Havaianas":{tags:{brand:"Havaianas",name:"Havaianas",shop:"shoes"}},"shop/shoes|Humanic":{countryCodes:["at","cz","de","hu","ro","sk"],tags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"}},"shop/shoes|Hush Puppies":{tags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"}},"shop/shoes|Johnston & Murphy":{countryCodes:["ca","us"],tags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"}},"shop/shoes|Jones Bootmaker":{countryCodes:["gb"],tags:{brand:"Jones Bootmaker","brand:wikidata":"Q6275139",name:"Jones Bootmaker",shop:"shoes",short_name:"Jones"}},"shop/shoes|Journeys":{countryCodes:["ca","us"],tags:{brand:"Journeys","brand:wikidata":"Q61994838",name:"Journeys",shop:"shoes"}},"shop/shoes|Kari":{tags:{brand:"Kari","brand:wikidata":"Q47155680","brand:wikipedia":"ru:Kari (компания)",name:"Kari",shop:"shoes"}},"shop/shoes|Kids Foot Locker":{countryCodes:["us"],tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Kids Foot Locker",shop:"shoes"}},"shop/shoes|La Halle aux Chaussures":{countryCodes:["fr"],tags:{brand:"La Halle aux Chaussures","brand:wikidata":"Q62390731",name:"La Halle aux Chaussures",shop:"shoes"}},"shop/shoes|Lady Foot Locker":{countryCodes:["us"],tags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Lady Foot Locker",shop:"shoes"}},"shop/shoes|Manfield":{tags:{brand:"Manfield",name:"Manfield",shop:"shoes"}},"shop/shoes|Mephisto":{tags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"}},"shop/shoes|Merrell":{countryCodes:["us"],tags:{brand:"Merrell","brand:wikidata":"Q1921997","brand:wikipedia":"en:Merrell (company)",name:"Merrell",shop:"shoes"}},"shop/shoes|Minelli":{tags:{brand:"Minelli","brand:wikidata":"Q61994831",name:"Minelli",shop:"shoes"}},"shop/shoes|Naturalizer":{countryCodes:["ca","cn","gu","us"],tags:{brand:"Naturalizer","brand:wikidata":"Q65012038",name:"Naturalizer",shop:"shoes"}},"shop/shoes|New Balance":{tags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"}},"shop/shoes|Office":{countryCodes:["de","gb","ie","ro"],tags:{brand:"Office","brand:wikidata":"Q7079121","brand:wikipedia":"en:Office Holdings",name:"Office",shop:"shoes"}},"shop/shoes|Payless ShoeSource":{matchNames:["payless"],tags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"}},"shop/shoes|Quick Schuh":{countryCodes:["at","de"],tags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"}},"shop/shoes|Rack Room Shoes":{countryCodes:["us"],tags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"}},"shop/shoes|Ralf Ringer":{countryCodes:["ru"],tags:{brand:"Ralf Ringer",name:"Ralf Ringer",shop:"shoes"}},"shop/shoes|Red Wing":{countryCodes:["de","gb","nl","us"],matchNames:["red wing shoes"],tags:{brand:"Red Wing","brand:wikidata":"Q934096","brand:wikipedia":"en:Red Wing Shoes",name:"Red Wing",shop:"shoes"}},"shop/shoes|Reno":{countryCodes:["at","ch","de","hu","sk"],tags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"}},"shop/shoes|Respect":{countryCodes:["by","ru","ua"],tags:{brand:"Respect",name:"Respect",shop:"shoes"}},"shop/shoes|Rieker":{tags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"}},"shop/shoes|Rockport":{tags:{brand:"Rockport","brand:wikidata":"Q4048384","brand:wikipedia":"en:Rockport (company)",name:"Rockport",shop:"shoes"}},"shop/shoes|Salamander":{tags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"}},"shop/shoes|San Marina":{countryCodes:["fr"],tags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"}},"shop/shoes|Scapino":{countryCodes:["nl"],tags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"}},"shop/shoes|Schuh":{countryCodes:["de","gb","gg","ie"],tags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"}},"shop/shoes|Shoe Carnival":{countryCodes:["us"],tags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"}},"shop/shoes|Shoe Zone":{countryCodes:["gb","ie"],tags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"}},"shop/shoes|Siemes Schuhcenter":{countryCodes:["de"],tags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"}},"shop/shoes|Skechers":{matchNames:["sketchers"],tags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"}},"shop/shoes|Snipes":{countryCodes:["at","ch","de","nl"],tags:{brand:"Snipes",name:"Snipes",shop:"shoes"}},"shop/shoes|Soft Moc":{countryCodes:["ca"],tags:{brand:"Soft Moc","brand:wikidata":"Q65012391",name:"Soft Moc",shop:"shoes"}},"shop/shoes|Sperry":{countryCodes:["us"],matchNames:["sperry top sider"],tags:{brand:"Sperry","brand:wikidata":"Q7576421","brand:wikipedia":"en:Sperry Top-Sider",name:"Sperry",shop:"shoes"}},"shop/shoes|Steve Madden":{countryCodes:["ca","us"],tags:{brand:"Steve Madden","brand:wikidata":"Q25352034","brand:wikipedia":"en:Steve Madden (company)",name:"Steve Madden",shop:"shoes"}},"shop/shoes|Stride Rite":{countryCodes:["us"],tags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",shop:"shoes"}},"shop/shoes|Stuart Weitzman":{countryCodes:["ca","us"],tags:{brand:"Stuart Weitzman",name:"Stuart Weitzman",shop:"shoes"}},"shop/shoes|Tamaris":{countryCodes:["at","be","de","fr","nl"],tags:{brand:"Tamaris","brand:wikidata":"Q61994827",name:"Tamaris",shop:"shoes"}},"shop/shoes|The Shoe Company":{countryCodes:["ca"],tags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"}},"shop/shoes|UGG":{countryCodes:["au","us"],tags:{brand:"UGG","brand:wikidata":"Q1138480","brand:wikipedia":"en:UGG (brand)",name:"UGG",shop:"shoes"}},"shop/shoes|Vans":{tags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"}},"shop/shoes|Walking on a Cloud":{countryCodes:["ca"],tags:{brand:"Walking on a Cloud","brand:wikidata":"Q65012662",name:"Walking on a Cloud",shop:"shoes"}},"shop/shoes|vanHaren":{countryCodes:["be","nl"],tags:{brand:"vanHaren","brand:wikidata":"Q62390668",name:"vanHaren",shop:"shoes"}},"shop/shoes|Éram":{countryCodes:["be","fr"],tags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"}},"shop/shoes|Марко":{tags:{brand:"Марко",name:"Марко",shop:"shoes"}},"shop/shoes|ЦентрОбувь":{countryCodes:["by","ru","ua"],tags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"}},"shop/shoes|Юничел":{countryCodes:["kz","ru"],tags:{brand:"Юничел","brand:wikidata":"Q62390569",name:"Юничел",shop:"shoes"}},"shop/shoes|つるや":{countryCodes:["jp"],tags:{brand:"つるや","brand:en":"Tsuruya","brand:ja":"つるや","brand:wikidata":"Q11272578","brand:wikipedia":"ja:つるや (靴屋)",name:"つるや","name:en":"Tsuruya","name:ja":"つるや",shop:"shoes"}},"shop/shoes|東京靴流通センター":{countryCodes:["jp"],tags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:ja":"東京靴流通センター","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center","name:ja":"東京靴流通センター",shop:"shoes"}},"shop/sports|Academy Sports + Outdoors":{countryCodes:["us"],matchNames:["academy","academy sports and outdoors"],matchTags:["shop/outdoor"],tags:{brand:"Academy Sports + Outdoors","brand:wikidata":"Q4671380","brand:wikipedia":"en:Academy Sports + Outdoors",name:"Academy Sports + Outdoors",shop:"sports"}},"shop/sports|Adidas":{tags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"}},"shop/sports|Aktiesport":{countryCodes:["nl"],tags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"}},"shop/sports|American Golf":{countryCodes:["gb","ie"],matchTags:["shop/golf"],tags:{brand:"American Golf","brand:wikidata":"Q62657494",name:"American Golf",shop:"sports",sport:"golf"}},"shop/sports|Big 5 Sporting Goods":{countryCodes:["us"],matchNames:["big 5"],tags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"}},"shop/sports|Centauro":{countryCodes:["br"],tags:{brand:"Centauro","brand:wikidata":"Q28679561","brand:wikipedia":"pt:Lojas Centauro",name:"Centauro",shop:"sports"}},"shop/sports|Decathlon":{tags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"}},"shop/sports|Dick's Sporting Goods":{countryCodes:["us"],matchNames:["dicks"],tags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"}},"shop/sports|Finish Line":{countryCodes:["us"],tags:{brand:"Finish Line","brand:wikidata":"Q5450341","brand:wikipedia":"en:Finish Line, Inc.",name:"Finish Line",shop:"sports"}},"shop/sports|Hervis":{countryCodes:["at","cz","de","hr","hu","ro","si"],matchNames:["hervis sport","hervis sports"],tags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"}},"shop/sports|Hibbett Sports":{countryCodes:["us"],tags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"}},"shop/sports|Intersport":{tags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"}},"shop/sports|JD Sports":{countryCodes:["de","es","fr","gb","ie","nl"],matchNames:["JD"],tags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"}},"shop/sports|Marathon Sports":{countryCodes:["bo","ec","pe"],tags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"}},"shop/sports|Martes Sport":{countryCodes:["pl"],tags:{brand:"Martes Sport","brand:wikidata":"Q62073490",name:"Martes Sport",shop:"sports"}},"shop/sports|Modell's Sporting Goods":{countryCodes:["us"],matchNames:["modells"],tags:{brand:"Modell's Sporting Goods","brand:wikidata":"Q3317844","brand:wikipedia":"en:Modell's Sporting Goods",name:"Modell's Sporting Goods",shop:"sports"}},"shop/sports|Peloton":{countryCodes:["ca","gb","us"],tags:{brand:"Peloton","brand:wikidata":"Q56276186","brand:wikipedia":"en:Peloton (company)",name:"Peloton",shop:"sports"}},"shop/sports|Play It Again Sports":{countryCodes:["ca","us"],tags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"}},"shop/sports|Rebel":{countryCodes:["au","nz"],tags:{brand:"Rebel","brand:wikidata":"Q18636397","brand:wikipedia":"en:Rebel (company)",name:"Rebel",shop:"sports"}},"shop/sports|Sport 2000":{countryCodes:["at","de","fr","nl"],tags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"}},"shop/sports|Sport Chek":{countryCodes:["ca"],tags:{brand:"Sport Chek","brand:wikidata":"Q3494037","brand:wikipedia":"en:Sport Chek",name:"Sport Chek",shop:"sports"}},"shop/sports|Sporting Life":{countryCodes:["ca"],tags:{brand:"Sporting Life","brand:wikidata":"Q7579583","brand:wikipedia":"en:Sporting Life (retailer)",name:"Sporting Life",shop:"sports"}},"shop/sports|Sportisimo":{countryCodes:["cz","sk"],tags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"}},"shop/sports|Sports Authority":{tags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"}},"shop/sports|Sports Direct":{matchNames:["SportsDirect.com"],tags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"}},"shop/sports|Stadium":{countryCodes:["de","dk","fi","se"],tags:{brand:"Stadium","brand:wikidata":"Q4993863","brand:wikipedia":"sv:Stadium (detaljhandelskedja)",name:"Stadium",shop:"sports"}},"shop/sports|XXL":{countryCodes:["fi","no","se"],tags:{brand:"XXL","brand:wikidata":"Q12010840","brand:wikipedia":"no:XXL",name:"XXL",shop:"sports"}},"shop/sports|Спортмастер":{countryCodes:["by","kz","ru","ua"],matchNames:["спортмастер гипер"],tags:{brand:"Спортмастер","brand:en":"Sportmaster","brand:ru":"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер","name:en":"Sportmaster","name:ru":"Спортмастер",shop:"sports"}},"shop/stationery|Buffetti":{countryCodes:["it"],tags:{brand:"Buffetti",name:"Buffetti",shop:"stationery"}},"shop/stationery|Bureau Vallée":{countryCodes:["fr"],tags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"}},"shop/stationery|McPaper":{countryCodes:["ch","de"],tags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"}},"shop/stationery|Office Depot":{matchTags:["shop/office_supplies"],tags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"}},"shop/stationery|OfficeMax":{countryCodes:["mx","nz","us"],tags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"}},"shop/stationery|Officeworks":{countryCodes:["au"],tags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"}},"shop/stationery|Pagro":{countryCodes:["at"],tags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"}},"shop/stationery|Paper Source":{countryCodes:["us"],tags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"}},"shop/stationery|Paperchase":{countryCodes:["gb"],tags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"}},"shop/stationery|Ryman":{countryCodes:["gb"],tags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"}},"shop/stationery|Staples":{matchTags:["shop/office_supplies"],tags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"}},"shop/stationery|Комус":{countryCodes:["ru"],tags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"}},"shop/storage_rental|Extra Space Storage":{countryCodes:["us"],tags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"}},"shop/storage_rental|Public Storage":{countryCodes:["ca","us"],matchTags:["shop/storage_units"],tags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"}},"shop/supermarket|8 à Huit":{nomatch:["shop/convenience|8 à Huit"],tags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"fr:8 à Huit",name:"8 à Huit",shop:"supermarket"}},"shop/supermarket|99 Ranch Market":{countryCodes:["us"],matchNames:["99 ranch","ranch 99"],tags:{brand:"99 Ranch Market","brand:wikidata":"Q4646307","brand:wikipedia":"en:99 Ranch Market",cuisine:"asian",name:"99 Ranch Market","name:en":"99 Ranch Market","name:zh-Hans":"大华超级市场","name:zh-Hant":"大華超級市場",shop:"supermarket"}},"shop/supermarket|A&O":{countryCodes:["it"],tags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"}},"shop/supermarket|A101":{countryCodes:["tr"],tags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"}},"shop/supermarket|AD Delhaize":{countryCodes:["be","lu"],tags:{brand:"AD Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"AD Delhaize",shop:"supermarket"}},"shop/supermarket|ADEG":{countryCodes:["at"],tags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"}},"shop/supermarket|Acme":{countryCodes:["us"],tags:{brand:"Acme","brand:wikidata":"Q341975","brand:wikipedia":"en:Acme Markets",name:"Acme",shop:"supermarket"}},"shop/supermarket|Ahorramás":{countryCodes:["es"],tags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"}},"shop/supermarket|Albert":{countryCodes:["cz"],tags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"}},"shop/supermarket|Albert Heijn":{countryCodes:["be","nl"],tags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"}},"shop/supermarket|Albertsons":{countryCodes:["us"],matchNames:["albertsons supermarket"],tags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"}},"shop/supermarket|Alcampo":{countryCodes:["es"],tags:{brand:"Alcampo",name:"Alcampo",shop:"supermarket"}},"shop/supermarket|Aldi":{tags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"}},"shop/supermarket|Aldi Nord":{countryCodes:["de"],tags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"}},"shop/supermarket|Aldi Süd":{countryCodes:["de"],tags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"}},"shop/supermarket|Alfamart":{tags:{brand:"Alfamart","brand:wikidata":"Q23745600","brand:wikipedia":"en:Alfamart",name:"Alfamart",shop:"supermarket"}},"shop/supermarket|Alimerka":{countryCodes:["es"],tags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"}},"shop/supermarket|Alnatura":{countryCodes:["ch","de"],tags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",organic:"only",shop:"supermarket"}},"shop/supermarket|Amigo":{countryCodes:["us"],matchNames:["amigo puerto rico","amigo supermarket","supermercado amigo"],tags:{alt_name:"Supermercados Amigo",brand:"Amigo","brand:wikidata":"Q4746234","brand:wikipedia":"en:Amigo Supermarkets",name:"Amigo",shop:"supermarket"}},"shop/supermarket|Ara":{countryCodes:["co"],tags:{brand:"Ara",name:"Ara",shop:"supermarket"}},"shop/supermarket|Asda":{countryCodes:["gb"],nomatch:["amenity/fuel|Asda"],tags:{brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda",shop:"supermarket"}},"shop/supermarket|Atacadão":{countryCodes:["br"],tags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"}},"shop/supermarket|Auchan":{nomatch:["amenity/fuel|Auchan"],tags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"}},"shop/supermarket|Auchan Drive":{countryCodes:["fr","lu"],tags:{brand:"Auchan Drive",name:"Auchan Drive",shop:"supermarket"}},"shop/supermarket|BI-LO":{countryCodes:["us"],tags:{brand:"BI-LO","brand:wikidata":"Q4835620","brand:wikipedia":"en:BI-LO (United States)",name:"BI-LO",shop:"supermarket"}},"shop/supermarket|BM":{countryCodes:["es"],tags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"}},"shop/supermarket|Biedronka":{countryCodes:["pl"],tags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"pl:Biedronka (sieć handlowa)",name:"Biedronka",shop:"supermarket"}},"shop/supermarket|Big Bazaar":{countryCodes:["in"],tags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"supermarket"}},"shop/supermarket|Big C":{countryCodes:["th","vn"],tags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"}},"shop/supermarket|Billa":{tags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"}},"shop/supermarket|Bim":{countryCodes:["ma","tr"],tags:{brand:"Bim","brand:wikidata":"Q1022075","brand:wikipedia":"en:Bim (company)",name:"Bim",shop:"supermarket"}},"shop/supermarket|Bingo":{countryCodes:["ba"],tags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"}},"shop/supermarket|Bio C' Bon":{countryCodes:["es","fr"],tags:{brand:"Bio C' Bon",name:"Bio C' Bon",shop:"supermarket"}},"shop/supermarket|Bio Company":{countryCodes:["de"],tags:{brand:"Bio Company","brand:wikidata":"Q864179","brand:wikipedia":"de:Bio Company",name:"Bio Company",organic:"only",shop:"supermarket"}},"shop/supermarket|Biocoop":{countryCodes:["fr"],tags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera":{tags:{brand:"Bodega Aurrera","brand:wikidata":"Q3365858","brand:wikipedia":"en:Bodega Aurrerá",name:"Bodega Aurrera",shop:"supermarket"}},"shop/supermarket|Bodega Aurrera Express":{countryCodes:["mx"],tags:{brand:"Bodega Aurrera Express",name:"Bodega Aurrera Express",shop:"supermarket"}},"shop/supermarket|Bonpreu":{countryCodes:["es"],tags:{brand:"Bonpreu",name:"Bonpreu",shop:"supermarket"}},"shop/supermarket|Bravo":{countryCodes:["us"],tags:{brand:"Bravo","brand:wikidata":"Q16985159","brand:wikipedia":"en:Bravo (supermarket)",name:"Bravo",shop:"supermarket"}},"shop/supermarket|Brookshire Brothers":{countryCodes:["us"],tags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"}},"shop/supermarket|Brookshire's":{countryCodes:["us"],tags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"}},"shop/supermarket|Budgens":{countryCodes:["gb"],nomatch:["shop/convenience|Budgens"],tags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"}},"shop/supermarket|Bulk Barn":{countryCodes:["ca"],tags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"}},"shop/supermarket|Bunnpris":{countryCodes:["no"],tags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"}},"shop/supermarket|C-Town Supermarkets":{countryCodes:["us"],tags:{brand:"C-Town Supermarkets","brand:wikidata":"Q5005929","brand:wikipedia":"en:C-Town Supermarkets",name:"C-Town",shop:"supermarket"}},"shop/supermarket|CBA":{tags:{brand:"CBA","brand:wikidata":"Q779845","brand:wikipedia":"en:CBA (food retail)",name:"CBA",shop:"supermarket"}},"shop/supermarket|COOP Jednota":{countryCodes:["cz","sk"],matchNames:["jednota"],nomatch:["shop/convenience|COOP Jednota"],tags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"}},"shop/supermarket|Caprabo":{countryCodes:["ad","es"],tags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"}},"shop/supermarket|Cardenas":{countryCodes:["us"],matchNames:["mi pueblo","mi pueblo food center"],tags:{brand:"Cardenas","brand:wikidata":"Q64149543","brand:wikipedia":"en:Cardenas (supermarket)",cuisine:"latin_american",name:"Cardenas",shop:"supermarket"}},"shop/supermarket|Cargills Food City~(Sri Lanka)":{countryCodes:["lk"],nomatch:["shop/supermarket|Food City~(USA)"],tags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City",shop:"supermarket"}},"shop/supermarket|Carrefour":{nomatch:["amenity/fuel|Carrefour","shop/convenience|Carrefour Express"],tags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",shop:"supermarket"}},"shop/supermarket|Carrefour City":{countryCodes:["be","fr"],matchTags:["shop/convenience"],tags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",shop:"supermarket"}},"shop/supermarket|Carrefour Contact":{countryCodes:["fr"],tags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",shop:"supermarket"}},"shop/supermarket|Carrefour Market":{tags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",shop:"supermarket"}},"shop/supermarket|Carulla":{countryCodes:["co"],tags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"}},"shop/supermarket|Casino":{tags:{brand:"Casino",name:"Casino",shop:"supermarket"}},"shop/supermarket|Centra":{tags:{brand:"Centra",name:"Centra",shop:"supermarket"}},"shop/supermarket|Centre Commercial E. Leclerc":{countryCodes:["fr","pl"],tags:{brand:"Centre Commercial E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"Centre Commercial E. Leclerc",shop:"supermarket"}},"shop/supermarket|Chata Polska":{countryCodes:["pl"],nomatch:["shop/convenience|Chata Polska"],tags:{brand:"Chata Polska","brand:wikidata":"Q61994406",name:"Chata Polska",shop:"supermarket"}},"shop/supermarket|Checkers":{countryCodes:["bw","na","za"],nomatch:["amenity/fast_food|Checkers"],tags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"}},"shop/supermarket|Chedraui":{countryCodes:["mx"],tags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"}},"shop/supermarket|City Market":{tags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"}},"shop/supermarket|Co-op~(Canada)":{countryCodes:["ca"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Coop~(Schweiz)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"}},"shop/supermarket|Coles":{countryCodes:["au","gb"],tags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"}},"shop/supermarket|Colruyt":{countryCodes:["be","fr","lu"],tags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"}},"shop/supermarket|Combi":{countryCodes:["de"],tags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"}},"shop/supermarket|Comercial Mexicana":{countryCodes:["mx"],tags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"es:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"}},"shop/supermarket|Conad":{countryCodes:["al","it"],tags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"}},"shop/supermarket|Conad City":{countryCodes:["it"],tags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"}},"shop/supermarket|Condis":{countryCodes:["es"],tags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"}},"shop/supermarket|Consum":{countryCodes:["es"],tags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"}},"shop/supermarket|Continente":{countryCodes:["pt"],tags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"}},"shop/supermarket|Coop Konsum":{countryCodes:["se"],tags:{brand:"Coop Konsum",name:"Coop Konsum",shop:"supermarket"}},"shop/supermarket|Coop Prix":{countryCodes:["no"],tags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"}},"shop/supermarket|Coop~(Schweiz)":{countryCodes:["ch"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|The Co-operative Food~(UK)"],tags:{brand:"Coop","brand:wikidata":"Q432564","brand:wikipedia":"de:Coop (Schweiz)",name:"Coop",shop:"supermarket"}},"shop/supermarket|Cora":{countryCodes:["be","fr","lu","ro"],tags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"}},"shop/supermarket|Costcutter":{nomatch:["shop/convenience|Costcutter"],tags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"}},"shop/supermarket|Coto":{countryCodes:["ar"],tags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"}},"shop/supermarket|Countdown":{countryCodes:["nz"],tags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"}},"shop/supermarket|Covirán":{countryCodes:["es","pt"],tags:{brand:"Covirán",name:"Covirán",shop:"supermarket"}},"shop/supermarket|Crai":{countryCodes:["ch","it"],tags:{brand:"Crai",name:"Crai",shop:"supermarket"}},"shop/supermarket|Cub Foods":{countryCodes:["us"],tags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"}},"shop/supermarket|D'Agostino":{countryCodes:["us"],tags:{brand:"D'Agostino","brand:wikidata":"Q20656844","brand:wikipedia":"en:D'Agostino Supermarkets",name:"D'Agostino",shop:"supermarket"}},"shop/supermarket|D1":{countryCodes:["co"],tags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"}},"shop/supermarket|Dagli'Brugsen":{countryCodes:["dk"],tags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"}},"shop/supermarket|Decò":{countryCodes:["it"],tags:{brand:"Decò",name:"Decò",shop:"supermarket"}},"shop/supermarket|Deen":{countryCodes:["nl"],tags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"}},"shop/supermarket|Delhaize":{countryCodes:["be","lu"],tags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"}},"shop/supermarket|Delikatesy Centrum":{countryCodes:["pl"],nomatch:["shop/convenience|Delikatesy Centrum"],tags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"}},"shop/supermarket|Denner":{countryCodes:["ch","li"],tags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarket)",name:"Denner",shop:"supermarket"}},"shop/supermarket|Despar":{countryCodes:["it"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"}},"shop/supermarket|Despensa Familiar":{countryCodes:["gt","hn","sv"],tags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"}},"shop/supermarket|Dia":{matchNames:["supermercado dia"],tags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia",shop:"supermarket"}},"shop/supermarket|Dia Market":{tags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Dia Market",shop:"supermarket"}},"shop/supermarket|Dino":{countryCodes:["pl"],tags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"}},"shop/supermarket|Dirk van den Broek":{countryCodes:["nl"],tags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"}},"shop/supermarket|Disco~(Argentina)":{countryCodes:["ar"],tags:{brand:"Disco","brand:wikidata":"Q6135978","brand:wikipedia":"es:Disco (supermercado de Argentina)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Disco~(Uruguay)":{countryCodes:["uy"],tags:{brand:"Disco","brand:wikidata":"Q16636819","brand:wikipedia":"es:Disco (supermercado de Uruguay)",name:"Disco",shop:"supermarket"}},"shop/supermarket|Diska":{countryCodes:["de"],tags:{brand:"Diska","brand:wikidata":"Q62390177",name:"Diska",shop:"supermarket"}},"shop/supermarket|Dunnes Stores":{countryCodes:["gb","ie"],tags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"}},"shop/supermarket|E-Center":{countryCodes:["de"],tags:{brand:"E-Center","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"E-Center",shop:"supermarket"}},"shop/supermarket|E. Leclerc":{countryCodes:["es","fr","pl","pt"],tags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"}},"shop/supermarket|E. Leclerc Drive":{countryCodes:["fr"],tags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",shop:"supermarket"}},"shop/supermarket|EMTÉ":{countryCodes:["nl"],tags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"}},"shop/supermarket|Edeka":{countryCodes:["de"],matchNames:["edeka neukauf"],tags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"}},"shop/supermarket|Eko":{countryCodes:["pl"],nomatch:["amenity/fuel|EKO~(Canada)","amenity/fuel|EKO~(Greece)"],tags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"}},"shop/supermarket|Ekom":{countryCodes:["it"],tags:{brand:"Ekom","brand:wikidata":"Q62073442",name:"Ekom",shop:"supermarket"}},"shop/supermarket|Ekono":{countryCodes:["cl"],tags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"}},"shop/supermarket|Eroski":{countryCodes:["es","gi"],matchNames:["charter","eroski center"],tags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"}},"shop/supermarket|Eroski City":{countryCodes:["es"],tags:{brand:"Eroski City",name:"Eroski City",shop:"supermarket"}},"shop/supermarket|Esselunga":{countryCodes:["it"],tags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"}},"shop/supermarket|EuroSpin":{countryCodes:["it","si"],tags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:Eurospin",name:"EuroSpin",shop:"supermarket"}},"shop/supermarket|Eurospar":{tags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"}},"shop/supermarket|Extra":{matchNames:["coop extra"],matchTags:["shop/convenience"],tags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"}},"shop/supermarket|Famila":{countryCodes:["de","it"],tags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"}},"shop/supermarket|Fareway":{countryCodes:["us"],tags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"}},"shop/supermarket|Farm Boy":{countryCodes:["ca"],tags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"}},"shop/supermarket|Farmfoods":{countryCodes:["gb","sk"],tags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"}},"shop/supermarket|Feneberg":{countryCodes:["at","de"],tags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"}},"shop/supermarket|Food 4 Less":{countryCodes:["us"],tags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"}},"shop/supermarket|Food Basics":{tags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"}},"shop/supermarket|Food City~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Cargills Food City~(Sri Lanka)"],tags:{brand:"Food City","brand:wikidata":"Q16981107","brand:wikipedia":"en:Food City (K-VA-T)",name:"Food City",shop:"supermarket"}},"shop/supermarket|Food Lion":{countryCodes:["es","us"],tags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"}},"shop/supermarket|FoodLand~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)"],tags:{brand:"FoodLand","brand:wikidata":"Q5465271","brand:wikipedia":"en:FoodLand",name:"FoodLand",shop:"supermarket"}},"shop/supermarket|FoodMaxx":{countryCodes:["us"],tags:{brand:"FoodMaxx","brand:wikidata":"Q61894844",name:"FoodMaxx",shop:"supermarket"}},"shop/supermarket|Foodland~(Australia)":{countryCodes:["au"],nomatch:["shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465555","brand:wikipedia":"en:Foodland (South Australia)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Hawaii)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465554","brand:wikipedia":"en:Foodland (Canada)",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodland~(Hawaii)":{countryCodes:["us"],nomatch:["shop/supermarket|Foodland~(Australia)","shop/supermarket|Foodland~(Canada)","shop/supermarket|Foodland~(USA)"],tags:{brand:"Foodland","brand:wikidata":"Q5465560","brand:wikipedia":"en:Foodland Hawaii",name:"Foodland",shop:"supermarket"}},"shop/supermarket|Foodworks":{countryCodes:["au"],tags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"}},"shop/supermarket|Fortinos":{countryCodes:["ca"],tags:{brand:"Fortinos","brand:wikidata":"Q5472662","brand:wikipedia":"en:Fortinos",name:"Fortinos",shop:"supermarket"}},"shop/supermarket|Four Square":{tags:{brand:"Four Square",name:"Four Square",shop:"supermarket"}},"shop/supermarket|Fred Meyer":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"}},"shop/supermarket|Fresh":{tags:{brand:"Fresh","brand:wikidata":"Q50737403","brand:wikipedia":"sk:Fresh",name:"Fresh",shop:"supermarket"}},"shop/supermarket|Fresh Thyme":{countryCodes:["us"],matchNames:["fresh thyme farmers market"],tags:{brand:"Fresh Thyme","brand:wikidata":"Q64132791",name:"Fresh Thyme",shop:"supermarket"}},"shop/supermarket|FreshCo":{countryCodes:["ca"],tags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"}},"shop/supermarket|Froiz":{countryCodes:["es","pt"],tags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"}},"shop/supermarket|Føtex":{countryCodes:["dk"],tags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"}},"shop/supermarket|G20":{countryCodes:["fr"],tags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"}},"shop/supermarket|GBarbosa":{countryCodes:["br"],tags:{brand:"GBarbosa","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"}},"shop/supermarket|Gadis":{countryCodes:["es"],tags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"}},"shop/supermarket|Giant Eagle":{countryCodes:["us"],tags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"}},"shop/supermarket|Giant~(Carlisle)":{countryCodes:["us"],nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant","brand:wikidata":"Q5558332","brand:wikipedia":"en:Giant Food Stores",name:"Giant",shop:"supermarket"}},"shop/supermarket|Giant~(Landover)":{countryCodes:["us"],nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant","brand:wikidata":"Q5558336","brand:wikipedia":"en:Giant Food (Landover)",name:"Giant",shop:"supermarket"}},"shop/supermarket|Globus":{tags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"}},"shop/supermarket|Gordon Food Service":{countryCodes:["ca","us"],tags:{brand:"Gordon Food Service","brand:wikidata":"Q1538006","brand:wikipedia":"en:Gordon Food Service",name:"Gordon Food Service",shop:"supermarket"}},"shop/supermarket|Grand Frais":{countryCodes:["fr"],tags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"}},"shop/supermarket|Grocery Outlet":{countryCodes:["us"],tags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",official_name:"Grocery Outlet Bargain Market",shop:"supermarket"}},"shop/supermarket|Groszek":{countryCodes:["pl"],nomatch:["shop/convenience|Groszek"],tags:{brand:"Groszek","brand:wikidata":"Q9280965","brand:wikipedia":"pl:Groszek (sieć sklepów)",name:"Groszek",shop:"supermarket"}},"shop/supermarket|Géant Casino":{countryCodes:["cg","fr"],tags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"}},"shop/supermarket|H Mart":{countryCodes:["ca","gb","us"],tags:{"alt_name:ko":"H 마트",brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"H Mart","name:en":"H Mart","name:ko":"한아름","name:zh-Hans":"韩亚龙","name:zh-Hant":"韓亞龍",shop:"supermarket"}},"shop/supermarket|H-E-B":{countryCodes:["mx","us"],tags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"}},"shop/supermarket|HIT":{countryCodes:["de"],tags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"}},"shop/supermarket|HalpaHalli":{countryCodes:["ee","fi","ru"],tags:{brand:"HalpaHalli","brand:wikidata":"Q11861256","brand:wikipedia":"fi:HalpaHalli",name:"HalpaHalli",shop:"supermarket"}},"shop/supermarket|Hannaford":{countryCodes:["us"],tags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"}},"shop/supermarket|Harris Teeter":{countryCodes:["us"],tags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"}},"shop/supermarket|Hemköp":{countryCodes:["se"],tags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"}},"shop/supermarket|Heron Foods":{countryCodes:["gb"],tags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"}},"shop/supermarket|Hofer":{countryCodes:["at","si"],nomatch:["amenity/fuel|Hofer"],tags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"}},"shop/supermarket|Hoogvliet":{countryCodes:["nl"],tags:{brand:"Hoogvliet","brand:wikidata":"Q2770647","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"}},"shop/supermarket|Hruška":{nomatch:["shop/convenience|Hruška"],tags:{brand:"Hruška",name:"Hruška",shop:"supermarket"}},"shop/supermarket|Hy-Vee":{countryCodes:["us"],tags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"}},"shop/supermarket|Hyper U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Super U","shop/supermarket|U Express"],tags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"}},"shop/supermarket|ICA":{countryCodes:["no","se"],matchNames:["ica supermarket"],nomatch:["shop/supermarket|ICA Kvantum","shop/supermarket|ICA Maxi"],tags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"}},"shop/supermarket|ICA Kvantum":{countryCodes:["se"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Maxi"],tags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"}},"shop/supermarket|ICA Maxi":{countryCodes:["no","se"],matchNames:["maxi"],nomatch:["shop/supermarket|ICA","shop/supermarket|ICA Kvantum"],tags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"}},"shop/supermarket|IDEA":{countryCodes:["rs"],tags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"}},"shop/supermarket|IGA":{countryCodes:["au","ca","us"],tags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"}},"shop/supermarket|Ingles":{countryCodes:["us"],tags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"}},"shop/supermarket|Intermarché":{tags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"}},"shop/supermarket|Intermarché Super":{countryCodes:["be","fr","pl","pt"],tags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"}},"shop/supermarket|Interspar":{countryCodes:["at"],tags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"}},"shop/supermarket|Irma":{countryCodes:["dk"],tags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"}},"shop/supermarket|Jan Linders":{countryCodes:["nl"],tags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"}},"shop/supermarket|Jewel-Osco":{countryCodes:["us"],tags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"}},"shop/supermarket|Jumbo":{tags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"}},"shop/supermarket|K+K":{countryCodes:["de"],tags:{brand:"K+K","brand:wikidata":"Q1718009","brand:wikipedia":"de:K+K Klaas & Kock",name:"K+K",shop:"supermarket"}},"shop/supermarket|K-Citymarket":{countryCodes:["fi"],tags:{brand:"K-Citymarket","brand:wikidata":"Q11868561","brand:wikipedia":"fi:K-Citymarket",name:"K-Citymarket",shop:"supermarket"}},"shop/supermarket|K-Supermarket":{countryCodes:["fi"],tags:{brand:"K-Supermarket","brand:wikidata":"Q5408668","brand:wikipedia":"fi:K-Supermarket",name:"K-Supermarket",shop:"supermarket"}},"shop/supermarket|Kaufland":{countryCodes:["bg","cz","de","hr","pl","ro","sk"],tags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"}},"shop/supermarket|King Soopers":{countryCodes:["us"],tags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"}},"shop/supermarket|Kings":{countryCodes:["us"],tags:{brand:"Kings","brand:wikidata":"Q6412914","brand:wikipedia":"en:Kings Food Markets",name:"Kings",shop:"supermarket"}},"shop/supermarket|Kiwi":{countryCodes:["dk","no"],tags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"}},"shop/supermarket|Konsum":{countryCodes:["de","ee","se"],tags:{brand:"Konsum",name:"Konsum",shop:"supermarket"}},"shop/supermarket|Konzum~(Balkans)":{countryCodes:["ba","hr","rs"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Czechia)"],tags:{brand:"Konzum","brand:wikidata":"Q518563","brand:wikipedia":"hr:Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Konzum~(Czechia)":{countryCodes:["cz","sk"],nomatch:["shop/convenience|Konzum~(Balkans)","shop/convenience|Konzum~(Czechia)","shop/supermarket|Konzum~(Balkans)"],tags:{brand:"Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Kroger":{matchNames:["krogers"],nomatch:["amenity/fuel|Kroger"],tags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"}},"shop/supermarket|Kroger Marketplace":{nomatch:["amenity/fuel|Kroger"],tags:{brand:"Kroger Marketplace","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger Marketplace",shop:"supermarket"}},"shop/supermarket|Kvickly":{countryCodes:["dk"],tags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"}},"shop/supermarket|La Anónima":{countryCodes:["ar"],tags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"}},"shop/supermarket|La Comer":{countryCodes:["mx"],tags:{brand:"La Comer","brand:wikidata":"Q26765126","brand:wikipedia":"es:La Comer",name:"La Comer",shop:"supermarket"}},"shop/supermarket|La Michoacana Meat Market":{countryCodes:["us"],matchNames:["la michoacana"],tags:{brand:"La Michoacana Meat Market","brand:en":"La Michoacana Meat Market","brand:es":"La Michoacana","brand:wikidata":"Q6463872","brand:wikipedia":"en:La Michoacana Meat Market",cuisine:"latin_american",name:"La Michoacana Meat Market","name:en":"La Michoacana Meat Market","name:es":"La Michoacana",shop:"supermarket"}},"shop/supermarket|La Plaza de DIA":{countryCodes:["es"],tags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA",shop:"supermarket"}},"shop/supermarket|La Vie Claire":{countryCodes:["fr"],tags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"}},"shop/supermarket|Landi":{countryCodes:["ch"],tags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"}},"shop/supermarket|Leader Price":{tags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"}},"shop/supermarket|Leclerc Drive":{countryCodes:["fr"],tags:{brand:"Leclerc Drive",name:"Leclerc Drive",shop:"supermarket"}},"shop/supermarket|Lewiatan":{countryCodes:["pl"],nomatch:["shop/convenience|Lewiatan"],tags:{brand:"Lewiatan","brand:wikidata":"Q11755396","brand:wikipedia":"pl:Lewiatan (sieć handlowa)",name:"Lewiatan",shop:"supermarket"}},"shop/supermarket|Lider":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider Express"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"}},"shop/supermarket|Lider Express":{countryCodes:["cl"],nomatch:["shop/supermarket|Lider"],tags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"}},"shop/supermarket|Lidl":{tags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"}},"shop/supermarket|Lincolnshire Co-op":{countryCodes:["gb"],tags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"}},"shop/supermarket|Linella":{countryCodes:["md"],tags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"}},"shop/supermarket|Loblaws":{countryCodes:["ca"],matchNames:["loblaws great food"],tags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"}},"shop/supermarket|Londis":{tags:{brand:"Londis",name:"Londis",shop:"supermarket"}},"shop/supermarket|Lotte Mart":{countryCodes:["id","kr"],tags:{brand:"Lotte Mart","brand:wikidata":"Q326715","brand:wikipedia":"en:Lotte Mart",name:"Lotte Mart",shop:"supermarket"}},"shop/supermarket|Lowe's Market":{countryCodes:["us"],nomatch:["shop/clothes|Lowes","shop/doityourself|Lowe's","shop/supermarket|Lowes Foods"],tags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"}},"shop/supermarket|Lowes Foods":{countryCodes:["us"],nomatch:["shop/clothes|Lowes","shop/doityourself|Lowe's","shop/supermarket|Lowe's Market"],tags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"}},"shop/supermarket|Lucky":{countryCodes:["us"],matchNames:["luckys"],tags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"}},"shop/supermarket|Lupa":{countryCodes:["es"],tags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"}},"shop/supermarket|M&S Simply Food":{nomatch:["shop/convenience|M&S Simply Food"],tags:{brand:"M&S Simply Food",name:"M&S Simply Food",shop:"supermarket"}},"shop/supermarket|MD":{countryCodes:["it"],matchNames:["md discount"],tags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"}},"shop/supermarket|MPREIS":{countryCodes:["at","it"],tags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"}},"shop/supermarket|Marc's":{countryCodes:["us"],nomatch:["amenity/pharmacy|Marc's"],tags:{brand:"Marc's","brand:wikidata":"Q17080259","brand:wikipedia":"en:Marc's",name:"Marc's",shop:"supermarket"}},"shop/supermarket|Markant":{countryCodes:["de"],tags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"}},"shop/supermarket|Market Basket":{tags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"}},"shop/supermarket|Marktkauf":{countryCodes:["de"],tags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"}},"shop/supermarket|Martin's Super Markets":{countryCodes:["us"],tags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"}},"shop/supermarket|Match":{countryCodes:["be","fr","hu","lu"],tags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"}},"shop/supermarket|Maxi Dia":{countryCodes:["es"],tags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados DIA",name:"Maxi Dia",shop:"supermarket"}},"shop/supermarket|Maxima X":{countryCodes:["bg","ee","lt","lv"],nomatch:["shop/supermarket|Maxima XX","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"}},"shop/supermarket|Maxima XX":{countryCodes:["bg","ee","lt","lv","pl"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XXX"],tags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"}},"shop/supermarket|Maxima XXX":{countryCodes:["bg","ee","lt","lv","pl"],matchNames:["maxima"],nomatch:["shop/supermarket|Maxima X","shop/supermarket|Maxima XX"],tags:{brand:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XXX",shop:"supermarket"}},"shop/supermarket|Maxi~(Canada)":{countryCodes:["ca"],nomatch:["shop/supermarket|Maxi~(Serbia)"],tags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Maxi~(Serbia)":{countryCodes:["rs"],nomatch:["shop/supermarket|Maxi~(Canada)"],tags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (Serbian supermarket)",name:"Maxi",shop:"supermarket"}},"shop/supermarket|Mega Image":{countryCodes:["ro"],tags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"}},"shop/supermarket|Mego":{countryCodes:["lv"],tags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"}},"shop/supermarket|Meijer":{countryCodes:["us"],tags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"}},"shop/supermarket|Meny":{countryCodes:["dk","no"],tags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"}},"shop/supermarket|Mercadona":{tags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"}},"shop/supermarket|Mercator":{countryCodes:["ba","hz","me","rs","si"],tags:{brand:"Mercator","brand:wikidata":"Q738412","brand:wikipedia":"en:Mercator (retail)",name:"Mercator",shop:"supermarket"}},"shop/supermarket|Merkur":{countryCodes:["at"],tags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"}},"shop/supermarket|Metro~(Canada)":{countryCodes:["ca"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"}},"shop/supermarket|Metro~(Peru)":{countryCodes:["pe"],nomatch:["shop/wholesale|Metro"],tags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",shop:"supermarket"}},"shop/supermarket|Migros":{tags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"}},"shop/supermarket|Mila":{countryCodes:["pl"],tags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"}},"shop/supermarket|Minipreço":{tags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"}},"shop/supermarket|Mix Markt":{countryCodes:["de"],tags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"}},"shop/supermarket|Monoprix":{tags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"}},"shop/supermarket|More":{countryCodes:["in"],tags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"}},"shop/supermarket|Morrisons":{countryCodes:["gb"],nomatch:["amenity/fuel|Morrisons"],tags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"}},"shop/supermarket|NP":{matchNames:["np-markt"],nomatch:["amenity/fuel|NP"],tags:{brand:"NP",name:"NP",shop:"supermarket"}},"shop/supermarket|Nah & Frisch":{countryCodes:["at","de"],matchNames:["nah und frisch"],tags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"}},"shop/supermarket|Nahkauf":{countryCodes:["de"],tags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"}},"shop/supermarket|Natural Grocers":{countryCodes:["us"],tags:{brand:"Natural Grocers",name:"Natural Grocers",shop:"supermarket"}},"shop/supermarket|Naturalia":{countryCodes:["fr"],tags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"}},"shop/supermarket|Netto":{tags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"}},"shop/supermarket|Netto Marken-Discount":{countryCodes:["de"],tags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"}},"shop/supermarket|New World":{countryCodes:["nz"],tags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"}},"shop/supermarket|No Frills":{countryCodes:["ca"],tags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"}},"shop/supermarket|Norfa XL":{countryCodes:["lt"],tags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"}},"shop/supermarket|Norma":{countryCodes:["at","cz","de","fr"],tags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"}},"shop/supermarket|Northern Store":{countryCodes:["ca"],tags:{brand:"Northern Store","brand:wikidata":"Q7754361","brand:wikipedia":"en:The North West Company",name:"Northern Store",shop:"supermarket"}},"shop/supermarket|Okay":{countryCodes:["be"],tags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"}},"shop/supermarket|Olímpica":{countryCodes:["co"],tags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Grupo Empresarial Olímpica",name:"Olímpica",shop:"supermarket"}},"shop/supermarket|PLUS":{countryCodes:["nl"],nomatch:["shop/mobile_phone|Plus"],tags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"}},"shop/supermarket|POLOmarket":{countryCodes:["pl"],tags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"pl:Polomarket",name:"POLOmarket",shop:"supermarket"}},"shop/supermarket|Palí":{countryCodes:["cr","ni"],tags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"}},"shop/supermarket|Pam":{countryCodes:["ch","it"],tags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"}},"shop/supermarket|Patel Brothers":{countryCodes:["us"],tags:{brand:"Patel Brothers","brand:wikidata":"Q55641396","brand:wikipedia":"en:Patel Brothers",cuisine:"indian",name:"Patel Brothers",shop:"supermarket"}},"shop/supermarket|Pavilions":{countryCodes:["us"],tags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"}},"shop/supermarket|Penny":{countryCodes:["at","cz","de","hu","it","ro"],matchNames:["penny market","penny markt"],tags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"}},"shop/supermarket|Pick 'n Save":{countryCodes:["us","za"],tags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"}},"shop/supermarket|Pick n Pay":{tags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"}},"shop/supermarket|Piggly Wiggly":{countryCodes:["gb","us"],tags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"}},"shop/supermarket|Pingo Doce":{countryCodes:["pt"],tags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"}},"shop/supermarket|Piotr i Paweł":{countryCodes:["pl"],tags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"pl:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"}},"shop/supermarket|Plaza Vea":{tags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"}},"shop/supermarket|Plodine":{countryCodes:["hr"],tags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"}},"shop/supermarket|Poiesz":{countryCodes:["nl"],tags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"}},"shop/supermarket|Price Chopper~(Kansas City)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(New York)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Price Chopper~(New York)":{countryCodes:["us"],nomatch:["shop/supermarket|Price Chopper~(Kansas City)"],tags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"}},"shop/supermarket|Prisma":{countryCodes:["ee","fi","ru"],tags:{brand:"Prisma","brand:wikidata":"Q12047031","brand:wikipedia":"fi:Prisma (kauppaketju)",name:"Prisma",shop:"supermarket"}},"shop/supermarket|Prix":{countryCodes:["it"],matchNames:["prix quality"],tags:{brand:"Prix","brand:wikidata":"Q61994819",name:"Prix",shop:"supermarket"}},"shop/supermarket|Profi":{countryCodes:["be","hu","ro"],tags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"}},"shop/supermarket|Profi City":{countryCodes:["ro"],tags:{brand:"Profi City",name:"Profi City",shop:"supermarket"}},"shop/supermarket|Provigo":{countryCodes:["ca"],tags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"}},"shop/supermarket|Proxy Delhaize":{countryCodes:["be","lu"],tags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"}},"shop/supermarket|Publix":{countryCodes:["br","us"],tags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"}},"shop/supermarket|Pueblo":{countryCodes:["us"],tags:{brand:"Pueblo","brand:wikidata":"Q7258464","brand:wikipedia":"en:Pueblo Supermarkets",name:"Pueblo",official_name:"Supermercados Pueblo","official_name:en":"Pueblo Supermarkets","official_name:es":"Supermercados Pueblo",shop:"supermarket"}},"shop/supermarket|Punto Simply":{countryCodes:["it"],tags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"}},"shop/supermarket|Puregold":{countryCodes:["ph"],tags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"}},"shop/supermarket|Pão de Açúcar":{countryCodes:["br","pt"],tags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"}},"shop/supermarket|QFC":{countryCodes:["us"],tags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"}},"shop/supermarket|Raley's":{countryCodes:["us"],tags:{brand:"Raley's","brand:wikidata":"Q7286970","brand:wikipedia":"en:Raley's Supermarkets",name:"Raley's",shop:"supermarket"}},"shop/supermarket|Ralphs":{countryCodes:["us"],tags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"}},"shop/supermarket|Real":{tags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"}},"shop/supermarket|Real Canadian Superstore":{countryCodes:["ca"],tags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"}},"shop/supermarket|Redner's":{countryCodes:["us"],matchNames:["redners warehouse market"],tags:{brand:"Redner's","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's",shop:"supermarket"}},"shop/supermarket|Reliance Fresh":{countryCodes:["in"],tags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"}},"shop/supermarket|Rema 1000":{countryCodes:["dk","no"],tags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"}},"shop/supermarket|Rewe":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe City"],tags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"}},"shop/supermarket|Rewe City":{countryCodes:["de"],nomatch:["shop/supermarket|Rewe"],tags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"}},"shop/supermarket|Rimi":{countryCodes:["ee","lt","lv"],tags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"}},"shop/supermarket|S-market":{countryCodes:["fi"],tags:{brand:"S-market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-market",shop:"supermarket"}},"shop/supermarket|Safeway":{nomatch:["amenity/fuel|Safeway"],tags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"}},"shop/supermarket|Sainsbury's":{countryCodes:["gb"],nomatch:["amenity/fuel|Sainsbury's"],tags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"}},"shop/supermarket|Santa Isabel":{countryCodes:["cl"],tags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"}},"shop/supermarket|Save-A-Lot":{countryCodes:["us"],tags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"}},"shop/supermarket|Save-On-Foods":{countryCodes:["ca"],tags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"}},"shop/supermarket|Schnucks":{countryCodes:["us"],tags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"}},"shop/supermarket|Shaw's":{countryCodes:["us"],tags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"}},"shop/supermarket|ShopRite~(USA)":{countryCodes:["us"],nomatch:["shop/supermarket|Shoprite~(Africa)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Africa)":{countryCodes:["ao","bw","cd","gh","ls","mg","mu","mw","mz","na","ng","sz","ug","za","zm"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Isle of Man)"],tags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:Shoprite (South Africa)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Shoprite~(Isle of Man)":{countryCodes:["im"],nomatch:["shop/supermarket|ShopRite~(USA)","shop/supermarket|Shoprite~(Africa)"],tags:{brand:"Shoprite","brand:wikidata":"Q7501242","brand:wikipedia":"en:Shoprite (Isle of Man)",name:"Shoprite",shop:"supermarket"}},"shop/supermarket|Sigma":{countryCodes:["it"],tags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"}},"shop/supermarket|Simply Market":{matchNames:["simply"],tags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"}},"shop/supermarket|Sky":{countryCodes:["de","lv","nl"],tags:{brand:"Sky","brand:wikidata":"Q1129779","brand:wikipedia":"de:Coop eG",name:"Sky",shop:"supermarket"}},"shop/supermarket|Smart & Final":{countryCodes:["mx","us"],tags:{brand:"Smart & Final",name:"Smart & Final",shop:"supermarket"}},"shop/supermarket|Smith's":{countryCodes:["ca","us"],nomatch:["amenity/fuel|Smith's"],tags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"}},"shop/supermarket|Sobeys":{countryCodes:["ca"],tags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"}},"shop/supermarket|Soriana":{countryCodes:["mx"],tags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"}},"shop/supermarket|Spar":{nomatch:["shop/convenience|Spar","shop/convenience|Spar Express"],tags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"}},"shop/supermarket|Społem":{nomatch:["shop/convenience|Społem"],tags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"}},"shop/supermarket|Sprouts Farmers Market":{countryCodes:["us"],tags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"}},"shop/supermarket|Stater Bros.":{countryCodes:["us"],tags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"}},"shop/supermarket|Stokrotka":{countryCodes:["pl"],tags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"pl:Stokrotka (sieć handlowa)",name:"Stokrotka",shop:"supermarket"}},"shop/supermarket|Stop & Shop":{countryCodes:["us"],tags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"}},"shop/supermarket|Studenac":{tags:{brand:"Studenac",name:"Studenac",shop:"supermarket"}},"shop/supermarket|Suma":{countryCodes:["es"],tags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"}},"shop/supermarket|Super 1 Foods":{countryCodes:["us"],tags:{brand:"Super 1 Foods",name:"Super 1 Foods",shop:"supermarket"}},"shop/supermarket|Super C":{tags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"}},"shop/supermarket|Super H Mart":{countryCodes:["us"],tags:{brand:"H Mart","brand:wikidata":"Q5636306","brand:wikipedia":"en:H Mart",cuisine:"asian",name:"Super H Mart",shop:"supermarket"}},"shop/supermarket|Super One Foods":{countryCodes:["us"],tags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"}},"shop/supermarket|Super U":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|U Express"],tags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"}},"shop/supermarket|SuperBrugsen":{countryCodes:["dk"],tags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"}},"shop/supermarket|SuperValu":{tags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)",name:"SuperValu",shop:"supermarket"}},"shop/supermarket|Superama":{countryCodes:["mx"],tags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"}},"shop/supermarket|Supercor":{countryCodes:["es","pt"],tags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"}},"shop/supermarket|Supersol":{countryCodes:["ar","es","ma","uy"],tags:{brand:"Supersol","brand:wikidata":"Q62073427",name:"Supersol",shop:"supermarket"}},"shop/supermarket|Superspar":{countryCodes:["es","za"],tags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"}},"shop/supermarket|T&T Supermarket":{countryCodes:["ca"],tags:{brand:"T&T Supermarket","brand:wikidata":"Q837893","brand:wikipedia":"en:T & T Supermarket",name:"T&T Supermarket",shop:"supermarket"}},"shop/supermarket|Tegut":{countryCodes:["de"],tags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"}},"shop/supermarket|Tesco":{nomatch:["shop/convenience|Tesco Express","shop/supermarket|Tesco Express"],tags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"}},"shop/supermarket|Tesco Express":{tags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"}},"shop/supermarket|Tesco Extra":{tags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"}},"shop/supermarket|Tesco Lotus":{countryCodes:["th"],nomatch:["shop/convenience|Tesco Lotus Express"],tags:{brand:"Tesco Lotus",name:"Tesco Lotus",shop:"supermarket"}},"shop/supermarket|Tesco Metro":{countryCodes:["gb"],tags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"}},"shop/supermarket|The Co-operative Food~(UK)":{countryCodes:["gb"],matchNames:["coop","coop food","cooperative food","the cooperative"],nomatch:["amenity/fuel|Co-op~(Canada)","shop/convenience|Co-op~(Canada)","shop/convenience|Coop~(Schweiz)","shop/convenience|The Co-operative Food~(UK)","shop/supermarket|Co-op~(Canada)","shop/supermarket|Coop~(Schweiz)"],tags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"}},"shop/supermarket|The Fresh Market":{countryCodes:["us"],matchNames:["fresh market"],tags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"}},"shop/supermarket|Tigros":{tags:{brand:"Tigros",name:"Tigros",shop:"supermarket"}},"shop/supermarket|Todis":{countryCodes:["it"],tags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"}},"shop/supermarket|Tommy":{countryCodes:["hr"],tags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"}},"shop/supermarket|Top Market":{countryCodes:["pl"],tags:{brand:"Top Market","brand:wikidata":"Q9360044","brand:wikipedia":"pl:Top Market",name:"Top Market",shop:"supermarket"}},"shop/supermarket|Tops":{countryCodes:["us"],tags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",official_name:"Tops Friendly Markets",shop:"supermarket"}},"shop/supermarket|Tottus":{countryCodes:["cl","pe"],tags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"}},"shop/supermarket|Trader Joe's":{countryCodes:["us"],tags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"}},"shop/supermarket|Treff 3000":{countryCodes:["de"],tags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"}},"shop/supermarket|Tuodì":{countryCodes:["it"],tags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"}},"shop/supermarket|U Express":{countryCodes:["fr"],nomatch:["amenity/fuel|Super U","shop/convenience|Utile","shop/supermarket|Hyper U","shop/supermarket|Super U"],tags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"}},"shop/supermarket|Unimarc":{countryCodes:["cl"],tags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"}},"shop/supermarket|Unimarkt":{countryCodes:["at"],tags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"}},"shop/supermarket|Vallarta":{countryCodes:["us"],tags:{brand:"Vallarta","brand:wikidata":"Q7911833","brand:wikipedia":"en:Vallarta Supermarkets",cuisine:"latin_american",name:"Vallarta","name:es":"Vallarta",official_name:"Vallarta Supermarkets",shop:"supermarket"}},"shop/supermarket|Valu-mart":{countryCodes:["ca"],tags:{brand:"Valu-mart","brand:wikidata":"Q7912687","brand:wikipedia":"en:Valu-mart",name:"Valu-mart",shop:"supermarket"}},"shop/supermarket|Vea":{countryCodes:["ar"],tags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"}},"shop/supermarket|VinMart":{countryCodes:["vn"],matchTags:["shop/department_store"],nomatch:["shop/convenience|VinMart+"],tags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"}},"shop/supermarket|Volg":{countryCodes:["ch","li"],tags:{brand:"Volg","brand:wikidata":"Q2530746","brand:wikipedia":"de:Volg",name:"Volg",shop:"supermarket"}},"shop/supermarket|Vomar":{countryCodes:["nl"],tags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"}},"shop/supermarket|Vons":{countryCodes:["us"],tags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"}},"shop/supermarket|Waitrose":{countryCodes:["gb","je"],tags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose & Partners",name:"Waitrose",shop:"supermarket"}},"shop/supermarket|Walmart Neighborhood Market":{countryCodes:["ca","mx","us"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",shop:"supermarket"}},"shop/supermarket|Walmart Supercenter":{matchNames:["walmart supercentre"],matchTags:["shop/department_store"],tags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",shop:"supermarket"}},"shop/supermarket|Wasgau":{countryCodes:["de"],tags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"}},"shop/supermarket|Wegmans":{countryCodes:["us"],tags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"}},"shop/supermarket|Weis":{countryCodes:["us"],tags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"}},"shop/supermarket|Whole Foods Market":{countryCodes:["ca","gb","us"],matchNames:["whole foods"],tags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"}},"shop/supermarket|Willys":{countryCodes:["se"],tags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"}},"shop/supermarket|WinCo Foods":{countryCodes:["us"],tags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"}},"shop/supermarket|Winn-Dixie":{countryCodes:["us"],tags:{brand:"Winn-Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn-Dixie",shop:"supermarket"}},"shop/supermarket|Woolworths":{countryCodes:["au"],nomatch:["shop/clothes|Woolworths"],tags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"}},"shop/supermarket|Your Independent Grocer":{countryCodes:["ca"],matchNames:["independent"],tags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"}},"shop/supermarket|Zehrs":{countryCodes:["ca"],tags:{brand:"Zehrs","brand:wikidata":"Q8068546","brand:wikipedia":"en:Zehrs Markets",name:"Zehrs",shop:"supermarket"}},"shop/supermarket|basic":{countryCodes:["de"],tags:{brand:"basic","brand:wikidata":"Q809994","brand:wikipedia":"de:Basic AG",name:"basic",organic:"only",shop:"supermarket"}},"shop/supermarket|denn's Biomarkt":{countryCodes:["at","de"],tags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",organic:"only",shop:"supermarket"}},"shop/supermarket|fakta":{countryCodes:["dk"],tags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"}},"shop/supermarket|Şok":{countryCodes:["tr"],tags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"}},"shop/supermarket|ΑΒ Βασιλόπουλος":{countryCodes:["gr"],tags:{brand:"ΑΒ Βασιλόπουλος","brand:el":"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:el":"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"}},"shop/supermarket|Γαλαξίας":{countryCodes:["gr"],tags:{brand:"Γαλαξίας","brand:el":"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:el":"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"}},"shop/supermarket|Μασούτης":{countryCodes:["gr"],tags:{brand:"Μασούτης","brand:el":"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:el":"Μασούτης","name:en":"Masoutis",shop:"supermarket"}},"shop/supermarket|Σκλαβενίτης":{countryCodes:["gr"],tags:{brand:"Σκλαβενίτης","brand:el":"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:el":"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"}},"shop/supermarket|АТБ":{tags:{brand:"АТБ",name:"АТБ",shop:"supermarket"}},"shop/supermarket|Абсолют~(Russia)":{countryCodes:["ru"],tags:{brand:"Абсолют","brand:wikidata":"Q62389597",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Абсолют~(Ukraine)":{countryCodes:["ua"],tags:{brand:"Абсолют","brand:wikidata":"Q62389546",name:"Абсолют",shop:"supermarket"}},"shop/supermarket|Авоська":{tags:{brand:"Авоська",name:"Авоська",shop:"supermarket"}},"shop/supermarket|Азбука Вкуса":{countryCodes:["ru"],tags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"}},"shop/supermarket|Атак":{countryCodes:["ru"],tags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"}},"shop/supermarket|Ашан":{countryCodes:["ru","ua"],tags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"}},"shop/supermarket|Байрам":{countryCodes:["ru"],tags:{brand:"Байрам",name:"Байрам",shop:"supermarket"}},"shop/supermarket|Брусничка":{countryCodes:["ua"],tags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"}},"shop/supermarket|Верный":{tags:{brand:"Верный",name:"Верный",shop:"supermarket"}},"shop/supermarket|Виктория":{countryCodes:["ru"],matchTags:["shop/convenience"],nomatch:["amenity/cafe|Виктория","shop/hairdresser|Виктория"],tags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"}},"shop/supermarket|Виталюр":{countryCodes:["by"],tags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"}},"shop/supermarket|Вопак":{countryCodes:["ua"],tags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"}},"shop/supermarket|Гастроном":{tags:{brand:"Гастроном",name:"Гастроном",shop:"supermarket"}},"shop/supermarket|Гроздь":{nomatch:["shop/convenience|Гроздь"],tags:{brand:"Гроздь","brand:wikidata":"Q21638412","brand:wikipedia":"ru:Гроздь (сеть магазинов)",name:"Гроздь",shop:"supermarket"}},"shop/supermarket|Гулливер":{countryCodes:["ru"],tags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"}},"shop/supermarket|Десяточка":{countryCodes:["ru"],tags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"}},"shop/supermarket|Дикси":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"}},"shop/supermarket|Евроопт":{countryCodes:["by"],matchTags:["shop/convenience"],tags:{brand:"Евроопт","brand:en":"Euroopt","brand:ru":"Евроопт","brand:wikidata":"Q2565040","brand:wikipedia":"be:Еўрагандаль",name:"Евроопт","name:en":"Euroopt","name:ru":"Евроопт",shop:"supermarket"}},"shop/supermarket|Евроопт Hyper":{countryCodes:["by"],matchNames:["евроопт Гипер"],tags:{brand:"Евроопт Hyper","brand:wikidata":"Q65455975",name:"Евроопт Hyper",shop:"supermarket"}},"shop/supermarket|Евроопт Market":{tags:{brand:"Евроопт Market",name:"Евроопт Market",shop:"supermarket"}},"shop/supermarket|Евроопт Super":{countryCodes:["by"],matchNames:["евроопт Супер"],tags:{brand:"Евроопт Super","brand:wikidata":"Q65455960",name:"Евроопт Super",shop:"supermarket"}},"shop/supermarket|Караван":{countryCodes:["ru","ua"],tags:{brand:"Караван",name:"Караван",shop:"supermarket"}},"shop/supermarket|Карусель":{countryCodes:["ru"],tags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"}},"shop/supermarket|Квартал":{tags:{brand:"Квартал",name:"Квартал",shop:"supermarket"}},"shop/supermarket|Кировский":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"}},"shop/supermarket|Командор":{countryCodes:["ru"],tags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"}},"shop/supermarket|Красный Яр":{countryCodes:["ru"],tags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"}},"shop/supermarket|Лента":{countryCodes:["ru"],tags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"}},"shop/supermarket|Магазин":{tags:{brand:"Магазин",name:"Магазин",shop:"supermarket"}},"shop/supermarket|Магнит":{matchTags:["shop/department_store"],nomatch:["shop/convenience|Магнит","shop/cosmetics|Магнит Косметик"],tags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"}},"shop/supermarket|Магнит у дома":{countryCodes:["ru"],tags:{brand:"Магнит у дома",name:"Магнит у дома",shop:"supermarket"}},"shop/supermarket|Магнолия":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{brand:"Магнолия","brand:wikipedia":"ru:Магнолия (сеть магазинов)",name:"Магнолия",shop:"supermarket"}},"shop/supermarket|Мария-Ра":{countryCodes:["ru"],nomatch:["shop/convenience|Мария-Ра"],tags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"}},"shop/supermarket|Мираторг":{countryCodes:["ru"],tags:{brand:"Мираторг",name:"Мираторг",shop:"supermarket"}},"shop/supermarket|Монетка":{countryCodes:["ru"],tags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"}},"shop/supermarket|Народная 7Я семьЯ":{countryCodes:["ru"],matchNames:["семья"],tags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"}},"shop/supermarket|Перекрёсток":{countryCodes:["ru"],matchNames:["перекресток"],matchTags:["shop/convenience"],tags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"}},"shop/supermarket|Покупочка":{countryCodes:["ru"],tags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"}},"shop/supermarket|Полушка":{countryCodes:["ru"],tags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"}},"shop/supermarket|Пятёрочка":{countryCodes:["ru"],matchNames:["пятерочка"],matchTags:["shop/convenience"],tags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"}},"shop/supermarket|Радеж":{countryCodes:["ru"],tags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"}},"shop/supermarket|Рублёвский":{countryCodes:["by"],tags:{brand:"Рублёвский",name:"Рублёвский",shop:"supermarket"}},"shop/supermarket|Рукавичка":{countryCodes:["ua"],tags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"}},"shop/supermarket|Светофор":{countryCodes:["ru"],tags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"}},"shop/supermarket|Семишагофф":{countryCodes:["ru"],tags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"}},"shop/supermarket|Сільпо":{countryCodes:["ua"],tags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"}},"shop/supermarket|Таврия В":{countryCodes:["ua"],tags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"}},"shop/supermarket|Фора":{countryCodes:["ua"],tags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"}},"shop/supermarket|Фуршет":{countryCodes:["ua"],tags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"}},"shop/supermarket|Эдельвейс":{countryCodes:["ru"],tags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"}},"shop/supermarket|Ярче":{tags:{brand:"Ярче",name:"Ярче",shop:"supermarket"}},"shop/supermarket|سوبر ماركت":{tags:{brand:"سوبر ماركت",name:"سوبر ماركت",shop:"supermarket"}},"shop/supermarket|いなげや":{countryCodes:["jp"],tags:{brand:"いなげや","brand:en":"Inageya","brand:ja":"いなげや","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya","name:ja":"いなげや",shop:"supermarket"}},"shop/supermarket|まいばすけっと":{countryCodes:["jp"],tags:{brand:"まいばすけっと","brand:en":"My Basket","brand:ja":"まいばすけっと","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket","name:ja":"まいばすけっと",shop:"supermarket"}},"shop/supermarket|アコレ":{countryCodes:["jp"],tags:{brand:"アコレ","brand:ja":"アコレ",name:"アコレ","name:ja":"アコレ",shop:"supermarket"}},"shop/supermarket|イオン":{countryCodes:["jp"],tags:{brand:"イオン","brand:en":"AEON","brand:ja":"イオン","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON","name:ja":"イオン",shop:"supermarket"}},"shop/supermarket|イトーヨーカドー":{countryCodes:["jp"],matchNames:["イトーヨーカ堂"],tags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:ja":"イトーヨーカドー","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado","name:ja":"イトーヨーカドー",shop:"supermarket"}},"shop/supermarket|カスミ":{countryCodes:["jp"],tags:{brand:"カスミ","brand:en":"Kasumi","brand:ja":"カスミ","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi","name:ja":"カスミ",shop:"supermarket"}},"shop/supermarket|コープ":{countryCodes:["jp"],tags:{brand:"コープ","brand:ja":"コープ",name:"コープ","name:ja":"コープ",shop:"supermarket"}},"shop/supermarket|サミット":{countryCodes:["jp"],tags:{brand:"サミット","brand:ja":"サミット",name:"サミット","name:ja":"サミット",shop:"supermarket"}},"shop/supermarket|バロー":{countryCodes:["jp"],tags:{brand:"バロー","brand:en":"Valor","brand:ja":"バロー","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor","name:ja":"バロー",shop:"supermarket"}},"shop/supermarket|マックスバリュ":{countryCodes:["jp"],tags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:ja":"マックスバリュ","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai","name:ja":"マックスバリュ",shop:"supermarket"}},"shop/supermarket|マルエツ":{countryCodes:["jp"],tags:{brand:"マルエツ","brand:en":"Maruetsu","brand:ja":"マルエツ","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu","name:ja":"マルエツ",shop:"supermarket"}},"shop/supermarket|ヤオコー":{countryCodes:["jp"],tags:{brand:"ヤオコー","brand:en":"Yaoko","brand:ja":"ヤオコー","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko","name:ja":"ヤオコー",shop:"supermarket"}},"shop/supermarket|ヨークベニマル":{countryCodes:["jp"],tags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:ja":"ヨークベニマル","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru","name:ja":"ヨークベニマル",shop:"supermarket"}},"shop/supermarket|ヨークマート":{countryCodes:["jp"],tags:{brand:"ヨークマート","brand:en":"YorkMart","brand:ja":"ヨークマート","brand:wikidata":"Q11346201","brand:wikipedia":"ja:ヨークマート",name:"ヨークマート","name:en":"YorkMart","name:ja":"ヨークマート",shop:"supermarket"}},"shop/supermarket|ライフ":{countryCodes:["jp"],tags:{brand:"ライフ","brand:en":"Life","brand:ja":"ライフ","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life","name:ja":"ライフ",shop:"supermarket"}},"shop/supermarket|全聯":{countryCodes:["tw"],tags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|全聯福利中心":{countryCodes:["tw"],tags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"}},"shop/supermarket|家乐福":{countryCodes:["cn"],tags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"}},"shop/supermarket|惠康 Wellcome":{countryCodes:["hk"],tags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|業務スーパー":{countryCodes:["jp"],tags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:ja":"業務スーパー","brand:wikidata":"Q11590183","brand:wikipedia":"ja:神戸物産",name:"業務スーパー","name:en":"Gyōmu sūpā","name:ja":"業務スーパー",shop:"supermarket"}},"shop/supermarket|沃尔玛":{countryCodes:["cn"],tags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛",name:"沃尔玛","name:en":"Walmart",shop:"supermarket"}},"shop/supermarket|美廉社":{countryCodes:["tw"],tags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"}},"shop/supermarket|西友":{countryCodes:["jp"],tags:{brand:"西友","brand:en":"Seiyu","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu",shop:"supermarket"}},"shop/supermarket|頂好":{countryCodes:["tw"],tags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|頂好超市":{countryCodes:["tw"],tags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"}},"shop/supermarket|롯데마트":{countryCodes:["kr"],tags:{brand:"롯데마트","brand:ko":"롯데마트","brand:wikidata":"Q326715","brand:wikipedia":"ko:롯데마트",name:"롯데마트","name:en":"Lotte Mart","name:ko":"롯데마트",shop:"supermarket"}},"shop/supermarket|우리마트":{countryCodes:["kr"],tags:{brand:"우리마트","brand:ko":"우리마트",name:"우리마트","name:ko":"우리마트",shop:"supermarket"}},"shop/supermarket|하나로마트":{countryCodes:["kr"],tags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:ko":"하나로마트","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트","name:ko":"하나로마트",shop:"supermarket"}},"shop/swimming_pool|Leslie's Pool Supplies":{countryCodes:["us"],matchNames:["leslie's swimming pool supplies"],tags:{brand:"Leslie's Pool Supplies","brand:wikidata":"Q6530568","brand:wikipedia":"en:Leslie's Poolmart",name:"Leslie's Pool Supplies",official_name:"Leslie's Pool Supplies Service & Repair",shop:"swimming_pool"}},"shop/tea|DavidsTea":{countryCodes:["ca","us"],tags:{brand:"DavidsTea","brand:wikidata":"Q3019129","brand:wikipedia":"en:DavidsTea",name:"DavidsTea",shop:"tea"}},"shop/tea|T2":{countryCodes:["au"],tags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"}},"shop/tea|TeeGschwendner":{countryCodes:["de"],tags:{brand:"TeeGschwendner","brand:wikidata":"Q2399969","brand:wikipedia":"de:TeeGschwendner",name:"TeeGschwendner",shop:"tea"}},"shop/ticket|Boutique Grandes Lignes":{countryCodes:["fr"],tags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"}},"shop/ticket|DB Reisezentrum":{countryCodes:["de"],matchNames:["reisezentrum"],tags:{brand:"DB Reisezentrum","brand:wikidata":"Q15842100","brand:wikipedia":"de:Reisezentrum",name:"DB Reisezentrum",shop:"ticket"}},"shop/ticket|Guichet Transilien":{countryCodes:["fr"],tags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"}},"shop/tobacco|Nemzeti Dohánybolt":{countryCodes:["hu"],matchNames:["dohánybolt"],matchTags:["shop/kiosk"],tags:{brand:"Nemzeti Dohánybolt","brand:wikidata":"Q20639040","brand:wikipedia":"en:Dohánybolt",name:"Nemzeti Dohánybolt",shop:"tobacco"}},"shop/toys|Build-A-Bear Workshop":{countryCodes:["ca","gb","us"],matchNames:["build a bear"],matchTags:["shop/gift"],tags:{brand:"Build-A-Bear Workshop","brand:wikidata":"Q1002992","brand:wikipedia":"en:Build-A-Bear Workshop",name:"Build-A-Bear Workshop",shop:"toys"}},"shop/toys|Dráčik":{countryCodes:["cz","sk"],tags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"}},"shop/toys|Intertoys":{countryCodes:["be","de","nl"],tags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"}},"shop/toys|JouéClub":{countryCodes:["ad","fr","it","lb","ma","qa"],tags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"}},"shop/toys|King Jouet":{countryCodes:["fr"],tags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"}},"shop/toys|La Grande Récré":{countryCodes:["be","ci","es","fr","ma"],tags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"}},"shop/toys|Lego":{matchNames:["lego store"],tags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"}},"shop/toys|Lekia":{countryCodes:["no","se"],tags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"}},"shop/toys|Maxi Toys":{countryCodes:["be","de","fr","it"],tags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"}},"shop/toys|Smyths":{countryCodes:["at","ch","de","gb","ie"],tags:{brand:"Smyths","brand:wikidata":"Q7546779","brand:wikipedia":"en:Smyths",name:"Smyths",shop:"toys"}},"shop/toys|The Entertainer":{countryCodes:["gb","je"],tags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"}},"shop/toys|Toys Center":{tags:{brand:"Toys Center",name:"Toys Center",shop:"toys"}},"shop/toys|Toys R Us":{tags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"}},"shop/toys|Бегемотик":{countryCodes:["ru"],tags:{brand:"Бегемотик",name:"Бегемотик",shop:"toys"}},"shop/toys|Детский мир":{countryCodes:["by","kg","kz","ru","ua","uz"],tags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"}},"shop/toys|Кораблик":{countryCodes:["ru"],tags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"}},"shop/trade|84 Lumber":{countryCodes:["us"],matchNames:["84","eighty-four lumber"],tags:{brand:"84 Lumber","brand:wikidata":"Q4644779","brand:wikipedia":"en:84 Lumber",name:"84 Lumber",shop:"trade",trade:"building_supplies"}},"shop/trade|Fastenal":{countryCodes:["ca","pa","us"],tags:{brand:"Fastenal","brand:wikidata":"Q3067119","brand:wikipedia":"en:Fastenal",name:"Fastenal",shop:"trade"}},"shop/trade|Grainger":{countryCodes:["ca","us"],matchNames:["granger","w. w. grainger"],tags:{brand:"Grainger","brand:wikidata":"Q1627894","brand:wikipedia":"en:W. W. Grainger",name:"Grainger",shop:"trade"}},"shop/travel_agency|American Automobile Association":{countryCodes:["us"],matchTags:["office/travel_agent","shop/car"],nomatch:["office/insurance|AAA Insurance"],tags:{brand:"American Automobile Association","brand:wikidata":"Q463436","brand:wikipedia":"en:American Automobile Association",name:"American Automobile Association",shop:"travel_agency",short_name:"AAA"}},"shop/travel_agency|Coral Travel":{countryCodes:["pl","ru","ua"],tags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"}},"shop/travel_agency|D-reizen":{countryCodes:["nl"],tags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"}},"shop/travel_agency|DER Deutsches Reisebüro":{tags:{brand:"DER Deutsches Reisebüro",name:"DER Deutsches Reisebüro",shop:"travel_agency"}},"shop/travel_agency|DER Reisebüro":{countryCodes:["de"],tags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"}},"shop/travel_agency|Expedia CruiseShipCenters":{countryCodes:["ca","us"],tags:{brand:"Expedia CruiseShipCenters","brand:wikidata":"Q5189985","brand:wikipedia":"en:Expedia CruiseShipCenters",name:"Expedia CruiseShipCenters",shop:"travel_agency"}},"shop/travel_agency|First Reisebüro":{countryCodes:["de"],tags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"}},"shop/travel_agency|Flight Centre":{tags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"}},"shop/travel_agency|Halcón Viajes":{countryCodes:["es"],tags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"}},"shop/travel_agency|Havas Voyages":{countryCodes:["fr"],tags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"}},"shop/travel_agency|Liberty Travel":{countryCodes:["us"],tags:{brand:"Liberty Travel","brand:wikidata":"Q17031665","brand:wikipedia":"en:Liberty Travel",name:"Liberty Travel",shop:"travel_agency"}},"shop/travel_agency|Reiseland":{countryCodes:["de"],tags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"}},"shop/travel_agency|Selectour":{countryCodes:["fr"],tags:{brand:"Selectour","brand:wikidata":"Q3478073","brand:wikipedia":"fr:Selectour",name:"Selectour",shop:"travel_agency"}},"shop/travel_agency|TUI~(Group)":{matchNames:["tui reisecenter"],tags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"}},"shop/travel_agency|TUI~(UK)":{countryCodes:["gb"],matchNames:["thomson"],tags:{brand:"TUI","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"TUI",shop:"travel_agency"}},"shop/travel_agency|The Co-operative Travel":{countryCodes:["gb"],tags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"}},"shop/travel_agency|Thomas Cook":{tags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"}},"shop/travel_agency|Поехали с нами":{countryCodes:["ua"],tags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"}},"shop/tyres|Big O Tires":{countryCodes:["ca","us"],tags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"}},"shop/tyres|Bridgestone":{tags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"}},"shop/tyres|Discount Tire":{countryCodes:["us"],tags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"}},"shop/tyres|Express Oil Change & Tire Engineers":{countryCodes:["us"],tags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"}},"shop/tyres|Les Schwab Tire Center":{countryCodes:["us"],tags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"}},"shop/tyres|Michelin":{tags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"}},"shop/tyres|Tire Discounters":{countryCodes:["us"],tags:{brand:"Tire Discounters","brand:wikidata":"Q29093639","brand:wikipedia":"en:Tire Discounters",name:"Tire Discounters",shop:"tyres"}},"shop/tyres|Tires Plus":{countryCodes:["us"],tags:{brand:"Tires Plus","brand:wikidata":"Q64015091",name:"Tires Plus",shop:"tyres"}},"shop/tyres|Vianor":{tags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"}},"shop/vacuum_cleaner|Oreck":{countryCodes:["us"],matchNames:["oreck vacuums"],tags:{brand:"Oreck","brand:wikidata":"Q57273844",name:"Oreck",shop:"vacuum_cleaner"}},"shop/variety_store|99 Cents Only Stores":{countryCodes:["us"],matchNames:["99 cent only stores","99 cents only"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"99 Cents Only Stores","brand:wikidata":"Q4646294","brand:wikipedia":"en:99 Cents Only Stores",name:"99 Cents Only Stores",shop:"variety_store"}},"shop/variety_store|Action":{countryCodes:["at","be","de","fr","nl","pl"],matchTags:["shop/supermarket"],tags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"}},"shop/variety_store|B&M Bargains":{countryCodes:["gb"],tags:{brand:"B&M Bargains","brand:wikidata":"Q4836931","brand:wikipedia":"en:B & M",name:"B&M Bargains",shop:"variety_store"}},"shop/variety_store|Big Bazar":{countryCodes:["be","nl"],tags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"}},"shop/variety_store|Daiso Japan":{countryCodes:["au","us"],tags:{brand:"Daiso","brand:wikidata":"Q866991",name:"Daiso Japan",shop:"variety_store",short_name:"Daiso"}},"shop/variety_store|Dollar General":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"}},"shop/variety_store|Dollar Tree":{countryCodes:["ca","us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollarama","shop/variety_store|Family Dollar"],tags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"}},"shop/variety_store|Dollarama":{countryCodes:["ca"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Family Dollar"],tags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"}},"shop/variety_store|EuroShop":{countryCodes:["de"],tags:{brand:"EuroShop","brand:wikidata":"Q15846763","brand:wikipedia":"de:Schum EuroShop",name:"EuroShop",shop:"variety_store"}},"shop/variety_store|Family Dollar":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],nomatch:["amenity/bank|Dollar Bank","amenity/car_rental|Dollar","shop/variety_store|Dollar General","shop/variety_store|Dollar Tree","shop/variety_store|Dollarama"],tags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"}},"shop/variety_store|Five Below":{countryCodes:["us"],tags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"}},"shop/variety_store|Fix Price":{countryCodes:["by","ru"],tags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"}},"shop/variety_store|Flying Tiger Copenhagen":{matchNames:["tgr","tiger"],tags:{brand:"Flying Tiger Copenhagen","brand:wikidata":"Q2786319","brand:wikipedia":"en:Flying Tiger Copenhagen",name:"Flying Tiger Copenhagen",shop:"variety_store",short_name:"Flying Tiger"}},"shop/variety_store|GiFi":{countryCodes:["fr"],tags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"}},"shop/variety_store|Home Bargains":{countryCodes:["gb"],matchTags:["shop/supermarket"],tags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"}},"shop/variety_store|Miniso":{tags:{brand:"Miniso","brand:wikidata":"Q20732498","brand:wikipedia":"en:Miniso",name:"Miniso",shop:"variety_store"}},"shop/variety_store|Mäc-Geiz":{countryCodes:["de"],tags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"}},"shop/variety_store|NOZ":{countryCodes:["fr"],tags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"}},"shop/variety_store|Poundland":{countryCodes:["gb"],tags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"}},"shop/variety_store|Poundstretcher":{countryCodes:["gb"],tags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"}},"shop/variety_store|Poundworld":{countryCodes:["gb","ie"],tags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"}},"shop/variety_store|Roses":{countryCodes:["us"],tags:{brand:"Roses","brand:wikidata":"Q7368644","brand:wikipedia":"en:Roses (store)",name:"Roses",shop:"variety_store"}},"shop/variety_store|Savers":{tags:{brand:"Savers",name:"Savers",shop:"variety_store"}},"shop/variety_store|TEDi":{countryCodes:["at","de","es","hr","si","sk"],tags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"}},"shop/variety_store|Tokmanni":{countryCodes:["fi"],tags:{brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",name:"Tokmanni",shop:"variety_store"}},"shop/variety_store|Wilko":{countryCodes:["gb"],tags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"}},"shop/variety_store|キャンドゥ":{countryCodes:["jp"],tags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:ja":"キャンドゥ","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO","name:ja":"キャンドゥ",shop:"variety_store"}},"shop/variety_store|セリア":{countryCodes:["jp"],tags:{brand:"セリア","brand:en":"Seria","brand:ja":"セリア","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria","name:ja":"セリア",shop:"variety_store"}},"shop/variety_store|ダイソー":{countryCodes:["jp"],matchNames:["ザ・ダイソー"],tags:{brand:"ダイソー","brand:en":"Daiso","brand:ja":"ダイソー","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso","name:ja":"ダイソー",shop:"variety_store"}},"shop/variety_store|ダイレックス":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ダイレックス","brand:en":"Direx","brand:ja":"ダイレックス","brand:wikidata":"Q11317051","brand:wikipedia":"ja:ダイレックス (ディスカウントストア)",name:"ダイレックス","name:en":"Direx","name:ja":"ダイレックス",shop:"variety_store"}},"shop/variety_store|トライアル":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"トライアル","brand:en":"Trial","brand:ja":"トライアル","brand:wikidata":"Q11321723","brand:wikipedia":"ja:トライアルカンパニー",name:"トライアル","name:en":"Trial","name:ja":"トライアル",shop:"variety_store"}},"shop/variety_store|ドン・キホーテ":{countryCodes:["jp"],matchTags:["shop/supermarket"],tags:{brand:"ドン・キホーテ","brand:en":"Don Quijote","brand:ja":"ドン・キホーテ","brand:wikidata":"Q1185381","brand:wikipedia":"ja:ドン・キホーテ (企業)",name:"ドン・キホーテ","name:en":"Don Quijote","name:ja":"ドン・キホーテ",opening_hours:"24/7",shop:"variety_store",short_name:"ドンキ","short_name:en":"Donki","short_name:ja":"ドンキ"}},"shop/video_games|EB Games":{countryCodes:["au","ca","nz"],tags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"}},"shop/video_games|Game":{countryCodes:["gb"],tags:{brand:"Game","brand:wikidata":"Q5519813","brand:wikipedia":"en:Game (retailer)",name:"Game",shop:"video_games"}},"shop/video_games|GameStop":{tags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"}},"shop/video_games|Micromania":{countryCodes:["fr"],tags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"}},"shop/video|Blockbuster":{tags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"}},"shop/video|Family Video":{countryCodes:["us"],tags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"}},"shop/video|TSUTAYA":{nomatch:["shop/books|TSUTAYA","shop/music|TSUTAYA"],tags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"}},"shop/video|ゲオ":{countryCodes:["jp"],matchNames:["geo"],tags:{brand:"GEO","brand:ja":"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ","name:en":"GEO","name:ja":"ゲオ",shop:"video"}},"shop/watches|Fossil":{countryCodes:["de","us"],matchTags:["shop/jewelry"],tags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"}},"shop/watches|Omega":{countryCodes:["ch","fr"],tags:{brand:"Omega","brand:wikidata":"Q659224","brand:wikipedia":"en:Omega SA",name:"Omega",shop:"watches"}},"shop/watches|Rolex":{countryCodes:["us"],tags:{brand:"Rolex","brand:wikidata":"Q62288","brand:wikipedia":"en:Rolex",name:"Rolex",shop:"watches"}},"shop/watches|Swatch":{matchTags:["shop/jewelry"],tags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"}},"shop/wholesale|BJ's Wholesale Club":{countryCodes:["us"],matchTags:["shop/department_store"],tags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale"}},"shop/wholesale|Costco":{matchNames:["costco wholesale"],matchTags:["shop/department_store"],nomatch:["amenity/fuel|Costco Gasoline","amenity/pharmacy|Costco Pharmacy"],tags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale"}},"shop/wholesale|Makro":{matchTags:["shop/department_store"],tags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"}},"shop/wholesale|Metro":{matchTags:["shop/department_store"],nomatch:["amenity/bank|Metrobank","shop/supermarket|Metro~(Canada)"],tags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"}},"shop/wholesale|Sam's Club":{matchTags:["shop/department_store"],nomatch:["amenity/fuel|Sam's Club"],tags:{brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",shop:"wholesale"}},"shop/wholesale|コストコ":{countryCodes:["jp"],matchTags:["shop/department_store"],tags:{brand:"コストコ","brand:en":"Costco","brand:ja":"コストコ","brand:wikidata":"Q715583","brand:wikipedia":"ja:コストコ",name:"コストコ","name:en":"Costco","name:ja":"コストコ",shop:"wholesale"}},"tourism/hotel|B&B Hôtel":{countryCodes:["fr"],tags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"}},"tourism/hotel|Best Western":{nomatch:["tourism/hotel|Best Western Plus"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"}},"tourism/hotel|Best Western Plus":{countryCodes:["ca","us"],nomatch:["tourism/hotel|Best Western"],tags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"}},"tourism/hotel|Campanile":{nomatch:["amenity/restaurant|Campanile"],tags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"}},"tourism/hotel|Candlewood Suites":{countryCodes:["us"],tags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"}},"tourism/hotel|Comfort Inn":{countryCodes:["ca","gb","us"],nomatch:["tourism/hotel|Comfort Suites"],tags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"}},"tourism/hotel|Comfort Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"}},"tourism/hotel|Comfort Suites":{nomatch:["tourism/hotel|Comfort Inn"],tags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"}},"tourism/hotel|Country Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"}},"tourism/hotel|Courtyard by Marriott":{countryCodes:["ca","us"],matchNames:["courtyard","courtyard marriott"],tags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"}},"tourism/hotel|Crowne Plaza":{tags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"}},"tourism/hotel|Days Inn":{countryCodes:["ca","gb","us"],tags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"}},"tourism/hotel|Embassy Suites":{countryCodes:["us"],tags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"}},"tourism/hotel|Extended Stay America":{countryCodes:["us"],tags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"}},"tourism/hotel|Fairfield Inn":{countryCodes:["ca","us"],matchNames:["fairfield inn and suites"],tags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"}},"tourism/hotel|Formule 1":{countryCodes:["fr"],tags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"}},"tourism/hotel|Grand Hyatt":{tags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",tourism:"hotel"}},"tourism/hotel|Hampton":{countryCodes:["us"],matchNames:["hampton inn and suites"],tags:{alt_name:"Hampton Inn",brand:"Hampton","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton",tourism:"hotel"}},"tourism/hotel|Hilton":{tags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"}},"tourism/hotel|Hilton Garden Inn":{countryCodes:["ca","mx","us"],tags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn":{nomatch:["tourism/hotel|Holiday Inn Express"],tags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express":{nomatch:["tourism/hotel|Holiday Inn"],tags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"}},"tourism/hotel|Holiday Inn Express & Suites":{countryCodes:["ca","us"],tags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"}},"tourism/hotel|Home2 Suites":{countryCodes:["ca","mx","us"],matchNames:["home2"],tags:{brand:"Home2 Suites","brand:wikidata":"Q5887912","brand:wikipedia":"en:Home2 Suites by Hilton",name:"Home2 Suites",official_name:"Home2 Suites by Hilton",tourism:"hotel"}},"tourism/hotel|Homewood Suites":{countryCodes:["ca","us"],tags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"}},"tourism/hotel|Hotel Imperial":{tags:{brand:"Hotel Imperial",name:"Hotel Imperial",tourism:"hotel"}},"tourism/hotel|Hyatt":{tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",tourism:"hotel"}},"tourism/hotel|Hyatt Centric":{tags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",tourism:"hotel"}},"tourism/hotel|Hyatt House":{countryCodes:["us"],tags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",tourism:"hotel"}},"tourism/hotel|Hyatt Place":{countryCodes:["us"],tags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",tourism:"hotel"}},"tourism/hotel|Hyatt Regency":{tags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",tourism:"hotel"}},"tourism/hotel|Ibis":{matchNames:["hotel ibis","ibis hotel"],tags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"}},"tourism/hotel|Ibis Budget":{tags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"}},"tourism/hotel|Ibis Styles":{tags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"}},"tourism/hotel|Kyriad":{countryCodes:["fr"],tags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"}},"tourism/hotel|La Quinta":{countryCodes:["us"],matchNames:["la quinta inn and suites","la quinta inns and suites"],tags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"}},"tourism/hotel|Le Méridien":{tags:{brand:"Le Méridien","brand:wikidata":"Q261077","brand:wikipedia":"en:Le Méridien",name:"Le Méridien",tourism:"hotel"}},"tourism/hotel|Marriott":{tags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"}},"tourism/hotel|Mercure":{tags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"}},"tourism/hotel|Novotel":{tags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"}},"tourism/hotel|Park Hyatt":{tags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",tourism:"hotel"}},"tourism/hotel|Premier Inn":{countryCodes:["gb"],tags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"}},"tourism/hotel|Première Classe":{countryCodes:["fr"],tags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"}},"tourism/hotel|Quality Inn":{countryCodes:["ca","mx","us"],tags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"}},"tourism/hotel|Quality Inn & Suites":{countryCodes:["ca","us"],tags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"}},"tourism/hotel|Ramada":{tags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"}},"tourism/hotel|Red Roof Inn":{countryCodes:["us"],tags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"}},"tourism/hotel|Renaissance Hotel":{countryCodes:["us"],tags:{brand:"Renaissance Hotels","brand:wikidata":"Q2143252","brand:wikipedia":"en:Renaissance Hotels",name:"Renaissance Hotel",tourism:"hotel"}},"tourism/hotel|Residence Inn":{tags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"}},"tourism/hotel|Sheraton":{tags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"}},"tourism/hotel|Sleep Inn":{countryCodes:["us"],tags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"}},"tourism/hotel|Staybridge Suites":{countryCodes:["ca","gb","us"],tags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"}},"tourism/hotel|TownePlace Suites":{countryCodes:["ca","us"],matchNames:["TownePlace Marriott","TownePlace Suites Marriott"],tags:{brand:"TownePlace Suites","brand:wikidata":"Q7830092","brand:wikipedia":"en:TownePlace Suites",name:"TownePlace Suites",official_name:"TownePlace Suites by Marriott",tourism:"hotel"}},"tourism/hotel|Travelodge":{tags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"}},"tourism/hotel|W Hotels":{tags:{brand:"W Hotels","brand:wikidata":"Q7958488","brand:wikipedia":"en:W Hotels",name:"W Hotels",short_name:"W",tourism:"hotel"}},"tourism/hotel|東横イン":{countryCodes:["jp"],tags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:ja":"東横イン","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn","name:ja":"東横イン",tourism:"hotel"}},"tourism/motel|Econo Lodge":{tags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"}},"tourism/motel|Motel 6":{countryCodes:["ca","us"],tags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"}},"tourism/motel|Rodeway Inn":{countryCodes:["ca","us"],tags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"}},"tourism/motel|Super 8":{countryCodes:["ca","us"],tags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"}}};
65274         var brands$1 = {
65275         brands: brands
65276         };
65277
65278         var keepTags = ["^amenity/bank$","^amenity/bicycle_rental$","^amenity/bureau_de_change$","^amenity/cafe$","^amenity/car_rental$","^amenity/car_sharing$","^amenity/charging_station$","^amenity/cinema$","^amenity/dentist$","^amenity/fast_food$","^amenity/fuel$","^amenity/ice_cream$","^amenity/money_transfer$","^amenity/payment_(centre|terminal)$","^amenity/pharmacy$","^amenity/post_(box|office)$","^amenity/public_bookcase$","^amenity/restaurant$","^amenity/social_(centre|facility)$","^amenity/vending_machine$","^amenity/veterinary$","^leisure/fitness_centre$","^office/accountant$","^office/employment_agency$","^office/estate_agent$","^office/financial(_advisor)?$","^office/insurance$","^office/tax_advisor$","^office/telecommunication$","^shop/(?!(yes|no|gas|convenience;gas|laundry|lottery|mall))","^tourism/(h|m)otel$"];
65279         var discardKeys = ["^amenity/bank\\|(bank zachodni|bz) wbk$","^amenity/bank\\|.*sparkasse.*$","^amenity/bank\\|bank spółdzielczy$","^amenity/bank\\|pko$","^amenity/bank\\|volks- und raiffeisenbank$","^amenity/bank\\|volksbank$","^amenity/bank\\|volksbank( |-)raiffeisenbank$","^amenity/bank\\|vr( |-)bank$","^amenity/cafe\\|(kiosque(\\sà)?\\scafé|caf(e|é)\\sexpress|встреча|рандеву|чайхана|жемчужина)$","^amenity/cinema\\|октябрь$","^amenity/fast_food\\|(ali\\sbaba|antalya|asia\\s(bistro|imbiss|wok)|berlin\\sdöner|city\\s(grill|pizza)|kfc/taco\\sbell)$","^amenity/fast_food\\|(pizza\\s(house|time))$","^amenity/fuel\\|gnv|gpl|posto|spbu|جایگاه\\scng$","^amenity/ice_cream\\|gelateria$","^amenity/pharmacy\\|(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^amenity/pharmacy\\|(centrum|farm(a|á)cia\\s(central(e)?|comunale))$","^amenity/pharmacy\\|(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^amenity/pharmacy\\|(айболит|арніка|фармация)$","^amenity/pharmacy\\|pharmacie\\s(centrale|comunale|de\\s(l'hôtel\\sde\\sville|la\\s(gare|mairie|poste))|du\\s(centre|marché|parc))$","^amenity/restaurant\\|((da|la|las|el)\\s|delphi|deutsches\\shaus|dionysos|dorfkrug|europa|frohsinn|((gasthaus|schwarzer)\\s)?adler)","^amenity/restaurant\\|(ali\\sbaba|adria|akropolis|aroma|asia|athen|athos|bahnhof|bamboo|bären|bella\\s(vista|napoli)|belvedere)","^amenity/restaurant\\|(canteen|cantina|capri|carpe\\sdiem|casa\\s?(blanca|mia)|casino|china\\s(buffet|garden|house|king|star|town|wok))","^amenity/restaurant\\|(gasthaus\\slöwen|golden\\sdragon|great\\swall|grüner\\sbaum|hellas|hirsch(en)?|hong\\skong|ichiban|jade\\sgarden)","^amenity/restaurant\\|(jägerhof|kirchenwirt|kreta|kreuz|krone|l'|lamm|le\\sbistrot|linde|lindenhof|little\\s(italy|india)|los\\samigos)","^amenity/restaurant\\|(lotus|löwen|maharaja|mamma\\smia|mandarin|marco\\spolo|mediterraneo|mensa|milano|mykonos|mythos|namaste|napoli)","^amenity/restaurant\\|(new\\schina|oasis|ochsen|olympia|osaka|paradise|parrilla|peking|pho|pinocchio)","^amenity/restaurant\\|(pizza\\shouse|pizz(a|e)ria|pizza\\sking|pomodoro|portofino|poseidon|ratskeller|rhodos|ristorante\\s)","^amenity/restaurant\\|(roma|rose|rössl(e|i)|saffron|saigon|sakura|san\\smarco|santorini|schützenhaus|shalimar|shanghai|sonne|sphinx)","^amenity/restaurant\\|(sportheim|sternen|syrtaki|taj\\smahal|taste\\sof\\sindia|the\\skitchen|toscana|tokyo|traube)","^amenity/restaurant\\|(waldschänke|wok|zorbas|(zum|zur)\\s)","^amenity/social_facility\\|dom pomocy społecznej$","^amenity/social_facility\\|maison de retraite$","^amenity/social_facility\\|safe haven$","^shop/(convenience|kiosk)\\|(777|bp|esso|exxon|mobil|shell)$","^shop/bakery\\|(backshop|schneider|каравай)$","^shop/bakery\\|(bäckerei\\s)?müller","^shop/butcher\\|butcher$","^shop/clothes\\|трикотаж$","^shop/convenience\\|(milk bar|юлия)$","^shop/convenience\\|(августина|весна|визит|ветеран|домашний)$","^shop/convenience\\|(калинка|колобок|колос(ок)?|каравай|ласточка|лидер|любимый|людмила|люкс)$","^shop/convenience\\|(мечта|мираж|белорусские продукты|продукты 24|натали|надежда)$","^shop/convenience\\|(олимп|престиж|подсолнух|росинка|ромашка|родник|родны кут|рассвет)$","^shop/convenience\\|(семейный|спутник|солнечный|светлана|ивушка)$","^shop/convenience\\|(южный|эконом|шанс|чайка|центральный|хороший|фаворит|татьяна)$","^shop/florist\\|(мир цветов|орхидея)$","^shop/frame\\|rumah\\spenduduk$","^shop/hairdresser\\|(haarwerk|стиль|локон|шарм)$","^shop/hardware\\|(всё для дома|1000 мелочей)$","^shop/jewelry\\|585$","^shop/money_transfer|mobil(e)?\\smoney$","^shop/optician\\|(vision plus|оптика)$","^shop/supermarket\\|(famiglia cooperativa|семейный)$","^shop/tailor\\|couture\\s?(dame|homme|mixte)?$","^tourism/(h|m)otel\\|budget inn$","^tourism/hotel\\|(belvedere|krone|victoria)","^tourism/hotel\\|(central|city|europa|grand|palace|park|royal)\\s?hotel$","^tourism/hotel\\|h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$"];
65280         var discardNames = ["^((drummed|independent) )?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^((le|the) )?salo(o)?n( de)?( coiffure| fryzjerski| beauté)?( homme| dame)?$","^((горячий|свежий) )?хлеб(ница)?$","^((разливное|живое) )?пиво$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^(bureau de |)change$","^(buzón\\sde\\s)?correos$","^(cl(i|í)nica )?dental$","^(cl(i|í)nica )?veterinari(a|o)$","^(clinique )?vétérinaire$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^(hof|dorf)laden$","^(h|m)otel$","^(sklep )?(spożywcz(y|o))(-przemysłowy)?$","^(strom|milch)tankstelle$","^(the )?barber(ia|shop|\\sshop)?$","^(é|e)pic(erie|ier)$","^(агзс|азс|мережа азс приват|магазин при азс)$","^(газовая\\s)?заправка$","^(летнее )?кафе(терий)?$","^(парикмахерская|персона|перукарня)$","^(проездные )?билет(ы)?$","^(свежее )?мяс(ной|о)$","^(спец|детская|женская)?\\s?одежда$","^agencja pocztowa$","^alimentación$","^alimentar(a|i)$","^alimentation\\sgénérale$","^alte (apotheke|post)$","^apotek(a|et)$","^apotheke( am markt)?$","^apteka$","^atelier de couture$","^atm$","^auto serwis$","^baguette$","^bakery$","^bakkal$","^bank$","^baqala$","^bar (centrale|kafe)$","^bar$","^barbea?r(i|í)a$","^bazar$","^benzina$","^berber$","^bijouterie$","^bike sharing$","^biletomat$","^bistro$","^blumen(laden)?$","^bo(u)?tique$","^bodega$","^borrachar(i|í)a$","^botica$","^botiller(i|í)a$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^bureau de poste$","^bäckerei$","^büfé$","^cabinet dentaire$","^caf(e|é) de(s)? (la )?(place|sports|gare)$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^cajero\\sautomatico\\sbancared$","^carnicer(i|í)a$","^central$","^centro naturista$","^chifa$","^chinese restaurant$","^cine(ma)?$","^cleaners$","^co-operative$","^coffee$","^coiff(eur|ure)\\s?(homme|dame)?$","^colmado$","^comedor$","^comida china$","^commercial hotel$","^consultorio (dental|odontologico)$","^credit union$","^currency exchange$","^d(ö|o)ner(\\skebab)?$","^delikatesy$","^dental(\\s(clinic|surgery))?$","^dentist(a|e)?$","^drinks$","^droguer(i|í)a$","^dép(ô|o)t de gaz$","^dépanneur$","^eczane$","^edicola$","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^eisdiele","^el árbol$","^estanco$","^exchange$","^fagyizó$","^family dentistry$","^farm(a|à|á)ci(a|à|á|e)$","^fast food$","^ferramenta$","^ferreter(i|í)a$","^figaro$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fotocopias$","^fri(t|z)erie$","^fris(eu|ö)r$","^frituur$","^frutería$","^fryzjer$","^funeraria$","^game$","^garage\\s?(moto|auto)?$","^garba(drome)?$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio( municipal)?$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s?(design|lounge|salon|dresser)$","^hardware$","^home\\sutensils$","^hospedaje$","^húsbolt$","^imbiss$","^indipend\\.$","^internet cafe$","^istanbul(\\skebab)?$","^kaf(e|é)$","^kantine$","^kantor pos$","^kantor$","^kebab(ai|\\shouse)?$","^kios(co|k|ko|que)?$","^kisbolt$","^kitchen$","^księgarnia$","^kwiaciarnia$","^kwiaty$","^kулинария$","^ladestation$","^librairie$","^librer(i|í)a$","^libro$","^licorer(i|í)a$","^ljekarna$","^lombard$","^lot 1$","^lubricentro$","^lékárna$","^maceller(i|í)a$","^magazin","^mailbox$","^maison$","^market$","^mercado( municipal)?$","^mercerie$","^mini\\s?(abc|market|mart|mercado|pump)","^money exchange$","^máquina de tickets$","^mécanique$","^nagelstudio$","^nails$","^no name$","^obuwie$","^odontologia$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^optyk$","^outlet$","^pa(r|cz)komat$","^pac?k(etbox|station)$","^padaria$","^panader(i|í)a$","^pancake house$","^panificio$","^panorama$","^papeler(i|í)a$","^parafarmacia$","^parduotuvė$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^piekarnia$","^piscine$","^pizz(eri)?a$","^po(s|š)t(a|e|o)$","^poczta$","^poissonnerie$","^post\\s?(agentur|filiale|partner|office|stelle)?$","^potraviny$","^prehrana$","^pressing$","^pulper(i|í)a$","^punkt apteczny$","^quin?cai?llerie$","^quiosco$","^rent a car$","^repuestos automotrices$","^restaurant(e)?(\\suniversit(ário|aire))?$","^rzeźnik$","^sale$","^salle (omnisport|polyvalente)$","^salão de beleza$","^sari-sari store$","^sb\\stank$","^second\\shand$","^shops?$","^sklep$","^smíšené zboží$","^snacks?$","^souvenir(s)?( shop)?$","^spätkauf$","^stacja (benzynowa|paliw)$","^stadium$","^stadtbäckerei$","^station service$","^steak house$","^stores?$","^super ?america","^super\\s?m(arket|ercado)$","^sushi(\\sbar)?$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tabac\\spresse$","^tabaccher(i|í)a$","^tacos$","^taller( mecánico)?$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tesha$","^tienda(\\sde\\s(barrio|abarrotes))?$","^toko pakaian$","^trafik(a)?$","^trattoria$","^trinkhalle$","^télécentre$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^verduler(i|í)a$","^večerka$","^virágbolt$","^vulcanizare$","^warung$","^warzywniak$","^windmill$","^wulkanizacja$","^zahnarzt$","^zigarettenautomat$","^zöldséges$","^änderungsschneiderei$","^élelmiszer(bolt)?$","^φαρμακείο$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^автосервис\\+шиномонтаж$","^аптека","^аптечный (пункт|склад)$","^ателье$","^бассейн$","^бистро$","^булочная$","^буфет$","^ветеринарная клиника$","^ветлечебница$","^вс(е|ё) для дома$","^вулканизация$","^газ$","^главпочтамт$","^гостиница$","^детский дом$","^закусочная$","^замена масла$","^золото(й)?$","^зоо(магазин|товары)$","^игрушки$","^канцтовары$","^касса$","^квіти$","^киоск$","^книги$","^кофе(йня|\\sхауз)$","^крамниця$","^купец$","^ломбард$","^маркет$","^меб(ель|лі)$","^метан$","^минимаркет|мини-маркет$","^мороженое$","^мясная лавка$","^обувь$","^овощи(\\sи\\s|-)фрукты$","^октан$","^памятники$","^пекарня$","^пельменная$","^печать$","^пиццерия$","^по(чт|шт|щ)а$","^подарки$","^почтовое отделение$","^пресса$","^продукт(ы|и)?$","^продуктовый( магазин)?$","^промтовары$","^пропан$","^ремонт\\sобуви$","^ресторан$","^ритуал(ьные услуги)?$","^рыб(а|олов)$","^салон красоты$","^сантехника$","^семена$","^социальный участковый$","^спорт(зал|комплекс|товары)$","^столовая$","^стоматолог","^строитель$","^стройматериалы$","^сувениры$","^супермаркет$","^табак(ерка)?$","^ткани$","^товары для дома$","^универ(маг|сам)$","^уют$","^фрукты и овощи$","^химчистка$","^хинкальная$","^хоз(товары|яюшка)$","^хүнсний дэлгүүр$","^цвет(овик|очный|ы)(\\sмагазин)?$","^церковная( лавка)?$","^чайхана$","^ша(ве|у)рма$","^шашлычная$","^шиномонтаж$","^דלק$","^اداره پست$","^باشگاه بدنسازی$","^بانک$","^بقال(ة)?$","^حلاق$","^داروخانه شبانه روزی$","^داروخانه$","^رستوران$","^سوپر\\s?مارکت$","^صيدلية$","^قصابی$","^محط(ه|ة) وقود$","^مخبز(ة)?$","^مطعم$","^مقهى$","^مكتب البريد$","^میوه فروشی$","^نان\\s?(سنگک|بربری|لواش)?$","^نانوایی\\s?(سنگک|بربری|لواش)?ی?$","^پمپ (بنزین|گاز)$","^მარკეტი( \\(market\\))?","^カフェ$","^ポスト$","^体育館$","^加油站$","^珈琲館$","^租$","^自動販売機$","^自販機$","^郵便ポスト$","^郵局$","^食堂$","automat na jizdenky"];
65281         var filters = {
65282         keepTags: keepTags,
65283         discardKeys: discardKeys,
65284         discardNames: discardNames
65285         };
65286
65287         // ES5 for iD, for now
65288
65289
65290         // remove spaces, punctuation, diacritics
65291         var simplify = function simplify(str) {
65292             return diacritics.remove(
65293                 str
65294                     .replace(/&/g,'and')
65295                     .replace(/[\s\-=_!"#%'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`’\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g,'')
65296                     .toLowerCase()
65297             );
65298         };
65299
65300         // ES5 for iD, for now
65301
65302
65303         // toParts - split a name-suggestion-index key into parts
65304         // {
65305         //   kvnd:        "amenity/fast_food|Thaï Express~(North America)",
65306         //   kvn:         "amenity/fast_food|Thaï Express",
65307         //   kv:          "amenity/fast_food",
65308         //   k:           "amenity",
65309         //   v:           "fast_food",
65310         //   n:           "Thaï Express",
65311         //   d:           "(North America)",
65312         //   nsimple:     "thaiexpress",
65313         //   kvnnsimple:  "amenity/fast_food|thaiexpress"
65314         // }
65315         var to_parts = function toParts(kvnd) {
65316             var parts = {};
65317             parts.kvnd = kvnd;
65318
65319             var kvndparts = kvnd.split('~', 2);
65320             if (kvndparts.length > 1) parts.d = kvndparts[1];
65321
65322             parts.kvn = kvndparts[0];
65323             var kvnparts = parts.kvn.split('|', 2);
65324             if (kvnparts.length > 1) parts.n = kvnparts[1];
65325
65326             parts.kv = kvnparts[0];
65327             var kvparts = parts.kv.split('/', 2);
65328             parts.k = kvparts[0];
65329             parts.v = kvparts[1];
65330
65331             parts.nsimple = simplify(parts.n);
65332             parts.kvnsimple = parts.kv + '|' + parts.nsimple;
65333             return parts;
65334         };
65335
65336         var matchGroups = {beauty:["shop/beauty","shop/hairdresser_supply"],bed:["shop/bed","shop/furniture"],beverages:["shop/alcohol","shop/beverages"],confectionery:["shop/candy","shop/chocolate","shop/confectionery"],convenience:["shop/beauty","shop/chemist","shop/convenience","shop/cosmetics"],coworking:["amenity/coworking_space","office/coworking","office/coworking_space"],electronics:["office/telecommunication","shop/computer","shop/electronics","shop/hifi","shop/mobile","shop/mobile_phone"],fashion:["shop/accessories","shop/bag","shop/botique","shop/clothes","shop/department_store","shop/fashion","shop/fashion_accessories","shop/sports","shop/shoes"],financial:["office/accountant","office/financial","office/financial_advisor","office/tax_advisor","shop/tax"],fitness:["leisure/fitness_centre","leisure/fitness_center","leisure/sports_centre","leisure/sports_center"],food:["amenity/cafe","amenity/fast_food","amenity/ice_cream","amenity/restaurant","shop/bakery","shop/pastry","shop/tea","shop/coffee"],fuel:["amenity/fuel","shop/gas","shop/convenience;gas","shop/gas;convenience"],gift:["shop/gift","shop/stationery"],hardware:["shop/doityourself","shop/hardware","shop/trade"],houseware:["shop/houseware","shop/interior_decoration"],lodging:["tourism/hotel","tourism/motel"],money_transfer:["amenity/money_transfer","shop/money_transfer"],outdoor:["shop/outdoor","shop/sports"],parts:["shop/car_parts","shop/car_repair","shop/tires","shop/tyres"],school:["amenity/childcare","amenity/college","amenity/kindergarten","amenity/language_school","amenity/prep_school","amenity/school","amenity/university"],supermarket:["shop/food","shop/frozen_food","shop/greengrocer","shop/grocery","shop/supermarket","shop/wholesale"],vending:["amenity/vending_machine","shop/vending_machine"]};
65337         var match_groups = {
65338         matchGroups: matchGroups
65339         };
65340
65341         var match_groups$1 = /*#__PURE__*/Object.freeze({
65342                 matchGroups: matchGroups,
65343                 'default': match_groups
65344         });
65345
65346         var require$$0 = getCjsExportFromNamespace(match_groups$1);
65347
65348         // ES5 for iD, for now
65349
65350
65351
65352         var matchGroups$1 = require$$0.matchGroups;
65353
65354
65355         var matcher$1 = function() {
65356             var _warnings = [];    // array of match conflict pairs
65357             var _ambiguous = {};
65358             var _matchIndex = {};
65359             var matcher = {};
65360
65361             // Create an index of all the keys/simplenames for fast matching
65362             matcher.buildMatchIndex = function(brands) {
65363                 Object.keys(brands).forEach(function(kvnd) {
65364                     var obj = brands[kvnd];
65365                     var parts = to_parts(kvnd);
65366
65367                     if (obj.countryCodes) {
65368                         parts.countryCodes = obj.countryCodes.slice();  // copy
65369                     }
65370
65371                     var matchTags = (obj.matchTags || [])
65372                         .map(function(s) { return s.toLowerCase(); });
65373                     var matchNames = (obj.matchNames || [])
65374                         .concat(obj.tags.alt_name || [])        // #2732
65375                         .concat(obj.tags.official_name || [])   // #2732
65376                         .concat(obj.tags.short_name || [])      // #2732
65377                         .map(simplify);
65378                     var nomatches = (obj.nomatch || [])
65379                         .map(function(kvnd) { return to_parts(kvnd).kvnsimple; });
65380
65381                     var match_kv = [parts.kv].concat(matchTags);
65382                     var match_nsimple = [parts.nsimple].concat(matchNames);
65383
65384                     match_kv.forEach(function(kv) {
65385                         match_nsimple.forEach(function(nsimple) {
65386                             var test = kv + nsimple;
65387                             if (nomatches.some(function(s) { return s === test; })) {
65388                                 console.log('WARNING match/nomatch conflict for ' + test);
65389                                 return;
65390                             }
65391
65392                             if (parts.d) {
65393                                 // fixme: name collisions will overwrite the single entry (ok for now)
65394                                 if (!_ambiguous[kv]) _ambiguous[kv] = {};
65395                                 _ambiguous[kv][nsimple] = parts;
65396                             } else {
65397                                 // name collisions are a problem in matchIndex, warn if we detect it
65398                                 if (!_matchIndex[kv]) _matchIndex[kv] = {};
65399                                 var m = _matchIndex[kv][nsimple];
65400                                 if (m) {  // there already is a match for this
65401                                     _warnings.push([m.kvnd, kvnd + ' ("' + nsimple + '")']);
65402                                 } else {
65403                                     _matchIndex[kv][nsimple] = parts;
65404                                 }
65405                             }
65406                         });
65407                     });
65408                 });
65409             };
65410
65411
65412             // pass a `key`, `value`, `name` and return the best match,
65413             // `countryCode` optional (if supplied, must match that too)
65414             matcher.matchKVN = function(key, value, name, countryCode) {
65415                 return matcher.matchParts(to_parts(key + '/' + value + '|' + name), countryCode);
65416             };
65417
65418             // pass a parts object and return the best match,
65419             // `countryCode` optional (if supplied, must match that too)
65420             matcher.matchParts = function(parts, countryCode) {
65421                 var match = null;
65422                 var inGroup = false;
65423
65424                 // fixme: we currently return a single match for ambiguous
65425                 match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
65426                 if (match && matchesCountryCode(match)) return match;
65427
65428                 // try to return an exact match
65429                 match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
65430                 if (match && matchesCountryCode(match)) return match;
65431
65432                 // look in match groups
65433                 for (var mg in matchGroups$1) {
65434                     var matchGroup = matchGroups$1[mg];
65435                     match = null;
65436                     inGroup = false;
65437
65438                     for (var i = 0; i < matchGroup.length; i++) {
65439                         var otherkv = matchGroup[i].toLowerCase();
65440                         if (!inGroup) {
65441                             inGroup = (otherkv === parts.kv);
65442                         }
65443                         if (!match) {
65444                             // fixme: we currently return a single match for ambiguous
65445                             match = _ambiguous[otherkv] && _ambiguous[otherkv][parts.nsimple];
65446                         }
65447                         if (!match) {
65448                             match = _matchIndex[otherkv] && _matchIndex[otherkv][parts.nsimple];
65449                         }
65450
65451                         if (!matchesCountryCode(match)) {
65452                             match = null;
65453                         }
65454
65455                         if (inGroup && match) {
65456                             return match;
65457                         }
65458                     }
65459                 }
65460
65461                 return null;
65462
65463
65464                 function matchesCountryCode(match) {
65465                     if (!countryCode) return true;
65466                     if (!match.countryCodes) return true;
65467                     return (match.countryCodes.indexOf(countryCode) !== -1);
65468                 }
65469             };
65470
65471
65472             matcher.getWarnings = function() {
65473                 return _warnings;
65474             };
65475
65476
65477             return matcher;
65478         };
65479
65480         function validationGenericName() {
65481             var type = 'generic_name';
65482
65483             // known list of generic names (e.g. "bar")
65484             var discardNamesRegexes = filters.discardNames.map(function(discardName) {
65485                 return new RegExp(discardName, 'i');
65486             });
65487
65488             var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
65489
65490             function isGenericName(entity) {
65491                 var name = entity.tags.name;
65492                 if (!name) return false;
65493                 name = name.toLowerCase();
65494
65495                 var i, key, val;
65496
65497                 // test if the name is just the key or tag value (e.g. "park")
65498                 for (i = 0; i < keysToTestForGenericValues.length; i++) {
65499                     key = keysToTestForGenericValues[i];
65500                     val = entity.tags[key];
65501                     if (val) {
65502                         val = val.toLowerCase();
65503                         if (key === name ||
65504                             val === name ||
65505                             key.replace(/\_/g, ' ') === name ||
65506                             val.replace(/\_/g, ' ') === name) {
65507                             return entity.tags.name;
65508                         }
65509                     }
65510                 }
65511
65512                 // test if the name is otherwise generic
65513                 for (i = 0; i < discardNamesRegexes.length; i++) {
65514                     if (discardNamesRegexes[i].test(name)) {
65515                         return entity.tags.name;
65516                     }
65517                 }
65518
65519                 return false;
65520             }
65521
65522
65523             var validation = function checkGenericName(entity) {
65524                 var generic = isGenericName(entity);
65525                 if (!generic) return [];
65526
65527                 return [new validationIssue({
65528                     type: type,
65529                     severity: 'warning',
65530                     message: function(context) {
65531                         var entity = context.hasEntity(this.entityIds[0]);
65532                         if (!entity) return '';
65533                         var preset = utilPreset(entity, context);
65534                         return t('issues.generic_name.message', { feature: preset.name(), name: generic });
65535                     },
65536                     reference: showReference,
65537                     entityIds: [entity.id],
65538                     hash: generic,
65539                     fixes: [
65540                         new validationIssueFix({
65541                             icon: 'iD-operation-delete',
65542                             title: t('issues.fix.remove_generic_name.title'),
65543                             onClick: function(context) {
65544                                 var entityId = this.issue.entityIds[0];
65545                                 var entity = context.entity(entityId);
65546                                 var tags = Object.assign({}, entity.tags);   // shallow copy
65547                                 delete tags.name;
65548                                 context.perform(
65549                                     actionChangeTags(entityId, tags),
65550                                     t('issues.fix.remove_generic_name.annotation')
65551                                 );
65552                             }
65553                         })
65554                     ]
65555                 })];
65556
65557
65558                 function showReference(selection) {
65559                     selection.selectAll('.issue-reference')
65560                         .data([0])
65561                         .enter()
65562                         .append('div')
65563                         .attr('class', 'issue-reference')
65564                         .text(t('issues.generic_name.reference'));
65565                 }
65566             };
65567
65568             validation.type = type;
65569
65570             return validation;
65571         }
65572
65573         function validationImpossibleOneway() {
65574             var type = 'impossible_oneway';
65575
65576             var validation = function checkImpossibleOneway(entity, graph) {
65577
65578                 if (entity.type !== 'way' || entity.geometry(graph) !== 'line') return [];
65579
65580                 if (entity.isClosed()) return [];
65581
65582                 if (!typeForWay(entity)) return [];
65583
65584                 if (!isOneway(entity)) return [];
65585
65586                 var firstIssues = issuesForNode(entity, entity.first());
65587                 var lastIssues = issuesForNode(entity, entity.last());
65588
65589                 return firstIssues.concat(lastIssues);
65590
65591                 function typeForWay(way) {
65592                     if (way.geometry(graph) !== 'line') return null;
65593
65594                     if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
65595                     if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
65596                     return null;
65597                 }
65598
65599                 function isOneway(way) {
65600                     if (way.tags.oneway === 'yes') return true;
65601                     if (way.tags.oneway) return false;
65602
65603                     for (var key in way.tags) {
65604                         if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
65605                             return true;
65606                         }
65607                     }
65608                     return false;
65609                 }
65610
65611                 function nodeOccursMoreThanOnce(way, nodeID) {
65612                     var occurences = 0;
65613                     for (var index in way.nodes) {
65614                         if (way.nodes[index] === nodeID) {
65615                             occurences += 1;
65616                             if (occurences > 1) return true;
65617                         }
65618                     }
65619                     return false;
65620                 }
65621
65622                 function isConnectedViaOtherTypes(way, node) {
65623
65624                     var wayType = typeForWay(way);
65625
65626                     if (wayType === 'highway') {
65627                         // entrances are considered connected
65628                         if (node.tags.entrance && node.tags.entrance !== 'no') return true;
65629                         if (node.tags.amenity === 'parking_entrance') return true;
65630                     } else if (wayType === 'waterway') {
65631                         if (node.id === way.first()) {
65632                             // multiple waterways may start at the same spring
65633                             if (node.tags.natural === 'spring') return true;
65634                         } else {
65635                             // multiple waterways may end at the same drain
65636                             if (node.tags.manhole === 'drain') return true;
65637                         }
65638                     }
65639
65640                     return graph.parentWays(node).some(function(parentWay) {
65641                         if (parentWay.id === way.id) return false;
65642
65643                         if (wayType === 'highway') {
65644
65645                             // allow connections to highway areas
65646                             if (parentWay.geometry(graph) === 'area' &&
65647                                 osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
65648
65649                             // count connections to ferry routes as connected
65650                             if (parentWay.tags.route === 'ferry') return true;
65651
65652                             return graph.parentRelations(parentWay).some(function(parentRelation) {
65653                                 if (parentRelation.tags.type === 'route' &&
65654                                     parentRelation.tags.route === 'ferry') return true;
65655
65656                                 // allow connections to highway multipolygons
65657                                 return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
65658                             });
65659                         } else if (wayType === 'waterway') {
65660                             // multiple waterways may start or end at a water body at the same node
65661                             if (parentWay.tags.natural === 'water' ||
65662                                 parentWay.tags.natural === 'coastline') return true;
65663                         }
65664                         return false;
65665                     });
65666                 }
65667
65668                 function issuesForNode(way, nodeID) {
65669
65670                     var isFirst = nodeID === way.first();
65671
65672                     var wayType = typeForWay(way);
65673
65674                     // ignore if this way is self-connected at this node
65675                     if (nodeOccursMoreThanOnce(way, nodeID)) return [];
65676
65677                     var osm = services$1.osm;
65678                     if (!osm) return [];
65679
65680                     var node = graph.hasEntity(nodeID);
65681
65682                     // ignore if this node or its tile are unloaded
65683                     if (!node || !osm.isDataLoaded(node.loc)) return [];
65684
65685                     if (isConnectedViaOtherTypes(way, node)) return [];
65686
65687                     var attachedWaysOfSameType = graph.parentWays(node).filter(function(parentWay) {
65688                         if (parentWay.id === way.id) return false;
65689                         return typeForWay(parentWay) === wayType;
65690                     });
65691
65692                     // assume it's okay for waterways to start or end disconnected for now
65693                     if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
65694
65695                     var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
65696                         return isOneway(attachedWay);
65697                     });
65698
65699                     // ignore if the way is connected to some non-oneway features
65700                     if (attachedOneways.length < attachedWaysOfSameType.length) return [];
65701
65702                     if (attachedOneways.length) {
65703                         var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
65704                             if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
65705                             if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
65706                             return false;
65707                         });
65708                         if (connectedEndpointsOkay) return [];
65709                     }
65710
65711                     var fixes = [];
65712
65713                     if (attachedOneways.length) {
65714                         fixes.push(new validationIssueFix({
65715                             icon: 'iD-operation-reverse',
65716                             title: t('issues.fix.reverse_feature.title'),
65717                             entityIds: [way.id],
65718                             onClick: function(context) {
65719                                 var id = this.issue.entityIds[0];
65720                                 context.perform(actionReverse(id), t('operations.reverse.annotation'));
65721                             }
65722                         }));
65723                     }
65724                     if (node.tags.noexit !== 'yes') {
65725                         fixes.push(new validationIssueFix({
65726                             icon: 'iD-operation-continue' + (isFirst ? '-left' : ''),
65727                             title: t('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
65728                             onClick: function(context) {
65729                                 var entityID = this.issue.entityIds[0];
65730                                 var vertexID = this.issue.entityIds[1];
65731                                 var way = context.entity(entityID);
65732                                 var vertex = context.entity(vertexID);
65733                                 continueDrawing(way, vertex, context);
65734                             }
65735                         }));
65736                     }
65737
65738                     var placement = isFirst ? 'start' : 'end',
65739                         messageID = wayType + '.',
65740                         referenceID = wayType + '.';
65741
65742                     if (wayType === 'waterway') {
65743                         messageID += 'connected.' + placement;
65744                         referenceID += 'connected';
65745                     } else {
65746                         messageID += placement;
65747                         referenceID += placement;
65748                     }
65749
65750                     return [new validationIssue({
65751                         type: type,
65752                         subtype: wayType,
65753                         severity: 'warning',
65754                         message: function(context) {
65755                             var entity = context.hasEntity(this.entityIds[0]);
65756                             return entity ? t('issues.impossible_oneway.' + messageID + '.message', {
65757                                 feature: utilDisplayLabel(entity, context)
65758                             }) : '';
65759                         },
65760                         reference: getReference(referenceID),
65761                         entityIds: [way.id, node.id],
65762                         fixes: fixes
65763                     })];
65764
65765                     function getReference(referenceID) {
65766                         return function showReference(selection) {
65767                             selection.selectAll('.issue-reference')
65768                                 .data([0])
65769                                 .enter()
65770                                 .append('div')
65771                                 .attr('class', 'issue-reference')
65772                                 .text(t('issues.impossible_oneway.' + referenceID + '.reference'));
65773                         };
65774                     }
65775                 }
65776             };
65777
65778             function continueDrawing(way, vertex, context) {
65779                 // make sure the vertex is actually visible and editable
65780                 var map = context.map();
65781                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65782                     map.zoomToEase(vertex);
65783                 }
65784
65785                 context.enter(
65786                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65787                 );
65788             }
65789
65790             validation.type = type;
65791
65792             return validation;
65793         }
65794
65795         function validationIncompatibleSource() {
65796             var type = 'incompatible_source';
65797             var invalidSources = [
65798                 {
65799                     id:'google', regex:'google', exceptRegex: 'books.google|Google Books'
65800                 }
65801             ];
65802
65803             var validation = function checkIncompatibleSource(entity) {
65804
65805                 var entitySources = entity.tags && entity.tags.source && entity.tags.source.split(';');
65806
65807                 if (!entitySources) return [];
65808
65809                 var issues = [];
65810
65811                 invalidSources.forEach(function(invalidSource) {
65812
65813                     var hasInvalidSource = entitySources.some(function(source) {
65814                         if (!source.match(new RegExp(invalidSource.regex, 'i'))) return false;
65815                         if (invalidSource.exceptRegex && source.match(new RegExp(invalidSource.exceptRegex, 'i'))) return false;
65816                         return true;
65817                     });
65818
65819                     if (!hasInvalidSource) return;
65820
65821                     issues.push(new validationIssue({
65822                         type: type,
65823                         severity: 'warning',
65824                         message: function(context) {
65825                             var entity = context.hasEntity(this.entityIds[0]);
65826                             return entity ? t('issues.incompatible_source.' + invalidSource.id + '.feature.message', {
65827                                 feature: utilDisplayLabel(entity, context)
65828                             }) : '';
65829                         },
65830                         reference: getReference(invalidSource.id),
65831                         entityIds: [entity.id],
65832                         fixes: [
65833                             new validationIssueFix({
65834                                 title: t('issues.fix.remove_proprietary_data.title')
65835                             })
65836                         ]
65837                     }));
65838                 });
65839
65840                 return issues;
65841
65842
65843                 function getReference(id) {
65844                     return function showReference(selection) {
65845                         selection.selectAll('.issue-reference')
65846                             .data([0])
65847                             .enter()
65848                             .append('div')
65849                             .attr('class', 'issue-reference')
65850                             .text(t('issues.incompatible_source.' + id + '.reference'));
65851                     };
65852                 }
65853             };
65854
65855             validation.type = type;
65856
65857             return validation;
65858         }
65859
65860         function validationFormatting() {
65861             var type = 'invalid_format';
65862
65863             var validation = function(entity) {
65864                 var issues = [];
65865
65866                 function isValidEmail(email) {
65867                     // Emails in OSM are going to be official so they should be pretty simple
65868                     // Using negated lists to better support all possible unicode characters (#6494)
65869                     var valid_email = /^[^\(\)\\,":;<>@\[\]]+@[^\(\)\\,":;<>@\[\]\.]+(?:\.[a-z0-9-]+)*$/i;
65870
65871                     // An empty value is also acceptable
65872                     return (!email || valid_email.test(email));
65873                 }
65874
65875                 function isSchemePresent(url) {
65876                     var valid_scheme = /^https?:\/\//i;
65877                     return (!url || valid_scheme.test(url));
65878                 }
65879
65880                 function showReferenceEmail(selection) {
65881                     selection.selectAll('.issue-reference')
65882                         .data([0])
65883                         .enter()
65884                         .append('div')
65885                         .attr('class', 'issue-reference')
65886                         .text(t('issues.invalid_format.email.reference'));
65887                 }
65888
65889                 function showReferenceWebsite(selection) {
65890                     selection.selectAll('.issue-reference')
65891                         .data([0])
65892                         .enter()
65893                         .append('div')
65894                         .attr('class', 'issue-reference')
65895                         .text(t('issues.invalid_format.website.reference'));
65896                 }
65897
65898                 if (entity.tags.website) {
65899                     // Multiple websites are possible
65900                     // If ever we support ES6, arrow functions make this nicer
65901                     var websites = entity.tags.website
65902                         .split(';')
65903                         .map(function(s) { return s.trim(); })
65904                         .filter(function(x) { return !isSchemePresent(x); });
65905
65906                     if (websites.length) {
65907                         issues.push(new validationIssue({
65908                             type: type,
65909                             subtype: 'website',
65910                             severity: 'warning',
65911                             message: function(context) {
65912                                 var entity = context.hasEntity(this.entityIds[0]);
65913                                 return entity ? t('issues.invalid_format.website.message' + this.data,
65914                                     { feature: utilDisplayLabel(entity, context), site: websites.join(', ') }) : '';
65915                             },
65916                             reference: showReferenceWebsite,
65917                             entityIds: [entity.id],
65918                             hash: websites.join(),
65919                             data: (websites.length > 1) ? '_multi' : ''
65920                         }));
65921                     }
65922                 }
65923
65924                 if (entity.tags.email) {
65925                     // Multiple emails are possible
65926                     var emails = entity.tags.email
65927                         .split(';')
65928                         .map(function(s) { return s.trim(); })
65929                         .filter(function(x) { return !isValidEmail(x); });
65930
65931                     if (emails.length) {
65932                         issues.push(new validationIssue({
65933                             type: type,
65934                             subtype: 'email',
65935                             severity: 'warning',
65936                             message: function(context) {
65937                                 var entity = context.hasEntity(this.entityIds[0]);
65938                                 return entity ? t('issues.invalid_format.email.message' + this.data,
65939                                     { feature: utilDisplayLabel(entity, context), email: emails.join(', ') }) : '';
65940                             },
65941                             reference: showReferenceEmail,
65942                             entityIds: [entity.id],
65943                             hash: emails.join(),
65944                             data: (emails.length > 1) ? '_multi' : ''
65945                         }));
65946                     }
65947                 }
65948
65949                 return issues;
65950             };
65951
65952             validation.type = type;
65953
65954             return validation;
65955         }
65956
65957         function validationMaprules() {
65958             var type = 'maprules';
65959
65960             var validation = function checkMaprules(entity, graph) {
65961                 if (!services$1.maprules) return [];
65962
65963                 var rules = services$1.maprules.validationRules();
65964                 var issues = [];
65965
65966                 for (var i = 0; i < rules.length; i++) {
65967                     var rule = rules[i];
65968                     rule.findIssues(entity, graph, issues);
65969                 }
65970
65971                 return issues;
65972             };
65973
65974
65975             validation.type = type;
65976
65977             return validation;
65978         }
65979
65980         function validationMissingRole() {
65981             var type = 'missing_role';
65982
65983             var validation = function checkMissingRole(entity, graph) {
65984                 var issues = [];
65985                 if (entity.type === 'way') {
65986                     graph.parentRelations(entity).forEach(function(relation) {
65987                         if (!relation.isMultipolygon()) return;
65988
65989                         var member = relation.memberById(entity.id);
65990                         if (member && isMissingRole(member)) {
65991                             issues.push(makeIssue(entity, relation, member));
65992                         }
65993                     });
65994                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
65995                     entity.indexedMembers().forEach(function(member) {
65996                         var way = graph.hasEntity(member.id);
65997                         if (way && isMissingRole(member)) {
65998                             issues.push(makeIssue(way, entity, member));
65999                         }
66000                     });
66001                 }
66002
66003                 return issues;
66004             };
66005
66006
66007             function isMissingRole(member) {
66008                 return !member.role || !member.role.trim().length;
66009             }
66010
66011
66012             function makeIssue(way, relation, member) {
66013                 return new validationIssue({
66014                     type: type,
66015                     severity: 'warning',
66016                     message: function(context) {
66017                         var member = context.hasEntity(this.entityIds[1]),
66018                             relation = context.hasEntity(this.entityIds[0]);
66019                         return (member && relation) ? t('issues.missing_role.message', {
66020                             member: utilDisplayLabel(member, context),
66021                             relation: utilDisplayLabel(relation, context)
66022                         }) : '';
66023                     },
66024                     reference: showReference,
66025                     entityIds: [relation.id, way.id],
66026                     data: {
66027                         member: member
66028                     },
66029                     hash: member.index.toString(),
66030                     fixes: [
66031                         makeAddRoleFix('inner'),
66032                         makeAddRoleFix('outer'),
66033                         new validationIssueFix({
66034                             icon: 'iD-operation-delete',
66035                             title: t('issues.fix.remove_from_relation.title'),
66036                             onClick: function(context) {
66037                                 context.perform(
66038                                     actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
66039                                     t('operations.delete_member.annotation')
66040                                 );
66041                             }
66042                         })
66043                     ]
66044                 });
66045
66046
66047                 function showReference(selection) {
66048                     selection.selectAll('.issue-reference')
66049                         .data([0])
66050                         .enter()
66051                         .append('div')
66052                         .attr('class', 'issue-reference')
66053                         .text(t('issues.missing_role.multipolygon.reference'));
66054                 }
66055             }
66056
66057
66058             function makeAddRoleFix(role) {
66059                 return new validationIssueFix({
66060                     title: t('issues.fix.set_as_' + role + '.title'),
66061                     onClick: function(context) {
66062                         var oldMember = this.issue.data.member;
66063                         var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
66064                         context.perform(
66065                             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
66066                             t('operations.change_role.annotation')
66067                         );
66068                     }
66069                 });
66070             }
66071
66072             validation.type = type;
66073
66074             return validation;
66075         }
66076
66077         function validationMissingTag() {
66078             var type = 'missing_tag';
66079
66080
66081             function hasDescriptiveTags(entity) {
66082                 var keys = Object.keys(entity.tags)
66083                     .filter(function(k) {
66084                         if (k === 'area' || k === 'name') {
66085                             return false;
66086                         } else {
66087                             return osmIsInterestingTag(k);
66088                         }
66089                     });
66090
66091                 if (entity.type === 'relation' && keys.length === 1) {
66092                     return entity.tags.type !== 'multipolygon';
66093                 }
66094                 return keys.length > 0;
66095             }
66096
66097
66098             function isUnknownRoad(entity) {
66099                 return entity.type === 'way' && entity.tags.highway === 'road';
66100             }
66101
66102             function isUntypedRelation(entity) {
66103                 return entity.type === 'relation' && !entity.tags.type;
66104             }
66105
66106
66107             var validation = function checkMissingTag(entity, graph) {
66108
66109                 // ignore vertex features and relation members
66110                 if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
66111                     return [];
66112                 }
66113
66114                 var subtype;
66115
66116                 if (Object.keys(entity.tags).length === 0) {
66117                     subtype = 'any';
66118                 } else if (!hasDescriptiveTags(entity)) {
66119                     subtype = 'descriptive';
66120                 } else if (isUntypedRelation(entity)) {
66121                     subtype = 'relation_type';
66122                 } else if (isUnknownRoad(entity)) {
66123                     subtype = 'highway_classification';
66124                 }
66125
66126                 if (!subtype) return [];
66127
66128                 var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
66129
66130                 var fixes = [
66131                     new validationIssueFix({
66132                         icon: 'iD-icon-search',
66133                         title: t('issues.fix.' + selectFixType + '.title'),
66134                         onClick: function(context) {
66135                             context.ui().sidebar.showPresetList();
66136                         }
66137                     })
66138                 ];
66139
66140                 // can always delete if the user created it in the first place..
66141                 var canDelete = (entity.version === undefined || entity.v !== undefined);
66142                 fixes.push(
66143                     new validationIssueFix({
66144                         icon: 'iD-operation-delete',
66145                         title: t('issues.fix.delete_feature.title'),
66146                         onClick: function(context) {
66147                             var id = this.issue.entityIds[0];
66148                             var operation = operationDelete([id], context);
66149                             if (!operation.disabled()) {
66150                                 operation();
66151                             }
66152                         }
66153                     })
66154                 );
66155
66156                 var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
66157                 var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
66158
66159                 var severity = (canDelete && subtype !== 'highway_classification') ? 'error' : 'warning';
66160
66161                 return [new validationIssue({
66162                     type: type,
66163                     subtype: subtype,
66164                     severity: severity,
66165                     message: function(context) {
66166                         var entity = context.hasEntity(this.entityIds[0]);
66167                         return entity ? t('issues.' + messageID + '.message', {
66168                             feature: utilDisplayLabel(entity, context)
66169                         }) : '';
66170                     },
66171                     reference: showReference,
66172                     entityIds: [entity.id],
66173                     fixes: fixes
66174                 })];
66175
66176
66177                 function showReference(selection) {
66178                     selection.selectAll('.issue-reference')
66179                         .data([0])
66180                         .enter()
66181                         .append('div')
66182                         .attr('class', 'issue-reference')
66183                         .text(t('issues.' + referenceID + '.reference'));
66184                 }
66185             };
66186
66187
66188             validation.type = type;
66189
66190             return validation;
66191         }
66192
66193         function validationOutdatedTags(context) {
66194             var type = 'outdated_tags';
66195
66196             // initialize name-suggestion-index matcher
66197             var nsiMatcher = matcher$1();
66198             nsiMatcher.buildMatchIndex(brands$1.brands);
66199             var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
66200
66201             var allWD = {};
66202             var allWP = {};
66203             Object.keys(brands$1.brands).forEach(function(kvnd) {
66204                 var brand = brands$1.brands[kvnd];
66205                 var wd = brand.tags['brand:wikidata'];
66206                 var wp = brand.tags['brand:wikipedia'];
66207                 if (wd) { allWD[wd] = kvnd; }
66208                 if (wp) { allWP[wp] = kvnd; }
66209             });
66210
66211
66212             function oldTagIssues(entity, graph) {
66213                 var oldTags = Object.assign({}, entity.tags);  // shallow copy
66214                 var preset = context.presets().match(entity, graph);
66215                 var explicitPresetUpgrade = preset.replacement;
66216                 var subtype = 'deprecated_tags';
66217
66218                 // upgrade preset..
66219                 if (preset.replacement) {
66220                     var newPreset = context.presets().item(preset.replacement);
66221                     graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);  // true = skip field defaults
66222                     entity = graph.entity(entity.id);
66223                     preset = newPreset;
66224                 }
66225
66226                 // upgrade tags..
66227                 var deprecatedTags = entity.deprecatedTags();
66228                 if (deprecatedTags.length) {
66229                     deprecatedTags.forEach(function(tag) {
66230                         graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
66231                     });
66232                     entity = graph.entity(entity.id);
66233                 }
66234
66235                 // add missing addTags..
66236                 var newTags = Object.assign({}, entity.tags);  // shallow copy
66237                 if (preset.tags !== preset.addTags) {
66238                     Object.keys(preset.addTags).forEach(function(k) {
66239                         if (!newTags[k]) {
66240                             newTags[k] = preset.addTags[k];
66241                             if (!explicitPresetUpgrade) {
66242                                 subtype = 'incomplete_tags';
66243                             }
66244                         }
66245                     });
66246                 }
66247
66248                 // Do `wikidata` or `wikipedia` identify this entity as a brand?  #6416
66249                 // If so, these tags can be swapped to `brand:wikidata`/`brand:wikipedia`
66250                 var isBrand;
66251                 if (newTags.wikidata) {                 // try matching `wikidata`
66252                     isBrand = allWD[newTags.wikidata];
66253                 }
66254                 if (!isBrand && newTags.wikipedia) {    // fallback to `wikipedia`
66255                     isBrand = allWP[newTags.wikipedia];
66256                 }
66257                 if (isBrand && !newTags.office) {       // but avoid doing this for corporate offices
66258                     if (newTags.wikidata) {
66259                         newTags['brand:wikidata'] = newTags.wikidata;
66260                         delete newTags.wikidata;
66261                     }
66262                     if (newTags.wikipedia) {
66263                         newTags['brand:wikipedia'] = newTags.wikipedia;
66264                         delete newTags.wikipedia;
66265                     }
66266                     // I considered setting `name` and other tags here, but they aren't unique per wikidata
66267                     // (Q2759586 -> in USA "Papa John's", in Russia "Папа Джонс")
66268                     // So users will really need to use a preset or assign `name` themselves.
66269                 }
66270
66271                 // try key/value|name match against name-suggestion-index
66272                 if (newTags.name) {
66273                     for (var i = 0; i < nsiKeys.length; i++) {
66274                         var k = nsiKeys[i];
66275                         if (!newTags[k]) continue;
66276
66277                         var match = nsiMatcher.matchKVN(k, newTags[k], newTags.name);
66278                         if (!match) continue;
66279
66280                         // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
66281                         if (match.d) continue;
66282
66283                         var brand = brands$1.brands[match.kvnd];
66284                         if (brand && brand.tags['brand:wikidata']) {
66285                             subtype = 'noncanonical_brand';
66286
66287                             var keepTags = ['takeaway'].reduce(function(acc, k) {
66288                                 if (newTags[k]) {
66289                                     acc[k] = newTags[k];
66290                                 }
66291                                 return acc;
66292                             }, {});
66293
66294                             nsiKeys.forEach(function(k) { delete newTags[k]; });
66295                             Object.assign(newTags, brand.tags, keepTags);
66296                             break;
66297                         }
66298                     }
66299                 }
66300
66301
66302                 // determine diff
66303                 var tagDiff = utilTagDiff(oldTags, newTags);
66304                 if (!tagDiff.length) return [];
66305
66306                 var prefix = '';
66307                 if (subtype === 'noncanonical_brand') {
66308                     prefix = 'noncanonical_brand.';
66309                 } else if (subtype === 'incomplete_tags') {
66310                     prefix = 'incomplete.';
66311                 }
66312
66313                 // don't allow autofixing brand tags
66314                 var autoArgs = subtype !== 'noncanonical_brand' ? [doUpgrade, t('issues.fix.upgrade_tags.annotation')] : null;
66315
66316                 return [new validationIssue({
66317                     type: type,
66318                     subtype: subtype,
66319                     severity: 'warning',
66320                     message: showMessage,
66321                     reference: showReference,
66322                     entityIds: [entity.id],
66323                     hash: JSON.stringify(tagDiff),
66324                     fixes: [
66325                         new validationIssueFix({
66326                             autoArgs: autoArgs,
66327                             title: t('issues.fix.upgrade_tags.title'),
66328                             onClick: function(context) {
66329                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66330                             }
66331                         })
66332                     ]
66333                 })];
66334
66335
66336                 function doUpgrade(graph) {
66337                     var currEntity = graph.hasEntity(entity.id);
66338                     if (!currEntity) return graph;
66339
66340                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66341                     tagDiff.forEach(function(diff) {
66342                         if (diff.type === '-') {
66343                             delete newTags[diff.key];
66344                         } else if (diff.type === '+') {
66345                             newTags[diff.key] = diff.newVal;
66346                         }
66347                     });
66348
66349                     return actionChangeTags(currEntity.id, newTags)(graph);
66350                 }
66351
66352
66353                 function showMessage(context) {
66354                     var currEntity = context.hasEntity(entity.id);
66355                     if (!currEntity) return '';
66356
66357                     return t('issues.outdated_tags.' + prefix + 'message',
66358                         { feature: utilDisplayLabel(currEntity, context) }
66359                     );
66360                 }
66361
66362
66363                 function showReference(selection) {
66364                     var enter = selection.selectAll('.issue-reference')
66365                         .data([0])
66366                         .enter();
66367
66368                     enter
66369                         .append('div')
66370                         .attr('class', 'issue-reference')
66371                         .text(t('issues.outdated_tags.' + prefix + 'reference'));
66372
66373                     enter
66374                         .append('strong')
66375                         .text(t('issues.suggested'));
66376
66377                     enter
66378                         .append('table')
66379                         .attr('class', 'tagDiff-table')
66380                         .selectAll('.tagDiff-row')
66381                         .data(tagDiff)
66382                         .enter()
66383                         .append('tr')
66384                         .attr('class', 'tagDiff-row')
66385                         .append('td')
66386                         .attr('class', function(d) {
66387                             var klass = d.type === '+' ? 'add' : 'remove';
66388                             return 'tagDiff-cell tagDiff-cell-' + klass;
66389                         })
66390                         .text(function(d) { return d.display; });
66391                 }
66392             }
66393
66394
66395             function oldMultipolygonIssues(entity, graph) {
66396
66397                 var multipolygon, outerWay;
66398                 if (entity.type === 'relation') {
66399                     outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
66400                     multipolygon = entity;
66401                 } else if (entity.type === 'way') {
66402                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
66403                     outerWay = entity;
66404                 } else {
66405                     return [];
66406                 }
66407
66408                 if (!multipolygon || !outerWay) return [];
66409
66410                 return [new validationIssue({
66411                     type: type,
66412                     subtype: 'old_multipolygon',
66413                     severity: 'warning',
66414                     message: showMessage,
66415                     reference: showReference,
66416                     entityIds: [outerWay.id, multipolygon.id],
66417                     fixes: [
66418                         new validationIssueFix({
66419                             autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
66420                             title: t('issues.fix.move_tags.title'),
66421                             onClick: function(context) {
66422                                 context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
66423                             }
66424                         })
66425                     ]
66426                 })];
66427
66428
66429                 function doUpgrade(graph) {
66430                     var currMultipolygon = graph.hasEntity(multipolygon.id);
66431                     var currOuterWay = graph.hasEntity(outerWay.id);
66432                     if (!currMultipolygon || !currOuterWay) return graph;
66433
66434                     currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
66435                     graph = graph.replace(currMultipolygon);
66436                     return actionChangeTags(currOuterWay.id, {})(graph);
66437                 }
66438
66439
66440                 function showMessage(context) {
66441                     var currMultipolygon = context.hasEntity(multipolygon.id);
66442                     if (!currMultipolygon) return '';
66443
66444                     return t('issues.old_multipolygon.message',
66445                         { multipolygon: utilDisplayLabel(currMultipolygon, context) }
66446                     );
66447                 }
66448
66449
66450                 function showReference(selection) {
66451                     selection.selectAll('.issue-reference')
66452                         .data([0])
66453                         .enter()
66454                         .append('div')
66455                         .attr('class', 'issue-reference')
66456                         .text(t('issues.old_multipolygon.reference'));
66457                 }
66458             }
66459
66460
66461             var validation = function checkOutdatedTags(entity, graph) {
66462                 var issues = oldMultipolygonIssues(entity, graph);
66463                 if (!issues.length) issues = oldTagIssues(entity, graph);
66464                 return issues;
66465             };
66466
66467
66468             validation.type = type;
66469
66470             return validation;
66471         }
66472
66473         function validationPrivateData() {
66474             var type = 'private_data';
66475
66476             // assume that some buildings are private
66477             var privateBuildingValues = {
66478                 detached: true,
66479                 farm: true,
66480                 house: true,
66481                 houseboat: true,
66482                 residential: true,
66483                 semidetached_house: true,
66484                 static_caravan: true
66485             };
66486
66487             // but they might be public if they have one of these other tags
66488             var publicKeys = {
66489                 amenity: true,
66490                 craft: true,
66491                 historic: true,
66492                 leisure: true,
66493                 office: true,
66494                 shop: true,
66495                 tourism: true
66496             };
66497
66498             // these tags may contain personally identifying info
66499             var personalTags = {
66500                 'contact:email': true,
66501                 'contact:fax': true,
66502                 'contact:phone': true,
66503                 email: true,
66504                 fax: true,
66505                 phone: true
66506             };
66507
66508
66509             var validation = function checkPrivateData(entity) {
66510                 var tags = entity.tags;
66511                 if (!tags.building || !privateBuildingValues[tags.building]) return [];
66512
66513                 var keepTags = {};
66514                 for (var k in tags) {
66515                     if (publicKeys[k]) return [];  // probably a public feature
66516                     if (!personalTags[k]) {
66517                         keepTags[k] = tags[k];
66518                     }
66519                 }
66520
66521                 var tagDiff = utilTagDiff(tags, keepTags);
66522                 if (!tagDiff.length) return [];
66523
66524                 var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
66525
66526                 return [new validationIssue({
66527                     type: type,
66528                     severity: 'warning',
66529                     message: showMessage,
66530                     reference: showReference,
66531                     entityIds: [entity.id],
66532                     fixes: [
66533                         new validationIssueFix({
66534                             icon: 'iD-operation-delete',
66535                             title: t('issues.fix.' + fixID + '.title'),
66536                             onClick: function(context) {
66537                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66538                             }
66539                         })
66540                     ]
66541                 })];
66542
66543
66544                 function doUpgrade(graph) {
66545                     var currEntity = graph.hasEntity(entity.id);
66546                     if (!currEntity) return graph;
66547
66548                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66549                     tagDiff.forEach(function(diff) {
66550                         if (diff.type === '-') {
66551                             delete newTags[diff.key];
66552                         } else if (diff.type === '+') {
66553                             newTags[diff.key] = diff.newVal;
66554                         }
66555                     });
66556
66557                     return actionChangeTags(currEntity.id, newTags)(graph);
66558                 }
66559
66560
66561                 function showMessage(context) {
66562                     var currEntity = context.hasEntity(this.entityIds[0]);
66563                     if (!currEntity) return '';
66564
66565                     return t('issues.private_data.contact.message',
66566                         { feature: utilDisplayLabel(currEntity, context) }
66567                     );
66568                 }
66569
66570
66571                 function showReference(selection) {
66572                     var enter = selection.selectAll('.issue-reference')
66573                         .data([0])
66574                         .enter();
66575
66576                     enter
66577                         .append('div')
66578                         .attr('class', 'issue-reference')
66579                         .text(t('issues.private_data.reference'));
66580
66581                     enter
66582                         .append('strong')
66583                         .text(t('issues.suggested'));
66584
66585                     enter
66586                         .append('table')
66587                         .attr('class', 'tagDiff-table')
66588                         .selectAll('.tagDiff-row')
66589                         .data(tagDiff)
66590                         .enter()
66591                         .append('tr')
66592                         .attr('class', 'tagDiff-row')
66593                         .append('td')
66594                         .attr('class', function(d) {
66595                             var klass = d.type === '+' ? 'add' : 'remove';
66596                             return 'tagDiff-cell tagDiff-cell-' + klass;
66597                         })
66598                         .text(function(d) { return d.display; });
66599                 }
66600             };
66601
66602
66603             validation.type = type;
66604
66605             return validation;
66606         }
66607
66608         function validationTagSuggestsArea(context) {
66609             var type = 'tag_suggests_area';
66610
66611
66612             var validation = function checkTagSuggestsArea(entity, graph) {
66613                 if (entity.type !== 'way' || entity.isClosed()) return [];
66614
66615                 var tagSuggestingArea = entity.tagSuggestingArea();
66616                 if (!tagSuggestingArea) {
66617                     return [];
66618                 }
66619
66620                 if (context.presets().matchTags(tagSuggestingArea, 'line') ===
66621                     context.presets().matchTags(tagSuggestingArea, 'area')) {
66622                     // these tags also allow lines and making this an area wouldn't matter
66623                     return [];
66624                 }
66625
66626                 var tagText = utilTagText({ tags: tagSuggestingArea });
66627                 var fixes = [];
66628
66629                 var connectEndpointsOnClick;
66630
66631                 // must have at least three nodes to close this automatically
66632                 if (entity.nodes.length >= 3) {
66633                     var nodes = graph.childNodes(entity), testNodes;
66634                     var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
66635
66636                     // if the distance is very small, attempt to merge the endpoints
66637                     if (firstToLastDistanceMeters < 0.75) {
66638                         testNodes = nodes.slice();   // shallow copy
66639                         testNodes.pop();
66640                         testNodes.push(testNodes[0]);
66641                         // make sure this will not create a self-intersection
66642                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66643                             connectEndpointsOnClick = function(context) {
66644                                 var way = context.entity(this.issue.entityIds[0]);
66645                                 context.perform(
66646                                     actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
66647                                     t('issues.fix.connect_endpoints.annotation')
66648                                 );
66649                             };
66650                         }
66651                     }
66652
66653                     if (!connectEndpointsOnClick) {
66654                         // if the points were not merged, attempt to close the way
66655                         testNodes = nodes.slice();   // shallow copy
66656                         testNodes.push(testNodes[0]);
66657                         // make sure this will not create a self-intersection
66658                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66659                             connectEndpointsOnClick = function(context) {
66660                                 var wayId = this.issue.entityIds[0];
66661                                 var way = context.entity(wayId);
66662                                 var nodeId = way.nodes[0];
66663                                 var index = way.nodes.length;
66664                                 context.perform(
66665                                     actionAddVertex(wayId, nodeId, index),
66666                                     t('issues.fix.connect_endpoints.annotation')
66667                                 );
66668                             };
66669                         }
66670                     }
66671                 }
66672
66673                 fixes.push(new validationIssueFix({
66674                     title: t('issues.fix.connect_endpoints.title'),
66675                     onClick: connectEndpointsOnClick
66676                 }));
66677
66678                 fixes.push(new validationIssueFix({
66679                     icon: 'iD-operation-delete',
66680                     title: t('issues.fix.remove_tag.title'),
66681                     onClick: function(context) {
66682                         var entityId = this.issue.entityIds[0];
66683                         var entity = context.entity(entityId);
66684                         var tags = Object.assign({}, entity.tags);  // shallow copy
66685                         for (var key in tagSuggestingArea) {
66686                             delete tags[key];
66687                         }
66688                         context.perform(
66689                             actionChangeTags(entityId, tags),
66690                             t('issues.fix.remove_tag.annotation')
66691                         );
66692                     }
66693                 }));
66694
66695                 return [new validationIssue({
66696                     type: type,
66697                     severity: 'warning',
66698                     message: function(context) {
66699                         var entity = context.hasEntity(this.entityIds[0]);
66700                         return entity ? t('issues.tag_suggests_area.message', {
66701                             feature: utilDisplayLabel(entity, context),
66702                             tag: tagText
66703                         }) : '';
66704                     },
66705                     reference: showReference,
66706                     entityIds: [entity.id],
66707                     hash: JSON.stringify(tagSuggestingArea) +
66708                         // avoid stale "connect endpoints" fix
66709                         (typeof connectEndpointsOnClick),
66710                     fixes: fixes
66711                 })];
66712
66713
66714                 function showReference(selection) {
66715                     selection.selectAll('.issue-reference')
66716                         .data([0])
66717                         .enter()
66718                         .append('div')
66719                         .attr('class', 'issue-reference')
66720                         .text(t('issues.tag_suggests_area.reference'));
66721                 }
66722             };
66723
66724             validation.type = type;
66725
66726             return validation;
66727         }
66728
66729         function validationUnsquareWay(context) {
66730             var type = 'unsquare_way';
66731             var DEFAULT_DEG_THRESHOLD = 5;   // see also issues.js
66732
66733             // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
66734             var epsilon = 0.05;
66735             var nodeThreshold = 10;
66736
66737             function isBuilding(entity, graph) {
66738                 if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
66739                 return entity.tags.building && entity.tags.building !== 'no';
66740             }
66741
66742
66743             var validation = function checkUnsquareWay(entity, graph) {
66744
66745                 if (!isBuilding(entity, graph)) return [];
66746
66747                 // don't flag ways marked as physically unsquare
66748                 if (entity.tags.nonsquare === 'yes') return [];
66749
66750                 var isClosed = entity.isClosed();
66751                 if (!isClosed) return [];        // this building has bigger problems
66752
66753                 // don't flag ways with lots of nodes since they are likely detail-mapped
66754                 var nodes = graph.childNodes(entity).slice();    // shallow copy
66755                 if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
66756
66757                 // ignore if not all nodes are fully downloaded
66758                 var osm = services$1.osm;
66759                 if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
66760
66761                 // don't flag connected ways to avoid unresolvable unsquare loops
66762                 var hasConnectedSquarableWays = nodes.some(function(node) {
66763                     return graph.parentWays(node).some(function(way) {
66764                         if (way.id === entity.id) return false;
66765                         if (isBuilding(way, graph)) return true;
66766                         return graph.parentRelations(way).some(function(parentRelation) {
66767                             return parentRelation.isMultipolygon() &&
66768                                 parentRelation.tags.building &&
66769                                 parentRelation.tags.building !== 'no';
66770                         });
66771                     });
66772                 });
66773                 if (hasConnectedSquarableWays) return [];
66774
66775
66776                 // user-configurable square threshold
66777                 var storedDegreeThreshold = context.storage('validate-square-degrees');
66778                 var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
66779
66780                 var points = nodes.map(function(node) { return context.projection(node.loc); });
66781                 if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
66782
66783                 var autoArgs;
66784                 // don't allow autosquaring features linked to wikidata
66785                 if (!entity.tags.wikidata) {
66786                     // use same degree threshold as for detection
66787                     var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
66788                     autoAction.transitionable = false;  // when autofixing, do it instantly
66789                     autoArgs = [autoAction, t('operations.orthogonalize.annotation.area')];
66790                 }
66791
66792                 return [new validationIssue({
66793                     type: type,
66794                     severity: 'warning',
66795                     message: function(context) {
66796                         var entity = context.hasEntity(this.entityIds[0]);
66797                         return entity ? t('issues.unsquare_way.message', { feature: utilDisplayLabel(entity, context) }) : '';
66798                     },
66799                     reference: showReference,
66800                     entityIds: [entity.id],
66801                     hash: JSON.stringify(autoArgs !== undefined) + degreeThreshold,
66802                     fixes: [
66803                         new validationIssueFix({
66804                             icon: 'iD-operation-orthogonalize',
66805                             title: t('issues.fix.square_feature.title'),
66806                             autoArgs: autoArgs,
66807                             onClick: function(context, completionHandler) {
66808                                 var entityId = this.issue.entityIds[0];
66809                                 // use same degree threshold as for detection
66810                                 context.perform(
66811                                     actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold),
66812                                     t('operations.orthogonalize.annotation.area')
66813                                 );
66814                                 // run after the squaring transition (currently 150ms)
66815                                 window.setTimeout(function() { completionHandler(); }, 175);
66816                             }
66817                         }),
66818                         /*
66819                         new validationIssueFix({
66820                             title: t('issues.fix.tag_as_unsquare.title'),
66821                             onClick: function(context) {
66822                                 var entityId = this.issue.entityIds[0];
66823                                 var entity = context.entity(entityId);
66824                                 var tags = Object.assign({}, entity.tags);  // shallow copy
66825                                 tags.nonsquare = 'yes';
66826                                 context.perform(
66827                                     actionChangeTags(entityId, tags),
66828                                     t('issues.fix.tag_as_unsquare.annotation')
66829                                 );
66830                             }
66831                         })
66832                         */
66833                     ]
66834                 })];
66835
66836                 function showReference(selection) {
66837                     selection.selectAll('.issue-reference')
66838                         .data([0])
66839                         .enter()
66840                         .append('div')
66841                         .attr('class', 'issue-reference')
66842                         .text(t('issues.unsquare_way.buildings.reference'));
66843                 }
66844             };
66845
66846             validation.type = type;
66847
66848             return validation;
66849         }
66850
66851
66852
66853         var Validations = /*#__PURE__*/Object.freeze({
66854                 validationAlmostJunction: validationAlmostJunction,
66855                 validationCloseNodes: validationCloseNodes,
66856                 validationCrossingWays: validationCrossingWays,
66857                 validationDisconnectedWay: validationDisconnectedWay,
66858                 validationFixmeTag: validationFixmeTag,
66859                 validationGenericName: validationGenericName,
66860                 validationImpossibleOneway: validationImpossibleOneway,
66861                 validationIncompatibleSource: validationIncompatibleSource,
66862                 validationFormatting: validationFormatting,
66863                 validationMaprules: validationMaprules,
66864                 validationMissingRole: validationMissingRole,
66865                 validationMissingTag: validationMissingTag,
66866                 validationOutdatedTags: validationOutdatedTags,
66867                 validationPrivateData: validationPrivateData,
66868                 validationTagSuggestsArea: validationTagSuggestsArea,
66869                 validationUnsquareWay: validationUnsquareWay
66870         });
66871
66872         function coreValidator(context) {
66873             var dispatch$1 = dispatch('validated', 'focusedIssue');
66874             var validator = utilRebind({}, dispatch$1, 'on');
66875
66876             var _rules = {};
66877             var _disabledRules = {};
66878
66879             var _ignoredIssueIDs = {};       // issue.id -> true
66880             var _issuesByIssueID = {};       // issue.id -> issue
66881             var _issuesByEntityID = {};      // entity.id -> set(issue.id)
66882             var _validatedGraph = null;
66883             var _deferred = new Set();
66884
66885             //
66886             // initialize the validator rulesets
66887             //
66888             validator.init = function() {
66889                 Object.values(Validations).forEach(function(validation) {
66890                     if (typeof validation !== 'function') return;
66891
66892                     var fn = validation(context);
66893                     var key = fn.type;
66894                     _rules[key] = fn;
66895                 });
66896
66897                 var disabledRules = context.storage('validate-disabledRules');
66898                 if (disabledRules) {
66899                     disabledRules.split(',')
66900                         .forEach(function(key) { _disabledRules[key] = true; });
66901                 }
66902             };
66903
66904
66905             //
66906             // clear caches, called whenever iD resets after a save
66907             //
66908             validator.reset = function() {
66909                 Array.from(_deferred).forEach(function(handle) {
66910                     window.cancelIdleCallback(handle);
66911                     _deferred.delete(handle);
66912                 });
66913
66914                 // clear caches
66915                 _ignoredIssueIDs = {};
66916                 _issuesByIssueID = {};
66917                 _issuesByEntityID = {};
66918                 _validatedGraph = null;
66919
66920                 for (var key in _rules) {
66921                     if (typeof _rules[key].reset === 'function') {
66922                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66923                     }
66924                 }
66925             };
66926
66927             validator.resetIgnoredIssues = function() {
66928                 _ignoredIssueIDs = {};
66929                 // reload UI
66930                 dispatch$1.call('validated');
66931             };
66932
66933
66934             // when the user changes the squaring thereshold, rerun this on all buildings
66935             validator.changeSquareThreshold = function() {
66936                 var checkUnsquareWay = _rules.unsquare_way;
66937                 if (typeof checkUnsquareWay !== 'function') return;
66938
66939                 // uncache existing
66940                 Object.values(_issuesByIssueID)
66941                     .filter(function(issue) { return issue.type === 'unsquare_way'; })
66942                     .forEach(function(issue) {
66943                         var entityId = issue.entityIds[0];   // always 1 entity for unsquare way
66944                         if (_issuesByEntityID[entityId]) {
66945                             _issuesByEntityID[entityId].delete(issue.id);
66946                         }
66947                         delete _issuesByIssueID[issue.id];
66948                     });
66949
66950                 var buildings = context.intersects(geoExtent([-180,-90],[180, 90]))  // everywhere
66951                     .filter(function(entity) {
66952                         return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
66953                     });
66954
66955                 // rerun for all buildings
66956                 buildings.forEach(function(entity) {
66957                     var detected = checkUnsquareWay(entity, context);
66958                     if (detected.length !== 1) return;
66959
66960                     var issue = detected[0];
66961                     var ignoreFix = new validationIssueFix({
66962                         title: t('issues.fix.ignore_issue.title'),
66963                         icon: 'iD-icon-close',
66964                         onClick: function() {
66965                             ignoreIssue(this.issue.id);
66966                         }
66967                     });
66968                     ignoreFix.type = 'ignore';
66969                     ignoreFix.issue = issue;
66970                     issue.fixes.push(ignoreFix);
66971
66972                     if (!_issuesByEntityID[entity.id]) {
66973                         _issuesByEntityID[entity.id] = new Set();
66974                     }
66975                     _issuesByEntityID[entity.id].add(issue.id);
66976                     _issuesByIssueID[issue.id] = issue;
66977                 });
66978
66979                 dispatch$1.call('validated');
66980             };
66981
66982
66983             // options = {
66984             //     what: 'all',     // 'all' or 'edited'
66985             //     where: 'all',   // 'all' or 'visible'
66986             //     includeIgnored: false   // true, false, or 'only'
66987             //     includeDisabledRules: false   // true, false, or 'only'
66988             // };
66989             validator.getIssues = function(options) {
66990                 var opts = Object.assign({ what: 'all', where: 'all', includeIgnored: false, includeDisabledRules: false }, options);
66991                 var issues = Object.values(_issuesByIssueID);
66992                 var changes = context.history().difference().changes();
66993                 var view = context.map().extent();
66994
66995                 return issues.filter(function(issue) {
66996                     if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66997                     if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66998
66999                     if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
67000                     if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
67001
67002                     // Sanity check:  This issue may be for an entity that not longer exists.
67003                     // If we detect this, uncache and return false so it is not included..
67004                     var entityIds = issue.entityIds || [];
67005                     for (var i = 0; i < entityIds.length; i++) {
67006                         var entityId = entityIds[i];
67007                         if (!context.hasEntity(entityId)) {
67008                             delete _issuesByEntityID[entityId];
67009                             delete _issuesByIssueID[issue.id];
67010                             return false;
67011                         }
67012                     }
67013
67014                     if (opts.what === 'edited') {
67015                         var isEdited = entityIds.some(function(entityId) { return changes[entityId]; });
67016                         if (entityIds.length && !isEdited) return false;
67017                     }
67018
67019                     if (opts.where === 'visible') {
67020                         var extent = issue.extent(context.graph());
67021                         if (!view.intersects(extent)) return false;
67022                     }
67023
67024                     return true;
67025                 });
67026             };
67027
67028             validator.focusIssue = function(issue) {
67029                 var extent = issue.extent(context.graph());
67030
67031                 if (extent) {
67032                     var setZoom = Math.max(context.map().zoom(), 19);
67033                     context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
67034
67035                     // select the first entity
67036                     if (issue.entityIds && issue.entityIds.length) {
67037                         window.setTimeout(function() {
67038                             var ids = issue.entityIds;
67039                             context.enter(modeSelect(context, [ids[0]]));
67040                             dispatch$1.call('focusedIssue', this, issue);
67041                         }, 250);  // after ease
67042                     }
67043                 }
67044             };
67045
67046
67047             validator.getIssuesBySeverity = function(options) {
67048                 var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
67049                 groups.error = groups.error || [];
67050                 groups.warning = groups.warning || [];
67051                 return groups;
67052             };
67053
67054
67055             validator.getEntityIssues = function(entityID, options) {
67056                 var issueIDs = _issuesByEntityID[entityID];
67057                 if (!issueIDs) return [];
67058
67059                 var opts = options || {};
67060
67061                 return Array.from(issueIDs)
67062                     .map(function(id) { return _issuesByIssueID[id]; })
67063                     .filter(function(issue) {
67064                         if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
67065                         if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
67066
67067                         if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
67068                         if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
67069
67070                         return true;
67071                     });
67072             };
67073
67074
67075             validator.getRuleKeys = function() {
67076                 return Object.keys(_rules)
67077                     .filter(function(key) { return key !== 'maprules'; })
67078                     .sort(function(key1, key2) {
67079                         // alphabetize by localized title
67080                         return t('issues.' + key1 + '.title') < t('issues.' + key2 + '.title') ? -1 : 1;
67081                     });
67082             };
67083
67084
67085             validator.isRuleEnabled = function(key) {
67086                 return !_disabledRules[key];
67087             };
67088
67089
67090             validator.toggleRule = function(key) {
67091                 if (_disabledRules[key]) {
67092                     delete _disabledRules[key];
67093                 } else {
67094                     _disabledRules[key] = true;
67095                 }
67096
67097                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
67098                 validator.validate();
67099             };
67100
67101
67102             validator.disableRules = function(keys) {
67103                 _disabledRules = {};
67104                 keys.forEach(function(k) {
67105                     _disabledRules[k] = true;
67106                 });
67107
67108                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
67109                 validator.validate();
67110             };
67111
67112
67113             //
67114             // Remove a single entity and all its related issues from the caches
67115             //
67116             function uncacheEntityID(entityID) {
67117                 var issueIDs = _issuesByEntityID[entityID];
67118                 if (!issueIDs) return;
67119
67120                 issueIDs.forEach(function(issueID) {
67121                     var issue = _issuesByIssueID[issueID];
67122                     if (issue) {
67123                         // When multiple entities are involved (e.g. crossing_ways),
67124                         // remove this issue from the other entity caches too..
67125                         var entityIds = issue.entityIds || [];
67126                         entityIds.forEach(function(other) {
67127                             if (other !== entityID) {
67128                                 if (_issuesByEntityID[other]) {
67129                                     _issuesByEntityID[other].delete(issueID);
67130                                 }
67131                             }
67132                         });
67133                     }
67134
67135                     delete _issuesByIssueID[issueID];
67136                 });
67137
67138                 delete _issuesByEntityID[entityID];
67139             }
67140
67141
67142             function ignoreIssue(id) {
67143                 _ignoredIssueIDs[id] = true;
67144             }
67145
67146
67147             //
67148             // Run validation on a single entity for the given graph
67149             //
67150             function validateEntity(entity, graph) {
67151                 var entityIssues = [];
67152                 var ran = {};
67153
67154                 // runs validation and appends resulting issues,
67155                 // returning true if validation passed without issue
67156                 function runValidation(key) {
67157                     if (ran[key]) return true;
67158
67159                     var fn = _rules[key];
67160                     if (typeof fn !== 'function') {
67161                         console.error('no such validation rule = ' + key);  // eslint-disable-line no-console
67162                         ran[key] = true;
67163                         return true;
67164                     }
67165
67166                     var detected = fn(entity, graph);
67167                     detected.forEach(function(issue) {
67168                         var hasIgnoreFix = issue.fixes && issue.fixes.length && issue.fixes[issue.fixes.length - 1].type === 'ignore';
67169                         if (issue.severity === 'warning' && !hasIgnoreFix) {
67170                             var ignoreFix = new validationIssueFix({
67171                                 title: t('issues.fix.ignore_issue.title'),
67172                                 icon: 'iD-icon-close',
67173                                 onClick: function() {
67174                                     ignoreIssue(this.issue.id);
67175                                 }
67176                             });
67177                             ignoreFix.type = 'ignore';
67178                             ignoreFix.issue = issue;
67179                             issue.fixes.push(ignoreFix);
67180                         }
67181                     });
67182                     entityIssues = entityIssues.concat(detected);
67183                     ran[key] = true;
67184                     return !detected.length;
67185                 }
67186
67187                 // run some validations manually to control the order and to skip some
67188
67189                 runValidation('missing_role');
67190
67191                 if (entity.type === 'relation') {
67192                     if (!runValidation('outdated_tags')) {
67193                         // don't flag missing tags if they are on the outer way
67194                         ran.missing_tag = true;
67195                     }
67196                 }
67197
67198                 runValidation('missing_tag');
67199
67200                 runValidation('outdated_tags');
67201
67202                 runValidation('crossing_ways');
67203                 runValidation('almost_junction');
67204
67205                 // only check impossible_oneway if no disconnected_way issues
67206                 if (runValidation('disconnected_way')) {
67207                     runValidation('impossible_oneway');
67208                 } else {
67209                     ran.impossible_oneway = true;
67210                 }
67211
67212                 runValidation('tag_suggests_area');
67213
67214                 // run all rules not yet run
67215                 Object.keys(_rules).forEach(runValidation);
67216
67217                 return entityIssues;
67218             }
67219
67220             function entityIDsToValidate(entityIDs, graph) {
67221                 var processedIDs = new Set();
67222                 return entityIDs.reduce(function(acc, entityID) {
67223                     // keep redundancy check separate from `acc` because an `entityID`
67224                     // could have been added to `acc` as a related entity through an earlier pass
67225                     if (processedIDs.has(entityID)) return acc;
67226                     processedIDs.add(entityID);
67227
67228                     var entity = graph.hasEntity(entityID);
67229                     if (!entity) return acc;
67230
67231                     acc.add(entityID);
67232
67233                     var checkParentRels = [entity];
67234
67235                     if (entity.type === 'node') {   // include parent ways
67236                         graph.parentWays(entity).forEach(function(parentWay) {
67237                             acc.add(parentWay.id);
67238                             checkParentRels.push(parentWay);
67239                         });
67240                     } else if (entity.type === 'relation') {   // include members
67241                         entity.members.forEach(function(member) {
67242                             acc.add(member.id);
67243                         });
67244                     } else if (entity.type === 'way') {   // include connected ways
67245                         entity.nodes.forEach(function(nodeID) {
67246                             graph._parentWays[nodeID].forEach(function(wayID) {
67247                                 acc.add(wayID);
67248                             });
67249                         });
67250                     }
67251
67252                     checkParentRels.forEach(function(entity) {   // include parent relations
67253                         if (entity.type !== 'relation') {        // but not super-relations
67254                             graph.parentRelations(entity).forEach(function(parentRelation) {
67255                                 acc.add(parentRelation.id);
67256                             });
67257                         }
67258                     });
67259
67260                     return acc;
67261
67262                 }, new Set());
67263             }
67264
67265             //
67266             // Run validation for several entities, supplied `entityIDs`
67267             //
67268             function validateEntities(entityIDs) {
67269
67270                 var graph = context.graph();
67271
67272                 // clear caches for existing issues related to these entities
67273                 entityIDs.forEach(uncacheEntityID);
67274
67275                 // detect new issues and update caches
67276                 entityIDs.forEach(function(entityID) {
67277                     var entity = graph.hasEntity(entityID);
67278                     // don't validate deleted entities
67279                     if (!entity) return;
67280
67281                     var issues = validateEntity(entity, graph);
67282                     issues.forEach(function(issue) {
67283                         var entityIds = issue.entityIds || [];
67284                         entityIds.forEach(function(entityId) {
67285                             if (!_issuesByEntityID[entityId]) {
67286                                 _issuesByEntityID[entityId] = new Set();
67287                             }
67288                             _issuesByEntityID[entityId].add(issue.id);
67289                         });
67290                         _issuesByIssueID[issue.id] = issue;
67291                     });
67292                 });
67293
67294                 dispatch$1.call('validated');
67295             }
67296
67297
67298             //
67299             // Validates anything that has changed since the last time it was run.
67300             // Also updates the "validatedGraph" to be the current graph
67301             // and dispatches a `validated` event when finished.
67302             //
67303             validator.validate = function() {
67304                 var currGraph = context.graph();
67305                 _validatedGraph = _validatedGraph || context.history().base();
67306                 if (currGraph === _validatedGraph) {
67307                     dispatch$1.call('validated');
67308                     return;
67309                 }
67310                 var oldGraph = _validatedGraph;
67311                 var difference = coreDifference(oldGraph, currGraph);
67312                 _validatedGraph = currGraph;
67313
67314                 for (var key in _rules) {
67315                     if (typeof _rules[key].reset === 'function') {
67316                         _rules[key].reset();   // 'crossing_ways' is the only one like this
67317                     }
67318                 }
67319
67320                 var createdAndModifiedEntityIDs = difference.extantIDs(true);   // created/modified (true = w/relation members)
67321                 var entityIDsToCheck = entityIDsToValidate(createdAndModifiedEntityIDs, currGraph);
67322
67323                 // "validate" deleted entities in order to update their related entities
67324                 // (e.g. deleting the only highway connected to a road should create a disconnected highway issue)
67325                 var deletedEntityIDs = difference.deleted().map(function(entity) { return entity.id; });
67326                 var entityIDsToCheckForDeleted = entityIDsToValidate(deletedEntityIDs, oldGraph);
67327
67328                 // concat the sets
67329                 entityIDsToCheckForDeleted.forEach(entityIDsToCheck.add, entityIDsToCheck);
67330
67331                 validateEntities(entityIDsToCheck);   // dispatches 'validated'
67332             };
67333
67334
67335             // WHEN TO RUN VALIDATION:
67336             // When graph changes:
67337             context.history()
67338                 .on('restore.validator', validator.validate)   // restore saved history
67339                 .on('undone.validator', validator.validate)    // undo
67340                 .on('redone.validator', validator.validate);   // redo
67341                 // but not on 'change' (e.g. while drawing)
67342
67343             // When user chages editing modes:
67344             context
67345                 .on('exit.validator', validator.validate);
67346
67347             // When merging fetched data:
67348             context.history()
67349                 .on('merge.validator', function(entities) {
67350                     if (!entities) return;
67351                     var handle = window.requestIdleCallback(function() {
67352                         var ids = entities.map(function(entity) { return entity.id; });
67353                         validateEntities(entityIDsToValidate(ids, context.graph()));
67354                     });
67355                     _deferred.add(handle);
67356                 });
67357
67358
67359             return validator;
67360         }
67361
67362         function presetCollection(collection) {
67363             var maxSearchResults = 50;
67364
67365             var presets = {
67366
67367                 collection: collection,
67368
67369
67370                 item: function(id) {
67371                     return this.collection.find(function(d) {
67372                         return d.id === id;
67373                     });
67374                 },
67375
67376                 index: function(id) {
67377                     return this.collection.findIndex(function(d) {
67378                         return d.id === id;
67379                     });
67380                 },
67381
67382                 matchGeometry: function(geometry) {
67383                     return presetCollection(this.collection.filter(function(d) {
67384                         return d.matchGeometry(geometry);
67385                     }));
67386                 },
67387
67388                 matchAnyGeometry: function(geometries) {
67389                     return presetCollection(this.collection.filter(function(d) {
67390                         return geometries.some(function(geometry) {
67391                             return d.matchGeometry(geometry);
67392                         });
67393                     }));
67394                 },
67395
67396                 fallback: function(geometry) {
67397                     var id = geometry;
67398                     if (id === 'vertex') id = 'point';
67399                     return this.item(id);
67400                 },
67401
67402                 search: function(value, geometry, countryCode) {
67403                     if (!value) return this;
67404
67405                     value = value.toLowerCase().trim();
67406
67407                     // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
67408                     function leading(a) {
67409                         var index = a.indexOf(value);
67410                         return index === 0 || a[index - 1] === ' ';
67411                     }
67412
67413                     // match at name beginning only
67414                     function leadingStrict(a) {
67415                         var index = a.indexOf(value);
67416                         return index === 0;
67417                     }
67418
67419                     function sortNames(a, b) {
67420                         var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
67421                         var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
67422
67423                         // priority if search string matches preset name exactly - #4325
67424                         if (value === aCompare) return -1;
67425                         if (value === bCompare) return 1;
67426
67427                         // priority for higher matchScore
67428                         var i = b.originalScore - a.originalScore;
67429                         if (i !== 0) return i;
67430
67431                         // priority if search string appears earlier in preset name
67432                         i = aCompare.indexOf(value) - bCompare.indexOf(value);
67433                         if (i !== 0) return i;
67434
67435                         // priority for shorter preset names
67436                         return aCompare.length - bCompare.length;
67437                     }
67438
67439                     var pool = this.collection;
67440                     if (countryCode) {
67441                         pool = pool.filter(function(a) {
67442                             if (!a.countryCodes) return true;
67443                             return a.countryCodes.indexOf(countryCode) !== -1;
67444                         });
67445                     }
67446                     var searchable = pool.filter(function(a) {
67447                         return a.searchable !== false && a.suggestion !== true;
67448                     });
67449                     var suggestions = pool.filter(function(a) {
67450                         return a.suggestion === true;
67451                     });
67452
67453                     // matches value to preset.name
67454                     var leading_name = searchable
67455                         .filter(function(a) {
67456                             return leading(a.name().toLowerCase());
67457                         }).sort(sortNames);
67458
67459                     // matches value to preset.terms values
67460                     var leading_terms = searchable
67461                         .filter(function(a) {
67462                             return (a.terms() || []).some(leading);
67463                         });
67464
67465                     // matches value to preset.tags values
67466                     var leading_tag_values = searchable
67467                         .filter(function(a) {
67468                             return Object.values(a.tags || {})
67469                                 .filter(function(val) { return val !== '*'; })
67470                                 .some(leading);
67471                         });
67472
67473                     var leading_suggestions = suggestions
67474                         .filter(function(a) {
67475                             return leadingStrict(a.originalName.toLowerCase());
67476                         }).sort(sortNames);
67477
67478                     // finds close matches to value in preset.name
67479                     var similar_name = searchable
67480                         .map(function(a) {
67481                             return { preset: a, dist: utilEditDistance(value, a.name()) };
67482                         }).filter(function(a) {
67483                             return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
67484                         }).sort(function(a, b) {
67485                             return a.dist - b.dist;
67486                         }).map(function(a) {
67487                             return a.preset;
67488                         });
67489
67490                     // finds close matches to value in preset.terms
67491                     var similar_terms = searchable
67492                         .filter(function(a) {
67493                             return (a.terms() || []).some(function(b) {
67494                                 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
67495                             });
67496                         });
67497
67498                     var similar_suggestions = suggestions
67499                         .map(function(a) {
67500                             return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
67501                         }).filter(function(a) {
67502                             return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
67503                         }).sort(function(a, b) {
67504                             return a.dist - b.dist;
67505                         }).map(function(a) {
67506                             return a.preset;
67507                         });
67508
67509                     var results = leading_name.concat(
67510                         leading_suggestions,
67511                         leading_terms,
67512                         leading_tag_values,
67513                         similar_name,
67514                         similar_suggestions,
67515                         similar_terms
67516                     ).slice(0, maxSearchResults - 1);
67517
67518                     if (geometry) {
67519                         if (typeof geometry === 'string') {
67520                             results.push(presets.fallback(geometry));
67521                         } else {
67522                             geometry.forEach(function(geom) {
67523                                 results.push(presets.fallback(geom));
67524                             });
67525                         }
67526                     }
67527
67528                     return presetCollection(utilArrayUniq(results));
67529                 }
67530             };
67531
67532
67533             return presets;
67534         }
67535
67536         function presetCategory(id, category, all) {
67537             category = Object.assign({}, category);   // shallow copy
67538
67539             category.id = id;
67540
67541
67542             category.members = presetCollection(category.members.map(function(id) {
67543                 return all.item(id);
67544             }));
67545
67546
67547             category.geometry = category.members.collection.reduce(function(geometries, preset) {
67548                 for (var index in preset.geometry) {
67549                     var geometry = preset.geometry[index];
67550                     if (geometries.indexOf(geometry) === -1) {
67551                         geometries.push(geometry);
67552                     }
67553                 }
67554                 return geometries;
67555             }, []);
67556
67557
67558             category.matchGeometry = function(geometry) {
67559                 return category.geometry.indexOf(geometry) >= 0;
67560             };
67561
67562
67563             category.matchScore = function() {
67564                 return -1;
67565             };
67566
67567
67568             category.name = function() {
67569                 return t('presets.categories.' + id + '.name', {'default': id});
67570             };
67571
67572
67573             category.terms = function() {
67574                 return [];
67575             };
67576
67577
67578             return category;
67579         }
67580
67581         function presetField(id, field) {
67582             field = Object.assign({}, field);   // shallow copy
67583
67584             field.id = id;
67585
67586             // for use in classes, element ids, css selectors
67587             field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
67588
67589             field.matchGeometry = function(geometry) {
67590                 return !field.geometry || field.geometry === geometry;
67591             };
67592
67593
67594             field.t = function(scope, options) {
67595                 return t('presets.fields.' + id + '.' + scope, options);
67596             };
67597
67598
67599             field.label = function() {
67600                 return field.overrideLabel || field.t('label', {'default': id});
67601             };
67602
67603
67604             var placeholder = field.placeholder;
67605             field.placeholder = function() {
67606                 return field.t('placeholder', {'default': placeholder});
67607             };
67608
67609
67610             return field;
67611         }
67612
67613         function presetPreset(id, preset, fields, visible, rawPresets) {
67614             preset = Object.assign({}, preset);   // shallow copy
67615
67616             preset.id = id;
67617
67618             preset.parentPresetID = function() {
67619                 var endIndex = preset.id.lastIndexOf('/');
67620                 if (endIndex < 0) return null;
67621
67622                 return preset.id.substring(0, endIndex);
67623             };
67624
67625
67626             // For a preset without fields, use the fields of the parent preset.
67627             // Replace {preset} placeholders with the fields of the specified presets.
67628             function resolveFieldInheritance() {
67629
67630                 // Skip `fields` for the keys which define the preset.
67631                 // These are usually `typeCombo` fields like `shop=*`
67632                 function shouldInheritFieldWithID(fieldID) {
67633                     var f = fields[fieldID];
67634                     if (f.key) {
67635                         if (preset.tags[f.key] !== undefined &&
67636                             // inherit anyway if multiple values are allowed or just a checkbox
67637                             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check') {
67638                             return false;
67639                         }
67640                     }
67641                     return true;
67642                 }
67643
67644                 // returns an array of field IDs to inherit from the given presetID, if found
67645                 function inheritedFieldIDs(presetID, prop) {
67646                     if (!presetID) return null;
67647
67648                     var inheritPreset = rawPresets[presetID];
67649                     if (!inheritPreset) return null;
67650
67651                     var inheritFieldIDs = inheritPreset[prop] || [];
67652
67653                     if (prop === 'fields') {
67654                         inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
67655                     }
67656
67657                     return inheritFieldIDs;
67658                 }
67659
67660
67661                 ['fields', 'moreFields'].forEach(function(prop) {
67662                     var fieldIDs = [];
67663                     if (preset[prop] && preset[prop].length) {    // fields were defined
67664                         preset[prop].forEach(function(fieldID) {
67665                             var match = fieldID.match(/\{(.*)\}/);
67666                             if (match !== null) {        // presetID wrapped in braces {}
67667                                 var inheritIDs = inheritedFieldIDs(match[1], prop);
67668                                 if (inheritIDs !== null) {
67669                                     fieldIDs = fieldIDs.concat(inheritIDs);
67670                                 } else {
67671                                     /* eslint-disable no-console */
67672                                     console.log('Cannot resolve presetID ' + match[0] +
67673                                         ' found in ' + preset.id + ' ' + prop);
67674                                     /* eslint-enable no-console */
67675                                 }
67676                             } else {
67677                                 fieldIDs.push(fieldID);  // no braces - just a normal field
67678                             }
67679                         });
67680
67681                     } else {  // no fields defined, so use the parent's if possible
67682                         fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
67683                     }
67684                     // resolve duplicate fields
67685                     fieldIDs = utilArrayUniq(fieldIDs);
67686
67687                     // update this preset with the results
67688                     preset[prop] = fieldIDs;
67689
67690                     // update the raw object to allow for multiple levels of inheritance
67691                     rawPresets[preset.id][prop] = fieldIDs;
67692                 });
67693             }
67694
67695             if (rawPresets) {
67696                 resolveFieldInheritance();
67697             }
67698
67699             preset.fields = (preset.fields || []).map(getFields);
67700             preset.moreFields = (preset.moreFields || []).map(getFields);
67701             preset.geometry = (preset.geometry || []);
67702
67703             visible = visible || false;
67704
67705             function getFields(f) {
67706                 return fields[f];
67707             }
67708
67709
67710             preset.matchGeometry = function(geometry) {
67711                 return preset.geometry.indexOf(geometry) >= 0;
67712             };
67713
67714
67715             preset.originalScore = preset.matchScore || 1;
67716
67717
67718             preset.matchScore = function(entityTags) {
67719                 var tags = preset.tags;
67720                 var score = 0;
67721
67722                 for (var t in tags) {
67723                     if (entityTags[t] === tags[t]) {
67724                         score += preset.originalScore;
67725                     } else if (tags[t] === '*' && t in entityTags) {
67726                         score += preset.originalScore / 2;
67727                     } else {
67728                         return -1;
67729                     }
67730                 }
67731
67732                 return score;
67733             };
67734
67735             var _textCache = {};
67736
67737             preset.t = function(scope, options) {
67738                 var textID = 'presets.presets.' + id + '.' + scope;
67739
67740                 if (_textCache[textID]) return _textCache[textID];
67741
67742                 var text = t(textID, options);
67743                 _textCache[textID] = text;
67744                 return text;
67745             };
67746
67747
67748             preset.originalName = preset.name || '';
67749
67750
67751             preset.name = function() {
67752                 if (preset.suggestion) {
67753                     var path = id.split('/');
67754                     path.pop();  // remove brand name
67755                     // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
67756                     return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
67757                 }
67758                 return preset.t('name', { 'default': preset.originalName });
67759             };
67760
67761
67762             preset.originalTerms = (preset.terms || []).join();
67763
67764
67765             preset.terms = function() {
67766                 return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67767             };
67768
67769
67770             preset.isFallback = function() {
67771                 var tagCount = Object.keys(preset.tags).length;
67772                 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67773             };
67774
67775             preset.visible = function(val) {
67776                 if (!arguments.length) return visible;
67777                 visible = val;
67778                 return visible;
67779             };
67780
67781
67782             var reference = preset.reference || {};
67783             preset.reference = function(geometry) {
67784                 // Lookup documentation on Wikidata...
67785                 var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
67786                 if (qid) {
67787                     return { qid: qid };
67788                 }
67789
67790                 // Lookup documentation on OSM Wikibase...
67791                 var key = reference.key || Object.keys(utilObjectOmit(preset.tags, 'name'))[0];
67792                 var value = reference.value || preset.tags[key];
67793
67794                 if (geometry === 'relation' && key === 'type') {
67795                     if (value in preset.tags) {
67796                         key = value;
67797                         value = preset.tags[key];
67798                     } else {
67799                         return { rtype: value };
67800                     }
67801                 }
67802
67803                 if (value === '*') {
67804                     return { key: key };
67805                 } else {
67806                     return { key: key, value: value };
67807                 }
67808             };
67809
67810
67811             preset.removeTags = preset.removeTags || preset.addTags || preset.tags || {};
67812             preset.unsetTags = function(tags, geometry) {
67813                 tags = utilObjectOmit(tags, Object.keys(preset.removeTags));
67814
67815                 for (var f in preset.fields) {
67816                     var field = preset.fields[f];
67817                     if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67818                         delete tags[field.key];
67819                     }
67820                 }
67821
67822                 delete tags.area;
67823                 return tags;
67824             };
67825
67826
67827             preset.addTags = preset.addTags || preset.tags || {};
67828             preset.setTags = function(tags, geometry, skipFieldDefaults) {
67829                 var addTags = preset.addTags;
67830                 var k;
67831
67832                 tags = Object.assign({}, tags);   // shallow copy
67833
67834                 for (k in addTags) {
67835                     if (addTags[k] === '*') {
67836                         tags[k] = 'yes';
67837                     } else {
67838                         tags[k] = addTags[k];
67839                     }
67840                 }
67841
67842                 // Add area=yes if necessary.
67843                 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67844                 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67845                 // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
67846                 if (!addTags.hasOwnProperty('area')) {
67847                     delete tags.area;
67848                     if (geometry === 'area') {
67849                         var needsAreaTag = true;
67850                         if (preset.geometry.indexOf('line') === -1) {
67851                             for (k in addTags) {
67852                                 if (k in osmAreaKeys) {
67853                                     needsAreaTag = false;
67854                                     break;
67855                                 }
67856                             }
67857                         }
67858                         if (needsAreaTag) {
67859                             tags.area = 'yes';
67860                         }
67861                     }
67862                 }
67863                 if (geometry && !skipFieldDefaults) {
67864                     for (var f in preset.fields) {
67865                         var field = preset.fields[f];
67866                         if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67867                             tags[field.key] = field.default;
67868                         }
67869                     }
67870                 }
67871
67872                 return tags;
67873             };
67874
67875
67876             return preset;
67877         }
67878
67879         function presetIndex(context) {
67880             // a presetCollection with methods for
67881             // loading new data and returning defaults
67882
67883             var dispatch$1 = dispatch('recentsChange', 'favoritePreset');
67884
67885             var all = presetCollection([]);
67886             var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67887             var _fields = {};
67888             var _universal = [];
67889             var _favorites, _recents;
67890
67891             // Index of presets by (geometry, tag key).
67892             var _index = {
67893                 point: {},
67894                 vertex: {},
67895                 line: {},
67896                 area: {},
67897                 relation: {}
67898             };
67899
67900             all.match = function(entity, resolver) {
67901                 return resolver.transient(entity, 'presetMatch', function() {
67902                     var geometry = entity.geometry(resolver);
67903
67904                     // Treat entities on addr:interpolation lines as points, not vertices - #3241
67905                     if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67906                         geometry = 'point';
67907                     }
67908
67909                     return all.matchTags(entity.tags, geometry);
67910                 });
67911             };
67912
67913             all.matchTags = function(tags, geometry) {
67914
67915                 var address;
67916                 var geometryMatches = _index[geometry];
67917                 var best = -1;
67918                 var match;
67919
67920                 for (var k in tags) {
67921                     // If any part of an address is present,
67922                     // allow fallback to "Address" preset - #4353
67923                     if (/^addr:/.test(k) && geometryMatches['addr:*']) {
67924                         address = geometryMatches['addr:*'][0];
67925                     }
67926
67927                     var keyMatches = geometryMatches[k];
67928                     if (!keyMatches) continue;
67929
67930                     for (var i = 0; i < keyMatches.length; i++) {
67931                         var score = keyMatches[i].matchScore(tags);
67932                         if (score > best) {
67933                             best = score;
67934                             match = keyMatches[i];
67935                         }
67936                     }
67937
67938                 }
67939
67940                 if (address && (!match || match.isFallback())) {
67941                     match = address;
67942                 }
67943                 return match || all.fallback(geometry);
67944             };
67945
67946             all.allowsVertex = function(entity, resolver) {
67947                 if (entity.type !== 'node') return false;
67948                 if (Object.keys(entity.tags).length === 0) return true;
67949
67950                 return resolver.transient(entity, 'vertexMatch', function() {
67951                     // address lines allow vertices to act as standalone points
67952                     if (entity.isOnAddressLine(resolver)) return true;
67953
67954                     var geometries = osmNodeGeometriesForTags(entity.tags);
67955                     if (geometries.vertex) return true;
67956                     if (geometries.point) return false;
67957                     // allow vertices for unspecified points
67958                     return true;
67959                 });
67960             };
67961
67962
67963             // Because of the open nature of tagging, iD will never have a complete
67964             // list of tags used in OSM, so we want it to have logic like "assume
67965             // that a closed way with an amenity tag is an area, unless the amenity
67966             // is one of these specific types". This function computes a structure
67967             // that allows testing of such conditions, based on the presets designated
67968             // as as supporting (or not supporting) the area geometry.
67969             //
67970             // The returned object L is a whitelist/blacklist of tags. A closed way
67971             // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67972             // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67973             // and the subkeys form the blacklist.
67974             all.areaKeys = function() {
67975                 var areaKeys = {};
67976                 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
67977
67978                 // ignore name-suggestion-index and deprecated presets
67979                 var presets = all.collection.filter(function(p) {
67980                     return !p.suggestion && !p.replacement;
67981                 });
67982
67983                 // whitelist
67984                 presets.forEach(function(d) {
67985                     for (var key in d.tags) break;
67986                     if (!key) return;
67987                     if (ignore.indexOf(key) !== -1) return;
67988
67989                     if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67990                         areaKeys[key] = areaKeys[key] || {};
67991                     }
67992                 });
67993
67994                 // blacklist
67995                 presets.forEach(function(d) {
67996                     for (var key in d.tags) break;
67997                     if (!key) return;
67998                     if (ignore.indexOf(key) !== -1) return;
67999
68000                     var value = d.tags[key];
68001                     if (key in areaKeys &&                      // probably an area...
68002                         d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
68003                         value !== '*') {
68004                         areaKeys[key][value] = true;
68005                     }
68006                 });
68007
68008                 return areaKeys;
68009             };
68010
68011             all.pointTags = function() {
68012                 return all.collection.reduce(function(pointTags, d) {
68013                     // ignore name-suggestion-index, deprecated, and generic presets
68014                     if (d.suggestion || d.replacement || d.searchable === false) return pointTags;
68015
68016                     // only care about the primary tag
68017                     for (var key in d.tags) break;
68018                     if (!key) return pointTags;
68019
68020                     // if this can be a point
68021                     if (d.geometry.indexOf('point') !== -1) {
68022                         pointTags[key] = pointTags[key] || {};
68023                         pointTags[key][d.tags[key]] = true;
68024                     }
68025                     return pointTags;
68026                 }, {});
68027             };
68028
68029             all.vertexTags = function() {
68030                 return all.collection.reduce(function(vertexTags, d) {
68031                     // ignore name-suggestion-index, deprecated, and generic presets
68032                     if (d.suggestion || d.replacement || d.searchable === false) return vertexTags;
68033
68034                     // only care about the primary tag
68035                     for (var key in d.tags) break;
68036                     if (!key) return vertexTags;
68037
68038                     // if this can be a vertex
68039                     if (d.geometry.indexOf('vertex') !== -1) {
68040                         vertexTags[key] = vertexTags[key] || {};
68041                         vertexTags[key][d.tags[key]] = true;
68042                     }
68043                     return vertexTags;
68044                 }, {});
68045             };
68046
68047             all.build = function(d, visible) {
68048                 if (d.fields) {
68049                     Object.keys(d.fields).forEach(function(id) {
68050                         var f = d.fields[id];
68051                         _fields[id] = presetField(id, f);
68052                         if (f.universal) {
68053                             _universal.push(_fields[id]);
68054                         }
68055                     });
68056                 }
68057
68058                 if (d.presets) {
68059                     var rawPresets = d.presets;
68060                     Object.keys(d.presets).forEach(function(id) {
68061                         var p = d.presets[id];
68062                         var existing = all.index(id);
68063                         var isVisible = typeof visible === 'function' ? visible(id, p) : visible;
68064                         if (existing !== -1) {
68065                             all.collection[existing] = presetPreset(id, p, _fields, isVisible, rawPresets);
68066                         } else {
68067                             all.collection.push(presetPreset(id, p, _fields, isVisible, rawPresets));
68068                         }
68069                     });
68070                 }
68071
68072                 if (d.categories) {
68073                     Object.keys(d.categories).forEach(function(id) {
68074                         var c = d.categories[id];
68075                         var existing = all.index(id);
68076                         if (existing !== -1) {
68077                             all.collection[existing] = presetCategory(id, c, all);
68078                         } else {
68079                             all.collection.push(presetCategory(id, c, all));
68080                         }
68081                     });
68082                 }
68083
68084                 if (d.defaults) {
68085                     var getItem = (all.item).bind(all);
68086                     _defaults = {
68087                         area: presetCollection(d.defaults.area.map(getItem)),
68088                         line: presetCollection(d.defaults.line.map(getItem)),
68089                         point: presetCollection(d.defaults.point.map(getItem)),
68090                         vertex: presetCollection(d.defaults.vertex.map(getItem)),
68091                         relation: presetCollection(d.defaults.relation.map(getItem))
68092                     };
68093                 }
68094
68095                 for (var i = 0; i < all.collection.length; i++) {
68096                     var preset = all.collection[i];
68097                     var geometry = preset.geometry;
68098
68099                     for (var j = 0; j < geometry.length; j++) {
68100                         var g = _index[geometry[j]];
68101                         for (var k in preset.tags) {
68102                             (g[k] = g[k] || []).push(preset);
68103                         }
68104                     }
68105                 }
68106                 return all;
68107             };
68108
68109             all.init = function(shouldShow) {
68110                 all.collection = [];
68111                 _favorites = null;
68112                 _recents = null;
68113                 _fields = {};
68114                 _universal = [];
68115                 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
68116
68117                 return all.build(data.presets, shouldShow || true);
68118             };
68119
68120
68121             all.reset = function() {
68122                 all.collection = [];
68123                 _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
68124                 _fields = {};
68125                 _universal = [];
68126                 _favorites = null;
68127                 _recents = null;
68128
68129                 // Index of presets by (geometry, tag key).
68130                 _index = {
68131                     point: {},
68132                     vertex: {},
68133                     line: {},
68134                     area: {},
68135                     relation: {}
68136                 };
68137
68138                 return all;
68139             };
68140
68141             all.fromExternal = function(external, done) {
68142                 all.reset();
68143                 d3_json(external)
68144                     .then(function(externalPresets) {
68145                         all.build(data.presets, false);    // make default presets hidden to begin
68146                         all.build(externalPresets, true);  // make the external visible
68147                     })
68148                     .catch(function() {
68149                         all.init();
68150                     })
68151                     .finally(function() {
68152                         done(all);
68153                     });
68154             };
68155
68156             all.field = function(id) {
68157                 return _fields[id];
68158             };
68159
68160             all.universal = function() {
68161                 return _universal;
68162             };
68163
68164             all.defaults = function(geometry, n) {
68165                 var rec = [];
68166                 if (!context.inIntro()) {
68167                     rec = all.recent().matchGeometry(geometry).collection.slice(0, 4);
68168                 }
68169                 var def = utilArrayUniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
68170                 return presetCollection(utilArrayUniq(rec.concat(def).concat(all.fallback(geometry))));
68171             };
68172
68173             all.recent = function() {
68174                 return presetCollection(utilArrayUniq(all.getRecents().map(function(d) {
68175                     return d.preset;
68176                 })));
68177             };
68178
68179             function RibbonItem(preset, geometry, source) {
68180                 var item = {};
68181                 item.preset = preset;
68182                 item.geometry = geometry;
68183                 item.source = source;
68184
68185                 item.isFavorite = function() {
68186                     return item.source === 'favorite';
68187                 };
68188                 item.isRecent = function() {
68189                     return item.source === 'recent';
68190                 };
68191                 item.matches = function(preset, geometry) {
68192                     return item.preset.id === preset.id && item.geometry === geometry;
68193                 };
68194                 item.minified = function() {
68195                     return {
68196                         pID: item.preset.id,
68197                         geom: item.geometry
68198                     };
68199                 };
68200                 return item;
68201             }
68202
68203             function ribbonItemForMinified(d, source) {
68204                 if (d && d.pID && d.geom) {
68205                     var preset = all.item(d.pID);
68206                     if (!preset) return null;
68207
68208                     var geom = d.geom;
68209                     // treat point and vertex features as one geometry
68210                     if (geom === 'vertex') geom = 'point';
68211
68212                     // iD's presets could have changed since this was saved,
68213                     // so make sure it's still valid.
68214                     if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) {
68215                         return RibbonItem(preset, geom, source);
68216                     }
68217                 }
68218                 return null;
68219             }
68220
68221             function setFavorites(items) {
68222                 _favorites = items;
68223                 var minifiedItems = items.map(function(d) { return d.minified(); });
68224                 context.storage('preset_favorites', JSON.stringify(minifiedItems));
68225
68226                 // call update
68227                 dispatch$1.call('favoritePreset');
68228             }
68229
68230             all.getFavorites = function() {
68231                 if (!_favorites) {
68232                     // fetch from local storage
68233                     _favorites = (JSON.parse(context.storage('preset_favorites')) || [
68234                             // use the generic presets as the default favorites
68235                             { pID: 'point', geom: 'point'},
68236                             { pID: 'line', geom: 'line'},
68237                             { pID: 'area', geom: 'area'}
68238                         ]).reduce(function(output, d) {
68239                             var item = ribbonItemForMinified(d, 'favorite');
68240                             if (item) output.push(item);
68241                             return output;
68242                         }, []);
68243                 }
68244                 return _favorites;
68245             };
68246
68247             function setRecents(items) {
68248                 _recents = items;
68249                 var minifiedItems = items.map(function(d) { return d.minified(); });
68250                 context.storage('preset_recents', JSON.stringify(minifiedItems));
68251
68252                 dispatch$1.call('recentsChange');
68253             }
68254
68255             all.getRecents = function() {
68256                 if (!_recents) {
68257                     // fetch from local storage
68258                     _recents = (JSON.parse(context.storage('preset_recents')) || [])
68259                         .reduce(function(output, d) {
68260                             var item = ribbonItemForMinified(d, 'recent');
68261                             if (item) output.push(item);
68262                             return output;
68263                         }, []);
68264                 }
68265                 return _recents;
68266             };
68267
68268             all.toggleFavorite = function(preset, geometry) {
68269                 geometry = all.fallback(geometry).id;
68270                 var favs = all.getFavorites();
68271                 var favorite = all.favoriteMatching(preset, geometry);
68272                 if (favorite) {
68273                     favs.splice(favs.indexOf(favorite), 1);
68274                 } else {
68275                     // only allow 10 favorites
68276                     if (favs.length === 10) {
68277                         // remove the last favorite (last in, first out)
68278                         favs.pop();
68279                     }
68280                     // append array
68281                     favs.push(RibbonItem(preset, geometry, 'favorite'));
68282                 }
68283                 setFavorites(favs);
68284             };
68285
68286             all.removeFavorite = function(preset, geometry) {
68287                 geometry = all.fallback(geometry).id;
68288                 var item = all.favoriteMatching(preset, geometry);
68289                 if (item) {
68290                     var items = all.getFavorites();
68291                     items.splice(items.indexOf(item), 1);
68292                     setFavorites(items);
68293                 }
68294             };
68295
68296             all.removeRecent = function(preset, geometry) {
68297                 var item = all.recentMatching(preset, geometry);
68298                 if (item) {
68299                     var items = all.getRecents();
68300                     items.splice(items.indexOf(item), 1);
68301                     setRecents(items);
68302                 }
68303             };
68304
68305             all.favoriteMatching = function(preset, geometry) {
68306                 geometry = all.fallback(geometry).id;
68307                 var favs = all.getFavorites();
68308                 for (var index in favs) {
68309                     if (favs[index].matches(preset, geometry)) {
68310                         return favs[index];
68311                     }
68312                 }
68313                 return null;
68314             };
68315             all.recentMatching = function(preset, geometry) {
68316                 geometry = all.fallback(geometry).id;
68317                 var items = all.getRecents();
68318                 for (var index in items) {
68319                     if (items[index].matches(preset, geometry)) {
68320                         return items[index];
68321                     }
68322                 }
68323                 return null;
68324             };
68325
68326             all.moveItem = function(items, fromIndex, toIndex) {
68327                 if (fromIndex === toIndex ||
68328                     fromIndex < 0 || toIndex < 0 ||
68329                     fromIndex >= items.length || toIndex >= items.length) return null;
68330                 items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
68331                 return items;
68332             };
68333
68334             all.moveFavorite = function(fromIndex, toIndex) {
68335                 var items = all.moveItem(all.getFavorites(), fromIndex, toIndex);
68336                 if (items) setFavorites(items);
68337             };
68338
68339             all.moveRecent = function(item, beforeItem) {
68340                 var recents = all.getRecents();
68341                 var fromIndex = recents.indexOf(item);
68342                 var toIndex = recents.indexOf(beforeItem);
68343                 var items = all.moveItem(recents, fromIndex, toIndex);
68344                 if (items) setRecents(items);
68345             };
68346
68347             all.setMostRecent = function(preset, geometry) {
68348                 if (context.inIntro()) return;
68349                 if (preset.searchable === false) return;
68350
68351                 geometry = all.fallback(geometry).id;
68352
68353                 var items = all.getRecents();
68354                 var item = all.recentMatching(preset, geometry);
68355                 if (item) {
68356                     items.splice(items.indexOf(item), 1);
68357                 } else {
68358                     item = RibbonItem(preset, geometry, 'recent');
68359                 }
68360                 // allow 30 recents
68361                 if (items.length === 30) {
68362                     // remove the last favorite (first in, first out)
68363                     items.pop();
68364                 }
68365                 // prepend array
68366                 items.unshift(item);
68367                 setRecents(items);
68368             };
68369
68370             return utilRebind(all, dispatch$1, 'on');
68371         }
68372
68373         function localeDateString(s) {
68374             if (!s) return null;
68375             var detected = utilDetect();
68376             var options = { day: 'numeric', month: 'short', year: 'numeric' };
68377             var d = new Date(s);
68378             if (isNaN(d.getTime())) return null;
68379             return d.toLocaleDateString(detected.locale, options);
68380         }
68381
68382         function vintageRange(vintage) {
68383             var s;
68384             if (vintage.start || vintage.end) {
68385                 s = (vintage.start || '?');
68386                 if (vintage.start !== vintage.end) {
68387                     s += ' - ' + (vintage.end || '?');
68388                 }
68389             }
68390             return s;
68391         }
68392
68393
68394         function rendererBackgroundSource(data) {
68395             var source = Object.assign({}, data);   // shallow copy
68396             var offset = [0, 0];
68397             var name = source.name;
68398             var description = source.description;
68399             var best = !!source.best;
68400             var template = source.template;
68401
68402             source.tileSize = data.tileSize || 256;
68403             source.zoomExtent = data.zoomExtent || [0, 22];
68404             source.overzoom = data.overzoom !== false;
68405
68406             source.offset = function(_) {
68407                 if (!arguments.length) return offset;
68408                 offset = _;
68409                 return source;
68410             };
68411
68412
68413             source.nudge = function(val, zoomlevel) {
68414                 offset[0] += val[0] / Math.pow(2, zoomlevel);
68415                 offset[1] += val[1] / Math.pow(2, zoomlevel);
68416                 return source;
68417             };
68418
68419
68420             source.name = function() {
68421                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68422                 return t('imagery.' + id_safe + '.name', { default: name });
68423             };
68424
68425
68426             source.description = function() {
68427                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68428                 return t('imagery.' + id_safe + '.description', { default: description });
68429             };
68430
68431
68432             source.best = function() {
68433                 return best;
68434             };
68435
68436
68437             source.area = function() {
68438                 if (!data.polygon) return Number.MAX_VALUE;  // worldwide
68439                 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
68440                 return isNaN(area) ? 0 : area;
68441             };
68442
68443
68444             source.imageryUsed = function() {
68445                 return name || source.id;
68446             };
68447
68448
68449             source.template = function(_) {
68450                 if (!arguments.length) return template;
68451                 if (source.id === 'custom') template = _;
68452                 return source;
68453             };
68454
68455
68456             source.url = function(coord) {
68457                 if (this.type === 'wms') {
68458                     var tileToProjectedCoords = (function(x, y, z) {
68459                         //polyfill for IE11, PhantomJS
68460                         var sinh = Math.sinh || function(x) {
68461                             var y = Math.exp(x);
68462                             return (y - 1 / y) / 2;
68463                         };
68464
68465                         var zoomSize = Math.pow(2, z);
68466                         var lon = x / zoomSize * Math.PI * 2 - Math.PI;
68467                         var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
68468
68469                         switch (this.projection) {
68470                             case 'EPSG:4326':
68471                                 return {
68472                                     x: lon * 180 / Math.PI,
68473                                     y: lat * 180 / Math.PI
68474                                 };
68475                             default: // EPSG:3857 and synonyms
68476                                 var mercCoords = mercatorRaw(lon, lat);
68477                                 return {
68478                                     x: 20037508.34 / Math.PI * mercCoords[0],
68479                                     y: 20037508.34 / Math.PI * mercCoords[1]
68480                                 };
68481                         }
68482                     }).bind(this);
68483
68484                     var tileSize = this.tileSize;
68485                     var projection = this.projection;
68486                     var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
68487                     var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
68488                     return template.replace(/\{(\w+)\}/g, function (token, key) {
68489                       switch (key) {
68490                         case 'width':
68491                         case 'height':
68492                           return tileSize;
68493                         case 'proj':
68494                           return projection;
68495                         case 'wkid':
68496                           return projection.replace(/^EPSG:/, '');
68497                         case 'bbox':
68498                           return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
68499                         case 'w':
68500                           return minXmaxY.x;
68501                         case 's':
68502                           return maxXminY.y;
68503                         case 'n':
68504                           return maxXminY.x;
68505                         case 'e':
68506                           return minXmaxY.y;
68507                         default:
68508                           return token;
68509                       }
68510                     });
68511                 }
68512                 return template
68513                     .replace('{x}', coord[0])
68514                     .replace('{y}', coord[1])
68515                     // TMS-flipped y coordinate
68516                     .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
68517                     .replace(/\{z(oom)?\}/, coord[2])
68518                     .replace(/\{switch:([^}]+)\}/, function(s, r) {
68519                         var subdomains = r.split(',');
68520                         return subdomains[(coord[0] + coord[1]) % subdomains.length];
68521                     })
68522                     .replace('{u}', function() {
68523                         var u = '';
68524                         for (var zoom = coord[2]; zoom > 0; zoom--) {
68525                             var b = 0;
68526                             var mask = 1 << (zoom - 1);
68527                             if ((coord[0] & mask) !== 0) b++;
68528                             if ((coord[1] & mask) !== 0) b += 2;
68529                             u += b.toString();
68530                         }
68531                         return u;
68532                     });
68533             };
68534
68535
68536             source.validZoom = function(z) {
68537                 return source.zoomExtent[0] <= z &&
68538                     (source.overzoom || source.zoomExtent[1] > z);
68539             };
68540
68541
68542             source.isLocatorOverlay = function() {
68543                 return source.id === 'mapbox_locator_overlay';
68544             };
68545
68546
68547             /* hides a source from the list, but leaves it available for use */
68548             source.isHidden = function() {
68549                 return source.id === 'DigitalGlobe-Premium-vintage' ||
68550                     source.id === 'DigitalGlobe-Standard-vintage';
68551             };
68552
68553
68554             source.copyrightNotices = function() {};
68555
68556
68557             source.getMetadata = function(center, tileCoord, callback) {
68558                 var vintage = {
68559                     start: localeDateString(source.startDate),
68560                     end: localeDateString(source.endDate)
68561                 };
68562                 vintage.range = vintageRange(vintage);
68563
68564                 var metadata = { vintage: vintage };
68565                 callback(null, metadata);
68566             };
68567
68568
68569             return source;
68570         }
68571
68572
68573         rendererBackgroundSource.Bing = function(data, dispatch) {
68574             // http://msdn.microsoft.com/en-us/library/ff701716.aspx
68575             // http://msdn.microsoft.com/en-us/library/ff701701.aspx
68576
68577             data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
68578
68579             var bing = rendererBackgroundSource(data);
68580             // var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // P2, JOSM, etc
68581             var key = 'Ak5oTE46TUbjRp08OFVcGpkARErDobfpuyNKa-W2mQ8wbt1K1KL8p1bIRwWwcF-Q';    // iD
68582
68583
68584             var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key;
68585             var cache = {};
68586             var inflight = {};
68587             var providers = [];
68588
68589             d3_json(url)
68590                 .then(function(json) {
68591                     providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
68592                         return {
68593                             attribution: provider.attribution,
68594                             areas: provider.coverageAreas.map(function(area) {
68595                                 return {
68596                                     zoom: [area.zoomMin, area.zoomMax],
68597                                     extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
68598                                 };
68599                             })
68600                         };
68601                     });
68602                     dispatch.call('change');
68603                 })
68604                 .catch(function() {
68605                     /* ignore */
68606                 });
68607
68608
68609             bing.copyrightNotices = function(zoom, extent) {
68610                 zoom = Math.min(zoom, 21);
68611                 return providers.filter(function(provider) {
68612                     return provider.areas.some(function(area) {
68613                         return extent.intersects(area.extent) &&
68614                             area.zoom[0] <= zoom &&
68615                             area.zoom[1] >= zoom;
68616                     });
68617                 }).map(function(provider) {
68618                     return provider.attribution;
68619                 }).join(', ');
68620             };
68621
68622
68623             bing.getMetadata = function(center, tileCoord, callback) {
68624                 var tileID = tileCoord.slice(0, 3).join('/');
68625                 var zoom = Math.min(tileCoord[2], 21);
68626                 var centerPoint = center[1] + ',' + center[0];  // lat,lng
68627                 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
68628                         '?zl=' + zoom + '&key=' + key;
68629
68630                 if (inflight[tileID]) return;
68631
68632                 if (!cache[tileID]) {
68633                     cache[tileID] = {};
68634                 }
68635                 if (cache[tileID] && cache[tileID].metadata) {
68636                     return callback(null, cache[tileID].metadata);
68637                 }
68638
68639                 inflight[tileID] = true;
68640                 d3_json(url)
68641                     .then(function(result) {
68642                         delete inflight[tileID];
68643                         if (!result) {
68644                             throw new Error('Unknown Error');
68645                         }
68646                         var vintage = {
68647                             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
68648                             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
68649                         };
68650                         vintage.range = vintageRange(vintage);
68651
68652                         var metadata = { vintage: vintage };
68653                         cache[tileID].metadata = metadata;
68654                         if (callback) callback(null, metadata);
68655                     })
68656                     .catch(function(err) {
68657                         delete inflight[tileID];
68658                         if (callback) callback(err.message);
68659                     });
68660             };
68661
68662
68663             bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
68664
68665
68666             return bing;
68667         };
68668
68669
68670
68671         rendererBackgroundSource.Esri = function(data) {
68672             // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
68673             if (data.template.match(/blankTile/) === null) {
68674                 data.template = data.template + '?blankTile=false';
68675             }
68676
68677             var esri = rendererBackgroundSource(data);
68678             var cache = {};
68679             var inflight = {};
68680             var _prevCenter;
68681
68682             // use a tilemap service to set maximum zoom for esri tiles dynamically
68683             // https://developers.arcgis.com/documentation/tiled-elevation-service/
68684             esri.fetchTilemap = function(center) {
68685                 // skip if we have already fetched a tilemap within 5km
68686                 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
68687                 _prevCenter = center;
68688
68689                 // tiles are available globally to zoom level 19, afterward they may or may not be present
68690                 var z = 20;
68691
68692                 // first generate a random url using the template
68693                 var dummyUrl = esri.url([1,2,3]);
68694
68695                 // calculate url z/y/x from the lat/long of the center of the map
68696                 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
68697                 var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
68698
68699                 // fetch an 8x8 grid to leverage cache
68700                 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
68701
68702                 // make the request and introspect the response from the tilemap server
68703                 d3_json(tilemapUrl)
68704                     .then(function(tilemap) {
68705                         if (!tilemap) {
68706                             throw new Error('Unknown Error');
68707                         }
68708                         var hasTiles = true;
68709                         for (var i = 0; i < tilemap.data.length; i++) {
68710                             // 0 means an individual tile in the grid doesn't exist
68711                             if (!tilemap.data[i]) {
68712                                 hasTiles = false;
68713                                 break;
68714                             }
68715                         }
68716
68717                         // if any tiles are missing at level 20 we restrict maxZoom to 19
68718                         esri.zoomExtent[1] = (hasTiles ? 22 : 19);
68719                     })
68720                     .catch(function() {
68721                         /* ignore */
68722                     });
68723             };
68724
68725
68726             esri.getMetadata = function(center, tileCoord, callback) {
68727                 var tileID = tileCoord.slice(0, 3).join('/');
68728                 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
68729                 var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
68730                 var unknown = t('info_panels.background.unknown');
68731                 var metadataLayer;
68732                 var vintage = {};
68733                 var metadata = {};
68734
68735                 if (inflight[tileID]) return;
68736
68737                 switch (true) {
68738                     case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
68739                         metadataLayer = 4;
68740                         break;
68741                     case zoom >= 19:
68742                         metadataLayer = 3;
68743                         break;
68744                     case zoom >= 17:
68745                         metadataLayer = 2;
68746                         break;
68747                     case zoom >= 13:
68748                         metadataLayer = 0;
68749                         break;
68750                     default:
68751                         metadataLayer = 99;
68752                 }
68753
68754                 var url;
68755                 // build up query using the layer appropriate to the current zoom
68756                 if (esri.id === 'EsriWorldImagery') {
68757                     url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
68758                 } else if (esri.id === 'EsriWorldImageryClarity') {
68759                     url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
68760                 }
68761
68762                 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
68763
68764                 if (!cache[tileID]) {
68765                     cache[tileID] = {};
68766                 }
68767                 if (cache[tileID] && cache[tileID].metadata) {
68768                     return callback(null, cache[tileID].metadata);
68769                 }
68770
68771                 // accurate metadata is only available >= 13
68772                 if (metadataLayer === 99) {
68773                     vintage = {
68774                         start: null,
68775                         end: null,
68776                         range: null
68777                     };
68778                     metadata = {
68779                         vintage: null,
68780                         source: unknown,
68781                         description: unknown,
68782                         resolution: unknown,
68783                         accuracy: unknown
68784                     };
68785
68786                     callback(null, metadata);
68787
68788                 } else {
68789                     inflight[tileID] = true;
68790                     d3_json(url)
68791                         .then(function(result) {
68792                             delete inflight[tileID];
68793                             if (!result) {
68794                                 throw new Error('Unknown Error');
68795                             } else if (result.features && result.features.length < 1) {
68796                                 throw new Error('No Results');
68797                             } else if (result.error && result.error.message) {
68798                                 throw new Error(result.error.message);
68799                             }
68800
68801                             // pass through the discrete capture date from metadata
68802                             var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
68803                             vintage = {
68804                                 start: captureDate,
68805                                 end: captureDate,
68806                                 range: captureDate
68807                             };
68808                             metadata = {
68809                                 vintage: vintage,
68810                                 source: clean(result.features[0].attributes.NICE_NAME),
68811                                 description: clean(result.features[0].attributes.NICE_DESC),
68812                                 resolution: clean(result.features[0].attributes.SRC_RES),
68813                                 accuracy: clean(result.features[0].attributes.SRC_ACC)
68814                             };
68815
68816                             // append units - meters
68817                             if (isFinite(metadata.resolution)) {
68818                                 metadata.resolution += ' m';
68819                             }
68820                             if (isFinite(metadata.accuracy)) {
68821                                 metadata.accuracy += ' m';
68822                             }
68823
68824                             cache[tileID].metadata = metadata;
68825                             if (callback) callback(null, metadata);
68826                         })
68827                         .catch(function(err) {
68828                             delete inflight[tileID];
68829                             if (callback) callback(err.message);
68830                         });
68831                 }
68832
68833
68834                 function clean(val) {
68835                     return String(val).trim() || unknown;
68836                 }
68837             };
68838
68839             return esri;
68840         };
68841
68842
68843         rendererBackgroundSource.None = function() {
68844             var source = rendererBackgroundSource({ id: 'none', template: '' });
68845
68846
68847             source.name = function() {
68848                 return t('background.none');
68849             };
68850
68851
68852             source.imageryUsed = function() {
68853                 return null;
68854             };
68855
68856
68857             source.area = function() {
68858                 return -1;  // sources in background pane are sorted by area
68859             };
68860
68861
68862             return source;
68863         };
68864
68865
68866         rendererBackgroundSource.Custom = function(template) {
68867             var source = rendererBackgroundSource({ id: 'custom', template: template });
68868
68869
68870             source.name = function() {
68871                 return t('background.custom');
68872             };
68873
68874
68875             source.imageryUsed = function() {
68876                 return 'Custom (' + source.template() + ')';
68877             };
68878
68879
68880             source.area = function() {
68881                 return -2;  // sources in background pane are sorted by area
68882             };
68883
68884
68885             return source;
68886         };
68887
68888         function rendererTileLayer(context) {
68889             var transformProp = utilPrefixCSSProperty('Transform');
68890             var tiler = utilTiler();
68891
68892             var _tileSize = 256;
68893             var _projection;
68894             var _cache = {};
68895             var _tileOrigin;
68896             var _zoom;
68897             var _source;
68898
68899
68900             function tileSizeAtZoom(d, z) {
68901                 var EPSILON = 0.002;    // close seams
68902                 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
68903             }
68904
68905
68906             function atZoom(t, distance) {
68907                 var power = Math.pow(2, distance);
68908                 return [
68909                     Math.floor(t[0] * power),
68910                     Math.floor(t[1] * power),
68911                     t[2] + distance
68912                 ];
68913             }
68914
68915
68916             function lookUp(d) {
68917                 for (var up = -1; up > -d[2]; up--) {
68918                     var tile = atZoom(d, up);
68919                     if (_cache[_source.url(tile)] !== false) {
68920                         return tile;
68921                     }
68922                 }
68923             }
68924
68925
68926             function uniqueBy(a, n) {
68927                 var o = [];
68928                 var seen = {};
68929                 for (var i = 0; i < a.length; i++) {
68930                     if (seen[a[i][n]] === undefined) {
68931                         o.push(a[i]);
68932                         seen[a[i][n]] = true;
68933                     }
68934                 }
68935                 return o;
68936             }
68937
68938
68939             function addSource(d) {
68940                 d.push(_source.url(d));
68941                 return d;
68942             }
68943
68944
68945             // Update tiles based on current state of `projection`.
68946             function background(selection) {
68947                 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
68948
68949                 var pixelOffset;
68950                 if (_source) {
68951                     pixelOffset = [
68952                         _source.offset()[0] * Math.pow(2, _zoom),
68953                         _source.offset()[1] * Math.pow(2, _zoom)
68954                     ];
68955                 } else {
68956                     pixelOffset = [0, 0];
68957                 }
68958
68959                 var translate = [
68960                     _projection.translate()[0] + pixelOffset[0],
68961                     _projection.translate()[1] + pixelOffset[1]
68962                 ];
68963
68964                 tiler
68965                     .scale(_projection.scale() * 2 * Math.PI)
68966                     .translate(translate);
68967
68968                 _tileOrigin = [
68969                     _projection.scale() * Math.PI - translate[0],
68970                     _projection.scale() * Math.PI - translate[1]
68971                 ];
68972
68973                 render(selection);
68974             }
68975
68976
68977             // Derive the tiles onscreen, remove those offscreen and position them.
68978             // Important that this part not depend on `_projection` because it's
68979             // rentered when tiles load/error (see #644).
68980             function render(selection) {
68981                 if (!_source) return;
68982                 var requests = [];
68983                 var showDebug = context.getDebug('tile') && !_source.overlay;
68984
68985                 if (_source.validZoom(_zoom)) {
68986                     tiler.skipNullIsland(!!_source.overlay);
68987
68988                     tiler().forEach(function(d) {
68989                         addSource(d);
68990                         if (d[3] === '') return;
68991                         if (typeof d[3] !== 'string') return; // Workaround for #2295
68992                         requests.push(d);
68993                         if (_cache[d[3]] === false && lookUp(d)) {
68994                             requests.push(addSource(lookUp(d)));
68995                         }
68996                     });
68997
68998                     requests = uniqueBy(requests, 3).filter(function(r) {
68999                         // don't re-request tiles which have failed in the past
69000                         return _cache[r[3]] !== false;
69001                     });
69002                 }
69003
69004                 function load(d) {
69005                     _cache[d[3]] = true;
69006                     d3_select(this)
69007                         .on('error', null)
69008                         .on('load', null)
69009                         .classed('tile-loaded', true);
69010                     render(selection);
69011                 }
69012
69013                 function error(d) {
69014                     _cache[d[3]] = false;
69015                     d3_select(this)
69016                         .on('error', null)
69017                         .on('load', null)
69018                         .remove();
69019                     render(selection);
69020                 }
69021
69022                 function imageTransform(d) {
69023                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
69024                     var scale = tileSizeAtZoom(d, _zoom);
69025                     return 'translate(' +
69026                         ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
69027                         ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
69028                         'scale(' + scale + ',' + scale + ')';
69029                 }
69030
69031                 function tileCenter(d) {
69032                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
69033                     return [
69034                         ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
69035                         ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
69036                     ];
69037                 }
69038
69039                 function debugTransform(d) {
69040                     var coord = tileCenter(d);
69041                     return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
69042                 }
69043
69044
69045                 // Pick a representative tile near the center of the viewport
69046                 // (This is useful for sampling the imagery vintage)
69047                 var dims = tiler.size();
69048                 var mapCenter = [dims[0] / 2, dims[1] / 2];
69049                 var minDist = Math.max(dims[0], dims[1]);
69050                 var nearCenter;
69051
69052                 requests.forEach(function(d) {
69053                     var c = tileCenter(d);
69054                     var dist = geoVecLength(c, mapCenter);
69055                     if (dist < minDist) {
69056                         minDist = dist;
69057                         nearCenter = d;
69058                     }
69059                 });
69060
69061
69062                 var image = selection.selectAll('img')
69063                     .data(requests, function(d) { return d[3]; });
69064
69065                 image.exit()
69066                     .style(transformProp, imageTransform)
69067                     .classed('tile-removing', true)
69068                     .classed('tile-center', false)
69069                     .each(function() {
69070                         var tile = d3_select(this);
69071                         window.setTimeout(function() {
69072                             if (tile.classed('tile-removing')) {
69073                                 tile.remove();
69074                             }
69075                         }, 300);
69076                     });
69077
69078                 image.enter()
69079                   .append('img')
69080                     .attr('class', 'tile')
69081                     .attr('src', function(d) { return d[3]; })
69082                     .on('error', error)
69083                     .on('load', load)
69084                   .merge(image)
69085                     .style(transformProp, imageTransform)
69086                     .classed('tile-debug', showDebug)
69087                     .classed('tile-removing', false)
69088                     .classed('tile-center', function(d) { return d === nearCenter; });
69089
69090
69091
69092                 var debug = selection.selectAll('.tile-label-debug')
69093                     .data(showDebug ? requests : [], function(d) { return d[3]; });
69094
69095                 debug.exit()
69096                     .remove();
69097
69098                 if (showDebug) {
69099                     var debugEnter = debug.enter()
69100                         .append('div')
69101                         .attr('class', 'tile-label-debug');
69102
69103                     debugEnter
69104                         .append('div')
69105                         .attr('class', 'tile-label-debug-coord');
69106
69107                     debugEnter
69108                         .append('div')
69109                         .attr('class', 'tile-label-debug-vintage');
69110
69111                     debug = debug.merge(debugEnter);
69112
69113                     debug
69114                         .style(transformProp, debugTransform);
69115
69116                     debug
69117                         .selectAll('.tile-label-debug-coord')
69118                         .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
69119
69120                     debug
69121                         .selectAll('.tile-label-debug-vintage')
69122                         .each(function(d) {
69123                             var span = d3_select(this);
69124                             var center = context.projection.invert(tileCenter(d));
69125                             _source.getMetadata(center, d, function(err, result) {
69126                                 span.text((result && result.vintage && result.vintage.range) ||
69127                                     t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
69128                                 );
69129                             });
69130                         });
69131                 }
69132
69133             }
69134
69135
69136             background.projection = function(val) {
69137                 if (!arguments.length) return _projection;
69138                 _projection = val;
69139                 return background;
69140             };
69141
69142
69143             background.dimensions = function(val) {
69144                 if (!arguments.length) return tiler.size();
69145                 tiler.size(val);
69146                 return background;
69147             };
69148
69149
69150             background.source = function(val) {
69151                 if (!arguments.length) return _source;
69152                 _source = val;
69153                 _tileSize = _source.tileSize;
69154                 _cache = {};
69155                 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
69156                 return background;
69157             };
69158
69159
69160             return background;
69161         }
69162
69163         function rendererBackground(context) {
69164             var dispatch$1 = dispatch('change');
69165             var detected = utilDetect();
69166             var baseLayer = rendererTileLayer(context).projection(context.projection);
69167             var _isValid = true;
69168             var _overlayLayers = [];
69169             var _backgroundSources = [];
69170             var _brightness = 1;
69171             var _contrast = 1;
69172             var _saturation = 1;
69173             var _sharpness = 1;
69174
69175
69176             function background(selection) {
69177                 // If we are displaying an Esri basemap at high zoom,
69178                 // check its tilemap to see how high the zoom can go
69179                 if (context.map().zoom() > 18) {
69180                     var basemap = baseLayer.source();
69181                     if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
69182                         var center = context.map().center();
69183                         basemap.fetchTilemap(center);
69184                     }
69185                 }
69186
69187                 // Is the imagery valid here? - #4827
69188                 var sources = background.sources(context.map().extent());
69189                 var wasValid = _isValid;
69190                 _isValid = !!sources
69191                     .filter(function(d) { return d === baseLayer.source(); }).length;
69192
69193                 if (wasValid !== _isValid) {      // change in valid status
69194                     background.updateImagery();
69195                 }
69196
69197
69198                 var baseFilter = '';
69199                 if (detected.cssfilters) {
69200                     if (_brightness !== 1) {
69201                         baseFilter += 'brightness(' + _brightness + ')';
69202                     }
69203                     if (_contrast !== 1) {
69204                         baseFilter += 'contrast(' + _contrast + ')';
69205                     }
69206                     if (_saturation !== 1) {
69207                         baseFilter += 'saturate(' + _saturation + ')';
69208                     }
69209                     if (_sharpness < 1) {  // gaussian blur
69210                         var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
69211                         baseFilter += 'blur(' + blur + 'px)';
69212                     }
69213                 }
69214
69215                 var base = selection.selectAll('.layer-background')
69216                     .data([0]);
69217
69218                 base = base.enter()
69219                     .insert('div', '.layer-data')
69220                     .attr('class', 'layer layer-background')
69221                     .merge(base);
69222
69223                 if (detected.cssfilters) {
69224                     base.style('filter', baseFilter || null);
69225                 } else {
69226                     base.style('opacity', _brightness);
69227                 }
69228
69229
69230                 var imagery = base.selectAll('.layer-imagery')
69231                     .data([0]);
69232
69233                 imagery.enter()
69234                     .append('div')
69235                     .attr('class', 'layer layer-imagery')
69236                     .merge(imagery)
69237                     .call(baseLayer);
69238
69239
69240                 var maskFilter = '';
69241                 var mixBlendMode = '';
69242                 if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
69243                     mixBlendMode = 'overlay';
69244                     maskFilter = 'saturate(0) blur(3px) invert(1)';
69245
69246                     var contrast = _sharpness - 1;
69247                     maskFilter += ' contrast(' + contrast + ')';
69248
69249                     var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
69250                     maskFilter += ' brightness(' + brightness + ')';
69251                 }
69252
69253                 var mask = base.selectAll('.layer-unsharp-mask')
69254                     .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
69255
69256                 mask.exit()
69257                     .remove();
69258
69259                 mask.enter()
69260                     .append('div')
69261                     .attr('class', 'layer layer-mask layer-unsharp-mask')
69262                     .merge(mask)
69263                     .call(baseLayer)
69264                     .style('filter', maskFilter || null)
69265                     .style('mix-blend-mode', mixBlendMode || null);
69266
69267
69268                 var overlays = selection.selectAll('.layer-overlay')
69269                     .data(_overlayLayers, function(d) { return d.source().name(); });
69270
69271                 overlays.exit()
69272                     .remove();
69273
69274                 overlays.enter()
69275                     .insert('div', '.layer-data')
69276                     .attr('class', 'layer layer-overlay')
69277                     .merge(overlays)
69278                     .each(function(layer) { d3_select(this).call(layer); });
69279             }
69280
69281
69282             background.updateImagery = function() {
69283                 var b = baseLayer.source();
69284                 if (context.inIntro() || !b) return;
69285
69286                 var o = _overlayLayers
69287                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69288                     .map(function (d) { return d.source().id; })
69289                     .join(',');
69290
69291                 var meters = geoOffsetToMeters(b.offset());
69292                 var epsilon = 0.01;
69293                 var x = +meters[0].toFixed(2);
69294                 var y = +meters[1].toFixed(2);
69295                 var q = utilStringQs(window.location.hash.substring(1));
69296
69297                 var id = b.id;
69298                 if (id === 'custom') {
69299                     id = 'custom:' + b.template();
69300                 }
69301
69302                 if (id) {
69303                     q.background = id;
69304                 } else {
69305                     delete q.background;
69306                 }
69307
69308                 if (o) {
69309                     q.overlays = o;
69310                 } else {
69311                     delete q.overlays;
69312                 }
69313
69314                 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
69315                     q.offset = x + ',' + y;
69316                 } else {
69317                     delete q.offset;
69318                 }
69319
69320                 if (!window.mocha) {
69321                     window.location.replace('#' + utilQsString(q, true));
69322                 }
69323
69324                 var imageryUsed = [];
69325                 var photoOverlaysUsed = [];
69326
69327                 var current = b.imageryUsed();
69328                 if (current && _isValid) {
69329                     imageryUsed.push(current);
69330                 }
69331
69332                 _overlayLayers
69333                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
69334                     .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
69335
69336                 var data = context.layers().layer('data');
69337                 if (data && data.enabled() && data.hasData()) {
69338                     imageryUsed.push(data.getSrc());
69339                 }
69340
69341                 var photoOverlayLayers = {
69342                     streetside: 'Bing Streetside',
69343                     mapillary: 'Mapillary Images',
69344                     'mapillary-signs': 'Mapillary Signs',
69345                     openstreetcam: 'OpenStreetCam Images'
69346                 };
69347
69348                 for (var layerID in photoOverlayLayers) {
69349                     var layer = context.layers().layer(layerID);
69350                     if (layer && layer.enabled()) {
69351                         photoOverlaysUsed.push(layerID);
69352                         imageryUsed.push(photoOverlayLayers[layerID]);
69353                     }
69354                 }
69355
69356                 context.history().photoOverlaysUsed(photoOverlaysUsed);
69357                 context.history().imageryUsed(imageryUsed);
69358             };
69359
69360
69361             background.sources = function(extent) {
69362                 if (!data.imagery || !data.imagery.query) return [];   // called before init()?
69363
69364                 var matchIDs = {};
69365                 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
69366                 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
69367
69368                 return _backgroundSources.filter(function(source) {
69369                     return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
69370                 });
69371             };
69372
69373
69374             background.dimensions = function(d) {
69375                 if (!d) return;
69376                 baseLayer.dimensions(d);
69377
69378                 _overlayLayers.forEach(function(layer) {
69379                     layer.dimensions(d);
69380                 });
69381             };
69382
69383
69384             background.baseLayerSource = function(d) {
69385                 if (!arguments.length) return baseLayer.source();
69386
69387                 // test source against OSM imagery blacklists..
69388                 var osm = context.connection();
69389                 if (!osm) return background;
69390
69391                 var blacklists = context.connection().imageryBlacklists();
69392                 var template = d.template();
69393                 var fail = false;
69394                 var tested = 0;
69395                 var regex;
69396
69397                 for (var i = 0; i < blacklists.length; i++) {
69398                     try {
69399                         regex = new RegExp(blacklists[i]);
69400                         fail = regex.test(template);
69401                         tested++;
69402                         if (fail) break;
69403                     } catch (e) {
69404                         /* noop */
69405                     }
69406                 }
69407
69408                 // ensure at least one test was run.
69409                 if (!tested) {
69410                     regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
69411                     fail = regex.test(template);
69412                 }
69413
69414                 baseLayer.source(!fail ? d : background.findSource('none'));
69415                 dispatch$1.call('change');
69416                 background.updateImagery();
69417                 return background;
69418             };
69419
69420
69421             background.findSource = function(id) {
69422                 return _backgroundSources.find(function(d) {
69423                     return d.id && d.id === id;
69424                 });
69425             };
69426
69427
69428             background.bing = function() {
69429                 background.baseLayerSource(background.findSource('Bing'));
69430             };
69431
69432
69433             background.showsLayer = function(d) {
69434                 var baseSource = baseLayer.source();
69435                 if (!d || !baseSource) return false;
69436                 return d.id === baseSource.id ||
69437                     _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
69438             };
69439
69440
69441             background.overlayLayerSources = function() {
69442                 return _overlayLayers.map(function (l) { return l.source(); });
69443             };
69444
69445
69446             background.toggleOverlayLayer = function(d) {
69447                 var layer;
69448                 for (var i = 0; i < _overlayLayers.length; i++) {
69449                     layer = _overlayLayers[i];
69450                     if (layer.source() === d) {
69451                         _overlayLayers.splice(i, 1);
69452                         dispatch$1.call('change');
69453                         background.updateImagery();
69454                         return;
69455                     }
69456                 }
69457
69458                 layer = rendererTileLayer(context)
69459                     .source(d)
69460                     .projection(context.projection)
69461                     .dimensions(baseLayer.dimensions()
69462                 );
69463
69464                 _overlayLayers.push(layer);
69465                 dispatch$1.call('change');
69466                 background.updateImagery();
69467             };
69468
69469
69470             background.nudge = function(d, zoom) {
69471                 baseLayer.source().nudge(d, zoom);
69472                 dispatch$1.call('change');
69473                 background.updateImagery();
69474                 return background;
69475             };
69476
69477
69478             background.offset = function(d) {
69479                 if (!arguments.length) return baseLayer.source().offset();
69480                 baseLayer.source().offset(d);
69481                 dispatch$1.call('change');
69482                 background.updateImagery();
69483                 return background;
69484             };
69485
69486
69487             background.brightness = function(d) {
69488                 if (!arguments.length) return _brightness;
69489                 _brightness = d;
69490                 if (context.mode()) dispatch$1.call('change');
69491                 return background;
69492             };
69493
69494
69495             background.contrast = function(d) {
69496                 if (!arguments.length) return _contrast;
69497                 _contrast = d;
69498                 if (context.mode()) dispatch$1.call('change');
69499                 return background;
69500             };
69501
69502
69503             background.saturation = function(d) {
69504                 if (!arguments.length) return _saturation;
69505                 _saturation = d;
69506                 if (context.mode()) dispatch$1.call('change');
69507                 return background;
69508             };
69509
69510
69511             background.sharpness = function(d) {
69512                 if (!arguments.length) return _sharpness;
69513                 _sharpness = d;
69514                 if (context.mode()) dispatch$1.call('change');
69515                 return background;
69516             };
69517
69518
69519             background.init = function() {
69520                 function parseMap(qmap) {
69521                     if (!qmap) return false;
69522                     var args = qmap.split('/').map(Number);
69523                     if (args.length < 3 || args.some(isNaN)) return false;
69524                     return geoExtent([args[2], args[1]]);
69525                 }
69526
69527                 var q = utilStringQs(window.location.hash.substring(1));
69528                 var requested = q.background || q.layer;
69529                 var extent = parseMap(q.map);
69530                 var first;
69531                 var best;
69532
69533
69534                 data.imagery = data.imagery || [];
69535                 data.imagery.features = {};
69536
69537                 // build efficient index and querying for data.imagery
69538                 var features = data.imagery.map(function(source) {
69539                     if (!source.polygon) return null;
69540
69541                     // Add an extra array nest to each element in `source.polygon`
69542                     // so the rings are not treated as a bunch of holes:
69543                     // what we have: [ [[outer],[hole],[hole]] ]
69544                     // what we want: [ [[outer]],[[outer]],[[outer]] ]
69545                     var rings = source.polygon.map(function(ring) { return [ring]; });
69546
69547                     var feature = {
69548                         type: 'Feature',
69549                         properties: { id: source.id },
69550                         geometry: { type: 'MultiPolygon', coordinates: rings }
69551                     };
69552
69553                     data.imagery.features[source.id] = feature;
69554                     return feature;
69555
69556                 }).filter(Boolean);
69557
69558                 data.imagery.query = whichPolygon_1({
69559                     type: 'FeatureCollection',
69560                     features: features
69561                 });
69562
69563
69564                 // Add all the available imagery sources
69565                 _backgroundSources = data.imagery.map(function(source) {
69566                     if (source.type === 'bing') {
69567                         return rendererBackgroundSource.Bing(source, dispatch$1);
69568                     } else if (/^EsriWorldImagery/.test(source.id)) {
69569                         return rendererBackgroundSource.Esri(source);
69570                     } else {
69571                         return rendererBackgroundSource(source);
69572                     }
69573                 });
69574
69575                 first = _backgroundSources.length && _backgroundSources[0];
69576
69577                 // Add 'None'
69578                 _backgroundSources.unshift(rendererBackgroundSource.None());
69579
69580                 // Add 'Custom'
69581                 var template = context.storage('background-custom-template') || '';
69582                 var custom = rendererBackgroundSource.Custom(template);
69583                 _backgroundSources.unshift(custom);
69584
69585
69586                 // Decide which background layer to display
69587                 if (!requested && extent) {
69588                     best = this.sources(extent).find(function(s) { return s.best(); });
69589                 }
69590                 if (requested && requested.indexOf('custom:') === 0) {
69591                     template = requested.replace(/^custom:/, '');
69592                     background.baseLayerSource(custom.template(template));
69593                     context.storage('background-custom-template', template);
69594                 } else {
69595                     background.baseLayerSource(
69596                         background.findSource(requested) ||
69597                         best ||
69598                         background.findSource(context.storage('background-last-used')) ||
69599                         background.findSource('Bing') ||
69600                         first ||
69601                         background.findSource('none')
69602                     );
69603                 }
69604
69605                 var locator = _backgroundSources.find(function(d) {
69606                     return d.overlay && d.default;
69607                 });
69608
69609                 if (locator) {
69610                     background.toggleOverlayLayer(locator);
69611                 }
69612
69613                 var overlays = (q.overlays || '').split(',');
69614                 overlays.forEach(function(overlay) {
69615                     overlay = background.findSource(overlay);
69616                     if (overlay) {
69617                         background.toggleOverlayLayer(overlay);
69618                     }
69619                 });
69620
69621                 if (q.gpx) {
69622                     var gpx = context.layers().layer('data');
69623                     if (gpx) {
69624                         gpx.url(q.gpx, '.gpx');
69625                     }
69626                 }
69627
69628                 if (q.offset) {
69629                     var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
69630                         return !isNaN(n) && n;
69631                     });
69632
69633                     if (offset.length === 2) {
69634                         background.offset(geoMetersToOffset(offset));
69635                     }
69636                 }
69637             };
69638
69639
69640             return utilRebind(background, dispatch$1, 'on');
69641         }
69642
69643         function rendererFeatures(context) {
69644             var dispatch$1 = dispatch('change', 'redraw');
69645             var features = utilRebind({}, dispatch$1, 'on');
69646             var _deferred = new Set();
69647
69648             var traffic_roads = {
69649                 'motorway': true,
69650                 'motorway_link': true,
69651                 'trunk': true,
69652                 'trunk_link': true,
69653                 'primary': true,
69654                 'primary_link': true,
69655                 'secondary': true,
69656                 'secondary_link': true,
69657                 'tertiary': true,
69658                 'tertiary_link': true,
69659                 'residential': true,
69660                 'unclassified': true,
69661                 'living_street': true
69662             };
69663
69664             var service_roads = {
69665                 'service': true,
69666                 'road': true,
69667                 'track': true
69668             };
69669
69670             var paths = {
69671                 'path': true,
69672                 'footway': true,
69673                 'cycleway': true,
69674                 'bridleway': true,
69675                 'steps': true,
69676                 'pedestrian': true,
69677                 'corridor': true
69678             };
69679
69680             var past_futures = {
69681                 'proposed': true,
69682                 'construction': true,
69683                 'abandoned': true,
69684                 'dismantled': true,
69685                 'disused': true,
69686                 'razed': true,
69687                 'demolished': true,
69688                 'obliterated': true
69689             };
69690
69691             var _cullFactor = 1;
69692             var _cache = {};
69693             var _rules = {};
69694             var _stats = {};
69695             var _keys = [];
69696             var _hidden = [];
69697             var _forceVisible = {};
69698
69699
69700             function update() {
69701                 if (!window.mocha) {
69702                     var q = utilStringQs(window.location.hash.substring(1));
69703                     var disabled = features.disabled();
69704                     if (disabled.length) {
69705                         q.disable_features = disabled.join(',');
69706                     } else {
69707                         delete q.disable_features;
69708                     }
69709                     window.location.replace('#' + utilQsString(q, true));
69710                     context.storage('disabled-features', disabled.join(','));
69711                 }
69712                 _hidden = features.hidden();
69713                 dispatch$1.call('change');
69714                 dispatch$1.call('redraw');
69715             }
69716
69717
69718             function defineRule(k, filter, max) {
69719                 var isEnabled = true;
69720
69721                 _keys.push(k);
69722                 _rules[k] = {
69723                     filter: filter,
69724                     enabled: isEnabled,   // whether the user wants it enabled..
69725                     count: 0,
69726                     currentMax: (max || Infinity),
69727                     defaultMax: (max || Infinity),
69728                     enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
69729                     disable: function() { this.enabled = false; this.currentMax = 0; },
69730                     hidden: function() {
69731                         return !context.editable() ||
69732                             (this.count === 0 && !this.enabled) ||
69733                             this.count > this.currentMax * _cullFactor;
69734                     },
69735                     autoHidden: function() { return this.hidden() && this.currentMax > 0; }
69736                 };
69737             }
69738
69739
69740             defineRule('points', function isPoint(tags, geometry) {
69741                 return geometry === 'point';
69742             }, 200);
69743
69744             defineRule('traffic_roads', function isTrafficRoad(tags) {
69745                 return traffic_roads[tags.highway];
69746             });
69747
69748             defineRule('service_roads', function isServiceRoad(tags) {
69749                 return service_roads[tags.highway];
69750             });
69751
69752             defineRule('paths', function isPath(tags) {
69753                 return paths[tags.highway];
69754             });
69755
69756             defineRule('buildings', function isBuilding(tags) {
69757                 return (
69758                     (!!tags.building && tags.building !== 'no') ||
69759                     tags.parking === 'multi-storey' ||
69760                     tags.parking === 'sheds' ||
69761                     tags.parking === 'carports' ||
69762                     tags.parking === 'garage_boxes'
69763                 );
69764             }, 250);
69765
69766             defineRule('building_parts', function isBuildingPart(tags) {
69767                 return tags['building:part'];
69768             });
69769
69770             defineRule('indoor', function isIndoor(tags) {
69771                 return tags.indoor;
69772             });
69773
69774             defineRule('landuse', function isLanduse(tags, geometry) {
69775                 return geometry === 'area' &&
69776                     !_rules.buildings.filter(tags) &&
69777                     !_rules.building_parts.filter(tags) &&
69778                     !_rules.indoor.filter(tags) &&
69779                     !_rules.water.filter(tags) &&
69780                     !_rules.pistes.filter(tags);
69781             });
69782
69783             defineRule('boundaries', function isBoundary(tags) {
69784                 return (
69785                     !!tags.boundary
69786                 ) && !(
69787                     traffic_roads[tags.highway] ||
69788                     service_roads[tags.highway] ||
69789                     paths[tags.highway] ||
69790                     tags.waterway ||
69791                     tags.railway ||
69792                     tags.landuse ||
69793                     tags.natural ||
69794                     tags.building ||
69795                     tags.power
69796                 );
69797             });
69798
69799             defineRule('water', function isWater(tags) {
69800                 return (
69801                     !!tags.waterway ||
69802                     tags.natural === 'water' ||
69803                     tags.natural === 'coastline' ||
69804                     tags.natural === 'bay' ||
69805                     tags.landuse === 'pond' ||
69806                     tags.landuse === 'basin' ||
69807                     tags.landuse === 'reservoir' ||
69808                     tags.landuse === 'salt_pond'
69809                 );
69810             });
69811
69812             defineRule('rail', function isRail(tags) {
69813                 return (
69814                     !!tags.railway ||
69815                     tags.landuse === 'railway'
69816                 ) && !(
69817                     traffic_roads[tags.highway] ||
69818                     service_roads[tags.highway] ||
69819                     paths[tags.highway]
69820                 );
69821             });
69822
69823             defineRule('pistes', function isPiste(tags) {
69824                 return tags['piste:type'];
69825             });
69826
69827             defineRule('aerialways', function isPiste(tags) {
69828                 return tags.aerialway &&
69829                     tags.aerialway !== 'yes' &&
69830                     tags.aerialway !== 'station';
69831             });
69832
69833             defineRule('power', function isPower(tags) {
69834                 return !!tags.power;
69835             });
69836
69837             // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
69838             defineRule('past_future', function isPastFuture(tags) {
69839                 if (
69840                     traffic_roads[tags.highway] ||
69841                     service_roads[tags.highway] ||
69842                     paths[tags.highway]
69843                 ) { return false; }
69844
69845                 var strings = Object.keys(tags);
69846
69847                 for (var i = 0; i < strings.length; i++) {
69848                     var s = strings[i];
69849                     if (past_futures[s] || past_futures[tags[s]]) { return true; }
69850                 }
69851                 return false;
69852             });
69853
69854             // Lines or areas that don't match another feature filter.
69855             // IMPORTANT: The 'others' feature must be the last one defined,
69856             //   so that code in getMatches can skip this test if `hasMatch = true`
69857             defineRule('others', function isOther(tags, geometry) {
69858                 return (geometry === 'line' || geometry === 'area');
69859             });
69860
69861
69862
69863             features.features = function() {
69864                 return _rules;
69865             };
69866
69867
69868             features.keys = function() {
69869                 return _keys;
69870             };
69871
69872
69873             features.enabled = function(k) {
69874                 if (!arguments.length) {
69875                     return _keys.filter(function(k) { return _rules[k].enabled; });
69876                 }
69877                 return _rules[k] && _rules[k].enabled;
69878             };
69879
69880
69881             features.disabled = function(k) {
69882                 if (!arguments.length) {
69883                     return _keys.filter(function(k) { return !_rules[k].enabled; });
69884                 }
69885                 return _rules[k] && !_rules[k].enabled;
69886             };
69887
69888
69889             features.hidden = function(k) {
69890                 if (!arguments.length) {
69891                     return _keys.filter(function(k) { return _rules[k].hidden(); });
69892                 }
69893                 return _rules[k] && _rules[k].hidden();
69894             };
69895
69896
69897             features.autoHidden = function(k) {
69898                 if (!arguments.length) {
69899                     return _keys.filter(function(k) { return _rules[k].autoHidden(); });
69900                 }
69901                 return _rules[k] && _rules[k].autoHidden();
69902             };
69903
69904
69905             features.enable = function(k) {
69906                 if (_rules[k] && !_rules[k].enabled) {
69907                     _rules[k].enable();
69908                     update();
69909                 }
69910             };
69911
69912             features.enableAll = function() {
69913                 var didEnable = false;
69914                 for (var k in _rules) {
69915                     if (!_rules[k].enabled) {
69916                         didEnable = true;
69917                         _rules[k].enable();
69918                     }
69919                 }
69920                 if (didEnable) update();
69921             };
69922
69923
69924             features.disable = function(k) {
69925                 if (_rules[k] && _rules[k].enabled) {
69926                     _rules[k].disable();
69927                     update();
69928                 }
69929             };
69930
69931             features.disableAll = function() {
69932                 var didDisable = false;
69933                 for (var k in _rules) {
69934                     if (_rules[k].enabled) {
69935                         didDisable = true;
69936                         _rules[k].disable();
69937                     }
69938                 }
69939                 if (didDisable) update();
69940             };
69941
69942
69943             features.toggle = function(k) {
69944                 if (_rules[k]) {
69945                     (function(f) { return f.enabled ? f.disable() : f.enable(); }(_rules[k]));
69946                     update();
69947                 }
69948             };
69949
69950
69951             features.resetStats = function() {
69952                 for (var i = 0; i < _keys.length; i++) {
69953                     _rules[_keys[i]].count = 0;
69954                 }
69955                 dispatch$1.call('change');
69956             };
69957
69958
69959             features.gatherStats = function(d, resolver, dimensions) {
69960                 var needsRedraw = false;
69961                 var types = utilArrayGroupBy(d, 'type');
69962                 var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69963                 var currHidden, geometry, matches, i, j;
69964
69965                 for (i = 0; i < _keys.length; i++) {
69966                     _rules[_keys[i]].count = 0;
69967                 }
69968
69969                 // adjust the threshold for point/building culling based on viewport size..
69970                 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
69971                 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
69972
69973                 for (i = 0; i < entities.length; i++) {
69974                     geometry = entities[i].geometry(resolver);
69975                     matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
69976                     for (j = 0; j < matches.length; j++) {
69977                         _rules[matches[j]].count++;
69978                     }
69979                 }
69980
69981                 currHidden = features.hidden();
69982                 if (currHidden !== _hidden) {
69983                     _hidden = currHidden;
69984                     needsRedraw = true;
69985                     dispatch$1.call('change');
69986                 }
69987
69988                 return needsRedraw;
69989             };
69990
69991
69992             features.stats = function() {
69993                 for (var i = 0; i < _keys.length; i++) {
69994                     _stats[_keys[i]] = _rules[_keys[i]].count;
69995                 }
69996
69997                 return _stats;
69998             };
69999
70000
70001             features.clear = function(d) {
70002                 for (var i = 0; i < d.length; i++) {
70003                     features.clearEntity(d[i]);
70004                 }
70005             };
70006
70007
70008             features.clearEntity = function(entity) {
70009                 delete _cache[osmEntity.key(entity)];
70010             };
70011
70012
70013             features.reset = function() {
70014                 Array.from(_deferred).forEach(function(handle) {
70015                     window.cancelIdleCallback(handle);
70016                     _deferred.delete(handle);
70017                 });
70018
70019                 _cache = {};
70020             };
70021
70022             // only certain relations are worth checking
70023             function relationShouldBeChecked(relation) {
70024                 // multipolygon features have `area` geometry and aren't checked here
70025                 return relation.tags.type === 'boundary';
70026             }
70027
70028             features.getMatches = function(entity, resolver, geometry) {
70029                 if (geometry === 'vertex' ||
70030                     (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
70031
70032                 var ent = osmEntity.key(entity);
70033                 if (!_cache[ent]) {
70034                     _cache[ent] = {};
70035                 }
70036
70037                 if (!_cache[ent].matches) {
70038                     var matches = {};
70039                     var hasMatch = false;
70040
70041                     for (var i = 0; i < _keys.length; i++) {
70042                         if (_keys[i] === 'others') {
70043                             if (hasMatch) continue;
70044
70045                             // If an entity...
70046                             //   1. is a way that hasn't matched other 'interesting' feature rules,
70047                             if (entity.type === 'way') {
70048                                 var parents = features.getParents(entity, resolver, geometry);
70049
70050                                 //   2a. belongs only to a single multipolygon relation
70051                                 if ((parents.length === 1 && parents[0].isMultipolygon()) ||
70052                                     // 2b. or belongs only to boundary relations
70053                                     (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
70054
70055                                     // ...then match whatever feature rules the parent relation has matched.
70056                                     // see #2548, #2887
70057                                     //
70058                                     // IMPORTANT:
70059                                     // For this to work, getMatches must be called on relations before ways.
70060                                     //
70061                                     var pkey = osmEntity.key(parents[0]);
70062                                     if (_cache[pkey] && _cache[pkey].matches) {
70063                                         matches = Object.assign({}, _cache[pkey].matches);  // shallow copy
70064                                         continue;
70065                                     }
70066                                 }
70067                             }
70068                         }
70069
70070                         if (_rules[_keys[i]].filter(entity.tags, geometry)) {
70071                             matches[_keys[i]] = hasMatch = true;
70072                         }
70073                     }
70074                     _cache[ent].matches = matches;
70075                 }
70076
70077                 return _cache[ent].matches;
70078             };
70079
70080
70081             features.getParents = function(entity, resolver, geometry) {
70082                 if (geometry === 'point') return [];
70083
70084                 var ent = osmEntity.key(entity);
70085                 if (!_cache[ent]) {
70086                     _cache[ent] = {};
70087                 }
70088
70089                 if (!_cache[ent].parents) {
70090                     var parents = [];
70091                     if (geometry === 'vertex') {
70092                         parents = resolver.parentWays(entity);
70093                     } else {   // 'line', 'area', 'relation'
70094                         parents = resolver.parentRelations(entity);
70095                     }
70096                     _cache[ent].parents = parents;
70097                 }
70098                 return _cache[ent].parents;
70099             };
70100
70101
70102             features.isHiddenPreset = function(preset, geometry) {
70103                 if (!_hidden.length) return false;
70104                 if (!preset.tags) return false;
70105
70106                 var test = preset.setTags({}, geometry);
70107                 for (var key in _rules) {
70108                     if (_rules[key].filter(test, geometry)) {
70109                         if (_hidden.indexOf(key) !== -1) {
70110                             return key;
70111                         }
70112                         return false;
70113                     }
70114                 }
70115                 return false;
70116             };
70117
70118
70119             features.isHiddenFeature = function(entity, resolver, geometry) {
70120                 if (!_hidden.length) return false;
70121                 if (!entity.version) return false;
70122                 if (_forceVisible[entity.id]) return false;
70123
70124                 var matches = Object.keys(features.getMatches(entity, resolver, geometry));
70125                 return matches.length && matches.every(function(k) { return features.hidden(k); });
70126             };
70127
70128
70129             features.isHiddenChild = function(entity, resolver, geometry) {
70130                 if (!_hidden.length) return false;
70131                 if (!entity.version || geometry === 'point') return false;
70132                 if (_forceVisible[entity.id]) return false;
70133
70134                 var parents = features.getParents(entity, resolver, geometry);
70135                 if (!parents.length) return false;
70136
70137                 for (var i = 0; i < parents.length; i++) {
70138                     if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
70139                         return false;
70140                     }
70141                 }
70142                 return true;
70143             };
70144
70145
70146             features.hasHiddenConnections = function(entity, resolver) {
70147                 if (!_hidden.length) return false;
70148
70149                 var childNodes, connections;
70150                 if (entity.type === 'midpoint') {
70151                     childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
70152                     connections = [];
70153                 } else {
70154                     childNodes = entity.nodes ? resolver.childNodes(entity) : [];
70155                     connections = features.getParents(entity, resolver, entity.geometry(resolver));
70156                 }
70157
70158                 // gather ways connected to child nodes..
70159                 connections = childNodes.reduce(function(result, e) {
70160                     return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
70161                 }, connections);
70162
70163                 return connections.some(function(e) {
70164                     return features.isHidden(e, resolver, e.geometry(resolver));
70165                 });
70166             };
70167
70168
70169             features.isHidden = function(entity, resolver, geometry) {
70170                 if (!_hidden.length) return false;
70171                 if (!entity.version) return false;
70172
70173                 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
70174                 return fn(entity, resolver, geometry);
70175             };
70176
70177
70178             features.filter = function(d, resolver) {
70179                 if (!_hidden.length) return d;
70180
70181                 var result = [];
70182                 for (var i = 0; i < d.length; i++) {
70183                     var entity = d[i];
70184                     if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
70185                         result.push(entity);
70186                     }
70187                 }
70188                 return result;
70189             };
70190
70191
70192             features.forceVisible = function(entityIDs) {
70193                 if (!arguments.length) return Object.keys(_forceVisible);
70194
70195                 _forceVisible = {};
70196                 for (var i = 0; i < entityIDs.length; i++) {
70197                     _forceVisible[entityIDs[i]] = true;
70198                     var entity = context.hasEntity(entityIDs[i]);
70199                     if (entity && entity.type === 'relation') {
70200                         // also show relation members (one level deep)
70201                         for (var j in entity.members) {
70202                             _forceVisible[entity.members[j].id] = true;
70203                         }
70204                     }
70205                 }
70206                 return features;
70207             };
70208
70209
70210             features.init = function() {
70211                 var storage = context.storage('disabled-features');
70212                 if (storage) {
70213                     var storageDisabled = storage.replace(/;/g, ',').split(',');
70214                     storageDisabled.forEach(features.disable);
70215                 }
70216
70217                 var q = utilStringQs(window.location.hash.substring(1));
70218                 if (q.disable_features) {
70219                     var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
70220                     hashDisabled.forEach(features.disable);
70221                 }
70222             };
70223
70224
70225             // warm up the feature matching cache upon merging fetched data
70226             context.history().on('merge.features', function(newEntities) {
70227                 if (!newEntities) return;
70228                 var handle = window.requestIdleCallback(function() {
70229                     var graph = context.graph();
70230                     var types = utilArrayGroupBy(newEntities, 'type');
70231                     // ensure that getMatches is called on relations before ways
70232                     var entities = [].concat(types.relation || [], types.way || [], types.node || []);
70233                     for (var i = 0; i < entities.length; i++) {
70234                         var geometry = entities[i].geometry(graph);
70235                         features.getMatches(entities[i], graph, geometry);
70236                     }
70237                 });
70238                 _deferred.add(handle);
70239             });
70240
70241
70242             return features;
70243         }
70244
70245         // Touch targets control which other vertices we can drag a vertex onto.
70246         //
70247         // - the activeID - nope
70248         // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
70249         // - 2 away from the activeID - nope (would create a self intersecting segment)
70250         // - all others on a linear way - yes
70251         // - all others on a closed way - nope (would create a self intersecting polygon)
70252         //
70253         // returns
70254         // 0 = active vertex - no touch/connect
70255         // 1 = passive vertex - yes touch/connect
70256         // 2 = adjacent vertex - yes but pay attention segmenting a line here
70257         //
70258         function svgPassiveVertex(node, graph, activeID) {
70259             if (!activeID) return 1;
70260             if (activeID === node.id) return 0;
70261
70262             var parents = graph.parentWays(node);
70263
70264             for (var i = 0; i < parents.length; i++) {
70265                 var nodes = parents[i].nodes;
70266                 var isClosed = parents[i].isClosed();
70267                 for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
70268                     if (nodes[j] === node.id) {
70269                         var ix1 = j - 2;
70270                         var ix2 = j - 1;
70271                         var ix3 = j + 1;
70272                         var ix4 = j + 2;
70273
70274                         if (isClosed) {  // wraparound if needed
70275                             var max = nodes.length - 1;
70276                             if (ix1 < 0)   ix1 = max + ix1;
70277                             if (ix2 < 0)   ix2 = max + ix2;
70278                             if (ix3 > max) ix3 = ix3 - max;
70279                             if (ix4 > max) ix4 = ix4 - max;
70280                         }
70281
70282                         if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
70283                         else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
70284                         else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
70285                         else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
70286                         else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
70287                     }
70288                 }
70289             }
70290
70291             return 1;   // ok
70292         }
70293
70294
70295         function svgMarkerSegments(projection, graph, dt,
70296                                           shouldReverse,
70297                                           bothDirections) {
70298             return function(entity) {
70299                 var i = 0;
70300                 var offset = dt;
70301                 var segments = [];
70302                 var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
70303                 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
70304                 var a, b;
70305
70306                 if (shouldReverse(entity)) {
70307                     coordinates.reverse();
70308                 }
70309
70310                 d3_geoStream({
70311                     type: 'LineString',
70312                     coordinates: coordinates
70313                 }, projection.stream(clip({
70314                     lineStart: function() {},
70315                     lineEnd: function() { a = null; },
70316                     point: function(x, y) {
70317                         b = [x, y];
70318
70319                         if (a) {
70320                             var span = geoVecLength(a, b) - offset;
70321
70322                             if (span >= 0) {
70323                                 var heading = geoVecAngle(a, b);
70324                                 var dx = dt * Math.cos(heading);
70325                                 var dy = dt * Math.sin(heading);
70326                                 var p = [
70327                                     a[0] + offset * Math.cos(heading),
70328                                     a[1] + offset * Math.sin(heading)
70329                                 ];
70330
70331                                 // gather coordinates
70332                                 var coord = [a, p];
70333                                 for (span -= dt; span >= 0; span -= dt) {
70334                                     p = geoVecAdd(p, [dx, dy]);
70335                                     coord.push(p);
70336                                 }
70337                                 coord.push(b);
70338
70339                                 // generate svg paths
70340                                 var segment = '';
70341                                 var j;
70342
70343                                 for (j = 0; j < coord.length; j++) {
70344                                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70345                                 }
70346                                 segments.push({ id: entity.id, index: i++, d: segment });
70347
70348                                 if (bothDirections(entity)) {
70349                                     segment = '';
70350                                     for (j = coord.length - 1; j >= 0; j--) {
70351                                         segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70352                                     }
70353                                     segments.push({ id: entity.id, index: i++, d: segment });
70354                                 }
70355                             }
70356
70357                             offset = -span;
70358                         }
70359
70360                         a = b;
70361                     }
70362                 })));
70363
70364                 return segments;
70365             };
70366         }
70367
70368
70369         function svgPath(projection, graph, isArea) {
70370
70371             // Explanation of magic numbers:
70372             // "padding" here allows space for strokes to extend beyond the viewport,
70373             // so that the stroke isn't drawn along the edge of the viewport when
70374             // the shape is clipped.
70375             //
70376             // When drawing lines, pad viewport by 5px.
70377             // When drawing areas, pad viewport by 65px in each direction to allow
70378             // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
70379
70380             var cache = {};
70381             var padding = isArea ? 65 : 5;
70382             var viewport = projection.clipExtent();
70383             var paddedExtent = [
70384                 [viewport[0][0] - padding, viewport[0][1] - padding],
70385                 [viewport[1][0] + padding, viewport[1][1] + padding]
70386             ];
70387             var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
70388             var project = projection.stream;
70389             var path = d3_geoPath()
70390                 .projection({stream: function(output) { return project(clip(output)); }});
70391
70392             var svgpath = function(entity) {
70393                 if (entity.id in cache) {
70394                     return cache[entity.id];
70395                 } else {
70396                     return cache[entity.id] = path(entity.asGeoJSON(graph));
70397                 }
70398             };
70399
70400             svgpath.geojson = function(d) {
70401                 if (d.__featurehash__ !== undefined) {
70402                     if (d.__featurehash__ in cache) {
70403                         return cache[d.__featurehash__];
70404                     } else {
70405                         return cache[d.__featurehash__] = path(d);
70406                     }
70407                 } else {
70408                     return path(d);
70409                 }
70410             };
70411
70412             return svgpath;
70413         }
70414
70415
70416         function svgPointTransform(projection) {
70417             var svgpoint = function(entity) {
70418                 // http://jsperf.com/short-array-join
70419                 var pt = projection(entity.loc);
70420                 return 'translate(' + pt[0] + ',' + pt[1] + ')';
70421             };
70422
70423             svgpoint.geojson = function(d) {
70424                 return svgpoint(d.properties.entity);
70425             };
70426
70427             return svgpoint;
70428         }
70429
70430
70431         function svgRelationMemberTags(graph) {
70432             return function(entity) {
70433                 var tags = entity.tags;
70434                 var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
70435                 graph.parentRelations(entity).forEach(function(relation) {
70436                     var type = relation.tags.type;
70437                     if ((type === 'multipolygon' && shouldCopyMultipolygonTags) || type === 'boundary') {
70438                         tags = Object.assign({}, relation.tags, tags);
70439                     }
70440                 });
70441                 return tags;
70442             };
70443         }
70444
70445
70446         function svgSegmentWay(way, graph, activeID) {
70447             // When there is no activeID, we can memoize this expensive computation
70448             if (activeID === undefined) {
70449                 return graph.transient(way, 'waySegments', getWaySegments);
70450             } else {
70451                 return getWaySegments();
70452             }
70453
70454             function getWaySegments() {
70455                 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
70456                 var features = { passive: [], active: [] };
70457                 var start = {};
70458                 var end = {};
70459                 var node, type;
70460
70461                 for (var i = 0; i < way.nodes.length; i++) {
70462                     node = graph.entity(way.nodes[i]);
70463                     type = svgPassiveVertex(node, graph, activeID);
70464                     end = { node: node, type: type };
70465
70466                     if (start.type !== undefined) {
70467                         if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
70468                             pushActive(start, end, i);
70469                         } else if (start.type === 0 && end.type === 0) {   // both active vertices
70470                             pushActive(start, end, i);
70471                         } else {
70472                             pushPassive(start, end, i);
70473                         }
70474                     }
70475
70476                     start = end;
70477                 }
70478
70479                 return features;
70480
70481                 function pushActive(start, end, index) {
70482                     features.active.push({
70483                         type: 'Feature',
70484                         id: way.id + '-' + index + '-nope',
70485                         properties: {
70486                             nope: true,
70487                             target: true,
70488                             entity: way,
70489                             nodes: [start.node, end.node],
70490                             index: index
70491                         },
70492                         geometry: {
70493                             type: 'LineString',
70494                             coordinates: [start.node.loc, end.node.loc]
70495                         }
70496                     });
70497                 }
70498
70499                 function pushPassive(start, end, index) {
70500                     features.passive.push({
70501                         type: 'Feature',
70502                         id: way.id + '-' + index,
70503                         properties: {
70504                             target: true,
70505                             entity: way,
70506                             nodes: [start.node, end.node],
70507                             index: index
70508                         },
70509                         geometry: {
70510                             type: 'LineString',
70511                             coordinates: [start.node.loc, end.node.loc]
70512                         }
70513                     });
70514                 }
70515             }
70516         }
70517
70518         function svgTagClasses() {
70519             var primaries = [
70520                 'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
70521                 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
70522                 'leisure', 'military', 'place', 'man_made', 'route', 'attraction',
70523                 'building:part', 'indoor'
70524             ];
70525             var statuses = [
70526                 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
70527                 'razed', 'demolished', 'obliterated', 'intermittent'
70528             ];
70529             var secondaries = [
70530                 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
70531                 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
70532                 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure',
70533                 'man_made', 'indoor'
70534             ];
70535             var _tags = function(entity) { return entity.tags; };
70536
70537
70538             var tagClasses = function(selection) {
70539                 selection.each(function tagClassesEach(entity) {
70540                     var value = this.className;
70541
70542                     if (value.baseVal !== undefined) {
70543                         value = value.baseVal;
70544                     }
70545
70546                     var t = _tags(entity);
70547
70548                     var computed = tagClasses.getClassesString(t, value, entity);
70549
70550                     if (computed !== value) {
70551                         d3_select(this).attr('class', computed);
70552                     }
70553                 });
70554             };
70555
70556
70557             tagClasses.getClassesString = function(t, value, entity) {
70558                 var primary, status;
70559                 var i, k, v;
70560
70561                 // in some situations we want to render perimeter strokes a certain way
70562                 var overrideGeometry;
70563                 if (/\bstroke\b/.test(value)) {
70564                     if (!!t.barrier && t.barrier !== 'no') {
70565                         overrideGeometry = 'line';
70566                     } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
70567                         overrideGeometry = 'area';
70568                     }
70569                 }
70570
70571                 // preserve base classes (nothing with `tag-`)
70572                 var classes = value.trim().split(/\s+/)
70573                     .filter(function(klass) {
70574                         return klass.length && !/^tag-/.test(klass);
70575                     })
70576                     .map(function(klass) {  // special overrides for some perimeter strokes
70577                         return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
70578                     });
70579
70580                 // pick at most one primary classification tag..
70581                 for (i = 0; i < primaries.length; i++) {
70582                     k = primaries[i];
70583                     v = t[k];
70584                     if (!v || v === 'no') continue;
70585
70586                     if (k === 'piste:type') {  // avoid a ':' in the class name
70587                         k = 'piste';
70588                     } else if (k === 'building:part') {  // avoid a ':' in the class name
70589                         k = 'building_part';
70590                     }
70591
70592                     primary = k;
70593                     if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
70594                         status = v;
70595                         classes.push('tag-' + k);
70596                     } else {
70597                         classes.push('tag-' + k);
70598                         classes.push('tag-' + k + '-' + v);
70599                     }
70600
70601                     break;
70602                 }
70603
70604                 // add at most one status tag, only if relates to primary tag..
70605                 if (!status) {
70606                     for (i = 0; i < statuses.length; i++) {
70607                         k = statuses[i];
70608                         v = t[k];
70609                         if (!v || v === 'no') continue;
70610
70611                         if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
70612                             status = k;
70613                         }
70614                         else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
70615                             status = k;
70616                         } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
70617                             status = k;
70618                             primary = v;
70619                             classes.push('tag-' + v);
70620                         }  // else ignore e.g.  `highway=path + abandoned=railway`
70621
70622                         if (status) break;
70623                     }
70624                 }
70625
70626                 if (status) {
70627                     classes.push('tag-status');
70628                     classes.push('tag-status-' + status);
70629                 }
70630
70631                 // add any secondary tags
70632                 for (i = 0; i < secondaries.length; i++) {
70633                     k = secondaries[i];
70634                     v = t[k];
70635                     if (!v || v === 'no' || k === primary) continue;
70636                     classes.push('tag-' + k);
70637                     classes.push('tag-' + k + '-' + v);
70638                 }
70639
70640                 // For highways, look for surface tagging..
70641                 if (primary === 'highway' || primary === 'aeroway') {
70642                     var paved = (t.highway !== 'track');
70643                     for (k in t) {
70644                         v = t[k];
70645                         if (k in osmPavedTags) {
70646                             paved = !!osmPavedTags[k][v];
70647                             break;
70648                         }
70649                     }
70650                     if (!paved) {
70651                         classes.push('tag-unpaved');
70652                     }
70653                 }
70654
70655                 // If this is a wikidata-tagged item, add a class for that..
70656                 if (t.wikidata || t['brand:wikidata']) {
70657                     classes.push('tag-wikidata');
70658                 }
70659
70660                 return classes.join(' ').trim();
70661             };
70662
70663
70664             tagClasses.tags = function(val) {
70665                 if (!arguments.length) return _tags;
70666                 _tags = val;
70667                 return tagClasses;
70668             };
70669
70670             return tagClasses;
70671         }
70672
70673         function svgAreas(projection, context) {
70674             // Patterns only work in Firefox when set directly on element.
70675             // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
70676             var patterns = {
70677                 // tag - pattern name
70678                 // -or-
70679                 // tag - value - pattern name
70680                 // -or-
70681                 // tag - value - rules (optional tag-values, pattern name)
70682                 // (matches earlier rules first, so fallback should be last entry)
70683                 amenity: {
70684                     grave_yard: 'cemetery',
70685                     fountain: 'water_standing'
70686                 },
70687                 landuse: {
70688                     cemetery: [
70689                         { religion: 'christian', pattern: 'cemetery_christian' },
70690                         { religion: 'buddhist', pattern: 'cemetery_buddhist' },
70691                         { religion: 'muslim', pattern: 'cemetery_muslim' },
70692                         { religion: 'jewish', pattern: 'cemetery_jewish' },
70693                         { pattern: 'cemetery' }
70694                     ],
70695                     construction: 'construction',
70696                     farmland: 'farmland',
70697                     farmyard: 'farmyard',
70698                     forest: [
70699                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70700                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70701                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70702                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70703                     ],
70704                     grave_yard: 'cemetery',
70705                     grass: 'grass',
70706                     landfill: 'landfill',
70707                     meadow: 'meadow',
70708                     military: 'construction',
70709                     orchard: 'orchard',
70710                     quarry: 'quarry',
70711                     vineyard: 'vineyard'
70712                 },
70713                 natural: {
70714                     beach: 'beach',
70715                     grassland: 'grass',
70716                     sand: 'beach',
70717                     scrub: 'scrub',
70718                     water: [
70719                         { water: 'pond', pattern: 'pond' },
70720                         { water: 'reservoir', pattern: 'water_standing' },
70721                         { pattern: 'waves' }
70722                     ],
70723                     wetland: [
70724                         { wetland: 'marsh', pattern: 'wetland_marsh' },
70725                         { wetland: 'swamp', pattern: 'wetland_swamp' },
70726                         { wetland: 'bog', pattern: 'wetland_bog' },
70727                         { wetland: 'reedbed', pattern: 'wetland_reedbed' },
70728                         { pattern: 'wetland' }
70729                     ],
70730                     wood: [
70731                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70732                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70733                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70734                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70735                     ]
70736                 },
70737                 traffic_calming: {
70738                     island: [
70739                         { surface: 'grass', pattern: 'grass' },
70740                     ],
70741                     chicane: [
70742                         { surface: 'grass', pattern: 'grass' },
70743                     ],
70744                     choker: [
70745                         { surface: 'grass', pattern: 'grass' },
70746                     ]
70747                 }
70748             };
70749
70750             function setPattern(entity) {
70751                 // Skip pattern filling if this is a building (buildings don't get patterns applied)
70752                 if (entity.tags.building && entity.tags.building !== 'no') {
70753                     this.style.fill = this.style.stroke = '';
70754                     return;
70755                 }
70756
70757                 for (var tag in patterns) {
70758                     var entityValue = entity.tags[tag];
70759                     if (!entityValue) continue;
70760
70761                     if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
70762                         this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
70763                         return;
70764                     } else {
70765                         var values = patterns[tag];
70766                         for (var value in values) {
70767                             if (entityValue !== value) continue;
70768
70769                             var rules = values[value];
70770                             if (typeof rules === 'string') { // short syntax - pattern name
70771                                 this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
70772                                 return;
70773                             } else { // long syntax - rule array
70774                                 for (var ruleKey in rules) {
70775                                     var rule = rules[ruleKey];
70776
70777                                     var pass = true;
70778                                     for (var criterion in rule) {
70779                                         if (criterion !== 'pattern') { // reserved for pattern name
70780                                             // The only rule is a required tag-value pair
70781                                             var v = entity.tags[criterion];
70782                                             if (!v || v !== rule[criterion]) {
70783                                                 pass = false;
70784                                                 break;
70785                                             }
70786                                         }
70787                                     }
70788
70789                                     if (pass) {
70790                                         this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
70791                                         return;
70792                                     }
70793                                 }
70794                             }
70795                         }
70796                     }
70797                 }
70798
70799                 this.style.fill = this.style.stroke = '';
70800             }
70801
70802
70803             function drawTargets(selection, graph, entities, filter) {
70804                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70805                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
70806                 var getPath = svgPath(projection).geojson;
70807                 var activeID = context.activeID();
70808
70809                 // The targets and nopes will be MultiLineString sub-segments of the ways
70810                 var data = { targets: [], nopes: [] };
70811
70812                 entities.forEach(function(way) {
70813                     var features = svgSegmentWay(way, graph, activeID);
70814                     data.targets.push.apply(data.targets, features.passive);
70815                     data.nopes.push.apply(data.nopes, features.active);
70816                 });
70817
70818
70819                 // Targets allow hover and vertex snapping
70820                 var targetData = data.targets.filter(getPath);
70821                 var targets = selection.selectAll('.area.target-allowed')
70822                     .filter(function(d) { return filter(d.properties.entity); })
70823                     .data(targetData, function key(d) { return d.id; });
70824
70825                 // exit
70826                 targets.exit()
70827                     .remove();
70828
70829                 // enter/update
70830                 targets.enter()
70831                     .append('path')
70832                     .merge(targets)
70833                     .attr('d', getPath)
70834                     .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
70835
70836
70837                 // NOPE
70838                 var nopeData = data.nopes.filter(getPath);
70839                 var nopes = selection.selectAll('.area.target-nope')
70840                     .filter(function(d) { return filter(d.properties.entity); })
70841                     .data(nopeData, function key(d) { return d.id; });
70842
70843                 // exit
70844                 nopes.exit()
70845                     .remove();
70846
70847                 // enter/update
70848                 nopes.enter()
70849                     .append('path')
70850                     .merge(nopes)
70851                     .attr('d', getPath)
70852                     .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
70853             }
70854
70855
70856             function drawAreas(selection, graph, entities, filter) {
70857                 var path = svgPath(projection, graph, true);
70858                 var areas = {};
70859                 var multipolygon;
70860
70861                 for (var i = 0; i < entities.length; i++) {
70862                     var entity = entities[i];
70863                     if (entity.geometry(graph) !== 'area') continue;
70864
70865                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
70866                     if (multipolygon) {
70867                         areas[multipolygon.id] = {
70868                             entity: multipolygon.mergeTags(entity.tags),
70869                             area: Math.abs(entity.area(graph))
70870                         };
70871                     } else if (!areas[entity.id]) {
70872                         areas[entity.id] = {
70873                             entity: entity,
70874                             area: Math.abs(entity.area(graph))
70875                         };
70876                     }
70877                 }
70878
70879                 var fills = Object.values(areas).filter(function hasPath(a) { return path(a.entity); });
70880                 fills.sort(function areaSort(a, b) { return b.area - a.area; });
70881                 fills = fills.map(function(a) { return a.entity; });
70882
70883                 var strokes = fills.filter(function(area) { return area.type === 'way'; });
70884
70885                 var data = {
70886                     clip: fills,
70887                     shadow: strokes,
70888                     stroke: strokes,
70889                     fill: fills
70890                 };
70891
70892                 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
70893                    .filter(filter)
70894                    .data(data.clip, osmEntity.key);
70895
70896                 clipPaths.exit()
70897                    .remove();
70898
70899                 var clipPathsEnter = clipPaths.enter()
70900                    .append('clipPath')
70901                    .attr('class', 'clipPath-osm')
70902                    .attr('id', function(entity) { return entity.id + '-clippath'; });
70903
70904                 clipPathsEnter
70905                    .append('path');
70906
70907                 clipPaths.merge(clipPathsEnter)
70908                    .selectAll('path')
70909                    .attr('d', path);
70910
70911
70912                 var drawLayer = selection.selectAll('.layer-osm.areas');
70913                 var touchLayer = selection.selectAll('.layer-touch.areas');
70914
70915                 // Draw areas..
70916                 var areagroup = drawLayer
70917                     .selectAll('g.areagroup')
70918                     .data(['fill', 'shadow', 'stroke']);
70919
70920                 areagroup = areagroup.enter()
70921                     .append('g')
70922                     .attr('class', function(d) { return 'areagroup area-' + d; })
70923                     .merge(areagroup);
70924
70925                 var paths = areagroup
70926                     .selectAll('path')
70927                     .filter(filter)
70928                     .data(function(layer) { return data[layer]; }, osmEntity.key);
70929
70930                 paths.exit()
70931                     .remove();
70932
70933
70934                 var fillpaths = selection.selectAll('.area-fill path.area').nodes();
70935                 var bisect = d3_bisector(function(node) { return -node.__data__.area(graph); }).left;
70936
70937                 function sortedByArea(entity) {
70938                     if (this._parent.__data__ === 'fill') {
70939                         return fillpaths[bisect(fillpaths, -entity.area(graph))];
70940                     }
70941                 }
70942
70943                 paths = paths.enter()
70944                     .insert('path', sortedByArea)
70945                     .merge(paths)
70946                     .each(function(entity) {
70947                         var layer = this.parentNode.__data__;
70948                         this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
70949
70950                         if (layer === 'fill') {
70951                             this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
70952                             setPattern.call(this, entity);
70953                         }
70954                     })
70955                     .call(svgTagClasses())
70956                     .attr('d', path);
70957
70958
70959                 // Draw touch targets..
70960                 touchLayer
70961                     .call(drawTargets, graph, data.stroke, filter);
70962             }
70963
70964             return drawAreas;
70965         }
70966
70967         //[4]           NameStartChar      ::=          ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
70968         //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
70969         //[5]           Name       ::=          NameStartChar (NameChar)*
70970         var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
70971         var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
70972         var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
70973         //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
70974         //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
70975
70976         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70977         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70978         var S_TAG = 0;//tag name offerring
70979         var S_ATTR = 1;//attr name offerring 
70980         var S_ATTR_SPACE=2;//attr name end and space offer
70981         var S_EQ = 3;//=space?
70982         var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
70983         var S_ATTR_END = 5;//attr value end and no space(quot end)
70984         var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
70985         var S_TAG_CLOSE = 7;//closed el<el />
70986
70987         function XMLReader(){
70988                 
70989         }
70990
70991         XMLReader.prototype = {
70992                 parse:function(source,defaultNSMap,entityMap){
70993                         var domBuilder = this.domBuilder;
70994                         domBuilder.startDocument();
70995                         _copy(defaultNSMap ,defaultNSMap = {});
70996                         parse(source,defaultNSMap,entityMap,
70997                                         domBuilder,this.errorHandler);
70998                         domBuilder.endDocument();
70999                 }
71000         };
71001         function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
71002                 function fixedFromCharCode(code) {
71003                         // String.prototype.fromCharCode does not supports
71004                         // > 2 bytes unicode chars directly
71005                         if (code > 0xffff) {
71006                                 code -= 0x10000;
71007                                 var surrogate1 = 0xd800 + (code >> 10)
71008                                         , surrogate2 = 0xdc00 + (code & 0x3ff);
71009
71010                                 return String.fromCharCode(surrogate1, surrogate2);
71011                         } else {
71012                                 return String.fromCharCode(code);
71013                         }
71014                 }
71015                 function entityReplacer(a){
71016                         var k = a.slice(1,-1);
71017                         if(k in entityMap){
71018                                 return entityMap[k]; 
71019                         }else if(k.charAt(0) === '#'){
71020                                 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
71021                         }else{
71022                                 errorHandler.error('entity not found:'+a);
71023                                 return a;
71024                         }
71025                 }
71026                 function appendText(end){//has some bugs
71027                         if(end>start){
71028                                 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
71029                                 locator&&position(start);
71030                                 domBuilder.characters(xt,0,end-start);
71031                                 start = end;
71032                         }
71033                 }
71034                 function position(p,m){
71035                         while(p>=lineEnd && (m = linePattern.exec(source))){
71036                                 lineStart = m.index;
71037                                 lineEnd = lineStart + m[0].length;
71038                                 locator.lineNumber++;
71039                                 //console.log('line++:',locator,startPos,endPos)
71040                         }
71041                         locator.columnNumber = p-lineStart+1;
71042                 }
71043                 var lineStart = 0;
71044                 var lineEnd = 0;
71045                 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
71046                 var locator = domBuilder.locator;
71047                 
71048                 var parseStack = [{currentNSMap:defaultNSMapCopy}];
71049                 var closeMap = {};
71050                 var start = 0;
71051                 while(true){
71052                         try{
71053                                 var tagStart = source.indexOf('<',start);
71054                                 if(tagStart<0){
71055                                         if(!source.substr(start).match(/^\s*$/)){
71056                                                 var doc = domBuilder.doc;
71057                                         var text = doc.createTextNode(source.substr(start));
71058                                         doc.appendChild(text);
71059                                         domBuilder.currentElement = text;
71060                                         }
71061                                         return;
71062                                 }
71063                                 if(tagStart>start){
71064                                         appendText(tagStart);
71065                                 }
71066                                 switch(source.charAt(tagStart+1)){
71067                                 case '/':
71068                                         var end = source.indexOf('>',tagStart+3);
71069                                         var tagName = source.substring(tagStart+2,end);
71070                                         var config = parseStack.pop();
71071                                         if(end<0){
71072                                                 
71073                                         tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
71074                                         //console.error('#@@@@@@'+tagName)
71075                                         errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
71076                                         end = tagStart+1+tagName.length;
71077                                 }else if(tagName.match(/\s</)){
71078                                         tagName = tagName.replace(/[\s<].*/,'');
71079                                         errorHandler.error("end tag name: "+tagName+' maybe not complete');
71080                                         end = tagStart+1+tagName.length;
71081                                         }
71082                                         //console.error(parseStack.length,parseStack)
71083                                         //console.error(config);
71084                                         var localNSMap = config.localNSMap;
71085                                         var endMatch = config.tagName == tagName;
71086                                         var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
71087                                 if(endIgnoreCaseMach){
71088                                         domBuilder.endElement(config.uri,config.localName,tagName);
71089                                                 if(localNSMap){
71090                                                         for(var prefix in localNSMap){
71091                                                                 domBuilder.endPrefixMapping(prefix) ;
71092                                                         }
71093                                                 }
71094                                                 if(!endMatch){
71095                                         errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
71096                                                 }
71097                                 }else{
71098                                         parseStack.push(config);
71099                                 }
71100                                         
71101                                         end++;
71102                                         break;
71103                                         // end elment
71104                                 case '?':// <?...?>
71105                                         locator&&position(tagStart);
71106                                         end = parseInstruction(source,tagStart,domBuilder);
71107                                         break;
71108                                 case '!':// <!doctype,<![CDATA,<!--
71109                                         locator&&position(tagStart);
71110                                         end = parseDCC(source,tagStart,domBuilder,errorHandler);
71111                                         break;
71112                                 default:
71113                                         locator&&position(tagStart);
71114                                         var el = new ElementAttributes();
71115                                         var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
71116                                         //elStartEnd
71117                                         var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
71118                                         var len = el.length;
71119                                         
71120                                         
71121                                         if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
71122                                                 el.closed = true;
71123                                                 if(!entityMap.nbsp){
71124                                                         errorHandler.warning('unclosed xml attribute');
71125                                                 }
71126                                         }
71127                                         if(locator && len){
71128                                                 var locator2 = copyLocator(locator,{});
71129                                                 //try{//attribute position fixed
71130                                                 for(var i = 0;i<len;i++){
71131                                                         var a = el[i];
71132                                                         position(a.offset);
71133                                                         a.locator = copyLocator(locator,{});
71134                                                 }
71135                                                 //}catch(e){console.error('@@@@@'+e)}
71136                                                 domBuilder.locator = locator2;
71137                                                 if(appendElement(el,domBuilder,currentNSMap)){
71138                                                         parseStack.push(el);
71139                                                 }
71140                                                 domBuilder.locator = locator;
71141                                         }else{
71142                                                 if(appendElement(el,domBuilder,currentNSMap)){
71143                                                         parseStack.push(el);
71144                                                 }
71145                                         }
71146                                         
71147                                         
71148                                         
71149                                         if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
71150                                                 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
71151                                         }else{
71152                                                 end++;
71153                                         }
71154                                 }
71155                         }catch(e){
71156                                 errorHandler.error('element parse error: '+e);
71157                                 //errorHandler.error('element parse error: '+e);
71158                                 end = -1;
71159                                 //throw e;
71160                         }
71161                         if(end>start){
71162                                 start = end;
71163                         }else{
71164                                 //TODO: 这里有可能sax回退,有位置错误风险
71165                                 appendText(Math.max(tagStart,start)+1);
71166                         }
71167                 }
71168         }
71169         function copyLocator(f,t){
71170                 t.lineNumber = f.lineNumber;
71171                 t.columnNumber = f.columnNumber;
71172                 return t;
71173         }
71174
71175         /**
71176          * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
71177          * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
71178          */
71179         function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
71180                 var attrName;
71181                 var value;
71182                 var p = ++start;
71183                 var s = S_TAG;//status
71184                 while(true){
71185                         var c = source.charAt(p);
71186                         switch(c){
71187                         case '=':
71188                                 if(s === S_ATTR){//attrName
71189                                         attrName = source.slice(start,p);
71190                                         s = S_EQ;
71191                                 }else if(s === S_ATTR_SPACE){
71192                                         s = S_EQ;
71193                                 }else{
71194                                         //fatalError: equal must after attrName or space after attrName
71195                                         throw new Error('attribute equal must after attrName');
71196                                 }
71197                                 break;
71198                         case '\'':
71199                         case '"':
71200                                 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
71201                                         ){//equal
71202                                         if(s === S_ATTR){
71203                                                 errorHandler.warning('attribute value must after "="');
71204                                                 attrName = source.slice(start,p);
71205                                         }
71206                                         start = p+1;
71207                                         p = source.indexOf(c,start);
71208                                         if(p>0){
71209                                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71210                                                 el.add(attrName,value,start-1);
71211                                                 s = S_ATTR_END;
71212                                         }else{
71213                                                 //fatalError: no end quot match
71214                                                 throw new Error('attribute value no end \''+c+'\' match');
71215                                         }
71216                                 }else if(s == S_ATTR_NOQUOT_VALUE){
71217                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71218                                         //console.log(attrName,value,start,p)
71219                                         el.add(attrName,value,start);
71220                                         //console.dir(el)
71221                                         errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
71222                                         start = p+1;
71223                                         s = S_ATTR_END;
71224                                 }else{
71225                                         //fatalError: no equal before
71226                                         throw new Error('attribute value must after "="');
71227                                 }
71228                                 break;
71229                         case '/':
71230                                 switch(s){
71231                                 case S_TAG:
71232                                         el.setTagName(source.slice(start,p));
71233                                 case S_ATTR_END:
71234                                 case S_TAG_SPACE:
71235                                 case S_TAG_CLOSE:
71236                                         s =S_TAG_CLOSE;
71237                                         el.closed = true;
71238                                 case S_ATTR_NOQUOT_VALUE:
71239                                 case S_ATTR:
71240                                 case S_ATTR_SPACE:
71241                                         break;
71242                                 //case S_EQ:
71243                                 default:
71244                                         throw new Error("attribute invalid close char('/')")
71245                                 }
71246                                 break;
71247                         case ''://end document
71248                                 //throw new Error('unexpected end of input')
71249                                 errorHandler.error('unexpected end of input');
71250                                 if(s == S_TAG){
71251                                         el.setTagName(source.slice(start,p));
71252                                 }
71253                                 return p;
71254                         case '>':
71255                                 switch(s){
71256                                 case S_TAG:
71257                                         el.setTagName(source.slice(start,p));
71258                                 case S_ATTR_END:
71259                                 case S_TAG_SPACE:
71260                                 case S_TAG_CLOSE:
71261                                         break;//normal
71262                                 case S_ATTR_NOQUOT_VALUE://Compatible state
71263                                 case S_ATTR:
71264                                         value = source.slice(start,p);
71265                                         if(value.slice(-1) === '/'){
71266                                                 el.closed  = true;
71267                                                 value = value.slice(0,-1);
71268                                         }
71269                                 case S_ATTR_SPACE:
71270                                         if(s === S_ATTR_SPACE){
71271                                                 value = attrName;
71272                                         }
71273                                         if(s == S_ATTR_NOQUOT_VALUE){
71274                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71275                                                 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
71276                                         }else{
71277                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
71278                                                         errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
71279                                                 }
71280                                                 el.add(value,value,start);
71281                                         }
71282                                         break;
71283                                 case S_EQ:
71284                                         throw new Error('attribute value missed!!');
71285                                 }
71286         //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
71287                                 return p;
71288                         /*xml space '\x20' | #x9 | #xD | #xA; */
71289                         case '\u0080':
71290                                 c = ' ';
71291                         default:
71292                                 if(c<= ' '){//space
71293                                         switch(s){
71294                                         case S_TAG:
71295                                                 el.setTagName(source.slice(start,p));//tagName
71296                                                 s = S_TAG_SPACE;
71297                                                 break;
71298                                         case S_ATTR:
71299                                                 attrName = source.slice(start,p);
71300                                                 s = S_ATTR_SPACE;
71301                                                 break;
71302                                         case S_ATTR_NOQUOT_VALUE:
71303                                                 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
71304                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
71305                                                 el.add(attrName,value,start);
71306                                         case S_ATTR_END:
71307                                                 s = S_TAG_SPACE;
71308                                                 break;
71309                                         //case S_TAG_SPACE:
71310                                         //case S_EQ:
71311                                         //case S_ATTR_SPACE:
71312                                         //      void();break;
71313                                         //case S_TAG_CLOSE:
71314                                                 //ignore warning
71315                                         }
71316                                 }else{//not space
71317         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
71318         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
71319                                         switch(s){
71320                                         //case S_TAG:void();break;
71321                                         //case S_ATTR:void();break;
71322                                         //case S_ATTR_NOQUOT_VALUE:void();break;
71323                                         case S_ATTR_SPACE:
71324                                                 var tagName =  el.tagName;
71325                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
71326                                                         errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
71327                                                 }
71328                                                 el.add(attrName,attrName,start);
71329                                                 start = p;
71330                                                 s = S_ATTR;
71331                                                 break;
71332                                         case S_ATTR_END:
71333                                                 errorHandler.warning('attribute space is required"'+attrName+'"!!');
71334                                         case S_TAG_SPACE:
71335                                                 s = S_ATTR;
71336                                                 start = p;
71337                                                 break;
71338                                         case S_EQ:
71339                                                 s = S_ATTR_NOQUOT_VALUE;
71340                                                 start = p;
71341                                                 break;
71342                                         case S_TAG_CLOSE:
71343                                                 throw new Error("elements closed character '/' and '>' must be connected to");
71344                                         }
71345                                 }
71346                         }//end outer switch
71347                         //console.log('p++',p)
71348                         p++;
71349                 }
71350         }
71351         /**
71352          * @return true if has new namespace define
71353          */
71354         function appendElement(el,domBuilder,currentNSMap){
71355                 var tagName = el.tagName;
71356                 var localNSMap = null;
71357                 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
71358                 var i = el.length;
71359                 while(i--){
71360                         var a = el[i];
71361                         var qName = a.qName;
71362                         var value = a.value;
71363                         var nsp = qName.indexOf(':');
71364                         if(nsp>0){
71365                                 var prefix = a.prefix = qName.slice(0,nsp);
71366                                 var localName = qName.slice(nsp+1);
71367                                 var nsPrefix = prefix === 'xmlns' && localName;
71368                         }else{
71369                                 localName = qName;
71370                                 prefix = null;
71371                                 nsPrefix = qName === 'xmlns' && '';
71372                         }
71373                         //can not set prefix,because prefix !== ''
71374                         a.localName = localName ;
71375                         //prefix == null for no ns prefix attribute 
71376                         if(nsPrefix !== false){//hack!!
71377                                 if(localNSMap == null){
71378                                         localNSMap = {};
71379                                         //console.log(currentNSMap,0)
71380                                         _copy(currentNSMap,currentNSMap={});
71381                                         //console.log(currentNSMap,1)
71382                                 }
71383                                 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
71384                                 a.uri = 'http://www.w3.org/2000/xmlns/';
71385                                 domBuilder.startPrefixMapping(nsPrefix, value); 
71386                         }
71387                 }
71388                 var i = el.length;
71389                 while(i--){
71390                         a = el[i];
71391                         var prefix = a.prefix;
71392                         if(prefix){//no prefix attribute has no namespace
71393                                 if(prefix === 'xml'){
71394                                         a.uri = 'http://www.w3.org/XML/1998/namespace';
71395                                 }if(prefix !== 'xmlns'){
71396                                         a.uri = currentNSMap[prefix || ''];
71397                                         
71398                                         //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
71399                                 }
71400                         }
71401                 }
71402                 var nsp = tagName.indexOf(':');
71403                 if(nsp>0){
71404                         prefix = el.prefix = tagName.slice(0,nsp);
71405                         localName = el.localName = tagName.slice(nsp+1);
71406                 }else{
71407                         prefix = null;//important!!
71408                         localName = el.localName = tagName;
71409                 }
71410                 //no prefix element has default namespace
71411                 var ns = el.uri = currentNSMap[prefix || ''];
71412                 domBuilder.startElement(ns,localName,tagName,el);
71413                 //endPrefixMapping and startPrefixMapping have not any help for dom builder
71414                 //localNSMap = null
71415                 if(el.closed){
71416                         domBuilder.endElement(ns,localName,tagName);
71417                         if(localNSMap){
71418                                 for(prefix in localNSMap){
71419                                         domBuilder.endPrefixMapping(prefix); 
71420                                 }
71421                         }
71422                 }else{
71423                         el.currentNSMap = currentNSMap;
71424                         el.localNSMap = localNSMap;
71425                         //parseStack.push(el);
71426                         return true;
71427                 }
71428         }
71429         function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
71430                 if(/^(?:script|textarea)$/i.test(tagName)){
71431                         var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
71432                         var text = source.substring(elStartEnd+1,elEndStart);
71433                         if(/[&<]/.test(text)){
71434                                 if(/^script$/i.test(tagName)){
71435                                         //if(!/\]\]>/.test(text)){
71436                                                 //lexHandler.startCDATA();
71437                                                 domBuilder.characters(text,0,text.length);
71438                                                 //lexHandler.endCDATA();
71439                                                 return elEndStart;
71440                                         //}
71441                                 }//}else{//text area
71442                                         text = text.replace(/&#?\w+;/g,entityReplacer);
71443                                         domBuilder.characters(text,0,text.length);
71444                                         return elEndStart;
71445                                 //}
71446                                 
71447                         }
71448                 }
71449                 return elStartEnd+1;
71450         }
71451         function fixSelfClosed(source,elStartEnd,tagName,closeMap){
71452                 //if(tagName in closeMap){
71453                 var pos = closeMap[tagName];
71454                 if(pos == null){
71455                         //console.log(tagName)
71456                         pos =  source.lastIndexOf('</'+tagName+'>');
71457                         if(pos<elStartEnd){//忘记闭合
71458                                 pos = source.lastIndexOf('</'+tagName);
71459                         }
71460                         closeMap[tagName] =pos;
71461                 }
71462                 return pos<elStartEnd;
71463                 //} 
71464         }
71465         function _copy(source,target){
71466                 for(var n in source){target[n] = source[n];}
71467         }
71468         function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
71469                 var next= source.charAt(start+2);
71470                 switch(next){
71471                 case '-':
71472                         if(source.charAt(start + 3) === '-'){
71473                                 var end = source.indexOf('-->',start+4);
71474                                 //append comment source.substring(4,end)//<!--
71475                                 if(end>start){
71476                                         domBuilder.comment(source,start+4,end-start-4);
71477                                         return end+3;
71478                                 }else{
71479                                         errorHandler.error("Unclosed comment");
71480                                         return -1;
71481                                 }
71482                         }else{
71483                                 //error
71484                                 return -1;
71485                         }
71486                 default:
71487                         if(source.substr(start+3,6) == 'CDATA['){
71488                                 var end = source.indexOf(']]>',start+9);
71489                                 domBuilder.startCDATA();
71490                                 domBuilder.characters(source,start+9,end-start-9);
71491                                 domBuilder.endCDATA(); 
71492                                 return end+3;
71493                         }
71494                         //<!DOCTYPE
71495                         //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
71496                         var matchs = split(source,start);
71497                         var len = matchs.length;
71498                         if(len>1 && /!doctype/i.test(matchs[0][0])){
71499                                 var name = matchs[1][0];
71500                                 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
71501                                 var sysid = len>4 && matchs[4][0];
71502                                 var lastMatch = matchs[len-1];
71503                                 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
71504                                                 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
71505                                 domBuilder.endDTD();
71506                                 
71507                                 return lastMatch.index+lastMatch[0].length
71508                         }
71509                 }
71510                 return -1;
71511         }
71512
71513
71514
71515         function parseInstruction(source,start,domBuilder){
71516                 var end = source.indexOf('?>',start);
71517                 if(end){
71518                         var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
71519                         if(match){
71520                                 var len = match[0].length;
71521                                 domBuilder.processingInstruction(match[1], match[2]) ;
71522                                 return end+2;
71523                         }else{//error
71524                                 return -1;
71525                         }
71526                 }
71527                 return -1;
71528         }
71529
71530         /**
71531          * @param source
71532          */
71533         function ElementAttributes(source){
71534                 
71535         }
71536         ElementAttributes.prototype = {
71537                 setTagName:function(tagName){
71538                         if(!tagNamePattern.test(tagName)){
71539                                 throw new Error('invalid tagName:'+tagName)
71540                         }
71541                         this.tagName = tagName;
71542                 },
71543                 add:function(qName,value,offset){
71544                         if(!tagNamePattern.test(qName)){
71545                                 throw new Error('invalid attribute:'+qName)
71546                         }
71547                         this[this.length++] = {qName:qName,value:value,offset:offset};
71548                 },
71549                 length:0,
71550                 getLocalName:function(i){return this[i].localName},
71551                 getLocator:function(i){return this[i].locator},
71552                 getQName:function(i){return this[i].qName},
71553                 getURI:function(i){return this[i].uri},
71554                 getValue:function(i){return this[i].value}
71555         //      ,getIndex:function(uri, localName)){
71556         //              if(localName){
71557         //                      
71558         //              }else{
71559         //                      var qName = uri
71560         //              }
71561         //      },
71562         //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
71563         //      getType:function(uri,localName){}
71564         //      getType:function(i){},
71565         };
71566
71567
71568
71569
71570         function _set_proto_(thiz,parent){
71571                 thiz.__proto__ = parent;
71572                 return thiz;
71573         }
71574         if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
71575                 _set_proto_ = function(thiz,parent){
71576                         function p(){}          p.prototype = parent;
71577                         p = new p();
71578                         for(parent in thiz){
71579                                 p[parent] = thiz[parent];
71580                         }
71581                         return p;
71582                 };
71583         }
71584
71585         function split(source,start){
71586                 var match;
71587                 var buf = [];
71588                 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
71589                 reg.lastIndex = start;
71590                 reg.exec(source);//skip <
71591                 while(match = reg.exec(source)){
71592                         buf.push(match);
71593                         if(match[1])return buf;
71594                 }
71595         }
71596
71597         var XMLReader_1 = XMLReader;
71598
71599         var sax = {
71600                 XMLReader: XMLReader_1
71601         };
71602
71603         /*
71604          * DOM Level 2
71605          * Object DOMException
71606          * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
71607          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
71608          */
71609
71610         function copy$3(src,dest){
71611                 for(var p in src){
71612                         dest[p] = src[p];
71613                 }
71614         }
71615         /**
71616         ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
71617         ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
71618          */
71619         function _extends(Class,Super){
71620                 var pt = Class.prototype;
71621                 if(Object.create){
71622                         var ppt = Object.create(Super.prototype);
71623                         pt.__proto__ = ppt;
71624                 }
71625                 if(!(pt instanceof Super)){
71626                         function t(){}          t.prototype = Super.prototype;
71627                         t = new t();
71628                         copy$3(pt,t);
71629                         Class.prototype = pt = t;
71630                 }
71631                 if(pt.constructor != Class){
71632                         if(typeof Class != 'function'){
71633                                 console.error("unknow Class:"+Class);
71634                         }
71635                         pt.constructor = Class;
71636                 }
71637         }
71638         var htmlns = 'http://www.w3.org/1999/xhtml' ;
71639         // Node Types
71640         var NodeType = {};
71641         var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
71642         var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
71643         var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
71644         var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
71645         var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
71646         var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
71647         var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
71648         var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
71649         var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
71650         var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
71651         var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
71652         var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
71653
71654         // ExceptionCode
71655         var ExceptionCode = {};
71656         var ExceptionMessage = {};
71657         var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
71658         var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
71659         var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
71660         var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
71661         var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
71662         var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
71663         var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
71664         var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
71665         var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
71666         var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
71667         //level2
71668         var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
71669         var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
71670         var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
71671         var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
71672         var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
71673
71674
71675         function DOMException$2(code, message) {
71676                 if(message instanceof Error){
71677                         var error = message;
71678                 }else{
71679                         error = this;
71680                         Error.call(this, ExceptionMessage[code]);
71681                         this.message = ExceptionMessage[code];
71682                         if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
71683                 }
71684                 error.code = code;
71685                 if(message) this.message = this.message + ": " + message;
71686                 return error;
71687         }DOMException$2.prototype = Error.prototype;
71688         copy$3(ExceptionCode,DOMException$2);
71689         /**
71690          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
71691          * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
71692          * The items in the NodeList are accessible via an integral index, starting from 0.
71693          */
71694         function NodeList() {
71695         }NodeList.prototype = {
71696                 /**
71697                  * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
71698                  * @standard level1
71699                  */
71700                 length:0, 
71701                 /**
71702                  * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
71703                  * @standard level1
71704                  * @param index  unsigned long 
71705                  *   Index into the collection.
71706                  * @return Node
71707                  *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
71708                  */
71709                 item: function(index) {
71710                         return this[index] || null;
71711                 },
71712                 toString:function(isHTML,nodeFilter){
71713                         for(var buf = [], i = 0;i<this.length;i++){
71714                                 serializeToString(this[i],buf,isHTML,nodeFilter);
71715                         }
71716                         return buf.join('');
71717                 }
71718         };
71719         function LiveNodeList(node,refresh){
71720                 this._node = node;
71721                 this._refresh = refresh;
71722                 _updateLiveList(this);
71723         }
71724         function _updateLiveList(list){
71725                 var inc = list._node._inc || list._node.ownerDocument._inc;
71726                 if(list._inc != inc){
71727                         var ls = list._refresh(list._node);
71728                         //console.log(ls.length)
71729                         __set__(list,'length',ls.length);
71730                         copy$3(ls,list);
71731                         list._inc = inc;
71732                 }
71733         }
71734         LiveNodeList.prototype.item = function(i){
71735                 _updateLiveList(this);
71736                 return this[i];
71737         };
71738
71739         _extends(LiveNodeList,NodeList);
71740         /**
71741          * 
71742          * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
71743          * NamedNodeMap objects in the DOM are live.
71744          * used for attributes or DocumentType entities 
71745          */
71746         function NamedNodeMap() {
71747         }
71748         function _findNodeIndex(list,node){
71749                 var i = list.length;
71750                 while(i--){
71751                         if(list[i] === node){return i}
71752                 }
71753         }
71754
71755         function _addNamedNode(el,list,newAttr,oldAttr){
71756                 if(oldAttr){
71757                         list[_findNodeIndex(list,oldAttr)] = newAttr;
71758                 }else{
71759                         list[list.length++] = newAttr;
71760                 }
71761                 if(el){
71762                         newAttr.ownerElement = el;
71763                         var doc = el.ownerDocument;
71764                         if(doc){
71765                                 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
71766                                 _onAddAttribute(doc,el,newAttr);
71767                         }
71768                 }
71769         }
71770         function _removeNamedNode(el,list,attr){
71771                 //console.log('remove attr:'+attr)
71772                 var i = _findNodeIndex(list,attr);
71773                 if(i>=0){
71774                         var lastIndex = list.length-1;
71775                         while(i<lastIndex){
71776                                 list[i] = list[++i];
71777                         }
71778                         list.length = lastIndex;
71779                         if(el){
71780                                 var doc = el.ownerDocument;
71781                                 if(doc){
71782                                         _onRemoveAttribute(doc,el,attr);
71783                                         attr.ownerElement = null;
71784                                 }
71785                         }
71786                 }else{
71787                         throw DOMException$2(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
71788                 }
71789         }
71790         NamedNodeMap.prototype = {
71791                 length:0,
71792                 item:NodeList.prototype.item,
71793                 getNamedItem: function(key) {
71794         //              if(key.indexOf(':')>0 || key == 'xmlns'){
71795         //                      return null;
71796         //              }
71797                         //console.log()
71798                         var i = this.length;
71799                         while(i--){
71800                                 var attr = this[i];
71801                                 //console.log(attr.nodeName,key)
71802                                 if(attr.nodeName == key){
71803                                         return attr;
71804                                 }
71805                         }
71806                 },
71807                 setNamedItem: function(attr) {
71808                         var el = attr.ownerElement;
71809                         if(el && el!=this._ownerElement){
71810                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71811                         }
71812                         var oldAttr = this.getNamedItem(attr.nodeName);
71813                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71814                         return oldAttr;
71815                 },
71816                 /* returns Node */
71817                 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
71818                         var el = attr.ownerElement, oldAttr;
71819                         if(el && el!=this._ownerElement){
71820                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71821                         }
71822                         oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
71823                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71824                         return oldAttr;
71825                 },
71826
71827                 /* returns Node */
71828                 removeNamedItem: function(key) {
71829                         var attr = this.getNamedItem(key);
71830                         _removeNamedNode(this._ownerElement,this,attr);
71831                         return attr;
71832                         
71833                         
71834                 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
71835                 
71836                 //for level2
71837                 removeNamedItemNS:function(namespaceURI,localName){
71838                         var attr = this.getNamedItemNS(namespaceURI,localName);
71839                         _removeNamedNode(this._ownerElement,this,attr);
71840                         return attr;
71841                 },
71842                 getNamedItemNS: function(namespaceURI, localName) {
71843                         var i = this.length;
71844                         while(i--){
71845                                 var node = this[i];
71846                                 if(node.localName == localName && node.namespaceURI == namespaceURI){
71847                                         return node;
71848                                 }
71849                         }
71850                         return null;
71851                 }
71852         };
71853         /**
71854          * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
71855          */
71856         function DOMImplementation(/* Object */ features) {
71857                 this._features = {};
71858                 if (features) {
71859                         for (var feature in features) {
71860                                  this._features = features[feature];
71861                         }
71862                 }
71863         }
71864         DOMImplementation.prototype = {
71865                 hasFeature: function(/* string */ feature, /* string */ version) {
71866                         var versions = this._features[feature.toLowerCase()];
71867                         if (versions && (!version || version in versions)) {
71868                                 return true;
71869                         } else {
71870                                 return false;
71871                         }
71872                 },
71873                 // Introduced in DOM Level 2:
71874                 createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
71875                         var doc = new Document();
71876                         doc.implementation = this;
71877                         doc.childNodes = new NodeList();
71878                         doc.doctype = doctype;
71879                         if(doctype){
71880                                 doc.appendChild(doctype);
71881                         }
71882                         if(qualifiedName){
71883                                 var root = doc.createElementNS(namespaceURI,qualifiedName);
71884                                 doc.appendChild(root);
71885                         }
71886                         return doc;
71887                 },
71888                 // Introduced in DOM Level 2:
71889                 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
71890                         var node = new DocumentType();
71891                         node.name = qualifiedName;
71892                         node.nodeName = qualifiedName;
71893                         node.publicId = publicId;
71894                         node.systemId = systemId;
71895                         // Introduced in DOM Level 2:
71896                         //readonly attribute DOMString        internalSubset;
71897                         
71898                         //TODO:..
71899                         //  readonly attribute NamedNodeMap     entities;
71900                         //  readonly attribute NamedNodeMap     notations;
71901                         return node;
71902                 }
71903         };
71904
71905
71906         /**
71907          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
71908          */
71909
71910         function Node$2() {
71911         }
71912         Node$2.prototype = {
71913                 firstChild : null,
71914                 lastChild : null,
71915                 previousSibling : null,
71916                 nextSibling : null,
71917                 attributes : null,
71918                 parentNode : null,
71919                 childNodes : null,
71920                 ownerDocument : null,
71921                 nodeValue : null,
71922                 namespaceURI : null,
71923                 prefix : null,
71924                 localName : null,
71925                 // Modified in DOM Level 2:
71926                 insertBefore:function(newChild, refChild){//raises 
71927                         return _insertBefore(this,newChild,refChild);
71928                 },
71929                 replaceChild:function(newChild, oldChild){//raises 
71930                         this.insertBefore(newChild,oldChild);
71931                         if(oldChild){
71932                                 this.removeChild(oldChild);
71933                         }
71934                 },
71935                 removeChild:function(oldChild){
71936                         return _removeChild(this,oldChild);
71937                 },
71938                 appendChild:function(newChild){
71939                         return this.insertBefore(newChild,null);
71940                 },
71941                 hasChildNodes:function(){
71942                         return this.firstChild != null;
71943                 },
71944                 cloneNode:function(deep){
71945                         return cloneNode(this.ownerDocument||this,this,deep);
71946                 },
71947                 // Modified in DOM Level 2:
71948                 normalize:function(){
71949                         var child = this.firstChild;
71950                         while(child){
71951                                 var next = child.nextSibling;
71952                                 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
71953                                         this.removeChild(next);
71954                                         child.appendData(next.data);
71955                                 }else{
71956                                         child.normalize();
71957                                         child = next;
71958                                 }
71959                         }
71960                 },
71961                 // Introduced in DOM Level 2:
71962                 isSupported:function(feature, version){
71963                         return this.ownerDocument.implementation.hasFeature(feature,version);
71964                 },
71965             // Introduced in DOM Level 2:
71966             hasAttributes:function(){
71967                 return this.attributes.length>0;
71968             },
71969             lookupPrefix:function(namespaceURI){
71970                 var el = this;
71971                 while(el){
71972                         var map = el._nsMap;
71973                         //console.dir(map)
71974                         if(map){
71975                                 for(var n in map){
71976                                         if(map[n] == namespaceURI){
71977                                                 return n;
71978                                         }
71979                                 }
71980                         }
71981                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71982                 }
71983                 return null;
71984             },
71985             // Introduced in DOM Level 3:
71986             lookupNamespaceURI:function(prefix){
71987                 var el = this;
71988                 while(el){
71989                         var map = el._nsMap;
71990                         //console.dir(map)
71991                         if(map){
71992                                 if(prefix in map){
71993                                         return map[prefix] ;
71994                                 }
71995                         }
71996                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71997                 }
71998                 return null;
71999             },
72000             // Introduced in DOM Level 3:
72001             isDefaultNamespace:function(namespaceURI){
72002                 var prefix = this.lookupPrefix(namespaceURI);
72003                 return prefix == null;
72004             }
72005         };
72006
72007
72008         function _xmlEncoder(c){
72009                 return c == '<' && '&lt;' ||
72010                  c == '>' && '&gt;' ||
72011                  c == '&' && '&amp;' ||
72012                  c == '"' && '&quot;' ||
72013                  '&#'+c.charCodeAt()+';'
72014         }
72015
72016
72017         copy$3(NodeType,Node$2);
72018         copy$3(NodeType,Node$2.prototype);
72019
72020         /**
72021          * @param callback return true for continue,false for break
72022          * @return boolean true: break visit;
72023          */
72024         function _visitNode(node,callback){
72025                 if(callback(node)){
72026                         return true;
72027                 }
72028                 if(node = node.firstChild){
72029                         do{
72030                                 if(_visitNode(node,callback)){return true}
72031                 }while(node=node.nextSibling)
72032             }
72033         }
72034
72035
72036
72037         function Document(){
72038         }
72039         function _onAddAttribute(doc,el,newAttr){
72040                 doc && doc._inc++;
72041                 var ns = newAttr.namespaceURI ;
72042                 if(ns == 'http://www.w3.org/2000/xmlns/'){
72043                         //update namespace
72044                         el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
72045                 }
72046         }
72047         function _onRemoveAttribute(doc,el,newAttr,remove){
72048                 doc && doc._inc++;
72049                 var ns = newAttr.namespaceURI ;
72050                 if(ns == 'http://www.w3.org/2000/xmlns/'){
72051                         //update namespace
72052                         delete el._nsMap[newAttr.prefix?newAttr.localName:''];
72053                 }
72054         }
72055         function _onUpdateChild(doc,el,newChild){
72056                 if(doc && doc._inc){
72057                         doc._inc++;
72058                         //update childNodes
72059                         var cs = el.childNodes;
72060                         if(newChild){
72061                                 cs[cs.length++] = newChild;
72062                         }else{
72063                                 //console.log(1)
72064                                 var child = el.firstChild;
72065                                 var i = 0;
72066                                 while(child){
72067                                         cs[i++] = child;
72068                                         child =child.nextSibling;
72069                                 }
72070                                 cs.length = i;
72071                         }
72072                 }
72073         }
72074
72075         /**
72076          * attributes;
72077          * children;
72078          * 
72079          * writeable properties:
72080          * nodeValue,Attr:value,CharacterData:data
72081          * prefix
72082          */
72083         function _removeChild(parentNode,child){
72084                 var previous = child.previousSibling;
72085                 var next = child.nextSibling;
72086                 if(previous){
72087                         previous.nextSibling = next;
72088                 }else{
72089                         parentNode.firstChild = next;
72090                 }
72091                 if(next){
72092                         next.previousSibling = previous;
72093                 }else{
72094                         parentNode.lastChild = previous;
72095                 }
72096                 _onUpdateChild(parentNode.ownerDocument,parentNode);
72097                 return child;
72098         }
72099         /**
72100          * preformance key(refChild == null)
72101          */
72102         function _insertBefore(parentNode,newChild,nextChild){
72103                 var cp = newChild.parentNode;
72104                 if(cp){
72105                         cp.removeChild(newChild);//remove and update
72106                 }
72107                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
72108                         var newFirst = newChild.firstChild;
72109                         if (newFirst == null) {
72110                                 return newChild;
72111                         }
72112                         var newLast = newChild.lastChild;
72113                 }else{
72114                         newFirst = newLast = newChild;
72115                 }
72116                 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
72117
72118                 newFirst.previousSibling = pre;
72119                 newLast.nextSibling = nextChild;
72120                 
72121                 
72122                 if(pre){
72123                         pre.nextSibling = newFirst;
72124                 }else{
72125                         parentNode.firstChild = newFirst;
72126                 }
72127                 if(nextChild == null){
72128                         parentNode.lastChild = newLast;
72129                 }else{
72130                         nextChild.previousSibling = newLast;
72131                 }
72132                 do{
72133                         newFirst.parentNode = parentNode;
72134                 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
72135                 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
72136                 //console.log(parentNode.lastChild.nextSibling == null)
72137                 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
72138                         newChild.firstChild = newChild.lastChild = null;
72139                 }
72140                 return newChild;
72141         }
72142         function _appendSingleChild(parentNode,newChild){
72143                 var cp = newChild.parentNode;
72144                 if(cp){
72145                         var pre = parentNode.lastChild;
72146                         cp.removeChild(newChild);//remove and update
72147                         var pre = parentNode.lastChild;
72148                 }
72149                 var pre = parentNode.lastChild;
72150                 newChild.parentNode = parentNode;
72151                 newChild.previousSibling = pre;
72152                 newChild.nextSibling = null;
72153                 if(pre){
72154                         pre.nextSibling = newChild;
72155                 }else{
72156                         parentNode.firstChild = newChild;
72157                 }
72158                 parentNode.lastChild = newChild;
72159                 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
72160                 return newChild;
72161                 //console.log("__aa",parentNode.lastChild.nextSibling == null)
72162         }
72163         Document.prototype = {
72164                 //implementation : null,
72165                 nodeName :  '#document',
72166                 nodeType :  DOCUMENT_NODE,
72167                 doctype :  null,
72168                 documentElement :  null,
72169                 _inc : 1,
72170                 
72171                 insertBefore :  function(newChild, refChild){//raises 
72172                         if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
72173                                 var child = newChild.firstChild;
72174                                 while(child){
72175                                         var next = child.nextSibling;
72176                                         this.insertBefore(child,refChild);
72177                                         child = next;
72178                                 }
72179                                 return newChild;
72180                         }
72181                         if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
72182                                 this.documentElement = newChild;
72183                         }
72184                         
72185                         return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
72186                 },
72187                 removeChild :  function(oldChild){
72188                         if(this.documentElement == oldChild){
72189                                 this.documentElement = null;
72190                         }
72191                         return _removeChild(this,oldChild);
72192                 },
72193                 // Introduced in DOM Level 2:
72194                 importNode : function(importedNode,deep){
72195                         return importNode(this,importedNode,deep);
72196                 },
72197                 // Introduced in DOM Level 2:
72198                 getElementById :        function(id){
72199                         var rtv = null;
72200                         _visitNode(this.documentElement,function(node){
72201                                 if(node.nodeType == ELEMENT_NODE){
72202                                         if(node.getAttribute('id') == id){
72203                                                 rtv = node;
72204                                                 return true;
72205                                         }
72206                                 }
72207                         });
72208                         return rtv;
72209                 },
72210                 
72211                 //document factory method:
72212                 createElement : function(tagName){
72213                         var node = new Element();
72214                         node.ownerDocument = this;
72215                         node.nodeName = tagName;
72216                         node.tagName = tagName;
72217                         node.childNodes = new NodeList();
72218                         var attrs       = node.attributes = new NamedNodeMap();
72219                         attrs._ownerElement = node;
72220                         return node;
72221                 },
72222                 createDocumentFragment :        function(){
72223                         var node = new DocumentFragment();
72224                         node.ownerDocument = this;
72225                         node.childNodes = new NodeList();
72226                         return node;
72227                 },
72228                 createTextNode :        function(data){
72229                         var node = new Text();
72230                         node.ownerDocument = this;
72231                         node.appendData(data);
72232                         return node;
72233                 },
72234                 createComment : function(data){
72235                         var node = new Comment();
72236                         node.ownerDocument = this;
72237                         node.appendData(data);
72238                         return node;
72239                 },
72240                 createCDATASection :    function(data){
72241                         var node = new CDATASection();
72242                         node.ownerDocument = this;
72243                         node.appendData(data);
72244                         return node;
72245                 },
72246                 createProcessingInstruction :   function(target,data){
72247                         var node = new ProcessingInstruction();
72248                         node.ownerDocument = this;
72249                         node.tagName = node.target = target;
72250                         node.nodeValue= node.data = data;
72251                         return node;
72252                 },
72253                 createAttribute :       function(name){
72254                         var node = new Attr();
72255                         node.ownerDocument      = this;
72256                         node.name = name;
72257                         node.nodeName   = name;
72258                         node.localName = name;
72259                         node.specified = true;
72260                         return node;
72261                 },
72262                 createEntityReference : function(name){
72263                         var node = new EntityReference();
72264                         node.ownerDocument      = this;
72265                         node.nodeName   = name;
72266                         return node;
72267                 },
72268                 // Introduced in DOM Level 2:
72269                 createElementNS :       function(namespaceURI,qualifiedName){
72270                         var node = new Element();
72271                         var pl = qualifiedName.split(':');
72272                         var attrs       = node.attributes = new NamedNodeMap();
72273                         node.childNodes = new NodeList();
72274                         node.ownerDocument = this;
72275                         node.nodeName = qualifiedName;
72276                         node.tagName = qualifiedName;
72277                         node.namespaceURI = namespaceURI;
72278                         if(pl.length == 2){
72279                                 node.prefix = pl[0];
72280                                 node.localName = pl[1];
72281                         }else{
72282                                 //el.prefix = null;
72283                                 node.localName = qualifiedName;
72284                         }
72285                         attrs._ownerElement = node;
72286                         return node;
72287                 },
72288                 // Introduced in DOM Level 2:
72289                 createAttributeNS :     function(namespaceURI,qualifiedName){
72290                         var node = new Attr();
72291                         var pl = qualifiedName.split(':');
72292                         node.ownerDocument = this;
72293                         node.nodeName = qualifiedName;
72294                         node.name = qualifiedName;
72295                         node.namespaceURI = namespaceURI;
72296                         node.specified = true;
72297                         if(pl.length == 2){
72298                                 node.prefix = pl[0];
72299                                 node.localName = pl[1];
72300                         }else{
72301                                 //el.prefix = null;
72302                                 node.localName = qualifiedName;
72303                         }
72304                         return node;
72305                 }
72306         };
72307         _extends(Document,Node$2);
72308
72309
72310         function Element() {
72311                 this._nsMap = {};
72312         }Element.prototype = {
72313                 nodeType : ELEMENT_NODE,
72314                 hasAttribute : function(name){
72315                         return this.getAttributeNode(name)!=null;
72316                 },
72317                 getAttribute : function(name){
72318                         var attr = this.getAttributeNode(name);
72319                         return attr && attr.value || '';
72320                 },
72321                 getAttributeNode : function(name){
72322                         return this.attributes.getNamedItem(name);
72323                 },
72324                 setAttribute : function(name, value){
72325                         var attr = this.ownerDocument.createAttribute(name);
72326                         attr.value = attr.nodeValue = "" + value;
72327                         this.setAttributeNode(attr);
72328                 },
72329                 removeAttribute : function(name){
72330                         var attr = this.getAttributeNode(name);
72331                         attr && this.removeAttributeNode(attr);
72332                 },
72333                 
72334                 //four real opeartion method
72335                 appendChild:function(newChild){
72336                         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
72337                                 return this.insertBefore(newChild,null);
72338                         }else{
72339                                 return _appendSingleChild(this,newChild);
72340                         }
72341                 },
72342                 setAttributeNode : function(newAttr){
72343                         return this.attributes.setNamedItem(newAttr);
72344                 },
72345                 setAttributeNodeNS : function(newAttr){
72346                         return this.attributes.setNamedItemNS(newAttr);
72347                 },
72348                 removeAttributeNode : function(oldAttr){
72349                         //console.log(this == oldAttr.ownerElement)
72350                         return this.attributes.removeNamedItem(oldAttr.nodeName);
72351                 },
72352                 //get real attribute name,and remove it by removeAttributeNode
72353                 removeAttributeNS : function(namespaceURI, localName){
72354                         var old = this.getAttributeNodeNS(namespaceURI, localName);
72355                         old && this.removeAttributeNode(old);
72356                 },
72357                 
72358                 hasAttributeNS : function(namespaceURI, localName){
72359                         return this.getAttributeNodeNS(namespaceURI, localName)!=null;
72360                 },
72361                 getAttributeNS : function(namespaceURI, localName){
72362                         var attr = this.getAttributeNodeNS(namespaceURI, localName);
72363                         return attr && attr.value || '';
72364                 },
72365                 setAttributeNS : function(namespaceURI, qualifiedName, value){
72366                         var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
72367                         attr.value = attr.nodeValue = "" + value;
72368                         this.setAttributeNode(attr);
72369                 },
72370                 getAttributeNodeNS : function(namespaceURI, localName){
72371                         return this.attributes.getNamedItemNS(namespaceURI, localName);
72372                 },
72373                 
72374                 getElementsByTagName : function(tagName){
72375                         return new LiveNodeList(this,function(base){
72376                                 var ls = [];
72377                                 _visitNode(base,function(node){
72378                                         if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
72379                                                 ls.push(node);
72380                                         }
72381                                 });
72382                                 return ls;
72383                         });
72384                 },
72385                 getElementsByTagNameNS : function(namespaceURI, localName){
72386                         return new LiveNodeList(this,function(base){
72387                                 var ls = [];
72388                                 _visitNode(base,function(node){
72389                                         if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
72390                                                 ls.push(node);
72391                                         }
72392                                 });
72393                                 return ls;
72394                                 
72395                         });
72396                 }
72397         };
72398         Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
72399         Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
72400
72401
72402         _extends(Element,Node$2);
72403         function Attr() {
72404         }Attr.prototype.nodeType = ATTRIBUTE_NODE;
72405         _extends(Attr,Node$2);
72406
72407
72408         function CharacterData() {
72409         }CharacterData.prototype = {
72410                 data : '',
72411                 substringData : function(offset, count) {
72412                         return this.data.substring(offset, offset+count);
72413                 },
72414                 appendData: function(text) {
72415                         text = this.data+text;
72416                         this.nodeValue = this.data = text;
72417                         this.length = text.length;
72418                 },
72419                 insertData: function(offset,text) {
72420                         this.replaceData(offset,0,text);
72421                 
72422                 },
72423                 appendChild:function(newChild){
72424                         throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
72425                 },
72426                 deleteData: function(offset, count) {
72427                         this.replaceData(offset,count,"");
72428                 },
72429                 replaceData: function(offset, count, text) {
72430                         var start = this.data.substring(0,offset);
72431                         var end = this.data.substring(offset+count);
72432                         text = start + text + end;
72433                         this.nodeValue = this.data = text;
72434                         this.length = text.length;
72435                 }
72436         };
72437         _extends(CharacterData,Node$2);
72438         function Text() {
72439         }Text.prototype = {
72440                 nodeName : "#text",
72441                 nodeType : TEXT_NODE,
72442                 splitText : function(offset) {
72443                         var text = this.data;
72444                         var newText = text.substring(offset);
72445                         text = text.substring(0, offset);
72446                         this.data = this.nodeValue = text;
72447                         this.length = text.length;
72448                         var newNode = this.ownerDocument.createTextNode(newText);
72449                         if(this.parentNode){
72450                                 this.parentNode.insertBefore(newNode, this.nextSibling);
72451                         }
72452                         return newNode;
72453                 }
72454         };
72455         _extends(Text,CharacterData);
72456         function Comment() {
72457         }Comment.prototype = {
72458                 nodeName : "#comment",
72459                 nodeType : COMMENT_NODE
72460         };
72461         _extends(Comment,CharacterData);
72462
72463         function CDATASection() {
72464         }CDATASection.prototype = {
72465                 nodeName : "#cdata-section",
72466                 nodeType : CDATA_SECTION_NODE
72467         };
72468         _extends(CDATASection,CharacterData);
72469
72470
72471         function DocumentType() {
72472         }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
72473         _extends(DocumentType,Node$2);
72474
72475         function Notation() {
72476         }Notation.prototype.nodeType = NOTATION_NODE;
72477         _extends(Notation,Node$2);
72478
72479         function Entity() {
72480         }Entity.prototype.nodeType = ENTITY_NODE;
72481         _extends(Entity,Node$2);
72482
72483         function EntityReference() {
72484         }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
72485         _extends(EntityReference,Node$2);
72486
72487         function DocumentFragment() {
72488         }DocumentFragment.prototype.nodeName =  "#document-fragment";
72489         DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
72490         _extends(DocumentFragment,Node$2);
72491
72492
72493         function ProcessingInstruction() {
72494         }
72495         ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
72496         _extends(ProcessingInstruction,Node$2);
72497         function XMLSerializer$1(){}
72498         XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
72499                 return nodeSerializeToString.call(node,isHtml,nodeFilter);
72500         };
72501         Node$2.prototype.toString = nodeSerializeToString;
72502         function nodeSerializeToString(isHtml,nodeFilter){
72503                 var buf = [];
72504                 var refNode = this.nodeType == 9?this.documentElement:this;
72505                 var prefix = refNode.prefix;
72506                 var uri = refNode.namespaceURI;
72507                 
72508                 if(uri && prefix == null){
72509                         //console.log(prefix)
72510                         var prefix = refNode.lookupPrefix(uri);
72511                         if(prefix == null){
72512                                 //isHTML = true;
72513                                 var visibleNamespaces=[
72514                                 {namespace:uri,prefix:null}
72515                                 //{namespace:uri,prefix:''}
72516                                 ];
72517                         }
72518                 }
72519                 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
72520                 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
72521                 return buf.join('');
72522         }
72523         function needNamespaceDefine(node,isHTML, visibleNamespaces) {
72524                 var prefix = node.prefix||'';
72525                 var uri = node.namespaceURI;
72526                 if (!prefix && !uri){
72527                         return false;
72528                 }
72529                 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
72530                         || uri == 'http://www.w3.org/2000/xmlns/'){
72531                         return false;
72532                 }
72533                 
72534                 var i = visibleNamespaces.length; 
72535                 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
72536                 while (i--) {
72537                         var ns = visibleNamespaces[i];
72538                         // get namespace prefix
72539                         //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
72540                         if (ns.prefix == prefix){
72541                                 return ns.namespace != uri;
72542                         }
72543                 }
72544                 //console.log(isHTML,uri,prefix=='')
72545                 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
72546                 //      return false;
72547                 //}
72548                 //node.flag = '11111'
72549                 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
72550                 return true;
72551         }
72552         function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
72553                 if(nodeFilter){
72554                         node = nodeFilter(node);
72555                         if(node){
72556                                 if(typeof node == 'string'){
72557                                         buf.push(node);
72558                                         return;
72559                                 }
72560                         }else{
72561                                 return;
72562                         }
72563                         //buf.sort.apply(attrs, attributeSorter);
72564                 }
72565                 switch(node.nodeType){
72566                 case ELEMENT_NODE:
72567                         if (!visibleNamespaces) visibleNamespaces = [];
72568                         var startVisibleNamespaces = visibleNamespaces.length;
72569                         var attrs = node.attributes;
72570                         var len = attrs.length;
72571                         var child = node.firstChild;
72572                         var nodeName = node.tagName;
72573                         
72574                         isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
72575                         buf.push('<',nodeName);
72576                         
72577                         
72578                         
72579                         for(var i=0;i<len;i++){
72580                                 // add namespaces for attributes
72581                                 var attr = attrs.item(i);
72582                                 if (attr.prefix == 'xmlns') {
72583                                         visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
72584                                 }else if(attr.nodeName == 'xmlns'){
72585                                         visibleNamespaces.push({ prefix: '', namespace: attr.value });
72586                                 }
72587                         }
72588                         for(var i=0;i<len;i++){
72589                                 var attr = attrs.item(i);
72590                                 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
72591                                         var prefix = attr.prefix||'';
72592                                         var uri = attr.namespaceURI;
72593                                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72594                                         buf.push(ns, '="' , uri , '"');
72595                                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
72596                                 }
72597                                 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
72598                         }
72599                         // add namespace for current node               
72600                         if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
72601                                 var prefix = node.prefix||'';
72602                                 var uri = node.namespaceURI;
72603                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72604                                 buf.push(ns, '="' , uri , '"');
72605                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
72606                         }
72607                         
72608                         if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
72609                                 buf.push('>');
72610                                 //if is cdata child node
72611                                 if(isHTML && /^script$/i.test(nodeName)){
72612                                         while(child){
72613                                                 if(child.data){
72614                                                         buf.push(child.data);
72615                                                 }else{
72616                                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72617                                                 }
72618                                                 child = child.nextSibling;
72619                                         }
72620                                 }else
72621                                 {
72622                                         while(child){
72623                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72624                                                 child = child.nextSibling;
72625                                         }
72626                                 }
72627                                 buf.push('</',nodeName,'>');
72628                         }else{
72629                                 buf.push('/>');
72630                         }
72631                         // remove added visible namespaces
72632                         //visibleNamespaces.length = startVisibleNamespaces;
72633                         return;
72634                 case DOCUMENT_NODE:
72635                 case DOCUMENT_FRAGMENT_NODE:
72636                         var child = node.firstChild;
72637                         while(child){
72638                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72639                                 child = child.nextSibling;
72640                         }
72641                         return;
72642                 case ATTRIBUTE_NODE:
72643                         return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
72644                 case TEXT_NODE:
72645                         return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
72646                 case CDATA_SECTION_NODE:
72647                         return buf.push( '<![CDATA[',node.data,']]>');
72648                 case COMMENT_NODE:
72649                         return buf.push( "<!--",node.data,"-->");
72650                 case DOCUMENT_TYPE_NODE:
72651                         var pubid = node.publicId;
72652                         var sysid = node.systemId;
72653                         buf.push('<!DOCTYPE ',node.name);
72654                         if(pubid){
72655                                 buf.push(' PUBLIC "',pubid);
72656                                 if (sysid && sysid!='.') {
72657                                         buf.push( '" "',sysid);
72658                                 }
72659                                 buf.push('">');
72660                         }else if(sysid && sysid!='.'){
72661                                 buf.push(' SYSTEM "',sysid,'">');
72662                         }else{
72663                                 var sub = node.internalSubset;
72664                                 if(sub){
72665                                         buf.push(" [",sub,"]");
72666                                 }
72667                                 buf.push(">");
72668                         }
72669                         return;
72670                 case PROCESSING_INSTRUCTION_NODE:
72671                         return buf.push( "<?",node.target," ",node.data,"?>");
72672                 case ENTITY_REFERENCE_NODE:
72673                         return buf.push( '&',node.nodeName,';');
72674                 //case ENTITY_NODE:
72675                 //case NOTATION_NODE:
72676                 default:
72677                         buf.push('??',node.nodeName);
72678                 }
72679         }
72680         function importNode(doc,node,deep){
72681                 var node2;
72682                 switch (node.nodeType) {
72683                 case ELEMENT_NODE:
72684                         node2 = node.cloneNode(false);
72685                         node2.ownerDocument = doc;
72686                         //var attrs = node2.attributes;
72687                         //var len = attrs.length;
72688                         //for(var i=0;i<len;i++){
72689                                 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
72690                         //}
72691                 case DOCUMENT_FRAGMENT_NODE:
72692                         break;
72693                 case ATTRIBUTE_NODE:
72694                         deep = true;
72695                         break;
72696                 //case ENTITY_REFERENCE_NODE:
72697                 //case PROCESSING_INSTRUCTION_NODE:
72698                 ////case TEXT_NODE:
72699                 //case CDATA_SECTION_NODE:
72700                 //case COMMENT_NODE:
72701                 //      deep = false;
72702                 //      break;
72703                 //case DOCUMENT_NODE:
72704                 //case DOCUMENT_TYPE_NODE:
72705                 //cannot be imported.
72706                 //case ENTITY_NODE:
72707                 //case NOTATION_NODE:
72708                 //can not hit in level3
72709                 //default:throw e;
72710                 }
72711                 if(!node2){
72712                         node2 = node.cloneNode(false);//false
72713                 }
72714                 node2.ownerDocument = doc;
72715                 node2.parentNode = null;
72716                 if(deep){
72717                         var child = node.firstChild;
72718                         while(child){
72719                                 node2.appendChild(importNode(doc,child,deep));
72720                                 child = child.nextSibling;
72721                         }
72722                 }
72723                 return node2;
72724         }
72725         //
72726         //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
72727         //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
72728         function cloneNode(doc,node,deep){
72729                 var node2 = new node.constructor();
72730                 for(var n in node){
72731                         var v = node[n];
72732                         if(typeof v != 'object' ){
72733                                 if(v != node2[n]){
72734                                         node2[n] = v;
72735                                 }
72736                         }
72737                 }
72738                 if(node.childNodes){
72739                         node2.childNodes = new NodeList();
72740                 }
72741                 node2.ownerDocument = doc;
72742                 switch (node2.nodeType) {
72743                 case ELEMENT_NODE:
72744                         var attrs       = node.attributes;
72745                         var attrs2      = node2.attributes = new NamedNodeMap();
72746                         var len = attrs.length;
72747                         attrs2._ownerElement = node2;
72748                         for(var i=0;i<len;i++){
72749                                 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
72750                         }
72751                         break;
72752                 case ATTRIBUTE_NODE:
72753                         deep = true;
72754                 }
72755                 if(deep){
72756                         var child = node.firstChild;
72757                         while(child){
72758                                 node2.appendChild(cloneNode(doc,child,deep));
72759                                 child = child.nextSibling;
72760                         }
72761                 }
72762                 return node2;
72763         }
72764
72765         function __set__(object,key,value){
72766                 object[key] = value;
72767         }
72768         //do dynamic
72769         try{
72770                 if(Object.defineProperty){
72771                         Object.defineProperty(LiveNodeList.prototype,'length',{
72772                                 get:function(){
72773                                         _updateLiveList(this);
72774                                         return this.$$length;
72775                                 }
72776                         });
72777                         Object.defineProperty(Node$2.prototype,'textContent',{
72778                                 get:function(){
72779                                         return getTextContent(this);
72780                                 },
72781                                 set:function(data){
72782                                         switch(this.nodeType){
72783                                         case ELEMENT_NODE:
72784                                         case DOCUMENT_FRAGMENT_NODE:
72785                                                 while(this.firstChild){
72786                                                         this.removeChild(this.firstChild);
72787                                                 }
72788                                                 if(data || String(data)){
72789                                                         this.appendChild(this.ownerDocument.createTextNode(data));
72790                                                 }
72791                                                 break;
72792                                         default:
72793                                                 //TODO:
72794                                                 this.data = data;
72795                                                 this.value = data;
72796                                                 this.nodeValue = data;
72797                                         }
72798                                 }
72799                         });
72800                         
72801                         function getTextContent(node){
72802                                 switch(node.nodeType){
72803                                 case ELEMENT_NODE:
72804                                 case DOCUMENT_FRAGMENT_NODE:
72805                                         var buf = [];
72806                                         node = node.firstChild;
72807                                         while(node){
72808                                                 if(node.nodeType!==7 && node.nodeType !==8){
72809                                                         buf.push(getTextContent(node));
72810                                                 }
72811                                                 node = node.nextSibling;
72812                                         }
72813                                         return buf.join('');
72814                                 default:
72815                                         return node.nodeValue;
72816                                 }
72817                         }
72818                         __set__ = function(object,key,value){
72819                                 //console.log(value)
72820                                 object['$$'+key] = value;
72821                         };
72822                 }
72823         }catch(e){//ie8
72824         }
72825
72826         //if(typeof require == 'function'){
72827                 var DOMImplementation_1 = DOMImplementation;
72828                 var XMLSerializer_1 = XMLSerializer$1;
72829         //}
72830
72831         var dom = {
72832                 DOMImplementation: DOMImplementation_1,
72833                 XMLSerializer: XMLSerializer_1
72834         };
72835
72836         var domParser = createCommonjsModule(function (module, exports) {
72837         function DOMParser(options){
72838                 this.options = options ||{locator:{}};
72839                 
72840         }
72841         DOMParser.prototype.parseFromString = function(source,mimeType){
72842                 var options = this.options;
72843                 var sax =  new XMLReader();
72844                 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
72845                 var errorHandler = options.errorHandler;
72846                 var locator = options.locator;
72847                 var defaultNSMap = options.xmlns||{};
72848                 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
72849                 if(locator){
72850                         domBuilder.setDocumentLocator(locator);
72851                 }
72852                 
72853                 sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
72854                 sax.domBuilder = options.domBuilder || domBuilder;
72855                 if(/\/x?html?$/.test(mimeType)){
72856                         entityMap.nbsp = '\xa0';
72857                         entityMap.copy = '\xa9';
72858                         defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
72859                 }
72860                 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
72861                 if(source){
72862                         sax.parse(source,defaultNSMap,entityMap);
72863                 }else{
72864                         sax.errorHandler.error("invalid doc source");
72865                 }
72866                 return domBuilder.doc;
72867         };
72868         function buildErrorHandler(errorImpl,domBuilder,locator){
72869                 if(!errorImpl){
72870                         if(domBuilder instanceof DOMHandler){
72871                                 return domBuilder;
72872                         }
72873                         errorImpl = domBuilder ;
72874                 }
72875                 var errorHandler = {};
72876                 var isCallback = errorImpl instanceof Function;
72877                 locator = locator||{};
72878                 function build(key){
72879                         var fn = errorImpl[key];
72880                         if(!fn && isCallback){
72881                                 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
72882                         }
72883                         errorHandler[key] = fn && function(msg){
72884                                 fn('[xmldom '+key+']\t'+msg+_locator(locator));
72885                         }||function(){};
72886                 }
72887                 build('warning');
72888                 build('error');
72889                 build('fatalError');
72890                 return errorHandler;
72891         }
72892
72893         //console.log('#\n\n\n\n\n\n\n####')
72894         /**
72895          * +ContentHandler+ErrorHandler
72896          * +LexicalHandler+EntityResolver2
72897          * -DeclHandler-DTDHandler 
72898          * 
72899          * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
72900          * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
72901          * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
72902          */
72903         function DOMHandler() {
72904             this.cdata = false;
72905         }
72906         function position(locator,node){
72907                 node.lineNumber = locator.lineNumber;
72908                 node.columnNumber = locator.columnNumber;
72909         }
72910         /**
72911          * @see org.xml.sax.ContentHandler#startDocument
72912          * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
72913          */ 
72914         DOMHandler.prototype = {
72915                 startDocument : function() {
72916                 this.doc = new DOMImplementation().createDocument(null, null, null);
72917                 if (this.locator) {
72918                         this.doc.documentURI = this.locator.systemId;
72919                 }
72920                 },
72921                 startElement:function(namespaceURI, localName, qName, attrs) {
72922                         var doc = this.doc;
72923                     var el = doc.createElementNS(namespaceURI, qName||localName);
72924                     var len = attrs.length;
72925                     appendElement(this, el);
72926                     this.currentElement = el;
72927                     
72928                         this.locator && position(this.locator,el);
72929                     for (var i = 0 ; i < len; i++) {
72930                         var namespaceURI = attrs.getURI(i);
72931                         var value = attrs.getValue(i);
72932                         var qName = attrs.getQName(i);
72933                                 var attr = doc.createAttributeNS(namespaceURI, qName);
72934                                 this.locator &&position(attrs.getLocator(i),attr);
72935                                 attr.value = attr.nodeValue = value;
72936                                 el.setAttributeNode(attr);
72937                     }
72938                 },
72939                 endElement:function(namespaceURI, localName, qName) {
72940                         var current = this.currentElement;
72941                         var tagName = current.tagName;
72942                         this.currentElement = current.parentNode;
72943                 },
72944                 startPrefixMapping:function(prefix, uri) {
72945                 },
72946                 endPrefixMapping:function(prefix) {
72947                 },
72948                 processingInstruction:function(target, data) {
72949                     var ins = this.doc.createProcessingInstruction(target, data);
72950                     this.locator && position(this.locator,ins);
72951                     appendElement(this, ins);
72952                 },
72953                 ignorableWhitespace:function(ch, start, length) {
72954                 },
72955                 characters:function(chars, start, length) {
72956                         chars = _toString.apply(this,arguments);
72957                         //console.log(chars)
72958                         if(chars){
72959                                 if (this.cdata) {
72960                                         var charNode = this.doc.createCDATASection(chars);
72961                                 } else {
72962                                         var charNode = this.doc.createTextNode(chars);
72963                                 }
72964                                 if(this.currentElement){
72965                                         this.currentElement.appendChild(charNode);
72966                                 }else if(/^\s*$/.test(chars)){
72967                                         this.doc.appendChild(charNode);
72968                                         //process xml
72969                                 }
72970                                 this.locator && position(this.locator,charNode);
72971                         }
72972                 },
72973                 skippedEntity:function(name) {
72974                 },
72975                 endDocument:function() {
72976                         this.doc.normalize();
72977                 },
72978                 setDocumentLocator:function (locator) {
72979                     if(this.locator = locator){// && !('lineNumber' in locator)){
72980                         locator.lineNumber = 0;
72981                     }
72982                 },
72983                 //LexicalHandler
72984                 comment:function(chars, start, length) {
72985                         chars = _toString.apply(this,arguments);
72986                     var comm = this.doc.createComment(chars);
72987                     this.locator && position(this.locator,comm);
72988                     appendElement(this, comm);
72989                 },
72990                 
72991                 startCDATA:function() {
72992                     //used in characters() methods
72993                     this.cdata = true;
72994                 },
72995                 endCDATA:function() {
72996                     this.cdata = false;
72997                 },
72998                 
72999                 startDTD:function(name, publicId, systemId) {
73000                         var impl = this.doc.implementation;
73001                     if (impl && impl.createDocumentType) {
73002                         var dt = impl.createDocumentType(name, publicId, systemId);
73003                         this.locator && position(this.locator,dt);
73004                         appendElement(this, dt);
73005                     }
73006                 },
73007                 /**
73008                  * @see org.xml.sax.ErrorHandler
73009                  * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
73010                  */
73011                 warning:function(error) {
73012                         console.warn('[xmldom warning]\t'+error,_locator(this.locator));
73013                 },
73014                 error:function(error) {
73015                         console.error('[xmldom error]\t'+error,_locator(this.locator));
73016                 },
73017                 fatalError:function(error) {
73018                         console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
73019                     throw error;
73020                 }
73021         };
73022         function _locator(l){
73023                 if(l){
73024                         return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
73025                 }
73026         }
73027         function _toString(chars,start,length){
73028                 if(typeof chars == 'string'){
73029                         return chars.substr(start,length)
73030                 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
73031                         if(chars.length >= start+length || start){
73032                                 return new java.lang.String(chars,start,length)+'';
73033                         }
73034                         return chars;
73035                 }
73036         }
73037
73038         /*
73039          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
73040          * used method of org.xml.sax.ext.LexicalHandler:
73041          *  #comment(chars, start, length)
73042          *  #startCDATA()
73043          *  #endCDATA()
73044          *  #startDTD(name, publicId, systemId)
73045          *
73046          *
73047          * IGNORED method of org.xml.sax.ext.LexicalHandler:
73048          *  #endDTD()
73049          *  #startEntity(name)
73050          *  #endEntity(name)
73051          *
73052          *
73053          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
73054          * IGNORED method of org.xml.sax.ext.DeclHandler
73055          *      #attributeDecl(eName, aName, type, mode, value)
73056          *  #elementDecl(name, model)
73057          *  #externalEntityDecl(name, publicId, systemId)
73058          *  #internalEntityDecl(name, value)
73059          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
73060          * IGNORED method of org.xml.sax.EntityResolver2
73061          *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
73062          *  #resolveEntity(publicId, systemId)
73063          *  #getExternalSubset(name, baseURI)
73064          * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
73065          * IGNORED method of org.xml.sax.DTDHandler
73066          *  #notationDecl(name, publicId, systemId) {};
73067          *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
73068          */
73069         "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
73070                 DOMHandler.prototype[key] = function(){return null};
73071         });
73072
73073         /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
73074         function appendElement (hander,node) {
73075             if (!hander.currentElement) {
73076                 hander.doc.appendChild(node);
73077             } else {
73078                 hander.currentElement.appendChild(node);
73079             }
73080         }//appendChild and setAttributeNS are preformance key
73081
73082         //if(typeof require == 'function'){
73083                 var XMLReader = sax.XMLReader;
73084                 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
73085                 exports.XMLSerializer = dom.XMLSerializer ;
73086                 exports.DOMParser = DOMParser;
73087         //}
73088         });
73089         var domParser_1 = domParser.DOMImplementation;
73090         var domParser_2 = domParser.XMLSerializer;
73091         var domParser_3 = domParser.DOMParser;
73092
73093         var togeojson = createCommonjsModule(function (module, exports) {
73094         var toGeoJSON = (function() {
73095
73096             var removeSpace = /\s*/g,
73097                 trimSpace = /^\s*|\s*$/g,
73098                 splitSpace = /\s+/;
73099             // generate a short, numeric hash of a string
73100             function okhash(x) {
73101                 if (!x || !x.length) return 0;
73102                 for (var i = 0, h = 0; i < x.length; i++) {
73103                     h = ((h << 5) - h) + x.charCodeAt(i) | 0;
73104                 } return h;
73105             }
73106             // all Y children of X
73107             function get(x, y) { return x.getElementsByTagName(y); }
73108             function attr(x, y) { return x.getAttribute(y); }
73109             function attrf(x, y) { return parseFloat(attr(x, y)); }
73110             // one Y child of X, if any, otherwise null
73111             function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
73112             // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
73113             function norm(el) { if (el.normalize) { el.normalize(); } return el; }
73114             // cast array x into numbers
73115             function numarray(x) {
73116                 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
73117                 return o;
73118             }
73119             // get the content of a text node, if any
73120             function nodeVal(x) {
73121                 if (x) { norm(x); }
73122                 return (x && x.textContent) || '';
73123             }
73124             // get the contents of multiple text nodes, if present
73125             function getMulti(x, ys) {
73126                 var o = {}, n, k;
73127                 for (k = 0; k < ys.length; k++) {
73128                     n = get1(x, ys[k]);
73129                     if (n) o[ys[k]] = nodeVal(n);
73130                 }
73131                 return o;
73132             }
73133             // add properties of Y to X, overwriting if present in both
73134             function extend(x, y) { for (var k in y) x[k] = y[k]; }
73135             // get one coordinate from a coordinate array, if any
73136             function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
73137             // get all coordinates from a coordinate array as [[],[]]
73138             function coord(v) {
73139                 var coords = v.replace(trimSpace, '').split(splitSpace),
73140                     o = [];
73141                 for (var i = 0; i < coords.length; i++) {
73142                     o.push(coord1(coords[i]));
73143                 }
73144                 return o;
73145             }
73146             function coordPair(x) {
73147                 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
73148                     ele = get1(x, 'ele'),
73149                     // handle namespaced attribute in browser
73150                     heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
73151                     time = get1(x, 'time'),
73152                     e;
73153                 if (ele) {
73154                     e = parseFloat(nodeVal(ele));
73155                     if (!isNaN(e)) {
73156                         ll.push(e);
73157                     }
73158                 }
73159                 return {
73160                     coordinates: ll,
73161                     time: time ? nodeVal(time) : null,
73162                     heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
73163                 };
73164             }
73165
73166             // create a new feature collection parent object
73167             function fc() {
73168                 return {
73169                     type: 'FeatureCollection',
73170                     features: []
73171                 };
73172             }
73173
73174             var serializer;
73175             if (typeof XMLSerializer !== 'undefined') {
73176                 /* istanbul ignore next */
73177                 serializer = new XMLSerializer();
73178             // only require xmldom in a node environment
73179             } else if ( typeof process === 'object' && !process.browser) {
73180                 serializer = new (domParser.XMLSerializer)();
73181             }
73182             function xml2str(str) {
73183                 // IE9 will create a new XMLSerializer but it'll crash immediately.
73184                 // This line is ignored because we don't run coverage tests in IE9
73185                 /* istanbul ignore next */
73186                 if (str.xml !== undefined) return str.xml;
73187                 return serializer.serializeToString(str);
73188             }
73189
73190             var t = {
73191                 kml: function(doc) {
73192
73193                     var gj = fc(),
73194                         // styleindex keeps track of hashed styles in order to match features
73195                         styleIndex = {}, styleByHash = {},
73196                         // stylemapindex keeps track of style maps to expose in properties
73197                         styleMapIndex = {},
73198                         // atomic geospatial types supported by KML - MultiGeometry is
73199                         // handled separately
73200                         geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
73201                         // all root placemarks in the file
73202                         placemarks = get(doc, 'Placemark'),
73203                         styles = get(doc, 'Style'),
73204                         styleMaps = get(doc, 'StyleMap');
73205
73206                     for (var k = 0; k < styles.length; k++) {
73207                         var hash = okhash(xml2str(styles[k])).toString(16);
73208                         styleIndex['#' + attr(styles[k], 'id')] = hash;
73209                         styleByHash[hash] = styles[k];
73210                     }
73211                     for (var l = 0; l < styleMaps.length; l++) {
73212                         styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
73213                         var pairs = get(styleMaps[l], 'Pair');
73214                         var pairsMap = {};
73215                         for (var m = 0; m < pairs.length; m++) {
73216                             pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
73217                         }
73218                         styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
73219
73220                     }
73221                     for (var j = 0; j < placemarks.length; j++) {
73222                         gj.features = gj.features.concat(getPlacemark(placemarks[j]));
73223                     }
73224                     function kmlColor(v) {
73225                         var color, opacity;
73226                         v = v || '';
73227                         if (v.substr(0, 1) === '#') { v = v.substr(1); }
73228                         if (v.length === 6 || v.length === 3) { color = v; }
73229                         if (v.length === 8) {
73230                             opacity = parseInt(v.substr(0, 2), 16) / 255;
73231                             color = '#' + v.substr(6, 2) +
73232                                 v.substr(4, 2) +
73233                                 v.substr(2, 2);
73234                         }
73235                         return [color, isNaN(opacity) ? undefined : opacity];
73236                     }
73237                     function gxCoord(v) { return numarray(v.split(' ')); }
73238                     function gxCoords(root) {
73239                         var elems = get(root, 'coord'), coords = [], times = [];
73240                         if (elems.length === 0) elems = get(root, 'gx:coord');
73241                         for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
73242                         var timeElems = get(root, 'when');
73243                         for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
73244                         return {
73245                             coords: coords,
73246                             times: times
73247                         };
73248                     }
73249                     function getGeometry(root) {
73250                         var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
73251                         if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
73252                         if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
73253                         if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
73254                         for (i = 0; i < geotypes.length; i++) {
73255                             geomNodes = get(root, geotypes[i]);
73256                             if (geomNodes) {
73257                                 for (j = 0; j < geomNodes.length; j++) {
73258                                     geomNode = geomNodes[j];
73259                                     if (geotypes[i] === 'Point') {
73260                                         geoms.push({
73261                                             type: 'Point',
73262                                             coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
73263                                         });
73264                                     } else if (geotypes[i] === 'LineString') {
73265                                         geoms.push({
73266                                             type: 'LineString',
73267                                             coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
73268                                         });
73269                                     } else if (geotypes[i] === 'Polygon') {
73270                                         var rings = get(geomNode, 'LinearRing'),
73271                                             coords = [];
73272                                         for (k = 0; k < rings.length; k++) {
73273                                             coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
73274                                         }
73275                                         geoms.push({
73276                                             type: 'Polygon',
73277                                             coordinates: coords
73278                                         });
73279                                     } else if (geotypes[i] === 'Track' ||
73280                                         geotypes[i] === 'gx:Track') {
73281                                         var track = gxCoords(geomNode);
73282                                         geoms.push({
73283                                             type: 'LineString',
73284                                             coordinates: track.coords
73285                                         });
73286                                         if (track.times.length) coordTimes.push(track.times);
73287                                     }
73288                                 }
73289                             }
73290                         }
73291                         return {
73292                             geoms: geoms,
73293                             coordTimes: coordTimes
73294                         };
73295                     }
73296                     function getPlacemark(root) {
73297                         var geomsAndTimes = getGeometry(root), i, properties = {},
73298                             name = nodeVal(get1(root, 'name')),
73299                             address = nodeVal(get1(root, 'address')),
73300                             styleUrl = nodeVal(get1(root, 'styleUrl')),
73301                             description = nodeVal(get1(root, 'description')),
73302                             timeSpan = get1(root, 'TimeSpan'),
73303                             timeStamp = get1(root, 'TimeStamp'),
73304                             extendedData = get1(root, 'ExtendedData'),
73305                             lineStyle = get1(root, 'LineStyle'),
73306                             polyStyle = get1(root, 'PolyStyle'),
73307                             visibility = get1(root, 'visibility');
73308
73309                         if (!geomsAndTimes.geoms.length) return [];
73310                         if (name) properties.name = name;
73311                         if (address) properties.address = address;
73312                         if (styleUrl) {
73313                             if (styleUrl[0] !== '#') {
73314                                 styleUrl = '#' + styleUrl;
73315                             }
73316
73317                             properties.styleUrl = styleUrl;
73318                             if (styleIndex[styleUrl]) {
73319                                 properties.styleHash = styleIndex[styleUrl];
73320                             }
73321                             if (styleMapIndex[styleUrl]) {
73322                                 properties.styleMapHash = styleMapIndex[styleUrl];
73323                                 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
73324                             }
73325                             // Try to populate the lineStyle or polyStyle since we got the style hash
73326                             var style = styleByHash[properties.styleHash];
73327                             if (style) {
73328                                 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
73329                                 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
73330                             }
73331                         }
73332                         if (description) properties.description = description;
73333                         if (timeSpan) {
73334                             var begin = nodeVal(get1(timeSpan, 'begin'));
73335                             var end = nodeVal(get1(timeSpan, 'end'));
73336                             properties.timespan = { begin: begin, end: end };
73337                         }
73338                         if (timeStamp) {
73339                             properties.timestamp = nodeVal(get1(timeStamp, 'when'));
73340                         }
73341                         if (lineStyle) {
73342                             var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
73343                                 color = linestyles[0],
73344                                 opacity = linestyles[1],
73345                                 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73346                             if (color) properties.stroke = color;
73347                             if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
73348                             if (!isNaN(width)) properties['stroke-width'] = width;
73349                         }
73350                         if (polyStyle) {
73351                             var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
73352                                 pcolor = polystyles[0],
73353                                 popacity = polystyles[1],
73354                                 fill = nodeVal(get1(polyStyle, 'fill')),
73355                                 outline = nodeVal(get1(polyStyle, 'outline'));
73356                             if (pcolor) properties.fill = pcolor;
73357                             if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
73358                             if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
73359                             if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
73360                         }
73361                         if (extendedData) {
73362                             var datas = get(extendedData, 'Data'),
73363                                 simpleDatas = get(extendedData, 'SimpleData');
73364
73365                             for (i = 0; i < datas.length; i++) {
73366                                 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
73367                             }
73368                             for (i = 0; i < simpleDatas.length; i++) {
73369                                 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
73370                             }
73371                         }
73372                         if (visibility) {
73373                             properties.visibility = nodeVal(visibility);
73374                         }
73375                         if (geomsAndTimes.coordTimes.length) {
73376                             properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
73377                                 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
73378                         }
73379                         var feature = {
73380                             type: 'Feature',
73381                             geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
73382                                 type: 'GeometryCollection',
73383                                 geometries: geomsAndTimes.geoms
73384                             },
73385                             properties: properties
73386                         };
73387                         if (attr(root, 'id')) feature.id = attr(root, 'id');
73388                         return [feature];
73389                     }
73390                     return gj;
73391                 },
73392                 gpx: function(doc) {
73393                     var i,
73394                         tracks = get(doc, 'trk'),
73395                         routes = get(doc, 'rte'),
73396                         waypoints = get(doc, 'wpt'),
73397                         // a feature collection
73398                         gj = fc(),
73399                         feature;
73400                     for (i = 0; i < tracks.length; i++) {
73401                         feature = getTrack(tracks[i]);
73402                         if (feature) gj.features.push(feature);
73403                     }
73404                     for (i = 0; i < routes.length; i++) {
73405                         feature = getRoute(routes[i]);
73406                         if (feature) gj.features.push(feature);
73407                     }
73408                     for (i = 0; i < waypoints.length; i++) {
73409                         gj.features.push(getPoint(waypoints[i]));
73410                     }
73411                     function getPoints(node, pointname) {
73412                         var pts = get(node, pointname),
73413                             line = [],
73414                             times = [],
73415                             heartRates = [],
73416                             l = pts.length;
73417                         if (l < 2) return {};  // Invalid line in GeoJSON
73418                         for (var i = 0; i < l; i++) {
73419                             var c = coordPair(pts[i]);
73420                             line.push(c.coordinates);
73421                             if (c.time) times.push(c.time);
73422                             if (c.heartRate) heartRates.push(c.heartRate);
73423                         }
73424                         return {
73425                             line: line,
73426                             times: times,
73427                             heartRates: heartRates
73428                         };
73429                     }
73430                     function getTrack(node) {
73431                         var segments = get(node, 'trkseg'),
73432                             track = [],
73433                             times = [],
73434                             heartRates = [],
73435                             line;
73436                         for (var i = 0; i < segments.length; i++) {
73437                             line = getPoints(segments[i], 'trkpt');
73438                             if (line) {
73439                                 if (line.line) track.push(line.line);
73440                                 if (line.times && line.times.length) times.push(line.times);
73441                                 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
73442                             }
73443                         }
73444                         if (track.length === 0) return;
73445                         var properties = getProperties(node);
73446                         extend(properties, getLineStyle(get1(node, 'extensions')));
73447                         if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
73448                         if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
73449                         return {
73450                             type: 'Feature',
73451                             properties: properties,
73452                             geometry: {
73453                                 type: track.length === 1 ? 'LineString' : 'MultiLineString',
73454                                 coordinates: track.length === 1 ? track[0] : track
73455                             }
73456                         };
73457                     }
73458                     function getRoute(node) {
73459                         var line = getPoints(node, 'rtept');
73460                         if (!line.line) return;
73461                         var prop = getProperties(node);
73462                         extend(prop, getLineStyle(get1(node, 'extensions')));
73463                         var routeObj = {
73464                             type: 'Feature',
73465                             properties: prop,
73466                             geometry: {
73467                                 type: 'LineString',
73468                                 coordinates: line.line
73469                             }
73470                         };
73471                         return routeObj;
73472                     }
73473                     function getPoint(node) {
73474                         var prop = getProperties(node);
73475                         extend(prop, getMulti(node, ['sym']));
73476                         return {
73477                             type: 'Feature',
73478                             properties: prop,
73479                             geometry: {
73480                                 type: 'Point',
73481                                 coordinates: coordPair(node).coordinates
73482                             }
73483                         };
73484                     }
73485                     function getLineStyle(extensions) {
73486                         var style = {};
73487                         if (extensions) {
73488                             var lineStyle = get1(extensions, 'line');
73489                             if (lineStyle) {
73490                                 var color = nodeVal(get1(lineStyle, 'color')),
73491                                     opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
73492                                     width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73493                                 if (color) style.stroke = color;
73494                                 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
73495                                 // GPX width is in mm, convert to px with 96 px per inch
73496                                 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
73497                             }
73498                         }
73499                         return style;
73500                     }
73501                     function getProperties(node) {
73502                         var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
73503                             links = get(node, 'link');
73504                         if (links.length) prop.links = [];
73505                         for (var i = 0, link; i < links.length; i++) {
73506                             link = { href: attr(links[i], 'href') };
73507                             extend(link, getMulti(links[i], ['text', 'type']));
73508                             prop.links.push(link);
73509                         }
73510                         return prop;
73511                     }
73512                     return gj;
73513                 }
73514             };
73515             return t;
73516         })();
73517
73518         module.exports = toGeoJSON;
73519         });
73520
73521         var _initialized = false;
73522         var _enabled = false;
73523         var _geojson;
73524
73525
73526         function svgData(projection, context, dispatch) {
73527             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73528             var _showLabels = true;
73529             var detected = utilDetect();
73530             var layer = d3_select(null);
73531             var _vtService;
73532             var _fileList;
73533             var _template;
73534             var _src;
73535
73536
73537             function init() {
73538                 if (_initialized) return;  // run once
73539
73540                 _geojson = {};
73541                 _enabled = true;
73542
73543                 function over() {
73544                     event.stopPropagation();
73545                     event.preventDefault();
73546                     event.dataTransfer.dropEffect = 'copy';
73547                 }
73548
73549                 d3_select('body')
73550                     .attr('dropzone', 'copy')
73551                     .on('drop.svgData', function() {
73552                         event.stopPropagation();
73553                         event.preventDefault();
73554                         if (!detected.filedrop) return;
73555                         drawData.fileList(event.dataTransfer.files);
73556                     })
73557                     .on('dragenter.svgData', over)
73558                     .on('dragexit.svgData', over)
73559                     .on('dragover.svgData', over);
73560
73561                 _initialized = true;
73562             }
73563
73564
73565             function getService() {
73566                 if (services$1.vectorTile && !_vtService) {
73567                     _vtService = services$1.vectorTile;
73568                     _vtService.event.on('loadedData', throttledRedraw);
73569                 } else if (!services$1.vectorTile && _vtService) {
73570                     _vtService = null;
73571                 }
73572
73573                 return _vtService;
73574             }
73575
73576
73577             function showLayer() {
73578                 layerOn();
73579
73580                 layer
73581                     .style('opacity', 0)
73582                     .transition()
73583                     .duration(250)
73584                     .style('opacity', 1)
73585                     .on('end', function () { dispatch.call('change'); });
73586             }
73587
73588
73589             function hideLayer() {
73590                 throttledRedraw.cancel();
73591
73592                 layer
73593                     .transition()
73594                     .duration(250)
73595                     .style('opacity', 0)
73596                     .on('end', layerOff);
73597             }
73598
73599
73600             function layerOn() {
73601                 layer.style('display', 'block');
73602             }
73603
73604
73605             function layerOff() {
73606                 layer.selectAll('.viewfield-group').remove();
73607                 layer.style('display', 'none');
73608             }
73609
73610
73611             // ensure that all geojson features in a collection have IDs
73612             function ensureIDs(gj) {
73613                 if (!gj) return null;
73614
73615                 if (gj.type === 'FeatureCollection') {
73616                     for (var i = 0; i < gj.features.length; i++) {
73617                         ensureFeatureID(gj.features[i]);
73618                     }
73619                 } else {
73620                     ensureFeatureID(gj);
73621                 }
73622                 return gj;
73623             }
73624
73625
73626             // ensure that each single Feature object has a unique ID
73627             function ensureFeatureID(feature) {
73628                 if (!feature) return;
73629                 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
73630                 return feature;
73631             }
73632
73633
73634             // Prefer an array of Features instead of a FeatureCollection
73635             function getFeatures(gj) {
73636                 if (!gj) return [];
73637
73638                 if (gj.type === 'FeatureCollection') {
73639                     return gj.features;
73640                 } else {
73641                     return [gj];
73642                 }
73643             }
73644
73645
73646             function featureKey(d) {
73647                 return d.__featurehash__;
73648             }
73649
73650
73651             function isPolygon(d) {
73652                 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
73653             }
73654
73655
73656             function clipPathID(d) {
73657                 return 'data-' + d.__featurehash__ + '-clippath';
73658             }
73659
73660
73661             function featureClasses(d) {
73662                 return [
73663                     'data' + d.__featurehash__,
73664                     d.geometry.type,
73665                     isPolygon(d) ? 'area' : '',
73666                     d.__layerID__ || ''
73667                 ].filter(Boolean).join(' ');
73668             }
73669
73670
73671             function drawData(selection) {
73672                 var vtService = getService();
73673                 var getPath = svgPath(projection).geojson;
73674                 var getAreaPath = svgPath(projection, null, true).geojson;
73675                 var hasData = drawData.hasData();
73676
73677                 layer = selection.selectAll('.layer-mapdata')
73678                     .data(_enabled && hasData ? [0] : []);
73679
73680                 layer.exit()
73681                     .remove();
73682
73683                 layer = layer.enter()
73684                     .append('g')
73685                     .attr('class', 'layer-mapdata')
73686                     .merge(layer);
73687
73688                 var surface = context.surface();
73689                 if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
73690
73691
73692                 // Gather data
73693                 var geoData, polygonData;
73694                 if (_template && vtService) {   // fetch data from vector tile service
73695                     var sourceID = _template;
73696                     vtService.loadTiles(sourceID, _template, projection);
73697                     geoData = vtService.data(sourceID, projection);
73698                 } else {
73699                     geoData = getFeatures(_geojson);
73700                 }
73701                 geoData = geoData.filter(getPath);
73702                 polygonData = geoData.filter(isPolygon);
73703
73704
73705                 // Draw clip paths for polygons
73706                 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
73707                    .data(polygonData, featureKey);
73708
73709                 clipPaths.exit()
73710                    .remove();
73711
73712                 var clipPathsEnter = clipPaths.enter()
73713                    .append('clipPath')
73714                    .attr('class', 'clipPath-data')
73715                    .attr('id', clipPathID);
73716
73717                 clipPathsEnter
73718                    .append('path');
73719
73720                 clipPaths.merge(clipPathsEnter)
73721                    .selectAll('path')
73722                    .attr('d', getAreaPath);
73723
73724
73725                 // Draw fill, shadow, stroke layers
73726                 var datagroups = layer
73727                     .selectAll('g.datagroup')
73728                     .data(['fill', 'shadow', 'stroke']);
73729
73730                 datagroups = datagroups.enter()
73731                     .append('g')
73732                     .attr('class', function(d) { return 'datagroup datagroup-' + d; })
73733                     .merge(datagroups);
73734
73735
73736                 // Draw paths
73737                 var pathData = {
73738                     fill: polygonData,
73739                     shadow: geoData,
73740                     stroke: geoData
73741                 };
73742
73743                 var paths = datagroups
73744                     .selectAll('path')
73745                     .data(function(layer) { return pathData[layer]; }, featureKey);
73746
73747                 // exit
73748                 paths.exit()
73749                     .remove();
73750
73751                 // enter/update
73752                 paths = paths.enter()
73753                     .append('path')
73754                     .attr('class', function(d) {
73755                         var datagroup = this.parentNode.__data__;
73756                         return 'pathdata ' + datagroup + ' ' + featureClasses(d);
73757                     })
73758                     .attr('clip-path', function(d) {
73759                         var datagroup = this.parentNode.__data__;
73760                         return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
73761                     })
73762                     .merge(paths)
73763                     .attr('d', function(d) {
73764                         var datagroup = this.parentNode.__data__;
73765                         return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
73766                     });
73767
73768
73769                 // Draw labels
73770                 layer
73771                     .call(drawLabels, 'label-halo', geoData)
73772                     .call(drawLabels, 'label', geoData);
73773
73774
73775                 function drawLabels(selection, textClass, data) {
73776                     var labelPath = d3_geoPath(projection);
73777                     var labelData = data.filter(function(d) {
73778                         return _showLabels && d.properties && (d.properties.desc || d.properties.name);
73779                     });
73780
73781                     var labels = selection.selectAll('text.' + textClass)
73782                         .data(labelData, featureKey);
73783
73784                     // exit
73785                     labels.exit()
73786                         .remove();
73787
73788                     // enter/update
73789                     labels = labels.enter()
73790                         .append('text')
73791                         .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
73792                         .merge(labels)
73793                         .text(function(d) {
73794                             return d.properties.desc || d.properties.name;
73795                         })
73796                         .attr('x', function(d) {
73797                             var centroid = labelPath.centroid(d);
73798                             return centroid[0] + 11;
73799                         })
73800                         .attr('y', function(d) {
73801                             var centroid = labelPath.centroid(d);
73802                             return centroid[1];
73803                         });
73804                 }
73805             }
73806
73807
73808             function getExtension(fileName) {
73809                 if (!fileName) return;
73810
73811                 var re = /\.(gpx|kml|(geo)?json)$/i;
73812                 var match = fileName.toLowerCase().match(re);
73813                 return match && match.length && match[0];
73814             }
73815
73816
73817             function xmlToDom(textdata) {
73818                 return (new DOMParser()).parseFromString(textdata, 'text/xml');
73819             }
73820
73821
73822             drawData.setFile = function(extension, data) {
73823                 _template = null;
73824                 _fileList = null;
73825                 _geojson = null;
73826                 _src = null;
73827
73828                 var gj;
73829                 switch (extension) {
73830                     case '.gpx':
73831                         gj = togeojson.gpx(xmlToDom(data));
73832                         break;
73833                     case '.kml':
73834                         gj = togeojson.kml(xmlToDom(data));
73835                         break;
73836                     case '.geojson':
73837                     case '.json':
73838                         gj = JSON.parse(data);
73839                         break;
73840                 }
73841
73842                 gj = gj || {};
73843                 if (Object.keys(gj).length) {
73844                     _geojson = ensureIDs(gj);
73845                     _src = extension + ' data file';
73846                     this.fitZoom();
73847                 }
73848
73849                 dispatch.call('change');
73850                 return this;
73851             };
73852
73853
73854             drawData.showLabels = function(val) {
73855                 if (!arguments.length) return _showLabels;
73856
73857                 _showLabels = val;
73858                 return this;
73859             };
73860
73861
73862             drawData.enabled = function(val) {
73863                 if (!arguments.length) return _enabled;
73864
73865                 _enabled = val;
73866                 if (_enabled) {
73867                     showLayer();
73868                 } else {
73869                     hideLayer();
73870                 }
73871
73872                 dispatch.call('change');
73873                 return this;
73874             };
73875
73876
73877             drawData.hasData = function() {
73878                 var gj = _geojson || {};
73879                 return !!(_template || Object.keys(gj).length);
73880             };
73881
73882
73883             drawData.template = function(val, src) {
73884                 if (!arguments.length) return _template;
73885
73886                 // test source against OSM imagery blacklists..
73887                 var osm = context.connection();
73888                 if (osm) {
73889                     var blacklists = osm.imageryBlacklists();
73890                     var fail = false;
73891                     var tested = 0;
73892                     var regex;
73893
73894                     for (var i = 0; i < blacklists.length; i++) {
73895                         try {
73896                             regex = new RegExp(blacklists[i]);
73897                             fail = regex.test(val);
73898                             tested++;
73899                             if (fail) break;
73900                         } catch (e) {
73901                             /* noop */
73902                         }
73903                     }
73904
73905                     // ensure at least one test was run.
73906                     if (!tested) {
73907                         regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73908                         fail = regex.test(val);
73909                     }
73910                 }
73911
73912                 _template = val;
73913                 _fileList = null;
73914                 _geojson = null;
73915
73916                 // strip off the querystring/hash from the template,
73917                 // it often includes the access token
73918                 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
73919
73920                 dispatch.call('change');
73921                 return this;
73922             };
73923
73924
73925             drawData.geojson = function(gj, src) {
73926                 if (!arguments.length) return _geojson;
73927
73928                 _template = null;
73929                 _fileList = null;
73930                 _geojson = null;
73931                 _src = null;
73932
73933                 gj = gj || {};
73934                 if (Object.keys(gj).length) {
73935                     _geojson = ensureIDs(gj);
73936                     _src = src || 'unknown.geojson';
73937                 }
73938
73939                 dispatch.call('change');
73940                 return this;
73941             };
73942
73943
73944             drawData.fileList = function(fileList) {
73945                 if (!arguments.length) return _fileList;
73946
73947                 _template = null;
73948                 _fileList = fileList;
73949                 _geojson = null;
73950                 _src = null;
73951
73952                 if (!fileList || !fileList.length) return this;
73953                 var f = fileList[0];
73954                 var extension = getExtension(f.name);
73955                 var reader = new FileReader();
73956                 reader.onload = (function() {
73957                     return function(e) {
73958                         drawData.setFile(extension, e.target.result);
73959                     };
73960                 })();
73961
73962                 reader.readAsText(f);
73963
73964                 return this;
73965             };
73966
73967
73968             drawData.url = function(url, defaultExtension) {
73969                 _template = null;
73970                 _fileList = null;
73971                 _geojson = null;
73972                 _src = null;
73973
73974                 // strip off any querystring/hash from the url before checking extension
73975                 var testUrl = url.split(/[?#]/)[0];
73976                 var extension = getExtension(testUrl) || defaultExtension;
73977                 if (extension) {
73978                     _template = null;
73979                     d3_text(url)
73980                         .then(function(data) {
73981                             drawData.setFile(extension, data);
73982                         })
73983                         .catch(function() {
73984                             /* ignore */
73985                         });
73986
73987                 } else {
73988                     drawData.template(url);
73989                 }
73990
73991                 return this;
73992             };
73993
73994
73995             drawData.getSrc = function() {
73996                 return _src || '';
73997             };
73998
73999
74000             drawData.fitZoom = function() {
74001                 var features = getFeatures(_geojson);
74002                 if (!features.length) return;
74003
74004                 var map = context.map();
74005                 var viewport = map.trimmedExtent().polygon();
74006                 var coords = features.reduce(function(coords, feature) {
74007                     var c = feature.geometry.coordinates;
74008
74009                     /* eslint-disable no-fallthrough */
74010                     switch (feature.geometry.type) {
74011                         case 'Point':
74012                             c = [c];
74013                         case 'MultiPoint':
74014                         case 'LineString':
74015                             break;
74016
74017                         case 'MultiPolygon':
74018                             c = utilArrayFlatten(c);
74019                         case 'Polygon':
74020                         case 'MultiLineString':
74021                             c = utilArrayFlatten(c);
74022                             break;
74023                     }
74024                     /* eslint-enable no-fallthrough */
74025
74026                     return utilArrayUnion(coords, c);
74027                 }, []);
74028
74029                 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
74030                     var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
74031                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
74032                 }
74033
74034                 return this;
74035             };
74036
74037
74038             init();
74039             return drawData;
74040         }
74041
74042         function svgDebug(projection, context) {
74043
74044             function drawDebug(selection) {
74045                 var showsTile = context.getDebug('tile');
74046                 var showsCollision = context.getDebug('collision');
74047                 var showsImagery = context.getDebug('imagery');
74048                 var showsCommunity = context.getDebug('community');
74049                 var showsImperial = context.getDebug('imperial');
74050                 var showsDriveLeft = context.getDebug('driveLeft');
74051                 var showsTouchTargets = context.getDebug('target');
74052                 var showsDownloaded = context.getDebug('downloaded');
74053
74054                 var debugData = [];
74055                 if (showsTile) {
74056                     debugData.push({ class: 'red', label: 'tile' });
74057                 }
74058                 if (showsCollision) {
74059                     debugData.push({ class: 'yellow', label: 'collision' });
74060                 }
74061                 if (showsImagery) {
74062                     debugData.push({ class: 'orange', label: 'imagery' });
74063                 }
74064                 if (showsCommunity) {
74065                     debugData.push({ class: 'blue', label: 'community' });
74066                 }
74067                 if (showsImperial) {
74068                     debugData.push({ class: 'cyan', label: 'imperial' });
74069                 }
74070                 if (showsDriveLeft) {
74071                     debugData.push({ class: 'green', label: 'driveLeft' });
74072                 }
74073                 if (showsTouchTargets) {
74074                     debugData.push({ class: 'pink', label: 'touchTargets' });
74075                 }
74076                 if (showsDownloaded) {
74077                     debugData.push({ class: 'purple', label: 'downloaded' });
74078                 }
74079
74080
74081                 var legend = d3_select('#content')
74082                     .selectAll('.debug-legend')
74083                     .data(debugData.length ? [0] : []);
74084
74085                 legend.exit()
74086                     .remove();
74087
74088                 legend = legend.enter()
74089                     .append('div')
74090                     .attr('class', 'fillD debug-legend')
74091                     .merge(legend);
74092
74093
74094                 var legendItems = legend.selectAll('.debug-legend-item')
74095                     .data(debugData, function(d) { return d.label; });
74096
74097                 legendItems.exit()
74098                     .remove();
74099
74100                 legendItems.enter()
74101                     .append('span')
74102                     .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
74103                     .text(function(d) { return d.label; });
74104
74105
74106                 var layer = selection.selectAll('.layer-debug')
74107                     .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft || showsDownloaded ? [0] : []);
74108
74109                 layer.exit()
74110                     .remove();
74111
74112                 layer = layer.enter()
74113                     .append('g')
74114                     .attr('class', 'layer-debug')
74115                     .merge(layer);
74116
74117
74118                 // imagery
74119                 var extent = context.map().extent();
74120                 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
74121                 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
74122
74123                 var imagery = layer.selectAll('path.debug-imagery')
74124                     .data(features);
74125
74126                 imagery.exit()
74127                     .remove();
74128
74129                 imagery.enter()
74130                     .append('path')
74131                     .attr('class', 'debug-imagery debug orange');
74132
74133
74134                 // community index
74135                 var community = layer.selectAll('path.debug-community')
74136                     .data(showsCommunity ? Object.values(data.community.features) : []);
74137
74138                 community.exit()
74139                     .remove();
74140
74141                 community.enter()
74142                     .append('path')
74143                     .attr('class', 'debug-community debug blue');
74144
74145
74146                 // imperial
74147                 var imperial = layer
74148                     .selectAll('path.debug-imperial')
74149                     .data(showsImperial ? [dataImperial] : []);
74150
74151                 imperial.exit()
74152                     .remove();
74153
74154                 imperial.enter()
74155                     .append('path')
74156                     .attr('class', 'debug-imperial debug cyan');
74157
74158
74159                 // driveleft
74160                 var driveLeft = layer
74161                     .selectAll('path.debug-drive-left')
74162                     .data(showsDriveLeft ? [dataDriveLeft] : []);
74163
74164                 driveLeft.exit()
74165                     .remove();
74166
74167                 driveLeft.enter()
74168                     .append('path')
74169                     .attr('class', 'debug-drive-left debug green');
74170
74171
74172                 // downloaded
74173                 var osm = context.connection();
74174                 var dataDownloaded = [];
74175
74176                 if (osm) {
74177                     var rtree = osm.caches('get').tile.rtree;
74178                     dataDownloaded = rtree.all().map(function(bbox) {
74179                         return {
74180                             type: 'Feature',
74181                             properties: { id: bbox.id },
74182                             geometry: {
74183                                 type: 'Polygon',
74184                                 coordinates: [[
74185                                     [ bbox.minX, bbox.minY ],
74186                                     [ bbox.minX, bbox.maxY ],
74187                                     [ bbox.maxX, bbox.maxY ],
74188                                     [ bbox.maxX, bbox.minY ],
74189                                     [ bbox.minX, bbox.minY ]
74190                                 ]]
74191                             }
74192                         };
74193                     });
74194                 }
74195
74196
74197                 var downloaded = layer
74198                     .selectAll('path.debug-downloaded')
74199                     .data(showsDownloaded ? dataDownloaded : []);
74200
74201                 downloaded.exit()
74202                     .remove();
74203
74204                 downloaded.enter()
74205                     .append('path')
74206                     .attr('class', 'debug-downloaded debug purple');
74207
74208
74209                 // update
74210                 layer.selectAll('path')
74211                     .attr('d', svgPath(projection).geojson);
74212             }
74213
74214
74215             // This looks strange because `enabled` methods on other layers are
74216             // chainable getter/setters, and this one is just a getter.
74217             drawDebug.enabled = function() {
74218                 if (!arguments.length) {
74219                     return context.getDebug('tile') ||
74220                         context.getDebug('collision') ||
74221                         context.getDebug('imagery') ||
74222                         context.getDebug('imperial') ||
74223                         context.getDebug('driveLeft') ||
74224                         context.getDebug('target') ||
74225                         context.getDebug('downloaded');
74226                 } else {
74227                     return this;
74228                 }
74229             };
74230
74231
74232             return drawDebug;
74233         }
74234
74235         var _keepRightEnabled = false;
74236         var _keepRightService;
74237
74238
74239         function svgKeepRight(projection, context, dispatch) {
74240             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
74241             var minZoom = 12;
74242             var touchLayer = d3_select(null);
74243             var drawLayer = d3_select(null);
74244             var _keepRightVisible = false;
74245
74246
74247             function markerPath(selection, klass) {
74248                 selection
74249                     .attr('class', klass)
74250                     .attr('transform', 'translate(-4, -24)')
74251                     .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
74252             }
74253
74254
74255             // Loosely-coupled keepRight service for fetching errors.
74256             function getService() {
74257                 if (services$1.keepRight && !_keepRightService) {
74258                     _keepRightService = services$1.keepRight;
74259                     _keepRightService.on('loaded', throttledRedraw);
74260                 } else if (!services$1.keepRight && _keepRightService) {
74261                     _keepRightService = null;
74262                 }
74263
74264                 return _keepRightService;
74265             }
74266
74267
74268             // Show the errors
74269             function editOn() {
74270                 if (!_keepRightVisible) {
74271                     _keepRightVisible = true;
74272                     drawLayer
74273                         .style('display', 'block');
74274                 }
74275             }
74276
74277
74278             // Immediately remove the errors and their touch targets
74279             function editOff() {
74280                 if (_keepRightVisible) {
74281                     _keepRightVisible = false;
74282                     drawLayer
74283                         .style('display', 'none');
74284                     drawLayer.selectAll('.qa_error.keepRight')
74285                         .remove();
74286                     touchLayer.selectAll('.qa_error.keepRight')
74287                         .remove();
74288                 }
74289             }
74290
74291
74292             // Enable the layer.  This shows the errors and transitions them to visible.
74293             function layerOn() {
74294                 editOn();
74295
74296                 drawLayer
74297                     .style('opacity', 0)
74298                     .transition()
74299                     .duration(250)
74300                     .style('opacity', 1)
74301                     .on('end interrupt', function () {
74302                         dispatch.call('change');
74303                     });
74304             }
74305
74306
74307             // Disable the layer.  This transitions the layer invisible and then hides the errors.
74308             function layerOff() {
74309                 throttledRedraw.cancel();
74310                 drawLayer.interrupt();
74311                 touchLayer.selectAll('.qa_error.keepRight')
74312                     .remove();
74313
74314                 drawLayer
74315                     .transition()
74316                     .duration(250)
74317                     .style('opacity', 0)
74318                     .on('end interrupt', function () {
74319                         editOff();
74320                         dispatch.call('change');
74321                     });
74322             }
74323
74324
74325             // Update the error markers
74326             function updateMarkers() {
74327                 if (!_keepRightVisible || !_keepRightEnabled) return;
74328
74329                 var service = getService();
74330                 var selectedID = context.selectedErrorID();
74331                 var data = (service ? service.getErrors(projection) : []);
74332                 var getTransform = svgPointTransform(projection);
74333
74334                 // Draw markers..
74335                 var markers = drawLayer.selectAll('.qa_error.keepRight')
74336                     .data(data, function(d) { return d.id; });
74337
74338                 // exit
74339                 markers.exit()
74340                     .remove();
74341
74342                 // enter
74343                 var markersEnter = markers.enter()
74344                     .append('g')
74345                     .attr('class', function(d) {
74346                         return [
74347                             'qa_error',
74348                             d.service,
74349                             'error_id-' + d.id,
74350                             'error_type-' + d.parent_error_type
74351                         ].join(' ');
74352                     });
74353
74354                 markersEnter
74355                     .append('ellipse')
74356                     .attr('cx', 0.5)
74357                     .attr('cy', 1)
74358                     .attr('rx', 6.5)
74359                     .attr('ry', 3)
74360                     .attr('class', 'stroke');
74361
74362                 markersEnter
74363                     .append('path')
74364                     .call(markerPath, 'shadow');
74365
74366                 markersEnter
74367                     .append('use')
74368                     .attr('class', 'qa_error-fill')
74369                     .attr('width', '20px')
74370                     .attr('height', '20px')
74371                     .attr('x', '-8px')
74372                     .attr('y', '-22px')
74373                     .attr('xlink:href', '#iD-icon-bolt');
74374
74375                 // update
74376                 markers
74377                     .merge(markersEnter)
74378                     .sort(sortY)
74379                     .classed('selected', function(d) { return d.id === selectedID; })
74380                     .attr('transform', getTransform);
74381
74382
74383                 // Draw targets..
74384                 if (touchLayer.empty()) return;
74385                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
74386
74387                 var targets = touchLayer.selectAll('.qa_error.keepRight')
74388                     .data(data, function(d) { return d.id; });
74389
74390                 // exit
74391                 targets.exit()
74392                     .remove();
74393
74394                 // enter/update
74395                 targets.enter()
74396                     .append('rect')
74397                     .attr('width', '20px')
74398                     .attr('height', '20px')
74399                     .attr('x', '-8px')
74400                     .attr('y', '-22px')
74401                     .merge(targets)
74402                     .sort(sortY)
74403                     .attr('class', function(d) {
74404                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
74405                     })
74406                     .attr('transform', getTransform);
74407
74408
74409                 function sortY(a, b) {
74410                     return (a.id === selectedID) ? 1
74411                         : (b.id === selectedID) ? -1
74412                         : (a.severity === 'error' && b.severity !== 'error') ? 1
74413                         : (b.severity === 'error' && a.severity !== 'error') ? -1
74414                         : b.loc[1] - a.loc[1];
74415                 }
74416             }
74417
74418
74419             // Draw the keepRight layer and schedule loading errors and updating markers.
74420             function drawKeepRight(selection) {
74421                 var service = getService();
74422
74423                 var surface = context.surface();
74424                 if (surface && !surface.empty()) {
74425                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
74426                 }
74427
74428                 drawLayer = selection.selectAll('.layer-keepRight')
74429                     .data(service ? [0] : []);
74430
74431                 drawLayer.exit()
74432                     .remove();
74433
74434                 drawLayer = drawLayer.enter()
74435                     .append('g')
74436                     .attr('class', 'layer-keepRight')
74437                     .style('display', _keepRightEnabled ? 'block' : 'none')
74438                     .merge(drawLayer);
74439
74440                 if (_keepRightEnabled) {
74441                     if (service && ~~context.map().zoom() >= minZoom) {
74442                         editOn();
74443                         service.loadErrors(projection);
74444                         updateMarkers();
74445                     } else {
74446                         editOff();
74447                     }
74448                 }
74449             }
74450
74451
74452             // Toggles the layer on and off
74453             drawKeepRight.enabled = function(val) {
74454                 if (!arguments.length) return _keepRightEnabled;
74455
74456                 _keepRightEnabled = val;
74457                 if (_keepRightEnabled) {
74458                     layerOn();
74459                 } else {
74460                     layerOff();
74461                     if (context.selectedErrorID()) {
74462                         context.enter(modeBrowse(context));
74463                     }
74464                 }
74465
74466                 dispatch.call('change');
74467                 return this;
74468             };
74469
74470
74471             drawKeepRight.supported = function() {
74472                 return !!getService();
74473             };
74474
74475
74476             return drawKeepRight;
74477         }
74478
74479         function svgGeolocate(projection) {
74480             var layer = d3_select(null);
74481             var _position;
74482
74483
74484             function init() {
74485                 if (svgGeolocate.initialized) return;  // run once
74486                 svgGeolocate.enabled = false;
74487                 svgGeolocate.initialized = true;
74488             }
74489
74490             function showLayer() {
74491                 layer.style('display', 'block');
74492             }
74493
74494
74495             function hideLayer() {
74496                 layer
74497                     .transition()
74498                     .duration(250)
74499                     .style('opacity', 0);
74500             }
74501
74502             function layerOn() {
74503                 layer
74504                     .style('opacity', 0)
74505                     .transition()
74506                     .duration(250)
74507                     .style('opacity', 1);
74508
74509             }
74510
74511             function layerOff() {
74512                 layer.style('display', 'none');
74513             }
74514
74515             function transform(d) {
74516                 return svgPointTransform(projection)(d);
74517             }
74518
74519             function accuracy(accuracy, loc) { // converts accuracy to pixels...
74520                 var degreesRadius = geoMetersToLat(accuracy),
74521                     tangentLoc = [loc[0], loc[1] + degreesRadius],
74522                     projectedTangent = projection(tangentLoc),
74523                     projectedLoc = projection([loc[0], loc[1]]);
74524
74525                 // southern most point will have higher pixel value...
74526                return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
74527             }
74528
74529             function update() {
74530                 var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
74531
74532                 var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
74533                     .data([geolocation]);
74534
74535                 groups.exit()
74536                     .remove();
74537
74538                 var pointsEnter = groups.enter()
74539                     .append('g')
74540                     .attr('class', 'geolocation');
74541
74542                 pointsEnter
74543                     .append('circle')
74544                     .attr('id', 'geolocate-radius')
74545                     .attr('dx', '0')
74546                     .attr('dy', '0')
74547                     .attr('fill', 'rgb(15,128,225)')
74548                     .attr('fill-opacity', '0.3')
74549                     .attr('r', '0');
74550
74551                 pointsEnter
74552                     .append('circle')
74553                     .attr('dx', '0')
74554                     .attr('dy', '0')
74555                     .attr('fill', 'rgb(15,128,225)')
74556                     .attr('stroke', 'white')
74557                     .attr('stroke-width', '1.5')
74558                     .attr('r', '6');
74559
74560                 groups.merge(pointsEnter)
74561                     .attr('transform', transform);
74562
74563                 d3_select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
74564             }
74565
74566             function drawLocation(selection) {
74567                 var enabled = svgGeolocate.enabled;
74568
74569                 layer = selection.selectAll('.layer-geolocate')
74570                     .data([0]);
74571
74572                 layer.exit()
74573                     .remove();
74574
74575                 var layerEnter = layer.enter()
74576                     .append('g')
74577                     .attr('class', 'layer-geolocate')
74578                     .style('display', enabled ? 'block' : 'none');
74579
74580                 layerEnter
74581                     .append('g')
74582                     .attr('class', 'geolocations');
74583
74584                 layer = layerEnter
74585                     .merge(layer);
74586
74587                 if (enabled) {
74588                     update();
74589                 } else {
74590                     layerOff();
74591                 }
74592             }
74593
74594             drawLocation.enabled = function (position, enabled) {
74595                 if (!arguments.length) return svgGeolocate.enabled;
74596                 _position = position;
74597                 svgGeolocate.enabled = enabled;
74598                 if (svgGeolocate.enabled) {
74599                     showLayer();
74600                     layerOn();
74601                 } else {
74602                     hideLayer();
74603                 }
74604                 return this;
74605             };
74606
74607             init();
74608             return drawLocation;
74609         }
74610
74611         function svgLabels(projection, context) {
74612             var path = d3_geoPath(projection);
74613             var detected = utilDetect();
74614             var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
74615             var _rdrawn = rbush_1();
74616             var _rskipped = rbush_1();
74617             var _textWidthCache = {};
74618             var _entitybboxes = {};
74619
74620             // Listed from highest to lowest priority
74621             var labelStack = [
74622                 ['line', 'aeroway', '*', 12],
74623                 ['line', 'highway', 'motorway', 12],
74624                 ['line', 'highway', 'trunk', 12],
74625                 ['line', 'highway', 'primary', 12],
74626                 ['line', 'highway', 'secondary', 12],
74627                 ['line', 'highway', 'tertiary', 12],
74628                 ['line', 'highway', '*', 12],
74629                 ['line', 'railway', '*', 12],
74630                 ['line', 'waterway', '*', 12],
74631                 ['area', 'aeroway', '*', 12],
74632                 ['area', 'amenity', '*', 12],
74633                 ['area', 'building', '*', 12],
74634                 ['area', 'historic', '*', 12],
74635                 ['area', 'leisure', '*', 12],
74636                 ['area', 'man_made', '*', 12],
74637                 ['area', 'natural', '*', 12],
74638                 ['area', 'shop', '*', 12],
74639                 ['area', 'tourism', '*', 12],
74640                 ['area', 'camp_site', '*', 12],
74641                 ['point', 'aeroway', '*', 10],
74642                 ['point', 'amenity', '*', 10],
74643                 ['point', 'building', '*', 10],
74644                 ['point', 'historic', '*', 10],
74645                 ['point', 'leisure', '*', 10],
74646                 ['point', 'man_made', '*', 10],
74647                 ['point', 'natural', '*', 10],
74648                 ['point', 'shop', '*', 10],
74649                 ['point', 'tourism', '*', 10],
74650                 ['point', 'camp_site', '*', 10],
74651                 ['line', 'name', '*', 12],
74652                 ['area', 'name', '*', 12],
74653                 ['point', 'name', '*', 10]
74654             ];
74655
74656
74657             function blacklisted(preset) {
74658                 var noIcons = ['building', 'landuse', 'natural'];
74659                 return noIcons.some(function(s) {
74660                     return preset.id.indexOf(s) >= 0;
74661                 });
74662             }
74663
74664
74665             function get(array, prop) {
74666                 return function(d, i) { return array[i][prop]; };
74667             }
74668
74669
74670             function textWidth(text, size, elem) {
74671                 var c = _textWidthCache[size];
74672                 if (!c) c = _textWidthCache[size] = {};
74673
74674                 if (c[text]) {
74675                     return c[text];
74676
74677                 } else if (elem) {
74678                     c[text] = elem.getComputedTextLength();
74679                     return c[text];
74680
74681                 } else {
74682                     var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
74683                     if (str === null) {
74684                         return size / 3 * 2 * text.length;
74685                     } else {
74686                         return size / 3 * (2 * text.length + str.length);
74687                     }
74688                 }
74689             }
74690
74691
74692             function drawLinePaths(selection, entities, filter, classes, labels) {
74693                 var paths = selection.selectAll('path')
74694                     .filter(filter)
74695                     .data(entities, osmEntity.key);
74696
74697                 // exit
74698                 paths.exit()
74699                     .remove();
74700
74701                 // enter/update
74702                 paths.enter()
74703                     .append('path')
74704                     .style('stroke-width', get(labels, 'font-size'))
74705                     .attr('id', function(d) { return 'labelpath-' + d.id; })
74706                     .attr('class', classes)
74707                     .merge(paths)
74708                     .attr('d', get(labels, 'lineString'));
74709             }
74710
74711
74712             function drawLineLabels(selection, entities, filter, classes, labels) {
74713                 var texts = selection.selectAll('text.' + classes)
74714                     .filter(filter)
74715                     .data(entities, osmEntity.key);
74716
74717                 // exit
74718                 texts.exit()
74719                     .remove();
74720
74721                 // enter
74722                 texts.enter()
74723                     .append('text')
74724                     .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
74725                     .attr('dy', baselineHack ? '0.35em' : null)
74726                     .append('textPath')
74727                     .attr('class', 'textpath');
74728
74729                 // update
74730                 selection.selectAll('text.' + classes).selectAll('.textpath')
74731                     .filter(filter)
74732                     .data(entities, osmEntity.key)
74733                     .attr('startOffset', '50%')
74734                     .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
74735                     .text(utilDisplayNameForPath);
74736             }
74737
74738
74739             function drawPointLabels(selection, entities, filter, classes, labels) {
74740                 var texts = selection.selectAll('text.' + classes)
74741                     .filter(filter)
74742                     .data(entities, osmEntity.key);
74743
74744                 // exit
74745                 texts.exit()
74746                     .remove();
74747
74748                 // enter/update
74749                 texts.enter()
74750                     .append('text')
74751                     .attr('class', function(d, i) {
74752                         return classes + ' ' + labels[i].classes + ' ' + d.id;
74753                     })
74754                     .merge(texts)
74755                     .attr('x', get(labels, 'x'))
74756                     .attr('y', get(labels, 'y'))
74757                     .style('text-anchor', get(labels, 'textAnchor'))
74758                     .text(utilDisplayName)
74759                     .each(function(d, i) {
74760                         textWidth(utilDisplayName(d), labels[i].height, this);
74761                     });
74762             }
74763
74764
74765             function drawAreaLabels(selection, entities, filter, classes, labels) {
74766                 entities = entities.filter(hasText);
74767                 labels = labels.filter(hasText);
74768                 drawPointLabels(selection, entities, filter, classes, labels);
74769
74770                 function hasText(d, i) {
74771                     return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
74772                 }
74773             }
74774
74775
74776             function drawAreaIcons(selection, entities, filter, classes, labels) {
74777                 var icons = selection.selectAll('use.' + classes)
74778                     .filter(filter)
74779                     .data(entities, osmEntity.key);
74780
74781                 // exit
74782                 icons.exit()
74783                     .remove();
74784
74785                 // enter/update
74786                 icons.enter()
74787                     .append('use')
74788                     .attr('class', 'icon ' + classes)
74789                     .attr('width', '17px')
74790                     .attr('height', '17px')
74791                     .merge(icons)
74792                     .attr('transform', get(labels, 'transform'))
74793                     .attr('xlink:href', function(d) {
74794                         var preset = context.presets().match(d, context.graph());
74795                         var picon = preset && preset.icon;
74796
74797                         if (!picon) {
74798                             return '';
74799                         } else {
74800                             var isMaki = /^maki-/.test(picon);
74801                             return '#' + picon + (isMaki ? '-15' : '');
74802                         }
74803                     });
74804             }
74805
74806
74807             function drawCollisionBoxes(selection, rtree, which) {
74808                 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
74809
74810                 var gj = [];
74811                 if (context.getDebug('collision')) {
74812                     gj = rtree.all().map(function(d) {
74813                         return { type: 'Polygon', coordinates: [[
74814                             [d.minX, d.minY],
74815                             [d.maxX, d.minY],
74816                             [d.maxX, d.maxY],
74817                             [d.minX, d.maxY],
74818                             [d.minX, d.minY]
74819                         ]]};
74820                     });
74821                 }
74822
74823                 var boxes = selection.selectAll('.' + which)
74824                     .data(gj);
74825
74826                 // exit
74827                 boxes.exit()
74828                     .remove();
74829
74830                 // enter/update
74831                 boxes.enter()
74832                     .append('path')
74833                     .attr('class', classes)
74834                     .merge(boxes)
74835                     .attr('d', d3_geoPath());
74836             }
74837
74838
74839             function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
74840                 var wireframe = context.surface().classed('fill-wireframe');
74841                 var zoom = geoScaleToZoom(projection.scale());
74842
74843                 var labelable = [];
74844                 var renderNodeAs = {};
74845                 var i, j, k, entity, geometry;
74846
74847                 for (i = 0; i < labelStack.length; i++) {
74848                     labelable.push([]);
74849                 }
74850
74851                 if (fullRedraw) {
74852                     _rdrawn.clear();
74853                     _rskipped.clear();
74854                     _entitybboxes = {};
74855
74856                 } else {
74857                     for (i = 0; i < entities.length; i++) {
74858                         entity = entities[i];
74859                         var toRemove = []
74860                             .concat(_entitybboxes[entity.id] || [])
74861                             .concat(_entitybboxes[entity.id + 'I'] || []);
74862
74863                         for (j = 0; j < toRemove.length; j++) {
74864                             _rdrawn.remove(toRemove[j]);
74865                             _rskipped.remove(toRemove[j]);
74866                         }
74867                     }
74868                 }
74869
74870                 // Loop through all the entities to do some preprocessing
74871                 for (i = 0; i < entities.length; i++) {
74872                     entity = entities[i];
74873                     geometry = entity.geometry(graph);
74874
74875                     // Insert collision boxes around interesting points/vertices
74876                     if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
74877                         var hasDirections = entity.directions(graph, projection).length;
74878                         var markerPadding;
74879
74880                         if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
74881                             renderNodeAs[entity.id] = 'point';
74882                             markerPadding = 20;   // extra y for marker height
74883                         } else {
74884                             renderNodeAs[entity.id] = 'vertex';
74885                             markerPadding = 0;
74886                         }
74887
74888                         var coord = projection(entity.loc);
74889                         var nodePadding = 10;
74890                         var bbox = {
74891                             minX: coord[0] - nodePadding,
74892                             minY: coord[1] - nodePadding - markerPadding,
74893                             maxX: coord[0] + nodePadding,
74894                             maxY: coord[1] + nodePadding
74895                         };
74896
74897                         doInsert(bbox, entity.id + 'P');
74898                     }
74899
74900                     // From here on, treat vertices like points
74901                     if (geometry === 'vertex') {
74902                         geometry = 'point';
74903                     }
74904
74905                     // Determine which entities are label-able
74906                     var preset = geometry === 'area' && context.presets().match(entity, graph);
74907                     var icon = preset && !blacklisted(preset) && preset.icon;
74908
74909                     if (!icon && !utilDisplayName(entity))
74910                         continue;
74911
74912                     for (k = 0; k < labelStack.length; k++) {
74913                         var matchGeom = labelStack[k][0];
74914                         var matchKey = labelStack[k][1];
74915                         var matchVal = labelStack[k][2];
74916                         var hasVal = entity.tags[matchKey];
74917
74918                         if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
74919                             labelable[k].push(entity);
74920                             break;
74921                         }
74922                     }
74923                 }
74924
74925                 var positions = {
74926                     point: [],
74927                     line: [],
74928                     area: []
74929                 };
74930
74931                 var labelled = {
74932                     point: [],
74933                     line: [],
74934                     area: []
74935                 };
74936
74937                 // Try and find a valid label for labellable entities
74938                 for (k = 0; k < labelable.length; k++) {
74939                     var fontSize = labelStack[k][3];
74940
74941                     for (i = 0; i < labelable[k].length; i++) {
74942                         entity = labelable[k][i];
74943                         geometry = entity.geometry(graph);
74944
74945                         var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
74946                         var name = getName(entity);
74947                         var width = name && textWidth(name, fontSize);
74948                         var p = null;
74949
74950                         if (geometry === 'point' || geometry === 'vertex') {
74951                             // no point or vertex labels in wireframe mode
74952                             // no vertex labels at low zooms (vertices have no icons)
74953                             if (wireframe) continue;
74954                             var renderAs = renderNodeAs[entity.id];
74955                             if (renderAs === 'vertex' && zoom < 17) continue;
74956
74957                             p = getPointLabel(entity, width, fontSize, renderAs);
74958
74959                         } else if (geometry === 'line') {
74960                             p = getLineLabel(entity, width, fontSize);
74961
74962                         } else if (geometry === 'area') {
74963                             p = getAreaLabel(entity, width, fontSize);
74964                         }
74965
74966                         if (p) {
74967                             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
74968                             p.classes = geometry + ' tag-' + labelStack[k][1];
74969                             positions[geometry].push(p);
74970                             labelled[geometry].push(entity);
74971                         }
74972                     }
74973                 }
74974
74975
74976                 function isInterestingVertex(entity) {
74977                     var selectedIDs = context.selectedIDs();
74978
74979                     return entity.hasInterestingTags() ||
74980                         entity.isEndpoint(graph) ||
74981                         entity.isConnected(graph) ||
74982                         selectedIDs.indexOf(entity.id) !== -1 ||
74983                         graph.parentWays(entity).some(function(parent) {
74984                             return selectedIDs.indexOf(parent.id) !== -1;
74985                         });
74986                 }
74987
74988
74989                 function getPointLabel(entity, width, height, geometry) {
74990                     var y = (geometry === 'point' ? -12 : 0);
74991                     var pointOffsets = {
74992                         ltr: [15, y, 'start'],
74993                         rtl: [-15, y, 'end']
74994                     };
74995
74996                     var coord = projection(entity.loc);
74997                     var textPadding = 2;
74998                     var offset = pointOffsets[textDirection];
74999                     var p = {
75000                         height: height,
75001                         width: width,
75002                         x: coord[0] + offset[0],
75003                         y: coord[1] + offset[1],
75004                         textAnchor: offset[2]
75005                     };
75006
75007                     // insert a collision box for the text label..
75008                     var bbox;
75009                     if (textDirection === 'rtl') {
75010                         bbox = {
75011                             minX: p.x - width - textPadding,
75012                             minY: p.y - (height / 2) - textPadding,
75013                             maxX: p.x + textPadding,
75014                             maxY: p.y + (height / 2) + textPadding
75015                         };
75016                     } else {
75017                         bbox = {
75018                             minX: p.x - textPadding,
75019                             minY: p.y - (height / 2) - textPadding,
75020                             maxX: p.x + width + textPadding,
75021                             maxY: p.y + (height / 2) + textPadding
75022                         };
75023                     }
75024
75025                     if (tryInsert([bbox], entity.id, true)) {
75026                         return p;
75027                     }
75028                 }
75029
75030
75031                 function getLineLabel(entity, width, height) {
75032                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
75033                     var points = graph.childNodes(entity)
75034                         .map(function(node) { return projection(node.loc); });
75035                     var length = geoPathLength(points);
75036
75037                     if (length < width + 20) return;
75038
75039                     // todo: properly clip points to viewport
75040
75041                     // % along the line to attempt to place the label
75042                     var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
75043                                        25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
75044                     var padding = 3;
75045
75046                     for (var i = 0; i < lineOffsets.length; i++) {
75047                         var offset = lineOffsets[i];
75048                         var middle = offset / 100 * length;
75049                         var start = middle - width / 2;
75050
75051                         if (start < 0 || start + width > length) continue;
75052
75053                         // generate subpath and ignore paths that are invalid or don't cross viewport.
75054                         var sub = subpath(points, start, start + width);
75055                         if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
75056                             continue;
75057                         }
75058
75059                         var isReverse = reverse(sub);
75060                         if (isReverse) {
75061                             sub = sub.reverse();
75062                         }
75063
75064                         var bboxes = [];
75065                         var boxsize = (height + 2) / 2;
75066
75067                         for (var j = 0; j < sub.length - 1; j++) {
75068                             var a = sub[j];
75069                             var b = sub[j + 1];
75070
75071                             // split up the text into small collision boxes
75072                             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
75073
75074                             for (var box = 0; box < num; box++) {
75075                                 var p = geoVecInterp(a, b, box / num);
75076                                 var x0 = p[0] - boxsize - padding;
75077                                 var y0 = p[1] - boxsize - padding;
75078                                 var x1 = p[0] + boxsize + padding;
75079                                 var y1 = p[1] + boxsize + padding;
75080
75081                                 bboxes.push({
75082                                     minX: Math.min(x0, x1),
75083                                     minY: Math.min(y0, y1),
75084                                     maxX: Math.max(x0, x1),
75085                                     maxY: Math.max(y0, y1)
75086                                 });
75087                             }
75088                         }
75089
75090                         if (tryInsert(bboxes, entity.id, false)) {   // accept this one
75091                             return {
75092                                 'font-size': height + 2,
75093                                 lineString: lineString(sub),
75094                                 startOffset: offset + '%'
75095                             };
75096                         }
75097                     }
75098
75099                     function reverse(p) {
75100                         var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
75101                         return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
75102                     }
75103
75104                     function lineString(points) {
75105                         return 'M' + points.join('L');
75106                     }
75107
75108                     function subpath(points, from, to) {
75109                         var sofar = 0;
75110                         var start, end, i0, i1;
75111
75112                         for (var i = 0; i < points.length - 1; i++) {
75113                             var a = points[i];
75114                             var b = points[i + 1];
75115                             var current = geoVecLength(a, b);
75116                             var portion;
75117                             if (!start && sofar + current >= from) {
75118                                 portion = (from - sofar) / current;
75119                                 start = [
75120                                     a[0] + portion * (b[0] - a[0]),
75121                                     a[1] + portion * (b[1] - a[1])
75122                                 ];
75123                                 i0 = i + 1;
75124                             }
75125                             if (!end && sofar + current >= to) {
75126                                 portion = (to - sofar) / current;
75127                                 end = [
75128                                     a[0] + portion * (b[0] - a[0]),
75129                                     a[1] + portion * (b[1] - a[1])
75130                                 ];
75131                                 i1 = i + 1;
75132                             }
75133                             sofar += current;
75134                         }
75135
75136                         var result = points.slice(i0, i1);
75137                         result.unshift(start);
75138                         result.push(end);
75139                         return result;
75140                     }
75141                 }
75142
75143
75144                 function getAreaLabel(entity, width, height) {
75145                     var centroid = path.centroid(entity.asGeoJSON(graph, true));
75146                     var extent = entity.extent(graph);
75147                     var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
75148
75149                     if (isNaN(centroid[0]) || areaWidth < 20) return;
75150
75151                     var preset = context.presets().match(entity, context.graph());
75152                     var picon = preset && preset.icon;
75153                     var iconSize = 17;
75154                     var padding = 2;
75155                     var p = {};
75156
75157                     if (picon) {  // icon and label..
75158                         if (addIcon()) {
75159                             addLabel(iconSize + padding);
75160                             return p;
75161                         }
75162                     } else {   // label only..
75163                         if (addLabel(0)) {
75164                             return p;
75165                         }
75166                     }
75167
75168
75169                     function addIcon() {
75170                         var iconX = centroid[0] - (iconSize / 2);
75171                         var iconY = centroid[1] - (iconSize / 2);
75172                         var bbox = {
75173                             minX: iconX,
75174                             minY: iconY,
75175                             maxX: iconX + iconSize,
75176                             maxY: iconY + iconSize
75177                         };
75178
75179                         if (tryInsert([bbox], entity.id + 'I', true)) {
75180                             p.transform = 'translate(' + iconX + ',' + iconY + ')';
75181                             return true;
75182                         }
75183                         return false;
75184                     }
75185
75186                     function addLabel(yOffset) {
75187                         if (width && areaWidth >= width + 20) {
75188                             var labelX = centroid[0];
75189                             var labelY = centroid[1] + yOffset;
75190                             var bbox = {
75191                                 minX: labelX - (width / 2) - padding,
75192                                 minY: labelY - (height / 2) - padding,
75193                                 maxX: labelX + (width / 2) + padding,
75194                                 maxY: labelY + (height / 2) + padding
75195                             };
75196
75197                             if (tryInsert([bbox], entity.id, true)) {
75198                                 p.x = labelX;
75199                                 p.y = labelY;
75200                                 p.textAnchor = 'middle';
75201                                 p.height = height;
75202                                 return true;
75203                             }
75204                         }
75205                         return false;
75206                     }
75207                 }
75208
75209
75210                 // force insert a singular bounding box
75211                 // singular box only, no array, id better be unique
75212                 function doInsert(bbox, id) {
75213                     bbox.id = id;
75214
75215                     var oldbox = _entitybboxes[id];
75216                     if (oldbox) {
75217                         _rdrawn.remove(oldbox);
75218                     }
75219                     _entitybboxes[id] = bbox;
75220                     _rdrawn.insert(bbox);
75221                 }
75222
75223
75224                 function tryInsert(bboxes, id, saveSkipped) {
75225                     var skipped = false;
75226
75227                     for (var i = 0; i < bboxes.length; i++) {
75228                         var bbox = bboxes[i];
75229                         bbox.id = id;
75230
75231                         // Check that label is visible
75232                         if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
75233                             skipped = true;
75234                             break;
75235                         }
75236                         if (_rdrawn.collides(bbox)) {
75237                             skipped = true;
75238                             break;
75239                         }
75240                     }
75241
75242                     _entitybboxes[id] = bboxes;
75243
75244                     if (skipped) {
75245                         if (saveSkipped) {
75246                             _rskipped.load(bboxes);
75247                         }
75248                     } else {
75249                         _rdrawn.load(bboxes);
75250                     }
75251
75252                     return !skipped;
75253                 }
75254
75255
75256                 var layer = selection.selectAll('.layer-osm.labels');
75257                 layer.selectAll('.labels-group')
75258                     .data(['halo', 'label', 'debug'])
75259                     .enter()
75260                     .append('g')
75261                     .attr('class', function(d) { return 'labels-group ' + d; });
75262
75263                 var halo = layer.selectAll('.labels-group.halo');
75264                 var label = layer.selectAll('.labels-group.label');
75265                 var debug = layer.selectAll('.labels-group.debug');
75266
75267                 // points
75268                 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
75269                 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
75270
75271                 // lines
75272                 drawLinePaths(layer, labelled.line, filter, '', positions.line);
75273                 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
75274                 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
75275
75276                 // areas
75277                 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
75278                 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
75279                 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
75280                 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
75281
75282                 // debug
75283                 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
75284                 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
75285
75286                 layer.call(filterLabels);
75287             }
75288
75289
75290             function filterLabels(selection) {
75291                 var drawLayer = selection.selectAll('.layer-osm.labels');
75292                 var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
75293
75294                 layers.selectAll('.nolabel')
75295                     .classed('nolabel', false);
75296
75297                 var mouse = context.mouse();
75298                 var graph = context.graph();
75299                 var selectedIDs = context.selectedIDs();
75300                 var ids = [];
75301                 var pad, bbox;
75302
75303                 // hide labels near the mouse
75304                 if (mouse) {
75305                     pad = 20;
75306                     bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
75307                     var nearMouse = _rdrawn.search(bbox).map(function(entity) { return entity.id; });
75308                     ids.push.apply(ids, nearMouse);
75309                 }
75310
75311                 // hide labels on selected nodes (they look weird when dragging / haloed)
75312                 for (var i = 0; i < selectedIDs.length; i++) {
75313                     var entity = graph.hasEntity(selectedIDs[i]);
75314                     if (entity && entity.type === 'node') {
75315                         ids.push(selectedIDs[i]);
75316                     }
75317                 }
75318
75319                 layers.selectAll(utilEntitySelector(ids))
75320                     .classed('nolabel', true);
75321
75322
75323                 // draw the mouse bbox if debugging is on..
75324                 var debug = selection.selectAll('.labels-group.debug');
75325                 var gj = [];
75326                 if (context.getDebug('collision')) {
75327                     gj = bbox ? [{
75328                         type: 'Polygon',
75329                         coordinates: [[
75330                             [bbox.minX, bbox.minY],
75331                             [bbox.maxX, bbox.minY],
75332                             [bbox.maxX, bbox.maxY],
75333                             [bbox.minX, bbox.maxY],
75334                             [bbox.minX, bbox.minY]
75335                         ]]
75336                     }] : [];
75337                 }
75338
75339                 var box = debug.selectAll('.debug-mouse')
75340                     .data(gj);
75341
75342                 // exit
75343                 box.exit()
75344                     .remove();
75345
75346                 // enter/update
75347                 box.enter()
75348                     .append('path')
75349                     .attr('class', 'debug debug-mouse yellow')
75350                     .merge(box)
75351                     .attr('d', d3_geoPath());
75352             }
75353
75354
75355             var throttleFilterLabels = throttle(filterLabels, 100);
75356
75357
75358             drawLabels.observe = function(selection) {
75359                 var listener = function() { throttleFilterLabels(selection); };
75360                 selection.on('mousemove.hidelabels', listener);
75361                 context.on('enter.hidelabels', listener);
75362             };
75363
75364
75365             drawLabels.off = function(selection) {
75366                 throttleFilterLabels.cancel();
75367                 selection.on('mousemove.hidelabels', null);
75368                 context.on('enter.hidelabels', null);
75369             };
75370
75371
75372             return drawLabels;
75373         }
75374
75375         var _improveOsmEnabled = false;
75376         var _errorService;
75377
75378
75379         function svgImproveOSM(projection, context, dispatch) {
75380             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75381             var minZoom = 12;
75382             var touchLayer = d3_select(null);
75383             var drawLayer = d3_select(null);
75384             var _improveOsmVisible = false;
75385
75386             function markerPath(selection, klass) {
75387                 selection
75388                     .attr('class', klass)
75389                     .attr('transform', 'translate(-10, -28)')
75390                     .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
75391             }
75392
75393
75394             // Loosely-coupled improveOSM service for fetching errors.
75395             function getService() {
75396                 if (services$1.improveOSM && !_errorService) {
75397                     _errorService = services$1.improveOSM;
75398                     _errorService.on('loaded', throttledRedraw);
75399                 } else if (!services$1.improveOSM && _errorService) {
75400                     _errorService = null;
75401                 }
75402
75403                 return _errorService;
75404             }
75405
75406
75407             // Show the errors
75408             function editOn() {
75409                 if (!_improveOsmVisible) {
75410                     _improveOsmVisible = true;
75411                     drawLayer
75412                         .style('display', 'block');
75413                 }
75414             }
75415
75416
75417             // Immediately remove the errors and their touch targets
75418             function editOff() {
75419                 if (_improveOsmVisible) {
75420                     _improveOsmVisible = false;
75421                     drawLayer
75422                         .style('display', 'none');
75423                     drawLayer.selectAll('.qa_error.improveOSM')
75424                         .remove();
75425                     touchLayer.selectAll('.qa_error.improveOSM')
75426                         .remove();
75427                 }
75428             }
75429
75430
75431             // Enable the layer.  This shows the errors and transitions them to visible.
75432             function layerOn() {
75433                 editOn();
75434
75435                 drawLayer
75436                     .style('opacity', 0)
75437                     .transition()
75438                     .duration(250)
75439                     .style('opacity', 1)
75440                     .on('end interrupt', function () {
75441                         dispatch.call('change');
75442                     });
75443             }
75444
75445
75446             // Disable the layer.  This transitions the layer invisible and then hides the errors.
75447             function layerOff() {
75448                 throttledRedraw.cancel();
75449                 drawLayer.interrupt();
75450                 touchLayer.selectAll('.qa_error.improveOSM')
75451                     .remove();
75452
75453                 drawLayer
75454                     .transition()
75455                     .duration(250)
75456                     .style('opacity', 0)
75457                     .on('end interrupt', function () {
75458                         editOff();
75459                         dispatch.call('change');
75460                     });
75461             }
75462
75463
75464             // Update the error markers
75465             function updateMarkers() {
75466                 if (!_improveOsmVisible || !_improveOsmEnabled) return;
75467
75468                 var service = getService();
75469                 var selectedID = context.selectedErrorID();
75470                 var data = (service ? service.getErrors(projection) : []);
75471                 var getTransform = svgPointTransform(projection);
75472
75473                 // Draw markers..
75474                 var markers = drawLayer.selectAll('.qa_error.improveOSM')
75475                     .data(data, function(d) { return d.id; });
75476
75477                 // exit
75478                 markers.exit()
75479                     .remove();
75480
75481                 // enter
75482                 var markersEnter = markers.enter()
75483                     .append('g')
75484                     .attr('class', function(d) {
75485                         return [
75486                             'qa_error',
75487                             d.service,
75488                             'error_id-' + d.id,
75489                             'error_type-' + d.error_type,
75490                             'category-' + d.category
75491                         ].join(' ');
75492                     });
75493
75494                 markersEnter
75495                     .append('polygon')
75496                     .call(markerPath, 'shadow');
75497
75498                 markersEnter
75499                     .append('ellipse')
75500                     .attr('cx', 0)
75501                     .attr('cy', 0)
75502                     .attr('rx', 4.5)
75503                     .attr('ry', 2)
75504                     .attr('class', 'stroke');
75505
75506                 markersEnter
75507                     .append('polygon')
75508                     .attr('fill', 'currentColor')
75509                     .call(markerPath, 'qa_error-fill');
75510
75511                 markersEnter
75512                     .append('use')
75513                     .attr('transform', 'translate(-5.5, -21)')
75514                     .attr('class', 'icon-annotation')
75515                     .attr('width', '11px')
75516                     .attr('height', '11px')
75517                     .attr('xlink:href', function(d) {
75518                         var picon = d.icon;
75519
75520                         if (!picon) {
75521                             return '';
75522                         } else {
75523                             var isMaki = /^maki-/.test(picon);
75524                             return '#' + picon + (isMaki ? '-11' : '');
75525                         }
75526                     });
75527
75528                 // update
75529                 markers
75530                     .merge(markersEnter)
75531                     .sort(sortY)
75532                     .classed('selected', function(d) { return d.id === selectedID; })
75533                     .attr('transform', getTransform);
75534
75535
75536                 // Draw targets..
75537                 if (touchLayer.empty()) return;
75538                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
75539
75540                 var targets = touchLayer.selectAll('.qa_error.improveOSM')
75541                     .data(data, function(d) { return d.id; });
75542
75543                 // exit
75544                 targets.exit()
75545                     .remove();
75546
75547                 // enter/update
75548                 targets.enter()
75549                     .append('rect')
75550                     .attr('width', '20px')
75551                     .attr('height', '30px')
75552                     .attr('x', '-10px')
75553                     .attr('y', '-28px')
75554                     .merge(targets)
75555                     .sort(sortY)
75556                     .attr('class', function(d) {
75557                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
75558                     })
75559                     .attr('transform', getTransform);
75560
75561
75562                 function sortY(a, b) {
75563                     return (a.id === selectedID) ? 1
75564                         : (b.id === selectedID) ? -1
75565                         : b.loc[1] - a.loc[1];
75566                 }
75567             }
75568
75569
75570             // Draw the ImproveOSM layer and schedule loading errors and updating markers.
75571             function drawImproveOSM(selection) {
75572                 var service = getService();
75573
75574                 var surface = context.surface();
75575                 if (surface && !surface.empty()) {
75576                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
75577                 }
75578
75579                 drawLayer = selection.selectAll('.layer-improveOSM')
75580                     .data(service ? [0] : []);
75581
75582                 drawLayer.exit()
75583                     .remove();
75584
75585                 drawLayer = drawLayer.enter()
75586                     .append('g')
75587                     .attr('class', 'layer-improveOSM')
75588                     .style('display', _improveOsmEnabled ? 'block' : 'none')
75589                     .merge(drawLayer);
75590
75591                 if (_improveOsmEnabled) {
75592                     if (service && ~~context.map().zoom() >= minZoom) {
75593                         editOn();
75594                         service.loadErrors(projection);
75595                         updateMarkers();
75596                     } else {
75597                         editOff();
75598                     }
75599                 }
75600             }
75601
75602
75603             // Toggles the layer on and off
75604             drawImproveOSM.enabled = function(val) {
75605                 if (!arguments.length) return _improveOsmEnabled;
75606
75607                 _improveOsmEnabled = val;
75608                 if (_improveOsmEnabled) {
75609                     layerOn();
75610                 } else {
75611                     layerOff();
75612                     if (context.selectedErrorID()) {
75613                         context.enter(modeBrowse(context));
75614                     }
75615                 }
75616
75617                 dispatch.call('change');
75618                 return this;
75619             };
75620
75621
75622             drawImproveOSM.supported = function() {
75623                 return !!getService();
75624             };
75625
75626
75627             return drawImproveOSM;
75628         }
75629
75630         function svgStreetside(projection, context, dispatch) {
75631             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75632             var minZoom = 14;
75633             var minMarkerZoom = 16;
75634             var minViewfieldZoom = 18;
75635             var layer = d3_select(null);
75636             var _viewerYaw = 0;
75637             var _selectedSequence = null;
75638             var _streetside;
75639
75640             /**
75641              * init().
75642              */
75643             function init() {
75644                 if (svgStreetside.initialized) return;  // run once
75645                 svgStreetside.enabled = false;
75646                 svgStreetside.initialized = true;
75647             }
75648
75649             /**
75650              * getService().
75651              */
75652             function getService() {
75653                 if (services$1.streetside && !_streetside) {
75654                     _streetside = services$1.streetside;
75655                     _streetside.event
75656                         .on('viewerChanged', viewerChanged)
75657                         .on('loadedBubbles', throttledRedraw);
75658                 } else if (!services$1.streetside && _streetside) {
75659                     _streetside = null;
75660                 }
75661
75662                 return _streetside;
75663             }
75664
75665             /**
75666              * showLayer().
75667              */
75668             function showLayer() {
75669                 var service = getService();
75670                 if (!service) return;
75671
75672                 editOn();
75673
75674                 layer
75675                     .style('opacity', 0)
75676                     .transition()
75677                     .duration(250)
75678                     .style('opacity', 1)
75679                     .on('end', function () { dispatch.call('change'); });
75680             }
75681
75682             /**
75683              * hideLayer().
75684              */
75685             function hideLayer() {
75686                 throttledRedraw.cancel();
75687
75688                 layer
75689                     .transition()
75690                     .duration(250)
75691                     .style('opacity', 0)
75692                     .on('end', editOff);
75693             }
75694
75695             /**
75696              * editOn().
75697              */
75698             function editOn() {
75699                 layer.style('display', 'block');
75700             }
75701
75702             /**
75703              * editOff().
75704              */
75705             function editOff() {
75706                 layer.selectAll('.viewfield-group').remove();
75707                 layer.style('display', 'none');
75708             }
75709
75710             /**
75711              * click() Handles 'bubble' point click event.
75712              */
75713             function click(d) {
75714                 var service = getService();
75715                 if (!service) return;
75716
75717                 // try to preserve the viewer rotation when staying on the same sequence
75718                 if (d.sequenceKey !== _selectedSequence) {
75719                     _viewerYaw = 0;  // reset
75720                 }
75721                 _selectedSequence = d.sequenceKey;
75722
75723                 service
75724                     .selectImage(d)
75725                     .then(function(r) {
75726                         if (r.status === 'ok'){
75727                             service.showViewer(_viewerYaw);
75728                         }
75729                     });
75730
75731
75732                 context.map().centerEase(d.loc);
75733             }
75734
75735             /**
75736              * mouseover().
75737              */
75738             function mouseover(d) {
75739                 var service = getService();
75740                 if (service) service.setStyles(d);
75741             }
75742
75743             /**
75744              * mouseout().
75745              */
75746             function mouseout() {
75747                 var service = getService();
75748                 if (service) service.setStyles(null);
75749             }
75750
75751             /**
75752              * transform().
75753              */
75754             function transform(d) {
75755                 var t = svgPointTransform(projection)(d);
75756                 var rot = d.ca + _viewerYaw;
75757                 if (rot) {
75758                     t += ' rotate(' + Math.floor(rot) + ',0,0)';
75759                 }
75760                 return t;
75761             }
75762
75763
75764             function viewerChanged() {
75765                 var service = getService();
75766                 if (!service) return;
75767
75768                 var viewer = service.viewer();
75769                 if (!viewer) return;
75770
75771                 // update viewfield rotation
75772                 _viewerYaw = viewer.getYaw();
75773
75774                 // avoid updating if the map is currently transformed
75775                 // e.g. during drags or easing.
75776                 if (context.map().isTransformed()) return;
75777
75778                 layer.selectAll('.viewfield-group.currentView')
75779                     .attr('transform', transform);
75780             }
75781
75782
75783             context.photos().on('change.streetside', update);
75784
75785             /**
75786              * update().
75787              */
75788             function update() {
75789                 var viewer = d3_select('#photoviewer');
75790                 var selected = viewer.empty() ? undefined : viewer.datum();
75791                 var z = ~~context.map().zoom();
75792                 var showMarkers = (z >= minMarkerZoom);
75793                 var showViewfields = (z >= minViewfieldZoom);
75794                 var service = getService();
75795
75796                 var sequences = [];
75797                 var bubbles = [];
75798
75799                 if (context.photos().showsPanoramic()) {
75800                     sequences = (service ? service.sequences(projection) : []);
75801                     bubbles = (service && showMarkers ? service.bubbles(projection) : []);
75802                 }
75803
75804                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75805                     .data(sequences, function(d) { return d.properties.key; });
75806
75807                 // exit
75808                 traces.exit()
75809                     .remove();
75810
75811                 // enter/update
75812                 traces = traces.enter()
75813                     .append('path')
75814                     .attr('class', 'sequence')
75815                     .merge(traces)
75816                     .attr('d', svgPath(projection).geojson);
75817
75818
75819                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75820                     .data(bubbles, function(d) {
75821                         // force reenter once bubbles are attached to a sequence
75822                         return d.key + (d.sequenceKey ? 'v1' : 'v0');
75823                     });
75824
75825                 // exit
75826                 groups.exit()
75827                     .remove();
75828
75829                 // enter
75830                 var groupsEnter = groups.enter()
75831                     .append('g')
75832                     .attr('class', 'viewfield-group')
75833                     .on('mouseenter', mouseover)
75834                     .on('mouseleave', mouseout)
75835                     .on('click', click);
75836
75837                 groupsEnter
75838                     .append('g')
75839                     .attr('class', 'viewfield-scale');
75840
75841                 // update
75842                 var markers = groups
75843                     .merge(groupsEnter)
75844                     .sort(function(a, b) {
75845                         return (a === selected) ? 1
75846                             : (b === selected) ? -1
75847                             : b.loc[1] - a.loc[1];
75848                     })
75849                     .attr('transform', transform)
75850                     .select('.viewfield-scale');
75851
75852
75853                 markers.selectAll('circle')
75854                     .data([0])
75855                     .enter()
75856                     .append('circle')
75857                     .attr('dx', '0')
75858                     .attr('dy', '0')
75859                     .attr('r', '6');
75860
75861                 var viewfields = markers.selectAll('.viewfield')
75862                     .data(showViewfields ? [0] : []);
75863
75864                 viewfields.exit()
75865                     .remove();
75866
75867                 // viewfields may or may not be drawn...
75868                 // but if they are, draw below the circles
75869                 viewfields.enter()
75870                     .insert('path', 'circle')
75871                     .attr('class', 'viewfield')
75872                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75873                     .attr('d', viewfieldPath);
75874
75875                 function viewfieldPath() {
75876                     var d = this.parentNode.__data__;
75877                     if (d.pano) {
75878                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75879                     } else {
75880                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75881                     }
75882                 }
75883
75884             }
75885
75886             /**
75887              * drawImages()
75888              * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
75889              * 'svgStreetside()' is called from index.js
75890              */
75891             function drawImages(selection) {
75892                 var enabled = svgStreetside.enabled;
75893                 var service = getService();
75894
75895                 layer = selection.selectAll('.layer-streetside-images')
75896                     .data(service ? [0] : []);
75897
75898                 layer.exit()
75899                     .remove();
75900
75901                 var layerEnter = layer.enter()
75902                     .append('g')
75903                     .attr('class', 'layer-streetside-images')
75904                     .style('display', enabled ? 'block' : 'none');
75905
75906                 layerEnter
75907                     .append('g')
75908                     .attr('class', 'sequences');
75909
75910                 layerEnter
75911                     .append('g')
75912                     .attr('class', 'markers');
75913
75914                 layer = layerEnter
75915                     .merge(layer);
75916
75917                 if (enabled) {
75918                     if (service && ~~context.map().zoom() >= minZoom) {
75919                         editOn();
75920                         update();
75921                         service.loadBubbles(projection);
75922                     } else {
75923                         editOff();
75924                     }
75925                 }
75926             }
75927
75928
75929             /**
75930              * drawImages.enabled().
75931              */
75932             drawImages.enabled = function(_) {
75933                 if (!arguments.length) return svgStreetside.enabled;
75934                 svgStreetside.enabled = _;
75935                 if (svgStreetside.enabled) {
75936                     showLayer();
75937                 } else {
75938                     hideLayer();
75939                 }
75940                 dispatch.call('change');
75941                 return this;
75942             };
75943
75944             /**
75945              * drawImages.supported().
75946              */
75947             drawImages.supported = function() {
75948                 return !!getService();
75949             };
75950
75951             init();
75952
75953             return drawImages;
75954         }
75955
75956         function svgMapillaryImages(projection, context, dispatch) {
75957             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75958             var minZoom = 12;
75959             var minMarkerZoom = 16;
75960             var minViewfieldZoom = 18;
75961             var layer = d3_select(null);
75962             var _mapillary;
75963             var viewerCompassAngle;
75964
75965
75966             function init() {
75967                 if (svgMapillaryImages.initialized) return;  // run once
75968                 svgMapillaryImages.enabled = false;
75969                 svgMapillaryImages.initialized = true;
75970             }
75971
75972
75973             function getService() {
75974                 if (services$1.mapillary && !_mapillary) {
75975                     _mapillary = services$1.mapillary;
75976                     _mapillary.event.on('loadedImages', throttledRedraw);
75977                     _mapillary.event.on('bearingChanged', function(e) {
75978                         viewerCompassAngle = e;
75979
75980                         // avoid updating if the map is currently transformed
75981                         // e.g. during drags or easing.
75982                         if (context.map().isTransformed()) return;
75983
75984                         layer.selectAll('.viewfield-group.currentView')
75985                             .filter(function(d) {
75986                                 return d.pano;
75987                             })
75988                             .attr('transform', transform);
75989                     });
75990                 } else if (!services$1.mapillary && _mapillary) {
75991                     _mapillary = null;
75992                 }
75993
75994                 return _mapillary;
75995             }
75996
75997
75998             function showLayer() {
75999                 var service = getService();
76000                 if (!service) return;
76001
76002                 editOn();
76003
76004                 layer
76005                     .style('opacity', 0)
76006                     .transition()
76007                     .duration(250)
76008                     .style('opacity', 1)
76009                     .on('end', function () { dispatch.call('change'); });
76010             }
76011
76012
76013             function hideLayer() {
76014                 throttledRedraw.cancel();
76015
76016                 layer
76017                     .transition()
76018                     .duration(250)
76019                     .style('opacity', 0)
76020                     .on('end', editOff);
76021             }
76022
76023
76024             function editOn() {
76025                 layer.style('display', 'block');
76026             }
76027
76028
76029             function editOff() {
76030                 layer.selectAll('.viewfield-group').remove();
76031                 layer.style('display', 'none');
76032             }
76033
76034
76035             function click(d) {
76036                 var service = getService();
76037                 if (!service) return;
76038
76039                 service
76040                     .selectImage(d)
76041                     .updateViewer(d.key, context)
76042                     .showViewer();
76043
76044                 context.map().centerEase(d.loc);
76045             }
76046
76047
76048             function mouseover(d) {
76049                 var service = getService();
76050                 if (service) service.setStyles(d);
76051             }
76052
76053
76054             function mouseout() {
76055                 var service = getService();
76056                 if (service) service.setStyles(null);
76057             }
76058
76059
76060             function transform(d) {
76061                 var t = svgPointTransform(projection)(d);
76062                 if (d.pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
76063                     t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
76064                 } else if (d.ca) {
76065                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
76066                 }
76067                 return t;
76068             }
76069
76070             context.photos().on('change.mapillary_images', update);
76071
76072             function filterImages(images) {
76073                 var showsPano = context.photos().showsPanoramic();
76074                 var showsFlat = context.photos().showsFlat();
76075                 if (!showsPano || !showsFlat) {
76076                     images = images.filter(function(image) {
76077                         if (image.pano) return showsPano;
76078                         return showsFlat;
76079                     });
76080                 }
76081                 return images;
76082             }
76083
76084             function filterSequences(sequences, service) {
76085                 var showsPano = context.photos().showsPanoramic();
76086                 var showsFlat = context.photos().showsFlat();
76087                 if (!showsPano || !showsFlat) {
76088                     sequences = sequences.filter(function(sequence) {
76089                         if (sequence.properties.hasOwnProperty('pano')) {
76090                             if (sequence.properties.pano) return showsPano;
76091                             return showsFlat;
76092                         } else {
76093                             // if the sequence doesn't specify pano or not, search its images
76094                             var cProps = sequence.properties.coordinateProperties;
76095                             if (cProps && cProps.image_keys && cProps.image_keys.length > 0) {
76096                                 for (var index in cProps.image_keys) {
76097                                     var imageKey = cProps.image_keys[index];
76098                                     var image = service.cachedImage(imageKey);
76099                                     if (image && image.hasOwnProperty('pano')) {
76100                                         if (image.pano) return showsPano;
76101                                         return showsFlat;
76102                                     }
76103                                 }
76104                             }
76105                         }
76106                     });
76107                 }
76108                 return sequences;
76109             }
76110
76111             function update() {
76112                 var viewer = d3_select('#photoviewer');
76113                 var selected = viewer.empty() ? undefined : viewer.datum();
76114
76115                 var z = ~~context.map().zoom();
76116                 var showMarkers = (z >= minMarkerZoom);
76117                 var showViewfields = (z >= minViewfieldZoom);
76118
76119                 var service = getService();
76120                 var sequences = (service ? service.sequences(projection) : []);
76121                 var images = (service && showMarkers ? service.images(projection) : []);
76122
76123                 images = filterImages(images);
76124                 sequences = filterSequences(sequences, service);
76125
76126                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
76127                     .data(sequences, function(d) { return d.properties.key; });
76128
76129                 // exit
76130                 traces.exit()
76131                     .remove();
76132
76133                 // enter/update
76134                 traces = traces.enter()
76135                     .append('path')
76136                     .attr('class', 'sequence')
76137                     .merge(traces)
76138                     .attr('d', svgPath(projection).geojson);
76139
76140
76141                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
76142                     .data(images, function(d) { return d.key; });
76143
76144                 // exit
76145                 groups.exit()
76146                     .remove();
76147
76148                 // enter
76149                 var groupsEnter = groups.enter()
76150                     .append('g')
76151                     .attr('class', 'viewfield-group')
76152                     .on('mouseenter', mouseover)
76153                     .on('mouseleave', mouseout)
76154                     .on('click', click);
76155
76156                 groupsEnter
76157                     .append('g')
76158                     .attr('class', 'viewfield-scale');
76159
76160                 // update
76161                 var markers = groups
76162                     .merge(groupsEnter)
76163                     .sort(function(a, b) {
76164                         return (a === selected) ? 1
76165                             : (b === selected) ? -1
76166                             : b.loc[1] - a.loc[1];  // sort Y
76167                     })
76168                     .attr('transform', transform)
76169                     .select('.viewfield-scale');
76170
76171
76172                 markers.selectAll('circle')
76173                     .data([0])
76174                     .enter()
76175                     .append('circle')
76176                     .attr('dx', '0')
76177                     .attr('dy', '0')
76178                     .attr('r', '6');
76179
76180                 var viewfields = markers.selectAll('.viewfield')
76181                     .data(showViewfields ? [0] : []);
76182
76183                 viewfields.exit()
76184                     .remove();
76185
76186                 viewfields.enter()               // viewfields may or may not be drawn...
76187                     .insert('path', 'circle')    // but if they are, draw below the circles
76188                     .attr('class', 'viewfield')
76189                     .classed('pano', function() { return this.parentNode.__data__.pano; })
76190                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76191                     .attr('d', viewfieldPath);
76192
76193                 function viewfieldPath() {
76194                     var d = this.parentNode.__data__;
76195                     if (d.pano) {
76196                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
76197                     } else {
76198                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
76199                     }
76200                 }
76201             }
76202
76203
76204             function drawImages(selection) {
76205                 var enabled = svgMapillaryImages.enabled;
76206                 var service = getService();
76207
76208                 layer = selection.selectAll('.layer-mapillary')
76209                     .data(service ? [0] : []);
76210
76211                 layer.exit()
76212                     .remove();
76213
76214                 var layerEnter = layer.enter()
76215                     .append('g')
76216                     .attr('class', 'layer-mapillary')
76217                     .style('display', enabled ? 'block' : 'none');
76218
76219                 layerEnter
76220                     .append('g')
76221                     .attr('class', 'sequences');
76222
76223                 layerEnter
76224                     .append('g')
76225                     .attr('class', 'markers');
76226
76227                 layer = layerEnter
76228                     .merge(layer);
76229
76230                 if (enabled) {
76231                     if (service && ~~context.map().zoom() >= minZoom) {
76232                         editOn();
76233                         update();
76234                         service.loadImages(projection);
76235                     } else {
76236                         editOff();
76237                     }
76238                 }
76239             }
76240
76241
76242             drawImages.enabled = function(_) {
76243                 if (!arguments.length) return svgMapillaryImages.enabled;
76244                 svgMapillaryImages.enabled = _;
76245                 if (svgMapillaryImages.enabled) {
76246                     showLayer();
76247                 } else {
76248                     hideLayer();
76249                 }
76250                 dispatch.call('change');
76251                 return this;
76252             };
76253
76254
76255             drawImages.supported = function() {
76256                 return !!getService();
76257             };
76258
76259
76260             init();
76261             return drawImages;
76262         }
76263
76264         function svgMapillarySigns(projection, context, dispatch) {
76265             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76266             var minZoom = 12;
76267             var layer = d3_select(null);
76268             var _mapillary;
76269
76270
76271             function init() {
76272                 if (svgMapillarySigns.initialized) return;  // run once
76273                 svgMapillarySigns.enabled = false;
76274                 svgMapillarySigns.initialized = true;
76275             }
76276
76277
76278             function getService() {
76279                 if (services$1.mapillary && !_mapillary) {
76280                     _mapillary = services$1.mapillary;
76281                     _mapillary.event.on('loadedSigns', throttledRedraw);
76282                 } else if (!services$1.mapillary && _mapillary) {
76283                     _mapillary = null;
76284                 }
76285                 return _mapillary;
76286             }
76287
76288
76289             function showLayer() {
76290                 var service = getService();
76291                 if (!service) return;
76292
76293                 editOn();
76294             }
76295
76296
76297             function hideLayer() {
76298                 throttledRedraw.cancel();
76299                 editOff();
76300             }
76301
76302
76303             function editOn() {
76304                 layer.style('display', 'block');
76305             }
76306
76307
76308             function editOff() {
76309                 layer.selectAll('.icon-sign').remove();
76310                 layer.style('display', 'none');
76311             }
76312
76313
76314             function click(d) {
76315                 var service = getService();
76316                 if (!service) return;
76317
76318                 context.map().centerEase(d.loc);
76319
76320                 var selected = service.getSelectedImage();
76321                 var selectedImageKey = selected && selected.key;
76322                 var imageKey;
76323
76324                 // Pick one of the images the sign was detected in,
76325                 // preference given to an image already selected.
76326                 d.detections.forEach(function(detection) {
76327                     if (!imageKey || selectedImageKey === detection.image_key) {
76328                         imageKey = detection.image_key;
76329                     }
76330                 });
76331
76332                 service
76333                     .selectImage(null, imageKey)
76334                     .updateViewer(imageKey, context)
76335                     .showViewer();
76336             }
76337
76338
76339             function update() {
76340                 var service = getService();
76341                 var data = (service ? service.signs(projection) : []);
76342                 var viewer = d3_select('#photoviewer');
76343                 var selected = viewer.empty() ? undefined : viewer.datum();
76344                 var selectedImageKey = selected && selected.key;
76345                 var transform = svgPointTransform(projection);
76346
76347                 var signs = layer.selectAll('.icon-sign')
76348                     .data(data, function(d) { return d.key; });
76349
76350                 // exit
76351                 signs.exit()
76352                     .remove();
76353
76354                 // enter
76355                 var enter = signs.enter()
76356                     .append('use')
76357                     .attr('class', 'icon-sign')
76358                     .attr('width', '24px')
76359                     .attr('height', '24px')
76360                     .attr('x', '-12px')
76361                     .attr('y', '-12px')
76362                     .attr('xlink:href', function(d) { return '#' + d.value; })
76363                     .classed('currentView', function(d) {
76364                         return d.detections.some(function(detection) {
76365                             return detection.image_key === selectedImageKey;
76366                         });
76367                     })
76368                     .on('click', click);
76369
76370                 // update
76371                 signs
76372                     .merge(enter)
76373                     .sort(function(a, b) {
76374                         return (a === selected) ? 1
76375                             : (b === selected) ? -1
76376                             : b.loc[1] - a.loc[1];  // sort Y
76377                     })
76378                     .attr('transform', transform);
76379             }
76380
76381
76382             function drawSigns(selection) {
76383                 var enabled = svgMapillarySigns.enabled;
76384                 var service = getService();
76385
76386                 layer = selection.selectAll('.layer-mapillary-signs')
76387                     .data(service ? [0] : []);
76388
76389                 layer.exit()
76390                     .remove();
76391
76392                 layer = layer.enter()
76393                     .append('g')
76394                     .attr('class', 'layer-mapillary-signs')
76395                     .style('display', enabled ? 'block' : 'none')
76396                     .merge(layer);
76397
76398                 if (enabled) {
76399                     if (service && ~~context.map().zoom() >= minZoom) {
76400                         editOn();
76401                         update();
76402                         service.loadSigns(projection);
76403                     } else {
76404                         editOff();
76405                     }
76406                 }
76407             }
76408
76409
76410             drawSigns.enabled = function(_) {
76411                 if (!arguments.length) return svgMapillarySigns.enabled;
76412                 svgMapillarySigns.enabled = _;
76413                 if (svgMapillarySigns.enabled) {
76414                     showLayer();
76415                 } else {
76416                     hideLayer();
76417                 }
76418                 dispatch.call('change');
76419                 return this;
76420             };
76421
76422
76423             drawSigns.supported = function() {
76424                 return !!getService();
76425             };
76426
76427
76428             init();
76429             return drawSigns;
76430         }
76431
76432         function svgOpenstreetcamImages(projection, context, dispatch) {
76433             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76434             var minZoom = 12;
76435             var minMarkerZoom = 16;
76436             var minViewfieldZoom = 18;
76437             var layer = d3_select(null);
76438             var _openstreetcam;
76439
76440
76441             function init() {
76442                 if (svgOpenstreetcamImages.initialized) return;  // run once
76443                 svgOpenstreetcamImages.enabled = false;
76444                 svgOpenstreetcamImages.initialized = true;
76445             }
76446
76447
76448             function getService() {
76449                 if (services$1.openstreetcam && !_openstreetcam) {
76450                     _openstreetcam = services$1.openstreetcam;
76451                     _openstreetcam.event.on('loadedImages', throttledRedraw);
76452                 } else if (!services$1.openstreetcam && _openstreetcam) {
76453                     _openstreetcam = null;
76454                 }
76455
76456                 return _openstreetcam;
76457             }
76458
76459
76460             function showLayer() {
76461                 var service = getService();
76462                 if (!service) return;
76463
76464                 editOn();
76465
76466                 layer
76467                     .style('opacity', 0)
76468                     .transition()
76469                     .duration(250)
76470                     .style('opacity', 1)
76471                     .on('end', function () { dispatch.call('change'); });
76472             }
76473
76474
76475             function hideLayer() {
76476                 throttledRedraw.cancel();
76477
76478                 layer
76479                     .transition()
76480                     .duration(250)
76481                     .style('opacity', 0)
76482                     .on('end', editOff);
76483             }
76484
76485
76486             function editOn() {
76487                 layer.style('display', 'block');
76488             }
76489
76490
76491             function editOff() {
76492                 layer.selectAll('.viewfield-group').remove();
76493                 layer.style('display', 'none');
76494             }
76495
76496
76497             function click(d) {
76498                 var service = getService();
76499                 if (!service) return;
76500
76501                 service
76502                     .selectImage(d)
76503                     .updateViewer(d)
76504                     .showViewer();
76505
76506                 context.map().centerEase(d.loc);
76507             }
76508
76509
76510             function mouseover(d) {
76511                 var service = getService();
76512                 if (service) service.setStyles(d);
76513             }
76514
76515
76516             function mouseout() {
76517                 var service = getService();
76518                 if (service) service.setStyles(null);
76519             }
76520
76521
76522             function transform(d) {
76523                 var t = svgPointTransform(projection)(d);
76524                 if (d.ca) {
76525                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
76526                 }
76527                 return t;
76528             }
76529
76530
76531             context.photos().on('change.openstreetcam_images', update);
76532
76533             function update() {
76534                 var viewer = d3_select('#photoviewer');
76535                 var selected = viewer.empty() ? undefined : viewer.datum();
76536
76537                 var z = ~~context.map().zoom();
76538                 var showMarkers = (z >= minMarkerZoom);
76539                 var showViewfields = (z >= minViewfieldZoom);
76540
76541                 var service = getService();
76542                 var sequences = [];
76543                 var images = [];
76544
76545                 if (context.photos().showsFlat()) {
76546                     sequences = (service ? service.sequences(projection) : []);
76547                     images = (service && showMarkers ? service.images(projection) : []);
76548                 }
76549
76550                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
76551                     .data(sequences, function(d) { return d.properties.key; });
76552
76553                 // exit
76554                 traces.exit()
76555                     .remove();
76556
76557                 // enter/update
76558                 traces = traces.enter()
76559                     .append('path')
76560                     .attr('class', 'sequence')
76561                     .merge(traces)
76562                     .attr('d', svgPath(projection).geojson);
76563
76564
76565                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
76566                     .data(images, function(d) { return d.key; });
76567
76568                 // exit
76569                 groups.exit()
76570                     .remove();
76571
76572                 // enter
76573                 var groupsEnter = groups.enter()
76574                     .append('g')
76575                     .attr('class', 'viewfield-group')
76576                     .on('mouseenter', mouseover)
76577                     .on('mouseleave', mouseout)
76578                     .on('click', click);
76579
76580                 groupsEnter
76581                     .append('g')
76582                     .attr('class', 'viewfield-scale');
76583
76584                 // update
76585                 var markers = groups
76586                     .merge(groupsEnter)
76587                     .sort(function(a, b) {
76588                         return (a === selected) ? 1
76589                             : (b === selected) ? -1
76590                             : b.loc[1] - a.loc[1];  // sort Y
76591                     })
76592                     .attr('transform', transform)
76593                     .select('.viewfield-scale');
76594
76595
76596                 markers.selectAll('circle')
76597                     .data([0])
76598                     .enter()
76599                     .append('circle')
76600                     .attr('dx', '0')
76601                     .attr('dy', '0')
76602                     .attr('r', '6');
76603
76604                 var viewfields = markers.selectAll('.viewfield')
76605                     .data(showViewfields ? [0] : []);
76606
76607                 viewfields.exit()
76608                     .remove();
76609
76610                 viewfields.enter()               // viewfields may or may not be drawn...
76611                     .insert('path', 'circle')    // but if they are, draw below the circles
76612                     .attr('class', 'viewfield')
76613                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76614                     .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
76615             }
76616
76617
76618             function drawImages(selection) {
76619                 var enabled = svgOpenstreetcamImages.enabled,
76620                     service = getService();
76621
76622                 layer = selection.selectAll('.layer-openstreetcam')
76623                     .data(service ? [0] : []);
76624
76625                 layer.exit()
76626                     .remove();
76627
76628                 var layerEnter = layer.enter()
76629                     .append('g')
76630                     .attr('class', 'layer-openstreetcam')
76631                     .style('display', enabled ? 'block' : 'none');
76632
76633                 layerEnter
76634                     .append('g')
76635                     .attr('class', 'sequences');
76636
76637                 layerEnter
76638                     .append('g')
76639                     .attr('class', 'markers');
76640
76641                 layer = layerEnter
76642                     .merge(layer);
76643
76644                 if (enabled) {
76645                     if (service && ~~context.map().zoom() >= minZoom) {
76646                         editOn();
76647                         update();
76648                         service.loadImages(projection);
76649                     } else {
76650                         editOff();
76651                     }
76652                 }
76653             }
76654
76655
76656             drawImages.enabled = function(_) {
76657                 if (!arguments.length) return svgOpenstreetcamImages.enabled;
76658                 svgOpenstreetcamImages.enabled = _;
76659                 if (svgOpenstreetcamImages.enabled) {
76660                     showLayer();
76661                 } else {
76662                     hideLayer();
76663                 }
76664                 dispatch.call('change');
76665                 return this;
76666             };
76667
76668
76669             drawImages.supported = function() {
76670                 return !!getService();
76671             };
76672
76673
76674             init();
76675             return drawImages;
76676         }
76677
76678         function svgOsm(projection, context, dispatch) {
76679             var enabled = true;
76680
76681
76682             function drawOsm(selection) {
76683                 selection.selectAll('.layer-osm')
76684                     .data(['covered', 'areas', 'lines', 'points', 'labels'])
76685                     .enter()
76686                     .append('g')
76687                     .attr('class', function(d) { return 'layer-osm ' + d; });
76688
76689                 selection.selectAll('.layer-osm.points').selectAll('.points-group')
76690                     .data(['points', 'midpoints', 'vertices', 'turns'])
76691                     .enter()
76692                     .append('g')
76693                     .attr('class', function(d) { return 'points-group ' + d; });
76694             }
76695
76696
76697             function showLayer() {
76698                 var layer = context.surface().selectAll('.data-layer.osm');
76699                 layer.interrupt();
76700
76701                 layer
76702                     .classed('disabled', false)
76703                     .style('opacity', 0)
76704                     .transition()
76705                     .duration(250)
76706                     .style('opacity', 1)
76707                     .on('end interrupt', function () {
76708                         dispatch.call('change');
76709                     });
76710             }
76711
76712
76713             function hideLayer() {
76714                 var layer = context.surface().selectAll('.data-layer.osm');
76715                 layer.interrupt();
76716
76717                 layer
76718                     .transition()
76719                     .duration(250)
76720                     .style('opacity', 0)
76721                     .on('end interrupt', function () {
76722                         layer.classed('disabled', true);
76723                         dispatch.call('change');
76724                     });
76725             }
76726
76727
76728             drawOsm.enabled = function(val) {
76729                 if (!arguments.length) return enabled;
76730                 enabled = val;
76731
76732                 if (enabled) {
76733                     showLayer();
76734                 } else {
76735                     hideLayer();
76736                 }
76737
76738                 dispatch.call('change');
76739                 return this;
76740             };
76741
76742
76743             return drawOsm;
76744         }
76745
76746         var _notesEnabled = false;
76747         var _osmService;
76748
76749
76750         function svgNotes(projection, context, dispatch$1) {
76751             if (!dispatch$1) { dispatch$1 = dispatch('change'); }
76752             var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
76753             var minZoom = 12;
76754             var touchLayer = d3_select(null);
76755             var drawLayer = d3_select(null);
76756             var _notesVisible = false;
76757
76758
76759             function markerPath(selection, klass) {
76760                 selection
76761                     .attr('class', klass)
76762                     .attr('transform', 'translate(-8, -22)')
76763                     .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
76764             }
76765
76766
76767             // Loosely-coupled osm service for fetching notes.
76768             function getService() {
76769                 if (services$1.osm && !_osmService) {
76770                     _osmService = services$1.osm;
76771                     _osmService.on('loadedNotes', throttledRedraw);
76772                 } else if (!services$1.osm && _osmService) {
76773                     _osmService = null;
76774                 }
76775
76776                 return _osmService;
76777             }
76778
76779
76780             // Show the notes
76781             function editOn() {
76782                 if (!_notesVisible) {
76783                     _notesVisible = true;
76784                     drawLayer
76785                         .style('display', 'block');
76786                 }
76787             }
76788
76789
76790             // Immediately remove the notes and their touch targets
76791             function editOff() {
76792                 if (_notesVisible) {
76793                     _notesVisible = false;
76794                     drawLayer
76795                         .style('display', 'none');
76796                     drawLayer.selectAll('.note')
76797                         .remove();
76798                     touchLayer.selectAll('.note')
76799                         .remove();
76800                 }
76801             }
76802
76803
76804             // Enable the layer.  This shows the notes and transitions them to visible.
76805             function layerOn() {
76806                 editOn();
76807
76808                 drawLayer
76809                     .style('opacity', 0)
76810                     .transition()
76811                     .duration(250)
76812                     .style('opacity', 1)
76813                     .on('end interrupt', function () {
76814                         dispatch$1.call('change');
76815                     });
76816             }
76817
76818
76819             // Disable the layer.  This transitions the layer invisible and then hides the notes.
76820             function layerOff() {
76821                 throttledRedraw.cancel();
76822                 drawLayer.interrupt();
76823                 touchLayer.selectAll('.note')
76824                     .remove();
76825
76826                 drawLayer
76827                     .transition()
76828                     .duration(250)
76829                     .style('opacity', 0)
76830                     .on('end interrupt', function () {
76831                         editOff();
76832                         dispatch$1.call('change');
76833                     });
76834             }
76835
76836
76837             // Update the note markers
76838             function updateMarkers() {
76839                 if (!_notesVisible || !_notesEnabled) return;
76840
76841                 var service = getService();
76842                 var selectedID = context.selectedNoteID();
76843                 var data = (service ? service.notes(projection) : []);
76844                 var getTransform = svgPointTransform(projection);
76845
76846                 // Draw markers..
76847                 var notes = drawLayer.selectAll('.note')
76848                     .data(data, function(d) { return d.status + d.id; });
76849
76850                 // exit
76851                 notes.exit()
76852                     .remove();
76853
76854                 // enter
76855                 var notesEnter = notes.enter()
76856                     .append('g')
76857                     .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
76858                     .classed('new', function(d) { return d.id < 0; });
76859
76860                 notesEnter
76861                     .append('ellipse')
76862                     .attr('cx', 0.5)
76863                     .attr('cy', 1)
76864                     .attr('rx', 6.5)
76865                     .attr('ry', 3)
76866                     .attr('class', 'stroke');
76867
76868                 notesEnter
76869                     .append('path')
76870                     .call(markerPath, 'shadow');
76871
76872                 notesEnter
76873                     .append('use')
76874                     .attr('class', 'note-fill')
76875                     .attr('width', '20px')
76876                     .attr('height', '20px')
76877                     .attr('x', '-8px')
76878                     .attr('y', '-22px')
76879                     .attr('xlink:href', '#iD-icon-note');
76880
76881                 notesEnter.selectAll('.icon-annotation')
76882                     .data(function(d) { return [d]; })
76883                     .enter()
76884                     .append('use')
76885                     .attr('class', 'icon-annotation')
76886                     .attr('width', '10px')
76887                     .attr('height', '10px')
76888                     .attr('x', '-3px')
76889                     .attr('y', '-19px')
76890                     .attr('xlink:href', function(d) {
76891                         return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
76892                     });
76893
76894                 // update
76895                 notes
76896                     .merge(notesEnter)
76897                     .sort(sortY)
76898                     .classed('selected', function(d) {
76899                         var mode = context.mode();
76900                         var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
76901                         return !isMoving && d.id === selectedID;
76902                     })
76903                     .attr('transform', getTransform);
76904
76905
76906                 // Draw targets..
76907                 if (touchLayer.empty()) return;
76908                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76909
76910                 var targets = touchLayer.selectAll('.note')
76911                     .data(data, function(d) { return d.id; });
76912
76913                 // exit
76914                 targets.exit()
76915                     .remove();
76916
76917                 // enter/update
76918                 targets.enter()
76919                     .append('rect')
76920                     .attr('width', '20px')
76921                     .attr('height', '20px')
76922                     .attr('x', '-8px')
76923                     .attr('y', '-22px')
76924                     .merge(targets)
76925                     .sort(sortY)
76926                     .attr('class', function(d) {
76927                         var newClass = (d.id < 0 ? 'new' : '');
76928                         return 'note target note-' + d.id + ' ' + fillClass + newClass;
76929                     })
76930                     .attr('transform', getTransform);
76931
76932
76933                 function sortY(a, b) {
76934                     return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
76935                 }
76936             }
76937
76938
76939             // Draw the notes layer and schedule loading notes and updating markers.
76940             function drawNotes(selection) {
76941                 var service = getService();
76942
76943                 var surface = context.surface();
76944                 if (surface && !surface.empty()) {
76945                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
76946                 }
76947
76948                 drawLayer = selection.selectAll('.layer-notes')
76949                     .data(service ? [0] : []);
76950
76951                 drawLayer.exit()
76952                     .remove();
76953
76954                 drawLayer = drawLayer.enter()
76955                     .append('g')
76956                     .attr('class', 'layer-notes')
76957                     .style('display', _notesEnabled ? 'block' : 'none')
76958                     .merge(drawLayer);
76959
76960                 if (_notesEnabled) {
76961                     if (service && ~~context.map().zoom() >= minZoom) {
76962                         editOn();
76963                         service.loadNotes(projection);
76964                         updateMarkers();
76965                     } else {
76966                         editOff();
76967                     }
76968                 }
76969             }
76970
76971
76972             // Toggles the layer on and off
76973             drawNotes.enabled = function(val) {
76974                 if (!arguments.length) return _notesEnabled;
76975
76976                 _notesEnabled = val;
76977                 if (_notesEnabled) {
76978                     layerOn();
76979                 } else {
76980                     layerOff();
76981                     if (context.selectedNoteID()) {
76982                         context.enter(modeBrowse(context));
76983                     }
76984                 }
76985
76986                 dispatch$1.call('change');
76987                 return this;
76988             };
76989
76990
76991             return drawNotes;
76992         }
76993
76994         function svgTouch() {
76995
76996             function drawTouch(selection) {
76997                 selection.selectAll('.layer-touch')
76998                     .data(['areas', 'lines', 'points', 'turns', 'markers'])
76999                     .enter()
77000                     .append('g')
77001                     .attr('class', function(d) { return 'layer-touch ' + d; });
77002             }
77003
77004             return drawTouch;
77005         }
77006
77007         function svgLayers(projection, context) {
77008             var dispatch$1 = dispatch('change');
77009             var svg = d3_select(null);
77010             var _layers = [
77011                 { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
77012                 { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
77013                 { id: 'data', layer: svgData(projection, context, dispatch$1) },
77014                 { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
77015                 { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
77016                 { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
77017                 { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch$1) },
77018                 { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
77019                 { id: 'openstreetcam', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
77020                 { id: 'debug', layer: svgDebug(projection, context) },
77021                 { id: 'geolocate', layer: svgGeolocate(projection) },
77022                 { id: 'touch', layer: svgTouch() }
77023             ];
77024
77025
77026             function drawLayers(selection) {
77027                 svg = selection.selectAll('.surface')
77028                     .data([0]);
77029
77030                 svg = svg.enter()
77031                     .append('svg')
77032                     .attr('class', 'surface')
77033                     .merge(svg);
77034
77035                 var defs = svg.selectAll('.surface-defs')
77036                     .data([0]);
77037
77038                 defs.enter()
77039                     .append('defs')
77040                     .attr('class', 'surface-defs');
77041
77042                 var groups = svg.selectAll('.data-layer')
77043                     .data(_layers);
77044
77045                 groups.exit()
77046                     .remove();
77047
77048                 groups.enter()
77049                     .append('g')
77050                     .attr('class', function(d) { return 'data-layer ' + d.id; })
77051                     .merge(groups)
77052                     .each(function(d) { d3_select(this).call(d.layer); });
77053             }
77054
77055
77056             drawLayers.all = function() {
77057                 return _layers;
77058             };
77059
77060
77061             drawLayers.layer = function(id) {
77062                 var obj = _layers.find(function(o) { return o.id === id; });
77063                 return obj && obj.layer;
77064             };
77065
77066
77067             drawLayers.only = function(what) {
77068                 var arr = [].concat(what);
77069                 var all = _layers.map(function(layer) { return layer.id; });
77070                 return drawLayers.remove(utilArrayDifference(all, arr));
77071             };
77072
77073
77074             drawLayers.remove = function(what) {
77075                 var arr = [].concat(what);
77076                 arr.forEach(function(id) {
77077                     _layers = _layers.filter(function(o) { return o.id !== id; });
77078                 });
77079                 dispatch$1.call('change');
77080                 return this;
77081             };
77082
77083
77084             drawLayers.add = function(what) {
77085                 var arr = [].concat(what);
77086                 arr.forEach(function(obj) {
77087                     if ('id' in obj && 'layer' in obj) {
77088                         _layers.push(obj);
77089                     }
77090                 });
77091                 dispatch$1.call('change');
77092                 return this;
77093             };
77094
77095
77096             drawLayers.dimensions = function(val) {
77097                 if (!arguments.length) return utilGetDimensions(svg);
77098                 utilSetDimensions(svg, val);
77099                 return this;
77100             };
77101
77102
77103             return utilRebind(drawLayers, dispatch$1, 'on');
77104         }
77105
77106         function svgLines(projection, context) {
77107             var detected = utilDetect();
77108
77109             var highway_stack = {
77110                 motorway: 0,
77111                 motorway_link: 1,
77112                 trunk: 2,
77113                 trunk_link: 3,
77114                 primary: 4,
77115                 primary_link: 5,
77116                 secondary: 6,
77117                 tertiary: 7,
77118                 unclassified: 8,
77119                 residential: 9,
77120                 service: 10,
77121                 footway: 11
77122             };
77123
77124
77125             function drawTargets(selection, graph, entities, filter) {
77126                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77127                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
77128                 var getPath = svgPath(projection).geojson;
77129                 var activeID = context.activeID();
77130
77131                 // The targets and nopes will be MultiLineString sub-segments of the ways
77132                 var data = { targets: [], nopes: [] };
77133
77134                 entities.forEach(function(way) {
77135                     var features = svgSegmentWay(way, graph, activeID);
77136                     data.targets.push.apply(data.targets, features.passive);
77137                     data.nopes.push.apply(data.nopes, features.active);
77138                 });
77139
77140
77141                 // Targets allow hover and vertex snapping
77142                 var targetData = data.targets.filter(getPath);
77143                 var targets = selection.selectAll('.line.target-allowed')
77144                     .filter(function(d) { return filter(d.properties.entity); })
77145                     .data(targetData, function key(d) { return d.id; });
77146
77147                 // exit
77148                 targets.exit()
77149                     .remove();
77150
77151                 // enter/update
77152                 targets.enter()
77153                     .append('path')
77154                     .merge(targets)
77155                     .attr('d', getPath)
77156                     .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
77157
77158
77159                 // NOPE
77160                 var nopeData = data.nopes.filter(getPath);
77161                 var nopes = selection.selectAll('.line.target-nope')
77162                     .filter(function(d) { return filter(d.properties.entity); })
77163                     .data(nopeData, function key(d) { return d.id; });
77164
77165                 // exit
77166                 nopes.exit()
77167                     .remove();
77168
77169                 // enter/update
77170                 nopes.enter()
77171                     .append('path')
77172                     .merge(nopes)
77173                     .attr('d', getPath)
77174                     .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
77175             }
77176
77177
77178             function drawLines(selection, graph, entities, filter) {
77179
77180                 function waystack(a, b) {
77181                     var selected = context.selectedIDs();
77182                     var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
77183                     var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
77184
77185                     if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
77186                     if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
77187                     return scoreA - scoreB;
77188                 }
77189
77190
77191                 function drawLineGroup(selection, klass, isSelected) {
77192                     // Note: Don't add `.selected` class in draw modes
77193                     var mode = context.mode();
77194                     var isDrawing = mode && /^draw/.test(mode.id);
77195                     var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
77196
77197                     var lines = selection
77198                         .selectAll('path')
77199                         .filter(filter)
77200                         .data(getPathData(isSelected), osmEntity.key);
77201
77202                     lines.exit()
77203                         .remove();
77204
77205                     // Optimization: Call expensive TagClasses only on enter selection. This
77206                     // works because osmEntity.key is defined to include the entity v attribute.
77207                     lines.enter()
77208                         .append('path')
77209                         .attr('class', function(d) {
77210
77211                             var prefix = 'way line';
77212                             if (!d.hasInterestingTags() && graph.parentMultipolygons(d).length > 0) {
77213                                 // fudge the classes to style multipolygon member lines as area edges
77214                                 prefix = 'relation area';
77215                             }
77216
77217                             var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
77218                             return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
77219                         })
77220                         .call(svgTagClasses())
77221                         .merge(lines)
77222                         .sort(waystack)
77223                         .attr('d', getPath)
77224                         .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
77225
77226                     return selection;
77227                 }
77228
77229
77230                 function getPathData(isSelected) {
77231                     return function() {
77232                         var layer = this.parentNode.__data__;
77233                         var data = pathdata[layer] || [];
77234                         return data.filter(function(d) {
77235                             if (isSelected)
77236                                 return context.selectedIDs().indexOf(d.id) !== -1;
77237                             else
77238                                 return context.selectedIDs().indexOf(d.id) === -1;
77239                         });
77240                     };
77241                 }
77242
77243                 function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
77244                     var markergroup = layergroup
77245                         .selectAll('g.' + groupclass)
77246                         .data([pathclass]);
77247
77248                     markergroup = markergroup.enter()
77249                         .append('g')
77250                         .attr('class', groupclass)
77251                         .merge(markergroup);
77252
77253                     var markers = markergroup
77254                         .selectAll('path')
77255                         .filter(filter)
77256                         .data(
77257                             function data() { return groupdata[this.parentNode.__data__] || []; },
77258                             function key(d) { return [d.id, d.index]; }
77259                         );
77260
77261                     markers.exit()
77262                         .remove();
77263
77264                     markers = markers.enter()
77265                         .append('path')
77266                         .attr('class', pathclass)
77267                         .merge(markers)
77268                         .attr('marker-mid', marker)
77269                         .attr('d', function(d) { return d.d; });
77270
77271                     if (detected.ie) {
77272                         markers.each(function() { this.parentNode.insertBefore(this, this); });
77273                     }
77274                 }
77275
77276
77277                 var getPath = svgPath(projection, graph);
77278                 var ways = [];
77279                 var onewaydata = {};
77280                 var sideddata = {};
77281                 var oldMultiPolygonOuters = {};
77282
77283                 for (var i = 0; i < entities.length; i++) {
77284                     var entity = entities[i];
77285                     var outer = osmOldMultipolygonOuterMember(entity, graph);
77286                     if (outer) {
77287                         ways.push(entity.mergeTags(outer.tags));
77288                         oldMultiPolygonOuters[outer.id] = true;
77289                     } else if (entity.geometry(graph) === 'line') {
77290                         ways.push(entity);
77291                     }
77292                 }
77293
77294                 ways = ways.filter(getPath);
77295                 var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); });
77296
77297                 Object.keys(pathdata).forEach(function(k) {
77298                     var v = pathdata[k];
77299                     var onewayArr = v.filter(function(d) { return d.isOneWay(); });
77300                     var onewaySegments = svgMarkerSegments(
77301                         projection, graph, 35,
77302                         function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
77303                         function bothDirections(entity) {
77304                             return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
77305                         }
77306                     );
77307                     onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
77308
77309                     var sidedArr = v.filter(function(d) { return d.isSided(); });
77310                     var sidedSegments = svgMarkerSegments(
77311                         projection, graph, 30,
77312                         function shouldReverse() { return false; },
77313                         function bothDirections() { return false; }
77314                     );
77315                     sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
77316                 });
77317
77318
77319                 var covered = selection.selectAll('.layer-osm.covered');     // under areas
77320                 var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
77321                 var touchLayer = selection.selectAll('.layer-touch.lines');
77322
77323                 // Draw lines..
77324                 [covered, uncovered].forEach(function(selection) {
77325                     var range = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
77326                     var layergroup = selection
77327                         .selectAll('g.layergroup')
77328                         .data(range);
77329
77330                     layergroup = layergroup.enter()
77331                         .append('g')
77332                         .attr('class', function(d) { return 'layergroup layer' + String(d); })
77333                         .merge(layergroup);
77334
77335                     layergroup
77336                         .selectAll('g.linegroup')
77337                         .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
77338                         .enter()
77339                         .append('g')
77340                         .attr('class', function(d) { return 'linegroup line-' + d; });
77341
77342                     layergroup.selectAll('g.line-shadow')
77343                         .call(drawLineGroup, 'shadow', false);
77344                     layergroup.selectAll('g.line-casing')
77345                         .call(drawLineGroup, 'casing', false);
77346                     layergroup.selectAll('g.line-stroke')
77347                         .call(drawLineGroup, 'stroke', false);
77348
77349                     layergroup.selectAll('g.line-shadow-highlighted')
77350                         .call(drawLineGroup, 'shadow', true);
77351                     layergroup.selectAll('g.line-casing-highlighted')
77352                         .call(drawLineGroup, 'casing', true);
77353                     layergroup.selectAll('g.line-stroke-highlighted')
77354                         .call(drawLineGroup, 'stroke', true);
77355
77356                     addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
77357                     addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
77358                         function marker(d) {
77359                             var category = graph.entity(d.id).sidednessIdentifier();
77360                             return 'url(#sided-marker-' + category + ')';
77361                         }
77362                     );
77363                 });
77364
77365                 // Draw touch targets..
77366                 touchLayer
77367                     .call(drawTargets, graph, ways, filter);
77368             }
77369
77370
77371             return drawLines;
77372         }
77373
77374         function svgMidpoints(projection, context) {
77375             var targetRadius = 8;
77376
77377             function drawTargets(selection, graph, entities, filter) {
77378                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77379                 var getTransform = svgPointTransform(projection).geojson;
77380
77381                 var data = entities.map(function(midpoint) {
77382                     return {
77383                         type: 'Feature',
77384                         id: midpoint.id,
77385                         properties: {
77386                             target: true,
77387                             entity: midpoint
77388                         },
77389                         geometry: {
77390                             type: 'Point',
77391                             coordinates: midpoint.loc
77392                         }
77393                     };
77394                 });
77395
77396                 var targets = selection.selectAll('.midpoint.target')
77397                     .filter(function(d) { return filter(d.properties.entity); })
77398                     .data(data, function key(d) { return d.id; });
77399
77400                 // exit
77401                 targets.exit()
77402                     .remove();
77403
77404                 // enter/update
77405                 targets.enter()
77406                     .append('circle')
77407                     .attr('r', targetRadius)
77408                     .merge(targets)
77409                     .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
77410                     .attr('transform', getTransform);
77411             }
77412
77413
77414             function drawMidpoints(selection, graph, entities, filter, extent) {
77415                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
77416                 var touchLayer = selection.selectAll('.layer-touch.points');
77417
77418                 var mode = context.mode();
77419                 if (mode && mode.id !== 'select') {
77420                     drawLayer.selectAll('.midpoint').remove();
77421                     touchLayer.selectAll('.midpoint.target').remove();
77422                     return;
77423                 }
77424
77425                 var poly = extent.polygon();
77426                 var midpoints = {};
77427
77428                 for (var i = 0; i < entities.length; i++) {
77429                     var entity = entities[i];
77430
77431                     if (entity.type !== 'way') continue;
77432                     if (!filter(entity)) continue;
77433                     if (context.selectedIDs().indexOf(entity.id) < 0) continue;
77434
77435                     var nodes = graph.childNodes(entity);
77436                     for (var j = 0; j < nodes.length - 1; j++) {
77437                         var a = nodes[j];
77438                         var b = nodes[j + 1];
77439                         var id = [a.id, b.id].sort().join('-');
77440
77441                         if (midpoints[id]) {
77442                             midpoints[id].parents.push(entity);
77443                         } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
77444                             var point = geoVecInterp(a.loc, b.loc, 0.5);
77445                             var loc = null;
77446
77447                             if (extent.intersects(point)) {
77448                                 loc = point;
77449                             } else {
77450                                 for (var k = 0; k < 4; k++) {
77451                                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
77452                                     if (point &&
77453                                         geoVecLength(projection(a.loc), projection(point)) > 20 &&
77454                                         geoVecLength(projection(b.loc), projection(point)) > 20)
77455                                     {
77456                                         loc = point;
77457                                         break;
77458                                     }
77459                                 }
77460                             }
77461
77462                             if (loc) {
77463                                 midpoints[id] = {
77464                                     type: 'midpoint',
77465                                     id: id,
77466                                     loc: loc,
77467                                     edge: [a.id, b.id],
77468                                     parents: [entity]
77469                                 };
77470                             }
77471                         }
77472                     }
77473                 }
77474
77475
77476                 function midpointFilter(d) {
77477                     if (midpoints[d.id])
77478                         return true;
77479
77480                     for (var i = 0; i < d.parents.length; i++) {
77481                         if (filter(d.parents[i])) {
77482                             return true;
77483                         }
77484                     }
77485
77486                     return false;
77487                 }
77488
77489
77490                 var groups = drawLayer.selectAll('.midpoint')
77491                     .filter(midpointFilter)
77492                     .data(Object.values(midpoints), function(d) { return d.id; });
77493
77494                 groups.exit()
77495                     .remove();
77496
77497                 var enter = groups.enter()
77498                     .insert('g', ':first-child')
77499                     .attr('class', 'midpoint');
77500
77501                 enter
77502                     .append('polygon')
77503                     .attr('points', '-6,8 10,0 -6,-8')
77504                     .attr('class', 'shadow');
77505
77506                 enter
77507                     .append('polygon')
77508                     .attr('points', '-3,4 5,0 -3,-4')
77509                     .attr('class', 'fill');
77510
77511                 groups = groups
77512                     .merge(enter)
77513                     .attr('transform', function(d) {
77514                         var translate = svgPointTransform(projection);
77515                         var a = graph.entity(d.edge[0]);
77516                         var b = graph.entity(d.edge[1]);
77517                         var angle = geoAngle(a, b, projection) * (180 / Math.PI);
77518                         return translate(d) + ' rotate(' + angle + ')';
77519                     })
77520                     .call(svgTagClasses().tags(
77521                         function(d) { return d.parents[0].tags; }
77522                     ));
77523
77524                 // Propagate data bindings.
77525                 groups.select('polygon.shadow');
77526                 groups.select('polygon.fill');
77527
77528
77529                 // Draw touch targets..
77530                 touchLayer
77531                     .call(drawTargets, graph, Object.values(midpoints), midpointFilter);
77532             }
77533
77534             return drawMidpoints;
77535         }
77536
77537         function svgPoints(projection, context) {
77538
77539             function markerPath(selection, klass) {
77540                 selection
77541                     .attr('class', klass)
77542                     .attr('transform', 'translate(-8, -23)')
77543                     .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
77544             }
77545
77546             function sortY(a, b) {
77547                 return b.loc[1] - a.loc[1];
77548             }
77549
77550
77551             // Avoid exit/enter if we're just moving stuff around.
77552             // The node will get a new version but we only need to run the update selection.
77553             function fastEntityKey(d) {
77554                 var mode = context.mode();
77555                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77556                 return isMoving ? d.id : osmEntity.key(d);
77557             }
77558
77559
77560             function drawTargets(selection, graph, entities, filter) {
77561                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77562                 var getTransform = svgPointTransform(projection).geojson;
77563                 var activeID = context.activeID();
77564                 var data = [];
77565
77566                 entities.forEach(function(node) {
77567                     if (activeID === node.id) return;   // draw no target on the activeID
77568
77569                     data.push({
77570                         type: 'Feature',
77571                         id: node.id,
77572                         properties: {
77573                             target: true,
77574                             entity: node
77575                         },
77576                         geometry: node.asGeoJSON()
77577                     });
77578                 });
77579
77580                 var targets = selection.selectAll('.point.target')
77581                     .filter(function(d) { return filter(d.properties.entity); })
77582                     .data(data, function key(d) { return d.id; });
77583
77584                 // exit
77585                 targets.exit()
77586                     .remove();
77587
77588                 // enter/update
77589                 targets.enter()
77590                     .append('rect')
77591                     .attr('x', -10)
77592                     .attr('y', -26)
77593                     .attr('width', 20)
77594                     .attr('height', 30)
77595                     .merge(targets)
77596                     .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
77597                     .attr('transform', getTransform);
77598             }
77599
77600
77601             function drawPoints(selection, graph, entities, filter) {
77602                 var wireframe = context.surface().classed('fill-wireframe');
77603                 var zoom = geoScaleToZoom(projection.scale());
77604
77605                 // Points with a direction will render as vertices at higher zooms..
77606                 function renderAsPoint(entity) {
77607                     return entity.geometry(graph) === 'point' &&
77608                         !(zoom >= 18 && entity.directions(graph, projection).length);
77609                 }
77610
77611                 // All points will render as vertices in wireframe mode too..
77612                 var points = wireframe ? [] : entities.filter(renderAsPoint);
77613                 points.sort(sortY);
77614
77615
77616                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
77617                 var touchLayer = selection.selectAll('.layer-touch.points');
77618
77619                 // Draw points..
77620                 var groups = drawLayer.selectAll('g.point')
77621                     .filter(filter)
77622                     .data(points, fastEntityKey);
77623
77624                 groups.exit()
77625                     .remove();
77626
77627                 var enter = groups.enter()
77628                     .append('g')
77629                     .attr('class', function(d) { return 'node point ' + d.id; })
77630                     .order();
77631
77632                 enter
77633                     .append('path')
77634                     .call(markerPath, 'shadow');
77635
77636                 enter
77637                     .append('ellipse')
77638                     .attr('cx', 0.5)
77639                     .attr('cy', 1)
77640                     .attr('rx', 6.5)
77641                     .attr('ry', 3)
77642                     .attr('class', 'stroke');
77643
77644                 enter
77645                     .append('path')
77646                     .call(markerPath, 'stroke');
77647
77648                 enter
77649                     .append('use')
77650                     .attr('transform', 'translate(-5, -19)')
77651                     .attr('class', 'icon')
77652                     .attr('width', '11px')
77653                     .attr('height', '11px');
77654
77655                 groups = groups
77656                     .merge(enter)
77657                     .attr('transform', svgPointTransform(projection))
77658                     .call(svgTagClasses());
77659
77660                 groups.select('.shadow');   // propagate bound data
77661                 groups.select('.stroke');   // propagate bound data
77662                 groups.select('.icon')      // propagate bound data
77663                     .attr('xlink:href', function(entity) {
77664                         var preset = context.presets().match(entity, graph);
77665                         var picon = preset && preset.icon;
77666
77667                         if (!picon) {
77668                             return '';
77669                         } else {
77670                             var isMaki = /^maki-/.test(picon);
77671                             return '#' + picon + (isMaki ? '-11' : '');
77672                         }
77673                     });
77674
77675
77676                 // Draw touch targets..
77677                 touchLayer
77678                     .call(drawTargets, graph, points, filter);
77679             }
77680
77681
77682             return drawPoints;
77683         }
77684
77685         function svgTurns(projection, context) {
77686
77687             function icon(turn) {
77688                 var u = turn.u ? '-u' : '';
77689                 if (turn.no) return '#iD-turn-no' + u;
77690                 if (turn.only) return '#iD-turn-only' + u;
77691                 return '#iD-turn-yes' + u;
77692             }
77693
77694             function drawTurns(selection, graph, turns) {
77695
77696                 function turnTransform(d) {
77697                     var pxRadius = 50;
77698                     var toWay = graph.entity(d.to.way);
77699                     var toPoints = graph.childNodes(toWay)
77700                         .map(function (n) { return n.loc; })
77701                         .map(projection);
77702                     var toLength = geoPathLength(toPoints);
77703                     var mid = toLength / 2;    // midpoint of destination way
77704
77705                     var toNode = graph.entity(d.to.node);
77706                     var toVertex = graph.entity(d.to.vertex);
77707                     var a = geoAngle(toVertex, toNode, projection);
77708                     var o = projection(toVertex.loc);
77709                     var r = d.u ? 0                  // u-turn: no radius
77710                         : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
77711                         : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
77712
77713                     return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
77714                         'rotate(' + a * 180 / Math.PI + ')';
77715                 }
77716
77717
77718                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
77719                 var touchLayer = selection.selectAll('.layer-touch.turns');
77720
77721                 // Draw turns..
77722                 var groups = drawLayer.selectAll('g.turn')
77723                     .data(turns, function(d) { return d.key; });
77724
77725                 // exit
77726                 groups.exit()
77727                     .remove();
77728
77729                 // enter
77730                 var groupsEnter = groups.enter()
77731                     .append('g')
77732                     .attr('class', function(d) { return 'turn ' + d.key; });
77733
77734                 var turnsEnter = groupsEnter
77735                     .filter(function(d) { return !d.u; });
77736
77737                 turnsEnter.append('rect')
77738                     .attr('transform', 'translate(-22, -12)')
77739                     .attr('width', '44')
77740                     .attr('height', '24');
77741
77742                 turnsEnter.append('use')
77743                     .attr('transform', 'translate(-22, -12)')
77744                     .attr('width', '44')
77745                     .attr('height', '24');
77746
77747                 var uEnter = groupsEnter
77748                     .filter(function(d) { return d.u; });
77749
77750                 uEnter.append('circle')
77751                     .attr('r', '16');
77752
77753                 uEnter.append('use')
77754                     .attr('transform', 'translate(-16, -16)')
77755                     .attr('width', '32')
77756                     .attr('height', '32');
77757
77758                 // update
77759                 groups = groups
77760                     .merge(groupsEnter)
77761                     .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
77762                     .attr('transform', turnTransform);
77763
77764                 groups.select('use')
77765                     .attr('xlink:href', icon);
77766
77767                 groups.select('rect');      // propagate bound data
77768                 groups.select('circle');    // propagate bound data
77769
77770
77771                 // Draw touch targets..
77772                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77773                 groups = touchLayer.selectAll('g.turn')
77774                     .data(turns, function(d) { return d.key; });
77775
77776                 // exit
77777                 groups.exit()
77778                     .remove();
77779
77780                 // enter
77781                 groupsEnter = groups.enter()
77782                     .append('g')
77783                     .attr('class', function(d) { return 'turn ' + d.key; });
77784
77785                 turnsEnter = groupsEnter
77786                     .filter(function(d) { return !d.u; });
77787
77788                 turnsEnter.append('rect')
77789                     .attr('class', 'target ' + fillClass)
77790                     .attr('transform', 'translate(-22, -12)')
77791                     .attr('width', '44')
77792                     .attr('height', '24');
77793
77794                 uEnter = groupsEnter
77795                     .filter(function(d) { return d.u; });
77796
77797                 uEnter.append('circle')
77798                     .attr('class', 'target ' + fillClass)
77799                     .attr('r', '16');
77800
77801                 // update
77802                 groups = groups
77803                     .merge(groupsEnter)
77804                     .attr('transform', turnTransform);
77805
77806                 groups.select('rect');      // propagate bound data
77807                 groups.select('circle');    // propagate bound data
77808
77809
77810                 return this;
77811             }
77812
77813             return drawTurns;
77814         }
77815
77816         function svgVertices(projection, context) {
77817             var radiuses = {
77818                 //       z16-, z17,   z18+,  w/icon
77819                 shadow: [6,    7.5,   7.5,   12],
77820                 stroke: [2.5,  3.5,   3.5,   8],
77821                 fill:   [1,    1.5,   1.5,   1.5]
77822             };
77823
77824             var _currHoverTarget;
77825             var _currPersistent = {};
77826             var _currHover = {};
77827             var _prevHover = {};
77828             var _currSelected = {};
77829             var _prevSelected = {};
77830             var _radii = {};
77831
77832
77833             function sortY(a, b) {
77834                 return b.loc[1] - a.loc[1];
77835             }
77836
77837             // Avoid exit/enter if we're just moving stuff around.
77838             // The node will get a new version but we only need to run the update selection.
77839             function fastEntityKey(d) {
77840                 var mode = context.mode();
77841                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77842                 return isMoving ? d.id : osmEntity.key(d);
77843             }
77844
77845
77846             function draw(selection, graph, vertices, sets, filter) {
77847                 sets = sets || { selected: {}, important: {}, hovered: {} };
77848
77849                 var icons = {};
77850                 var directions = {};
77851                 var wireframe = context.surface().classed('fill-wireframe');
77852                 var zoom = geoScaleToZoom(projection.scale());
77853                 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
77854                 var activeID = context.activeID();
77855
77856
77857                 function getIcon(d) {
77858                     // always check latest entity, as fastEntityKey avoids enter/exit now
77859                     var entity = graph.entity(d.id);
77860                     if (entity.id in icons) return icons[entity.id];
77861
77862                     icons[entity.id] =
77863                         entity.hasInterestingTags() &&
77864                         context.presets().match(entity, graph).icon;
77865
77866                     return icons[entity.id];
77867                 }
77868
77869
77870                 // memoize directions results, return false for empty arrays (for use in filter)
77871                 function getDirections(entity) {
77872                     if (entity.id in directions) return directions[entity.id];
77873
77874                     var angles = entity.directions(graph, projection);
77875                     directions[entity.id] = angles.length ? angles : false;
77876                     return angles;
77877                 }
77878
77879
77880                 function updateAttributes(selection) {
77881                     ['shadow', 'stroke', 'fill'].forEach(function(klass) {
77882                         var rads = radiuses[klass];
77883                         selection.selectAll('.' + klass)
77884                             .each(function(entity) {
77885                                 var i = z && getIcon(entity);
77886                                 var r = rads[i ? 3 : z];
77887
77888                                 // slightly increase the size of unconnected endpoints #3775
77889                                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
77890                                     r += 1.5;
77891                                 }
77892
77893                                 if (klass === 'shadow') {   // remember this value, so we don't need to
77894                                     _radii[entity.id] = r;  // recompute it when we draw the touch targets
77895                                 }
77896
77897                                 d3_select(this)
77898                                     .attr('r', r)
77899                                     .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
77900                             });
77901                     });
77902                 }
77903
77904                 vertices.sort(sortY);
77905
77906                 var groups = selection.selectAll('g.vertex')
77907                     .filter(filter)
77908                     .data(vertices, fastEntityKey);
77909
77910                 // exit
77911                 groups.exit()
77912                     .remove();
77913
77914                 // enter
77915                 var enter = groups.enter()
77916                     .append('g')
77917                     .attr('class', function(d) { return 'node vertex ' + d.id; })
77918                     .order();
77919
77920                 enter
77921                     .append('circle')
77922                     .attr('class', 'shadow');
77923
77924                 enter
77925                     .append('circle')
77926                     .attr('class', 'stroke');
77927
77928                 // Vertices with tags get a fill.
77929                 enter.filter(function(d) { return d.hasInterestingTags(); })
77930                     .append('circle')
77931                     .attr('class', 'fill');
77932
77933                 // update
77934                 groups = groups
77935                     .merge(enter)
77936                     .attr('transform', svgPointTransform(projection))
77937                     .classed('sibling', function(d) { return d.id in sets.selected; })
77938                     .classed('shared', function(d) { return graph.isShared(d); })
77939                     .classed('endpoint', function(d) { return d.isEndpoint(graph); })
77940                     .call(updateAttributes);
77941
77942
77943                 // Vertices with icons get a `use`.
77944                 var iconUse = groups
77945                     .selectAll('.icon')
77946                     .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
77947
77948                 // exit
77949                 iconUse.exit()
77950                     .remove();
77951
77952                 // enter
77953                 iconUse.enter()
77954                     .append('use')
77955                     .attr('class', 'icon')
77956                     .attr('width', '11px')
77957                     .attr('height', '11px')
77958                     .attr('transform', 'translate(-5.5, -5.5)')
77959                     .attr('xlink:href', function(d) {
77960                         var picon = getIcon(d);
77961                         var isMaki = /^maki-/.test(picon);
77962                         return '#' + picon + (isMaki ? '-11' : '');
77963                     });
77964
77965
77966                 // Vertices with directions get viewfields
77967                 var dgroups = groups
77968                     .selectAll('.viewfieldgroup')
77969                     .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
77970
77971                 // exit
77972                 dgroups.exit()
77973                     .remove();
77974
77975                 // enter/update
77976                 dgroups = dgroups.enter()
77977                     .insert('g', '.shadow')
77978                     .attr('class', 'viewfieldgroup')
77979                     .merge(dgroups);
77980
77981                 var viewfields = dgroups.selectAll('.viewfield')
77982                     .data(getDirections, function key(d) { return osmEntity.key(d); });
77983
77984                 // exit
77985                 viewfields.exit()
77986                     .remove();
77987
77988                 // enter/update
77989                 viewfields.enter()
77990                     .append('path')
77991                     .attr('class', 'viewfield')
77992                     .attr('d', 'M0,0H0')
77993                     .merge(viewfields)
77994                     .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
77995                     .attr('transform', function(d) { return 'rotate(' + d + ')'; });
77996             }
77997
77998
77999             function drawTargets(selection, graph, entities, filter) {
78000                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
78001                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
78002                 var getTransform = svgPointTransform(projection).geojson;
78003                 var activeID = context.activeID();
78004                 var data = { targets: [], nopes: [] };
78005
78006                 entities.forEach(function(node) {
78007                     if (activeID === node.id) return;   // draw no target on the activeID
78008
78009                     var vertexType = svgPassiveVertex(node, graph, activeID);
78010                     if (vertexType !== 0) {     // passive or adjacent - allow to connect
78011                         data.targets.push({
78012                             type: 'Feature',
78013                             id: node.id,
78014                             properties: {
78015                                 target: true,
78016                                 entity: node
78017                             },
78018                             geometry: node.asGeoJSON()
78019                         });
78020                     } else {
78021                         data.nopes.push({
78022                             type: 'Feature',
78023                             id: node.id + '-nope',
78024                             properties: {
78025                                 nope: true,
78026                                 target: true,
78027                                 entity: node
78028                             },
78029                             geometry: node.asGeoJSON()
78030                         });
78031                     }
78032                 });
78033
78034
78035                 // Targets allow hover and vertex snapping
78036                 var targets = selection.selectAll('.vertex.target-allowed')
78037                     .filter(function(d) { return filter(d.properties.entity); })
78038                     .data(data.targets, function key(d) { return d.id; });
78039
78040                 // exit
78041                 targets.exit()
78042                     .remove();
78043
78044                 // enter/update
78045                 targets.enter()
78046                     .append('circle')
78047                     .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
78048                     .merge(targets)
78049                     .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
78050                     .attr('transform', getTransform);
78051
78052
78053                 // NOPE
78054                 var nopes = selection.selectAll('.vertex.target-nope')
78055                     .filter(function(d) { return filter(d.properties.entity); })
78056                     .data(data.nopes, function key(d) { return d.id; });
78057
78058                 // exit
78059                 nopes.exit()
78060                     .remove();
78061
78062                 // enter/update
78063                 nopes.enter()
78064                     .append('circle')
78065                     .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
78066                     .merge(nopes)
78067                     .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
78068                     .attr('transform', getTransform);
78069             }
78070
78071
78072             // Points can also render as vertices:
78073             // 1. in wireframe mode or
78074             // 2. at higher zooms if they have a direction
78075             function renderAsVertex(entity, graph, wireframe, zoom) {
78076                 var geometry = entity.geometry(graph);
78077                 return geometry === 'vertex' || (geometry === 'point' && (
78078                     wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
78079                 ));
78080             }
78081
78082
78083             function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
78084                 var results = {};
78085
78086                 function addChildVertices(entity) {
78087                     var geometry = entity.geometry(graph);
78088                     if (!context.features().isHiddenFeature(entity, graph, geometry)) {
78089                         var i;
78090                         if (entity.type === 'way') {
78091                             for (i = 0; i < entity.nodes.length; i++) {
78092                                 var child = graph.hasEntity(entity.nodes[i]);
78093                                 if (child) {
78094                                     addChildVertices(child);
78095                                 }
78096                             }
78097                         } else if (entity.type === 'relation') {
78098                             for (i = 0; i < entity.members.length; i++) {
78099                                 var member = graph.hasEntity(entity.members[i].id);
78100                                 if (member) {
78101                                     addChildVertices(member);
78102                                 }
78103                             }
78104                         } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
78105                             results[entity.id] = entity;
78106                         }
78107                     }
78108                 }
78109
78110                 ids.forEach(function(id) {
78111                     var entity = graph.hasEntity(id);
78112                     if (!entity) return;
78113
78114                     if (entity.type === 'node') {
78115                         if (renderAsVertex(entity, graph, wireframe, zoom)) {
78116                             results[entity.id] = entity;
78117                             graph.parentWays(entity).forEach(function(entity) {
78118                                 addChildVertices(entity);
78119                             });
78120                         }
78121                     } else {  // way, relation
78122                         addChildVertices(entity);
78123                     }
78124                 });
78125
78126                 return results;
78127             }
78128
78129
78130             function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
78131                 var wireframe = context.surface().classed('fill-wireframe');
78132                 var zoom = geoScaleToZoom(projection.scale());
78133                 var mode = context.mode();
78134                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
78135
78136                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
78137                 var touchLayer = selection.selectAll('.layer-touch.points');
78138
78139                 if (fullRedraw) {
78140                     _currPersistent = {};
78141                     _radii = {};
78142                 }
78143
78144                 // Collect important vertices from the `entities` list..
78145                 // (during a paritial redraw, it will not contain everything)
78146                 for (var i = 0; i < entities.length; i++) {
78147                     var entity = entities[i];
78148                     var geometry = entity.geometry(graph);
78149                     var keep = false;
78150
78151                     // a point that looks like a vertex..
78152                     if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
78153                         _currPersistent[entity.id] = entity;
78154                         keep = true;
78155
78156                     // a vertex of some importance..
78157                     } else if (geometry === 'vertex' &&
78158                         (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
78159                         _currPersistent[entity.id] = entity;
78160                         keep = true;
78161                     }
78162
78163                     // whatever this is, it's not a persistent vertex..
78164                     if (!keep && !fullRedraw) {
78165                         delete _currPersistent[entity.id];
78166                     }
78167                 }
78168
78169                 // 3 sets of vertices to consider:
78170                 var sets = {
78171                     persistent: _currPersistent,  // persistent = important vertices (render always)
78172                     selected: _currSelected,      // selected + siblings of selected (render always)
78173                     hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
78174                 };
78175
78176                 var all = Object.assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
78177
78178                 // Draw the vertices..
78179                 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
78180                 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
78181                 var filterRendered = function(d) {
78182                     return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
78183                 };
78184                 drawLayer
78185                     .call(draw, graph, currentVisible(all), sets, filterRendered);
78186
78187                 // Draw touch targets..
78188                 // When drawing, render all targets (not just those affected by a partial redraw)
78189                 var filterTouch = function(d) {
78190                     return isMoving ? true : filterRendered(d);
78191                 };
78192                 touchLayer
78193                     .call(drawTargets, graph, currentVisible(all), filterTouch);
78194
78195
78196                 function currentVisible(which) {
78197                     return Object.keys(which)
78198                         .map(graph.hasEntity, graph)     // the current version of this entity
78199                         .filter(function (entity) { return entity && entity.intersects(extent, graph); });
78200                 }
78201             }
78202
78203
78204             // partial redraw - only update the selected items..
78205             drawVertices.drawSelected = function(selection, graph, extent) {
78206                 var wireframe = context.surface().classed('fill-wireframe');
78207                 var zoom = geoScaleToZoom(projection.scale());
78208
78209                 _prevSelected = _currSelected || {};
78210                 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
78211
78212                 // note that drawVertices will add `_currSelected` automatically if needed..
78213                 var filter = function(d) { return d.id in _prevSelected; };
78214                 drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
78215             };
78216
78217
78218             // partial redraw - only update the hovered items..
78219             drawVertices.drawHover = function(selection, graph, target, extent) {
78220                 if (target === _currHoverTarget) return;  // continue only if something changed
78221
78222                 var wireframe = context.surface().classed('fill-wireframe');
78223                 var zoom = geoScaleToZoom(projection.scale());
78224
78225                 _prevHover = _currHover || {};
78226                 _currHoverTarget = target;
78227                 var entity = target && target.properties && target.properties.entity;
78228
78229                 if (entity) {
78230                     _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
78231                 } else {
78232                     _currHover = {};
78233                 }
78234
78235                 // note that drawVertices will add `_currHover` automatically if needed..
78236                 var filter = function(d) { return d.id in _prevHover; };
78237                 drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
78238             };
78239
78240             return drawVertices;
78241         }
78242
78243         function utilBindOnce(target, type, listener, capture) {
78244             var typeOnce = type + '.once';
78245             function one() {
78246                 target.on(typeOnce, null);
78247                 listener.apply(this, arguments);
78248             }
78249             target.on(typeOnce, one, capture);
78250             return this;
78251         }
78252
78253         // constants
78254         var TILESIZE = 256;
78255         var kMin = geoZoomToScale(2, TILESIZE);
78256         var kMax = geoZoomToScale(24, TILESIZE);
78257
78258         function clamp(num, min, max) {
78259             return Math.max(min, Math.min(num, max));
78260         }
78261
78262
78263         function rendererMap(context) {
78264             var dispatch$1 = dispatch('move', 'drawn');
78265             var projection = context.projection;
78266             var curtainProjection = context.curtainProjection;
78267             var drawLayers = svgLayers(projection, context);
78268             var drawPoints = svgPoints(projection, context);
78269             var drawVertices = svgVertices(projection, context);
78270             var drawLines = svgLines(projection, context);
78271             var drawAreas = svgAreas(projection, context);
78272             var drawMidpoints = svgMidpoints(projection, context);
78273             var drawLabels = svgLabels(projection, context);
78274
78275             var _selection = d3_select(null);
78276             var supersurface = d3_select(null);
78277             var wrapper = d3_select(null);
78278             var surface = d3_select(null);
78279
78280             var _dimensions = [1, 1];
78281             var _dblClickEnabled = true;
78282             var _redrawEnabled = true;
78283             var _gestureTransformStart;
78284             var _transformStart = projection.transform();
78285             var _transformLast;
78286             var _isTransformed = false;
78287             var _minzoom = 0;
78288             var _getMouseCoords;
78289             var _mouseEvent;
78290
78291             var zoom = d3_zoom()
78292                 .scaleExtent([kMin, kMax])
78293                 .interpolate(d3_interpolate)
78294                 .filter(zoomEventFilter)
78295                 .on('zoom', zoomPan);
78296
78297             var scheduleRedraw = throttle(redraw, 750);
78298             // var isRedrawScheduled = false;
78299             // var pendingRedrawCall;
78300             // function scheduleRedraw() {
78301             //     // Only schedule the redraw if one has not already been set.
78302             //     if (isRedrawScheduled) return;
78303             //     isRedrawScheduled = true;
78304             //     var that = this;
78305             //     var args = arguments;
78306             //     pendingRedrawCall = window.requestIdleCallback(function () {
78307             //         // Reset the boolean so future redraws can be set.
78308             //         isRedrawScheduled = false;
78309             //         redraw.apply(that, args);
78310             //     }, { timeout: 1400 });
78311             // }
78312
78313             function cancelPendingRedraw() {
78314                 scheduleRedraw.cancel();
78315                 // isRedrawScheduled = false;
78316                 // window.cancelIdleCallback(pendingRedrawCall);
78317             }
78318
78319
78320             function map(selection) {
78321                 _selection = selection;
78322
78323                 context
78324                     .on('change.map', immediateRedraw);
78325
78326                 var osm = context.connection();
78327                 if (osm) {
78328                     osm.on('change.map', immediateRedraw);
78329                 }
78330
78331                 function didUndoOrRedo(targetTransform) {
78332                     var mode = context.mode().id;
78333                     if (mode !== 'browse' && mode !== 'select') return;
78334                     if (targetTransform) {
78335                         map.transformEase(targetTransform);
78336                     }
78337                 }
78338
78339                 context.history()
78340                     .on('merge.map', function() { scheduleRedraw(); })
78341                     .on('change.map', immediateRedraw)
78342                     .on('undone.map', function(stack, fromStack) {
78343                         didUndoOrRedo(fromStack.transform);
78344                     })
78345                     .on('redone.map', function(stack) {
78346                         didUndoOrRedo(stack.transform);
78347                     });
78348
78349                 context.background()
78350                     .on('change.map', immediateRedraw);
78351
78352                 context.features()
78353                     .on('redraw.map', immediateRedraw);
78354
78355                 drawLayers
78356                     .on('change.map', function() {
78357                         context.background().updateImagery();
78358                         immediateRedraw();
78359                     });
78360
78361                 selection
78362                     .on('dblclick.map', dblClick)
78363                     .call(zoom)
78364                     .call(zoom.transform, projection.transform());
78365
78366                 supersurface = selection.append('div')
78367                     .attr('id', 'supersurface')
78368                     .call(utilSetTransform, 0, 0);
78369
78370                 // Need a wrapper div because Opera can't cope with an absolutely positioned
78371                 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
78372                 wrapper = supersurface
78373                     .append('div')
78374                     .attr('class', 'layer layer-data');
78375
78376                 map.surface = surface = wrapper
78377                     .call(drawLayers)
78378                     .selectAll('.surface')
78379                     .attr('id', 'surface');
78380
78381                 surface
78382                     .call(drawLabels.observe)
78383                     .on('gesturestart.surface', function() {
78384                         _gestureTransformStart = projection.transform();
78385                     })
78386                     .on('gesturechange.surface', gestureChange)
78387                     .on('mousedown.zoom', function() {
78388                         if (event.button === 2) {
78389                             event.stopPropagation();
78390                         }
78391                     }, true)
78392                     .on('mouseup.zoom', function() {
78393                         if (resetTransform()) {
78394                             immediateRedraw();
78395                         }
78396                     })
78397                     .on('mousemove.map', function() {
78398                         _mouseEvent = event;
78399                     })
78400                     .on('mouseover.vertices', function() {
78401                         if (map.editable() && !_isTransformed) {
78402                             var hover = event.target.__data__;
78403                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78404                             dispatch$1.call('drawn', this, { full: false });
78405                         }
78406                     })
78407                     .on('mouseout.vertices', function() {
78408                         if (map.editable() && !_isTransformed) {
78409                             var hover = event.relatedTarget && event.relatedTarget.__data__;
78410                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78411                             dispatch$1.call('drawn', this, { full: false });
78412                         }
78413                     });
78414
78415                 context.on('enter.map',  function() {
78416                     if (map.editable() && !_isTransformed) {
78417                         // redraw immediately any objects affected by a change in selectedIDs.
78418                         var graph = context.graph();
78419                         var selectedAndParents = {};
78420                         context.selectedIDs().forEach(function(id) {
78421                             var entity = graph.hasEntity(id);
78422                             if (entity) {
78423                                 selectedAndParents[entity.id] = entity;
78424                                 if (entity.type === 'node') {
78425                                     graph.parentWays(entity).forEach(function(parent) {
78426                                         selectedAndParents[parent.id] = parent;
78427                                     });
78428                                 }
78429                             }
78430                         });
78431                         var data = Object.values(selectedAndParents);
78432                         var filter = function(d) { return d.id in selectedAndParents; };
78433
78434                         data = context.features().filter(data, graph);
78435
78436                         surface
78437                             .call(drawVertices.drawSelected, graph, map.extent())
78438                             .call(drawLines, graph, data, filter)
78439                             .call(drawAreas, graph, data, filter)
78440                             .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
78441
78442                         dispatch$1.call('drawn', this, { full: false });
78443
78444                         // redraw everything else later
78445                         scheduleRedraw();
78446                     }
78447                 });
78448
78449                 map.dimensions(utilGetDimensions(selection));
78450             }
78451
78452
78453             function zoomEventFilter() {
78454                 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
78455                 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
78456                 // This can happen if a previous `mousedown` occurred without a `mouseup`.
78457                 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
78458                 // so that d3-zoom won't stop propagation of new `mousedown` events.
78459                 if (event.type === 'mousedown') {
78460                     var hasOrphan = false;
78461                     var listeners = window.__on;
78462                     for (var i = 0; i < listeners.length; i++) {
78463                         var listener = listeners[i];
78464                         if (listener.name === 'zoom' && listener.type === 'mouseup') {
78465                             hasOrphan = true;
78466                             break;
78467                         }
78468                     }
78469                     if (hasOrphan) {
78470                         var event$1 = window.CustomEvent;
78471                         if (event$1) {
78472                             event$1 = new event$1('mouseup');
78473                         } else {
78474                             event$1 = window.document.createEvent('Event');
78475                             event$1.initEvent('mouseup', false, false);
78476                         }
78477                         // Event needs to be dispatched with an event.view property.
78478                         event$1.view = window;
78479                         window.dispatchEvent(event$1);
78480                     }
78481                 }
78482
78483                 return event.button !== 2;   // ignore right clicks
78484             }
78485
78486
78487             function pxCenter() {
78488                 return [_dimensions[0] / 2, _dimensions[1] / 2];
78489             }
78490
78491
78492             function drawEditable(difference, extent) {
78493                 var mode = context.mode();
78494                 var graph = context.graph();
78495                 var features = context.features();
78496                 var all = context.intersects(map.extent());
78497                 var fullRedraw = false;
78498                 var data;
78499                 var set;
78500                 var filter;
78501
78502                 if (difference) {
78503                     var complete = difference.complete(map.extent());
78504                     data = Object.values(complete).filter(Boolean);
78505                     set = new Set(data.map(function(entity) { return entity.id; }));
78506                     filter = function(d) { return set.has(d.id); };
78507                     features.clear(data);
78508
78509                 } else {
78510                     // force a full redraw if gatherStats detects that a feature
78511                     // should be auto-hidden (e.g. points or buildings)..
78512                     if (features.gatherStats(all, graph, _dimensions)) {
78513                         extent = undefined;
78514                     }
78515
78516                     if (extent) {
78517                         data = context.intersects(map.extent().intersection(extent));
78518                         set = new Set(data.map(function(entity) { return entity.id; }));
78519                         filter = function(d) { return set.has(d.id); };
78520
78521                     } else {
78522                         data = all;
78523                         fullRedraw = true;
78524                         filter = utilFunctor(true);
78525                     }
78526                 }
78527
78528                 data = features.filter(data, graph);
78529
78530                 if (mode && mode.id === 'select') {
78531                     // update selected vertices - the user might have just double-clicked a way,
78532                     // creating a new vertex, triggering a partial redraw without a mode change
78533                     surface.call(drawVertices.drawSelected, graph, map.extent());
78534                 }
78535
78536                 surface
78537                     .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
78538                     .call(drawLines, graph, data, filter)
78539                     .call(drawAreas, graph, data, filter)
78540                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
78541                     .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
78542                     .call(drawPoints, graph, data, filter);
78543
78544                 dispatch$1.call('drawn', this, {full: true});
78545             }
78546
78547
78548             function editOff() {
78549                 context.features().resetStats();
78550                 surface.selectAll('.layer-osm *').remove();
78551                 surface.selectAll('.layer-touch:not(.markers) *').remove();
78552
78553                 var allowed = {
78554                     'browse': true,
78555                     'save': true,
78556                     'select-note': true,
78557                     'select-data': true,
78558                     'select-error': true
78559                 };
78560
78561                 var mode = context.mode();
78562                 if (mode && !allowed[mode.id]) {
78563                     context.enter(modeBrowse(context));
78564                 }
78565
78566                 dispatch$1.call('drawn', this, {full: true});
78567             }
78568
78569
78570             function dblClick() {
78571                 if (!_dblClickEnabled) {
78572                     event.preventDefault();
78573                     event.stopImmediatePropagation();
78574                 }
78575             }
78576
78577
78578             function gestureChange() {
78579                 // Remap Safari gesture events to wheel events - #5492
78580                 // We want these disabled most places, but enabled for zoom/unzoom on map surface
78581                 // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
78582                 var e = event;
78583                 e.preventDefault();
78584
78585                 var props = {
78586                     deltaMode: 0,    // dummy values to ignore in zoomPan
78587                     deltaY: 1,       // dummy values to ignore in zoomPan
78588                     clientX: e.clientX,
78589                     clientY: e.clientY,
78590                     screenX: e.screenX,
78591                     screenY: e.screenY,
78592                     x: e.x,
78593                     y: e.y
78594                 };
78595
78596                 var e2 = new WheelEvent('wheel', props);
78597                 e2._scale = e.scale;         // preserve the original scale
78598                 e2._rotation = e.rotation;   // preserve the original rotation
78599
78600                 _selection.node().dispatchEvent(e2);
78601             }
78602
78603
78604             function zoomPan(manualEvent) {
78605                 var event$1 = (manualEvent || event);
78606                 var source = event$1.sourceEvent;
78607                 var eventTransform = event$1.transform;
78608                 var x = eventTransform.x;
78609                 var y = eventTransform.y;
78610                 var k = eventTransform.k;
78611
78612                 if (_transformStart.x === x &&
78613                     _transformStart.y === y &&
78614                     _transformStart.k === k) {
78615                     return;  // no change
78616                 }
78617
78618                 // Special handling of 'wheel' events:
78619                 // They might be triggered by the user scrolling the mouse wheel,
78620                 // or 2-finger pinch/zoom gestures, the transform may need adjustment.
78621                 if (source && source.type === 'wheel') {
78622                     var detected = utilDetect();
78623                     var dX = source.deltaX;
78624                     var dY = source.deltaY;
78625                     var x2 = x;
78626                     var y2 = y;
78627                     var k2 = k;
78628                     var t0, p0, p1;
78629
78630                     // Normalize mousewheel scroll speed (Firefox) - #3029
78631                     // If wheel delta is provided in LINE units, recalculate it in PIXEL units
78632                     // We are essentially redoing the calculations that occur here:
78633                     //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
78634                     // See this for more info:
78635                     //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
78636                     if (source.deltaMode === 1 /* LINE */) {
78637                         // Convert from lines to pixels, more if the user is scrolling fast.
78638                         // (I made up the exp function to roughly match Firefox to what Chrome does)
78639                         // These numbers should be floats, because integers are treated as pan gesture below.
78640                         var lines = Math.abs(source.deltaY);
78641                         var sign = (source.deltaY > 0) ? 1 : -1;
78642                         dY = sign * clamp(
78643                             Math.exp((lines - 1) * 0.75) * 4.000244140625,
78644                             4.000244140625,    // min
78645                             350.000244140625   // max
78646                         );
78647
78648                         // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
78649                         // There doesn't seem to be any scroll accelleration.
78650                         // This multiplier increases the speed a little bit - #5512
78651                         if (detected.os !== 'mac') {
78652                             dY *= 5;
78653                         }
78654
78655                         // recalculate x2,y2,k2
78656                         t0 = _isTransformed ? _transformLast : _transformStart;
78657                         p0 = _getMouseCoords(source);
78658                         p1 = t0.invert(p0);
78659                         k2 = t0.k * Math.pow(2, -dY / 500);
78660                         x2 = p0[0] - p1[0] * k2;
78661                         y2 = p0[1] - p1[1] * k2;
78662
78663                     // 2 finger map pinch zooming (Safari) - #5492
78664                     // These are fake `wheel` events we made from Safari `gesturechange` events..
78665                     } else if (source._scale) {
78666                         // recalculate x2,y2,k2
78667                         t0 = _gestureTransformStart;
78668                         p0 = _getMouseCoords(source);
78669                         p1 = t0.invert(p0);
78670                         k2 = t0.k * source._scale;
78671                         x2 = p0[0] - p1[0] * k2;
78672                         y2 = p0[1] - p1[1] * k2;
78673
78674                     // 2 finger map pinch zooming (all browsers except Safari) - #5492
78675                     // Pinch zooming via the `wheel` event will always have:
78676                     // - `ctrlKey = true`
78677                     // - `deltaY` is not round integer pixels (ignore `deltaX`)
78678                     } else if (source.ctrlKey && !isInteger(dY)) {
78679                         dY *= 6;   // slightly scale up whatever the browser gave us
78680
78681                         // recalculate x2,y2,k2
78682                         t0 = _isTransformed ? _transformLast : _transformStart;
78683                         p0 = _getMouseCoords(source);
78684                         p1 = t0.invert(p0);
78685                         k2 = t0.k * Math.pow(2, -dY / 500);
78686                         x2 = p0[0] - p1[0] * k2;
78687                         y2 = p0[1] - p1[1] * k2;
78688
78689                     // Trackpad scroll zooming with shift or alt/option key down
78690                     } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
78691                         // recalculate x2,y2,k2
78692                         t0 = _isTransformed ? _transformLast : _transformStart;
78693                         p0 = _getMouseCoords(source);
78694                         p1 = t0.invert(p0);
78695                         k2 = t0.k * Math.pow(2, -dY / 500);
78696                         x2 = p0[0] - p1[0] * k2;
78697                         y2 = p0[1] - p1[1] * k2;
78698
78699                     // 2 finger map panning (Mac only, all browsers) - #5492, #5512
78700                     // Panning via the `wheel` event will always have:
78701                     // - `ctrlKey = false`
78702                     // - `deltaX`,`deltaY` are round integer pixels
78703                     } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
78704                         p1 = projection.translate();
78705                         x2 = p1[0] - dX;
78706                         y2 = p1[1] - dY;
78707                         k2 = projection.scale();
78708                     }
78709
78710                     // something changed - replace the event transform
78711                     if (x2 !== x || y2 !== y || k2 !== k) {
78712                         x = x2;
78713                         y = y2;
78714                         k = k2;
78715                         eventTransform = identity$8.translate(x2, y2).scale(k2);
78716                         _selection.node().__zoom = eventTransform;
78717                     }
78718
78719                 }
78720
78721                 if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
78722                     surface.interrupt();
78723                     uiFlash().text(t('cannot_zoom'))();
78724                     setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
78725                     scheduleRedraw();
78726                     dispatch$1.call('move', this, map);
78727                     return;
78728                 }
78729
78730                 projection.transform(eventTransform);
78731
78732                 var scale = k / _transformStart.k;
78733                 var tX = (x / scale - _transformStart.x) * scale;
78734                 var tY = (y / scale - _transformStart.y) * scale;
78735
78736                 if (context.inIntro()) {
78737                     curtainProjection.transform({
78738                         x: x - tX,
78739                         y: y - tY,
78740                         k: k
78741                     });
78742                 }
78743
78744                 if (source) {
78745                     _mouseEvent = event$1;
78746                 }
78747                 _isTransformed = true;
78748                 _transformLast = eventTransform;
78749                 utilSetTransform(supersurface, tX, tY, scale);
78750                 scheduleRedraw();
78751
78752                 dispatch$1.call('move', this, map);
78753
78754
78755                 function isInteger(val) {
78756                     return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
78757                 }
78758             }
78759
78760
78761             function resetTransform() {
78762                 if (!_isTransformed) return false;
78763
78764                 // deprecation warning - Radial Menu to be removed in iD v3
78765                 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
78766                 utilSetTransform(supersurface, 0, 0);
78767                 _isTransformed = false;
78768                 if (context.inIntro()) {
78769                     curtainProjection.transform(projection.transform());
78770                 }
78771                 return true;
78772             }
78773
78774
78775             function redraw(difference, extent) {
78776                 if (surface.empty() || !_redrawEnabled) return;
78777
78778                 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
78779                 // It would result in artifacts where differenced entities are redrawn with
78780                 // one transform and unchanged entities with another.
78781                 if (resetTransform()) {
78782                     difference = extent = undefined;
78783                 }
78784
78785                 var zoom = map.zoom();
78786                 var z = String(~~zoom);
78787
78788                 if (surface.attr('data-zoom') !== z) {
78789                     surface.attr('data-zoom', z);
78790                 }
78791
78792                 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
78793                 var lat = map.center()[1];
78794                 var lowzoom = linear$2()
78795                     .domain([-60, 0, 60])
78796                     .range([17, 18.5, 17])
78797                     .clamp(true);
78798
78799                 surface
78800                     .classed('low-zoom', zoom <= lowzoom(lat));
78801
78802
78803                 if (!difference) {
78804                     supersurface.call(context.background());
78805                     wrapper.call(drawLayers);
78806                 }
78807
78808                 // OSM
78809                 if (map.editable()) {
78810                     context.loadTiles(projection);
78811                     drawEditable(difference, extent);
78812                 } else {
78813                     editOff();
78814                 }
78815
78816                 _transformStart = projection.transform();
78817
78818                 return map;
78819             }
78820
78821
78822
78823             var immediateRedraw = function(difference, extent) {
78824                 if (!difference && !extent) cancelPendingRedraw();
78825                 redraw(difference, extent);
78826             };
78827
78828
78829             map.mouse = function() {
78830                 var event$1 = _mouseEvent || event;
78831                 if (event$1) {
78832                     var s;
78833                     while ((s = event$1.sourceEvent)) { event$1 = s; }
78834                     return _getMouseCoords(event$1);
78835                 }
78836                 return null;
78837             };
78838
78839
78840             // returns Lng/Lat
78841             map.mouseCoordinates = function() {
78842                 var coord = map.mouse() || pxCenter();
78843                 return projection.invert(coord);
78844             };
78845
78846
78847             map.dblclickEnable = function(val) {
78848                 if (!arguments.length) return _dblClickEnabled;
78849                 _dblClickEnabled = val;
78850                 return map;
78851             };
78852
78853
78854             map.redrawEnable = function(val) {
78855                 if (!arguments.length) return _redrawEnabled;
78856                 _redrawEnabled = val;
78857                 return map;
78858             };
78859
78860
78861             map.isTransformed = function() {
78862                 return _isTransformed;
78863             };
78864
78865
78866             function setTransform(t2, duration, force) {
78867                 var t = projection.transform();
78868                 if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
78869
78870                 if (duration) {
78871                     _selection
78872                         .transition()
78873                         .duration(duration)
78874                         .on('start', function() { map.startEase(); })
78875                         .call(zoom.transform, identity$8.translate(t2.x, t2.y).scale(t2.k));
78876                 } else {
78877                     projection.transform(t2);
78878                     _transformStart = t2;
78879                     _selection.call(zoom.transform, _transformStart);
78880                 }
78881
78882                 return true;
78883             }
78884
78885
78886             function setCenterZoom(loc2, z2, duration, force) {
78887                 var c = map.center();
78888                 var z = map.zoom();
78889                 if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
78890
78891                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78892
78893                 var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
78894                 proj.scale(k2);
78895
78896                 var t = proj.translate();
78897                 var point = proj(loc2);
78898
78899                 var center = pxCenter();
78900                 t[0] += center[0] - point[0];
78901                 t[1] += center[1] - point[1];
78902
78903                 return setTransform(identity$8.translate(t[0], t[1]).scale(k2), duration, force);
78904             }
78905
78906
78907             map.pan = function(delta, duration) {
78908                 var t = projection.translate();
78909                 var k = projection.scale();
78910
78911                 t[0] += delta[0];
78912                 t[1] += delta[1];
78913
78914                 if (duration) {
78915                     _selection
78916                         .transition()
78917                         .duration(duration)
78918                         .on('start', function() { map.startEase(); })
78919                         .call(zoom.transform, identity$8.translate(t[0], t[1]).scale(k));
78920                 } else {
78921                     projection.translate(t);
78922                     _transformStart = projection.transform();
78923                     _selection.call(zoom.transform, _transformStart);
78924                     dispatch$1.call('move', this, map);
78925                     immediateRedraw();
78926                 }
78927
78928                 return map;
78929             };
78930
78931
78932             map.dimensions = function(val) {
78933                 if (!arguments.length) return _dimensions;
78934
78935                 _dimensions = val;
78936                 drawLayers.dimensions(_dimensions);
78937                 context.background().dimensions(_dimensions);
78938                 projection.clipExtent([[0, 0], _dimensions]);
78939                 _getMouseCoords = utilFastMouse(supersurface.node());
78940
78941                 scheduleRedraw();
78942                 return map;
78943             };
78944
78945
78946             function zoomIn(delta) {
78947                 setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
78948             }
78949
78950             function zoomOut(delta) {
78951                 setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
78952             }
78953
78954             map.zoomIn = function() { zoomIn(1); };
78955             map.zoomInFurther = function() { zoomIn(4); };
78956
78957             map.zoomOut = function() { zoomOut(1); };
78958             map.zoomOutFurther = function() { zoomOut(4); };
78959
78960
78961             map.center = function(loc2) {
78962                 if (!arguments.length) {
78963                     return projection.invert(pxCenter());
78964                 }
78965
78966                 if (setCenterZoom(loc2, map.zoom())) {
78967                     dispatch$1.call('move', this, map);
78968                 }
78969
78970                 scheduleRedraw();
78971                 return map;
78972             };
78973
78974             map.unobscuredCenterZoomEase = function(loc, zoom) {
78975                 var offset = map.unobscuredOffsetPx();
78976
78977                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78978                 // use the target zoom to calculate the offset center
78979                 proj.scale(geoZoomToScale(zoom, TILESIZE));
78980                 
78981                 var locPx = proj(loc);
78982                 var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
78983                 var offsetLoc = proj.invert(offsetLocPx);
78984
78985                 map.centerZoomEase(offsetLoc, zoom);
78986             };
78987
78988             map.unobscuredOffsetPx = function() {
78989                 var openPane = d3_select('.map-panes .map-pane.shown');
78990                 if (!openPane.empty()) {
78991                     return [openPane.node().offsetWidth/2, 0];
78992                 }
78993                 return [0, 0];
78994             };
78995
78996             map.zoom = function(z2) {
78997                 if (!arguments.length) {
78998                     return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
78999                 }
79000
79001                 if (z2 < _minzoom) {
79002                     surface.interrupt();
79003                     uiFlash().text(t('cannot_zoom'))();
79004                     z2 = context.minEditableZoom();
79005                 }
79006
79007                 if (setCenterZoom(map.center(), z2)) {
79008                     dispatch$1.call('move', this, map);
79009                 }
79010
79011                 scheduleRedraw();
79012                 return map;
79013             };
79014
79015
79016             map.centerZoom = function(loc2, z2) {
79017                 if (setCenterZoom(loc2, z2)) {
79018                     dispatch$1.call('move', this, map);
79019                 }
79020
79021                 scheduleRedraw();
79022                 return map;
79023             };
79024
79025
79026             map.zoomTo = function(entity) {
79027                 var extent = entity.extent(context.graph());
79028                 if (!isFinite(extent.area())) return map;
79029
79030                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
79031                 return map.centerZoom(extent.center(), z2);
79032             };
79033
79034
79035             map.centerEase = function(loc2, duration) {
79036                 duration = duration || 250;
79037                 setCenterZoom(loc2, map.zoom(), duration);
79038                 return map;
79039             };
79040
79041
79042             map.zoomEase = function(z2, duration) {
79043                 duration = duration || 250;
79044                 setCenterZoom(map.center(), z2, duration, false);
79045                 return map;
79046             };
79047
79048
79049             map.centerZoomEase = function(loc2, z2, duration) {
79050                 duration = duration || 250;
79051                 setCenterZoom(loc2, z2, duration, false);
79052                 return map;
79053             };
79054
79055
79056             map.transformEase = function(t2, duration) {
79057                 duration = duration || 250;
79058                 setTransform(t2, duration, false);
79059                 return map;
79060             };
79061
79062
79063             map.zoomToEase = function(entity, duration) {
79064                 var extent = entity.extent(context.graph());
79065                 if (!isFinite(extent.area())) return map;
79066
79067                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
79068                 return map.centerZoomEase(extent.center(), z2, duration);
79069             };
79070
79071
79072             map.startEase = function() {
79073                 utilBindOnce(surface, 'mousedown.ease', function() {
79074                     map.cancelEase();
79075                 });
79076                 return map;
79077             };
79078
79079
79080             map.cancelEase = function() {
79081                 _selection.interrupt();
79082                 return map;
79083             };
79084
79085
79086             map.extent = function(val) {
79087                 if (!arguments.length) {
79088                     return new geoExtent(
79089                         projection.invert([0, _dimensions[1]]),
79090                         projection.invert([_dimensions[0], 0])
79091                     );
79092                 } else {
79093                     var extent = geoExtent(val);
79094                     map.centerZoom(extent.center(), map.extentZoom(extent));
79095                 }
79096             };
79097
79098
79099             map.trimmedExtent = function(val) {
79100                 if (!arguments.length) {
79101                     var headerY = 60;
79102                     var footerY = 30;
79103                     var pad = 10;
79104                     return new geoExtent(
79105                         projection.invert([pad, _dimensions[1] - footerY - pad]),
79106                         projection.invert([_dimensions[0] - pad, headerY + pad])
79107                     );
79108                 } else {
79109                     var extent = geoExtent(val);
79110                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
79111                 }
79112             };
79113
79114
79115             function calcExtentZoom(extent, dim) {
79116                 var tl = projection([extent[0][0], extent[1][1]]);
79117                 var br = projection([extent[1][0], extent[0][1]]);
79118
79119                 // Calculate maximum zoom that fits extent
79120                 var hFactor = (br[0] - tl[0]) / dim[0];
79121                 var vFactor = (br[1] - tl[1]) / dim[1];
79122                 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
79123                 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
79124                 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
79125
79126                 return newZoom;
79127             }
79128
79129
79130             map.extentZoom = function(val) {
79131                 return calcExtentZoom(geoExtent(val), _dimensions);
79132             };
79133
79134
79135             map.trimmedExtentZoom = function(val) {
79136                 var trimY = 120;
79137                 var trimX = 40;
79138                 var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
79139                 return calcExtentZoom(geoExtent(val), trimmed);
79140             };
79141
79142
79143             map.editable = function() {
79144                 var layer = context.layers().layer('osm');
79145                 if (!layer || !layer.enabled()) return false;
79146
79147                 return map.zoom() >= context.minEditableZoom();
79148             };
79149
79150
79151             map.notesEditable = function() {
79152                 var layer = context.layers().layer('notes');
79153                 if (!layer || !layer.enabled()) return false;
79154
79155                 return map.zoom() >= context.minEditableZoom();
79156             };
79157
79158
79159             map.minzoom = function(val) {
79160                 if (!arguments.length) return _minzoom;
79161                 _minzoom = val;
79162                 return map;
79163             };
79164
79165
79166             map.layers = drawLayers;
79167
79168
79169             return utilRebind(map, dispatch$1, 'on');
79170         }
79171
79172         function rendererPhotos(context) {
79173             var dispatch$1 = dispatch('change');
79174             var _layerIDs = ['streetside', 'mapillary', 'mapillary-signs', 'openstreetcam'];
79175             var _allPhotoTypes = ['flat', 'panoramic'];
79176             var _shownPhotoTypes = _allPhotoTypes.slice();   // shallow copy
79177
79178             function photos() {}
79179
79180             function updateStorage() {
79181                 if (window.mocha) return;
79182
79183                 var q = utilStringQs(window.location.hash.substring(1));
79184                 var enabled = context.layers().all().filter(function(d) {
79185                     return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
79186                 }).map(function(d) {
79187                     return d.id;
79188                 });
79189                 if (enabled.length) {
79190                     q.photo_overlay = enabled.join(',');
79191                 } else {
79192                     delete q.photo_overlay;
79193                 }
79194                 window.location.replace('#' + utilQsString(q, true));
79195             }
79196
79197             photos.overlayLayerIDs = function() {
79198                 return _layerIDs;
79199             };
79200
79201             photos.allPhotoTypes = function() {
79202                 return _allPhotoTypes;
79203             };
79204
79205             function showsLayer(id) {
79206                 var layer = context.layers().layer(id);
79207                 return layer && layer.supported() && layer.enabled();
79208             }
79209
79210             photos.shouldFilterByPhotoType = function() {
79211                 return showsLayer('mapillary') ||
79212                     (showsLayer('streetside') && showsLayer('openstreetcam'));
79213             };
79214
79215             photos.showsPhotoType = function(val) {
79216                 if (!photos.shouldFilterByPhotoType()) return true;
79217
79218                 return _shownPhotoTypes.indexOf(val) !== -1;
79219             };
79220
79221             photos.showsFlat = function() {
79222                 return photos.showsPhotoType('flat');
79223             };
79224
79225             photos.showsPanoramic = function() {
79226                 return photos.showsPhotoType('panoramic');
79227             };
79228
79229             photos.togglePhotoType = function(val) {
79230                 var index = _shownPhotoTypes.indexOf(val);
79231                 if (index !== -1) {
79232                     _shownPhotoTypes.splice(index, 1);
79233                 } else {
79234                     _shownPhotoTypes.push(val);
79235                 }
79236                 dispatch$1.call('change', this);
79237                 return photos;
79238             };
79239
79240             photos.init = function() {
79241                 var q = utilStringQs(window.location.hash.substring(1));
79242                 if (q.photo_overlay) {
79243                     var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
79244                     hashOverlayIDs.forEach(function(id) {
79245                         var layer = context.layers().layer(id);
79246                         if (layer) layer.enabled(true);
79247                     });
79248                 }
79249
79250                 context.layers().on('change.rendererPhotos', updateStorage);
79251             };
79252
79253             return utilRebind(photos, dispatch$1, 'on');
79254         }
79255
79256         function uiAccount(context) {
79257             var osm = context.connection();
79258
79259
79260             function update(selection) {
79261                 if (!osm) return;
79262
79263                 if (!osm.authenticated()) {
79264                     selection.selectAll('#userLink, #logoutLink')
79265                         .classed('hide', true);
79266                     return;
79267                 }
79268
79269                 osm.userDetails(function(err, details) {
79270                     var userLink = selection.select('#userLink'),
79271                         logoutLink = selection.select('#logoutLink');
79272
79273                     userLink.html('');
79274                     logoutLink.html('');
79275
79276                     if (err) return;
79277
79278                     selection.selectAll('#userLink, #logoutLink')
79279                         .classed('hide', false);
79280
79281                     // Link
79282                     userLink.append('a')
79283                         .attr('href', osm.userURL(details.display_name))
79284                         .attr('target', '_blank');
79285
79286                     // Add thumbnail or dont
79287                     if (details.image_url) {
79288                         userLink.append('img')
79289                             .attr('class', 'icon pre-text user-icon')
79290                             .attr('src', details.image_url);
79291                     } else {
79292                         userLink
79293                             .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
79294                     }
79295
79296                     // Add user name
79297                     userLink.append('span')
79298                         .attr('class', 'label')
79299                         .text(details.display_name);
79300
79301                     logoutLink.append('a')
79302                         .attr('class', 'logout')
79303                         .attr('href', '#')
79304                         .text(t('logout'))
79305                         .on('click.logout', function() {
79306                             event.preventDefault();
79307                             osm.logout();
79308                         });
79309                 });
79310             }
79311
79312
79313             return function(selection) {
79314                 selection.append('li')
79315                     .attr('id', 'logoutLink')
79316                     .classed('hide', true);
79317
79318                 selection.append('li')
79319                     .attr('id', 'userLink')
79320                     .classed('hide', true);
79321
79322                 if (osm) {
79323                     osm.on('change.account', function() { update(selection); });
79324                     update(selection);
79325                 }
79326             };
79327         }
79328
79329         function uiAttribution(context) {
79330             var selection;
79331
79332
79333             function attribution(data, klass) {
79334                 var div = selection.selectAll('.' + klass)
79335                     .data([0]);
79336
79337                 div = div.enter()
79338                     .append('div')
79339                     .attr('class', klass)
79340                     .merge(div);
79341
79342
79343                 var background = div.selectAll('.attribution')
79344                     .data(data, function(d) { return d.name(); });
79345
79346                 background.exit()
79347                     .remove();
79348
79349                 background = background.enter()
79350                     .append('span')
79351                     .attr('class', 'attribution')
79352                     .each(function(d) {
79353                         if (d.terms_html) {
79354                             d3_select(this)
79355                                 .html(d.terms_html);
79356                             return;
79357                         }
79358
79359                         var selection;
79360                         if (d.terms_url) {
79361                             selection = d3_select(this)
79362                                 .append('a')
79363                                 .attr('href', d.terms_url)
79364                                 .attr('target', '_blank');
79365                         } else {
79366                             selection = d3_select(this);
79367                         }
79368
79369
79370                         var id_safe = d.id.replace(/\./g, '<TX_DOT>');
79371                         var terms_text = t('imagery.' + id_safe + '.attribution.text',
79372                             { default: d.terms_text || d.id || d.name() }
79373                         );
79374
79375                         if (d.icon && !d.overlay) {
79376                             selection
79377                                 .append('img')
79378                                 .attr('class', 'source-image')
79379                                 .attr('src', d.icon);
79380                         }
79381
79382                         selection
79383                             .append('span')
79384                             .attr('class', 'attribution-text')
79385                             .text(terms_text);
79386                     })
79387                     .merge(background);
79388
79389
79390                 var copyright = background.selectAll('.copyright-notice')
79391                     .data(function(d) {
79392                         var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
79393                         return notice ? [notice] : [];
79394                     });
79395
79396                 copyright.exit()
79397                     .remove();
79398
79399                 copyright = copyright.enter()
79400                     .append('span')
79401                     .attr('class', 'copyright-notice')
79402                     .merge(copyright);
79403
79404                 copyright
79405                     .text(String);
79406             }
79407
79408
79409             function update() {
79410                 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
79411                 attribution(context.background().overlayLayerSources().filter(function (s) {
79412                     return s.validZoom(context.map().zoom());
79413                 }), 'overlay-layer-attribution');
79414             }
79415
79416
79417             return function(select) {
79418                 selection = select;
79419
79420                 context.background()
79421                     .on('change.attribution', update);
79422
79423                 context.map()
79424                     .on('move.attribution', throttle(update, 400, {leading: false}));
79425
79426                 update();
79427             };
79428         }
79429
79430         function uiBackgroundDisplayOptions(context) {
79431             var detected = utilDetect();
79432             var storedOpacity = context.storage('background-opacity');
79433             var minVal = 0.25;
79434             var maxVal = detected.cssfilters ? 2 : 1;
79435
79436             var sliders = detected.cssfilters
79437                 ? ['brightness', 'contrast', 'saturation', 'sharpness']
79438                 : ['brightness'];
79439
79440             var _options = {
79441                 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
79442                 contrast: 1,
79443                 saturation: 1,
79444                 sharpness: 1
79445             };
79446
79447             var _selection = d3_select(null);
79448
79449
79450             function clamp(x, min, max) {
79451                 return Math.max(min, Math.min(x, max));
79452             }
79453
79454
79455             function updateValue(d, val) {
79456                 if (!val && event && event.target) {
79457                     val = event.target.value;
79458                 }
79459
79460                 val = clamp(val, minVal, maxVal);
79461
79462                 _options[d] = val;
79463                 context.background()[d](val);
79464
79465                 if (d === 'brightness') {
79466                     context.storage('background-opacity', val);
79467                 }
79468
79469                 _selection
79470                     .call(render);
79471             }
79472
79473
79474             function render(selection) {
79475                 var container = selection.selectAll('.display-options-container')
79476                     .data([0]);
79477
79478                 var containerEnter = container.enter()
79479                     .append('div')
79480                     .attr('class', 'display-options-container controls-list');
79481
79482                 // add slider controls
79483                 var slidersEnter = containerEnter.selectAll('.display-control')
79484                     .data(sliders)
79485                     .enter()
79486                     .append('div')
79487                     .attr('class', function(d) { return 'display-control display-control-' + d; });
79488
79489                 slidersEnter
79490                     .append('h5')
79491                     .text(function(d) { return t('background.' + d); })
79492                     .append('span')
79493                     .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
79494
79495                 slidersEnter
79496                     .append('input')
79497                     .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
79498                     .attr('type', 'range')
79499                     .attr('min', minVal)
79500                     .attr('max', maxVal)
79501                     .attr('step', '0.05')
79502                     .on('input', function(d) {
79503                         var val = d3_select(this).property('value');
79504                         updateValue(d, val);
79505                     });
79506
79507                 slidersEnter
79508                     .append('button')
79509                     .attr('title', t('background.reset'))
79510                     .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
79511                     .on('click', function(d) {
79512                         if (event.button !== 0) return;
79513                         updateValue(d, 1);
79514                     })
79515                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79516
79517                 // reset all button
79518                 containerEnter
79519                     .append('a')
79520                     .attr('class', 'display-option-resetlink')
79521                     .attr('href', '#')
79522                     .text(t('background.reset_all'))
79523                     .on('click', function() {
79524                         for (var i = 0; i < sliders.length; i++) {
79525                             updateValue(sliders[i],1);
79526                         }
79527                     });
79528
79529                 // update
79530                 container = containerEnter
79531                     .merge(container);
79532
79533                 container.selectAll('.display-option-input')
79534                     .property('value', function(d) { return _options[d]; });
79535
79536                 container.selectAll('.display-option-value')
79537                     .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
79538
79539                 container.selectAll('.display-option-reset')
79540                     .classed('disabled', function(d) { return _options[d] === 1; });
79541
79542                 // first time only, set brightness if needed
79543                 if (containerEnter.size() && _options.brightness !== 1) {
79544                     context.background().brightness(_options.brightness);
79545                 }
79546             }
79547
79548
79549             function backgroundDisplayOptions(selection) {
79550                 _selection = selection;
79551
79552                 selection
79553                     .call(uiDisclosure(context, 'background_display_options', true)
79554                         .title(t('background.display_options'))
79555                         .content(render)
79556                     );
79557             }
79558
79559
79560             return backgroundDisplayOptions;
79561         }
79562
79563         function uiBackgroundOffset(context) {
79564             var directions = [
79565                 ['right', [0.5, 0]],
79566                 ['top', [0, -0.5]],
79567                 ['left', [-0.5, 0]],
79568                 ['bottom', [0, 0.5]]
79569             ];
79570
79571
79572             function d3_eventCancel() {
79573                 event.stopPropagation();
79574                 event.preventDefault();
79575             }
79576
79577
79578             function updateValue() {
79579                 var meters = geoOffsetToMeters(context.background().offset());
79580                 var x = +meters[0].toFixed(2);
79581                 var y = +meters[1].toFixed(2);
79582
79583                 d3_selectAll('.nudge-inner-rect')
79584                     .select('input')
79585                     .classed('error', false)
79586                     .property('value', x + ', ' + y);
79587
79588                 d3_selectAll('.nudge-reset')
79589                     .classed('disabled', function() {
79590                         return (x === 0 && y === 0);
79591                     });
79592             }
79593
79594
79595             function resetOffset() {
79596                 context.background().offset([0, 0]);
79597                 updateValue();
79598             }
79599
79600
79601             function nudge(d) {
79602                 context.background().nudge(d, context.map().zoom());
79603                 updateValue();
79604             }
79605
79606
79607             function clickNudgeButton(d) {
79608                 var interval;
79609                 var timeout = window.setTimeout(function() {
79610                         interval = window.setInterval(nudge.bind(null, d), 100);
79611                     }, 500);
79612
79613                 function doneNudge() {
79614                     window.clearTimeout(timeout);
79615                     window.clearInterval(interval);
79616                     d3_select(window)
79617                         .on('mouseup.buttonoffset', null, true)
79618                         .on('mousedown.buttonoffset', null, true);
79619                 }
79620
79621                 d3_select(window)
79622                     .on('mouseup.buttonoffset', doneNudge, true)
79623                     .on('mousedown.buttonoffset', doneNudge, true);
79624
79625                 nudge(d);
79626             }
79627
79628
79629             function inputOffset() {
79630                 var input = d3_select(this);
79631                 var d = input.node().value;
79632
79633                 if (d === '') return resetOffset();
79634
79635                 d = d.replace(/;/g, ',').split(',').map(function(n) {
79636                     // if n is NaN, it will always get mapped to false.
79637                     return !isNaN(n) && n;
79638                 });
79639
79640                 if (d.length !== 2 || !d[0] || !d[1]) {
79641                     input.classed('error', true);
79642                     return;
79643                 }
79644
79645                 context.background().offset(geoMetersToOffset(d));
79646                 updateValue();
79647             }
79648
79649
79650             function dragOffset() {
79651                 event.preventDefault();
79652                 if (event.button !== 0) return;
79653
79654                 var origin = [event.clientX, event.clientY];
79655
79656                 context.container()
79657                     .append('div')
79658                     .attr('class', 'nudge-surface');
79659
79660                 d3_select(window)
79661                     .on('mousemove.offset', function() {
79662                         var latest = [event.clientX, event.clientY];
79663                         var d = [
79664                             -(origin[0] - latest[0]) / 4,
79665                             -(origin[1] - latest[1]) / 4
79666                         ];
79667
79668                         origin = latest;
79669                         nudge(d);
79670                     })
79671                     .on('mouseup.offset', function() {
79672                         if (event.button !== 0) return;
79673                         d3_selectAll('.nudge-surface')
79674                             .remove();
79675
79676                         d3_select(window)
79677                             .on('mousemove.offset', null)
79678                             .on('mouseup.offset', null);
79679                     });
79680             }
79681
79682
79683             function render(selection) {
79684                 var container = selection.selectAll('.nudge-container')
79685                     .data([0]);
79686
79687                 var containerEnter = container.enter()
79688                     .append('div')
79689                     .attr('class', 'nudge-container cf');
79690
79691                 containerEnter
79692                     .append('div')
79693                     .attr('class', 'nudge-instructions')
79694                     .text(t('background.offset'));
79695
79696                 var nudgeEnter = containerEnter
79697                     .append('div')
79698                     .attr('class', 'nudge-outer-rect')
79699                     .on('mousedown', dragOffset);
79700
79701                 nudgeEnter
79702                     .append('div')
79703                     .attr('class', 'nudge-inner-rect')
79704                     .append('input')
79705                     .on('change', inputOffset);
79706
79707                 containerEnter
79708                     .append('div')
79709                     .selectAll('button')
79710                     .data(directions).enter()
79711                     .append('button')
79712                     .attr('class', function(d) { return d[0] + ' nudge'; })
79713                     .on('contextmenu', d3_eventCancel)
79714                     .on('mousedown', function(d) {
79715                         if (event.button !== 0) return;
79716                         clickNudgeButton(d[1]);
79717                     });
79718
79719                 containerEnter
79720                     .append('button')
79721                     .attr('title', t('background.reset'))
79722                     .attr('class', 'nudge-reset disabled')
79723                     .on('contextmenu', d3_eventCancel)
79724                     .on('click', function() {
79725                         if (event.button !== 0) return;
79726                         resetOffset();
79727                     })
79728                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79729
79730                 updateValue();
79731             }
79732
79733
79734             function backgroundOffset(selection) {
79735                 selection
79736                     .call(uiDisclosure(context, 'background_offset', false)
79737                         .title(t('background.fix_misalignment'))
79738                         .content(render)
79739                     );
79740             }
79741
79742
79743             context.background()
79744                 .on('change.backgroundOffset-update', updateValue);
79745
79746             return backgroundOffset;
79747         }
79748
79749         // import { utilGetDimensions } from '../util/dimensions';
79750
79751
79752         function uiMapInMap(context) {
79753
79754             function mapInMap(selection) {
79755                 var backgroundLayer = rendererTileLayer(context);
79756                 var overlayLayers = {};
79757                 var projection = geoRawMercator();
79758                 var dataLayer = svgData(projection, context).showLabels(false);
79759                 var debugLayer = svgDebug(projection, context);
79760                 var zoom = d3_zoom()
79761                     .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
79762                     .on('start', zoomStarted)
79763                     .on('zoom', zoomed)
79764                     .on('end', zoomEnded);
79765
79766                 var wrap = d3_select(null);
79767                 var tiles = d3_select(null);
79768                 var viewport = d3_select(null);
79769
79770                 var _isTransformed = false;
79771                 var _isHidden = true;
79772                 var _skipEvents = false;
79773                 var _gesture = null;
79774                 var _zDiff = 6;    // by default, minimap renders at (main zoom - 6)
79775                 var _dMini;        // dimensions of minimap
79776                 var _cMini;        // center pixel of minimap
79777                 var _tStart;       // transform at start of gesture
79778                 var _tCurr;        // transform at most recent event
79779                 var _timeoutID;
79780
79781
79782                 function zoomStarted() {
79783                     if (_skipEvents) return;
79784                     _tStart = _tCurr = projection.transform();
79785                     _gesture = null;
79786                 }
79787
79788
79789                 function zoomed() {
79790                     if (_skipEvents) return;
79791
79792                     var x = event.transform.x;
79793                     var y = event.transform.y;
79794                     var k = event.transform.k;
79795                     var isZooming = (k !== _tStart.k);
79796                     var isPanning = (x !== _tStart.x || y !== _tStart.y);
79797
79798                     if (!isZooming && !isPanning) {
79799                         return;  // no change
79800                     }
79801
79802                     // lock in either zooming or panning, don't allow both in minimap.
79803                     if (!_gesture) {
79804                         _gesture = isZooming ? 'zoom' : 'pan';
79805                     }
79806
79807                     var tMini = projection.transform();
79808                     var tX, tY, scale;
79809
79810                     if (_gesture === 'zoom') {
79811                         scale = k / tMini.k;
79812                         tX = (_cMini[0] / scale - _cMini[0]) * scale;
79813                         tY = (_cMini[1] / scale - _cMini[1]) * scale;
79814                     } else {
79815                         k = tMini.k;
79816                         scale = 1;
79817                         tX = x - tMini.x;
79818                         tY = y - tMini.y;
79819                     }
79820
79821                     utilSetTransform(tiles, tX, tY, scale);
79822                     utilSetTransform(viewport, 0, 0, scale);
79823                     _isTransformed = true;
79824                     _tCurr = identity$8.translate(x, y).scale(k);
79825
79826                     var zMain = geoScaleToZoom(context.projection.scale());
79827                     var zMini = geoScaleToZoom(k);
79828
79829                     _zDiff = zMain - zMini;
79830
79831                     queueRedraw();
79832                 }
79833
79834
79835                 function zoomEnded() {
79836                     if (_skipEvents) return;
79837                     if (_gesture !== 'pan') return;
79838
79839                     updateProjection();
79840                     _gesture = null;
79841                     context.map().center(projection.invert(_cMini));   // recenter main map..
79842                 }
79843
79844
79845                 function updateProjection() {
79846                     var loc = context.map().center();
79847                     var tMain = context.projection.transform();
79848                     var zMain = geoScaleToZoom(tMain.k);
79849                     var zMini = Math.max(zMain - _zDiff, 0.5);
79850                     var kMini = geoZoomToScale(zMini);
79851
79852                     projection
79853                         .translate([tMain.x, tMain.y])
79854                         .scale(kMini);
79855
79856                     var point = projection(loc);
79857                     var mouse = (_gesture === 'pan') ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
79858                     var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
79859                     var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
79860
79861                     projection
79862                         .translate([xMini, yMini])
79863                         .clipExtent([[0, 0], _dMini]);
79864
79865                     _tCurr = projection.transform();
79866
79867                     if (_isTransformed) {
79868                         utilSetTransform(tiles, 0, 0);
79869                         utilSetTransform(viewport, 0, 0);
79870                         _isTransformed = false;
79871                     }
79872
79873                     zoom
79874                         .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
79875
79876                     _skipEvents = true;
79877                     wrap.call(zoom.transform, _tCurr);
79878                     _skipEvents = false;
79879                 }
79880
79881
79882                 function redraw() {
79883                     clearTimeout(_timeoutID);
79884                     if (_isHidden) return;
79885
79886                     updateProjection();
79887                     var zMini = geoScaleToZoom(projection.scale());
79888
79889                     // setup tile container
79890                     tiles = wrap
79891                         .selectAll('.map-in-map-tiles')
79892                         .data([0]);
79893
79894                     tiles = tiles.enter()
79895                         .append('div')
79896                         .attr('class', 'map-in-map-tiles')
79897                         .merge(tiles);
79898
79899                     // redraw background
79900                     backgroundLayer
79901                         .source(context.background().baseLayerSource())
79902                         .projection(projection)
79903                         .dimensions(_dMini);
79904
79905                     var background = tiles
79906                         .selectAll('.map-in-map-background')
79907                         .data([0]);
79908
79909                     background.enter()
79910                         .append('div')
79911                         .attr('class', 'map-in-map-background')
79912                         .merge(background)
79913                         .call(backgroundLayer);
79914
79915
79916                     // redraw overlay
79917                     var overlaySources = context.background().overlayLayerSources();
79918                     var activeOverlayLayers = [];
79919                     for (var i = 0; i < overlaySources.length; i++) {
79920                         if (overlaySources[i].validZoom(zMini)) {
79921                             if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
79922                             activeOverlayLayers.push(overlayLayers[i]
79923                                 .source(overlaySources[i])
79924                                 .projection(projection)
79925                                 .dimensions(_dMini));
79926                         }
79927                     }
79928
79929                     var overlay = tiles
79930                         .selectAll('.map-in-map-overlay')
79931                         .data([0]);
79932
79933                     overlay = overlay.enter()
79934                         .append('div')
79935                         .attr('class', 'map-in-map-overlay')
79936                         .merge(overlay);
79937
79938
79939                     var overlays = overlay
79940                         .selectAll('div')
79941                         .data(activeOverlayLayers, function(d) { return d.source().name(); });
79942
79943                     overlays.exit()
79944                         .remove();
79945
79946                     overlays = overlays.enter()
79947                         .append('div')
79948                         .merge(overlays)
79949                         .each(function(layer) { d3_select(this).call(layer); });
79950
79951
79952                     var dataLayers = tiles
79953                         .selectAll('.map-in-map-data')
79954                         .data([0]);
79955
79956                     dataLayers.exit()
79957                         .remove();
79958
79959                     dataLayers = dataLayers.enter()
79960                         .append('svg')
79961                         .attr('class', 'map-in-map-data')
79962                         .merge(dataLayers)
79963                         .call(dataLayer)
79964                         .call(debugLayer);
79965
79966
79967                     // redraw viewport bounding box
79968                     if (_gesture !== 'pan') {
79969                         var getPath = d3_geoPath(projection);
79970                         var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
79971
79972                         viewport = wrap.selectAll('.map-in-map-viewport')
79973                             .data([0]);
79974
79975                         viewport = viewport.enter()
79976                             .append('svg')
79977                             .attr('class', 'map-in-map-viewport')
79978                             .merge(viewport);
79979
79980
79981                         var path = viewport.selectAll('.map-in-map-bbox')
79982                             .data([bbox]);
79983
79984                         path.enter()
79985                             .append('path')
79986                             .attr('class', 'map-in-map-bbox')
79987                             .merge(path)
79988                             .attr('d', getPath)
79989                             .classed('thick', function(d) { return getPath.area(d) < 30; });
79990                     }
79991                 }
79992
79993
79994                 function queueRedraw() {
79995                     clearTimeout(_timeoutID);
79996                     _timeoutID = setTimeout(function() { redraw(); }, 750);
79997                 }
79998
79999
80000                 function toggle() {
80001                     if (event) event.preventDefault();
80002
80003                     _isHidden = !_isHidden;
80004
80005                     d3_select('.minimap-toggle-item')
80006                         .classed('active', !_isHidden)
80007                         .select('input')
80008                         .property('checked', !_isHidden);
80009
80010                     if (_isHidden) {
80011                         wrap
80012                             .style('display', 'block')
80013                             .style('opacity', '1')
80014                             .transition()
80015                             .duration(200)
80016                             .style('opacity', '0')
80017                             .on('end', function() {
80018                                 selection.selectAll('.map-in-map')
80019                                     .style('display', 'none');
80020                             });
80021                     } else {
80022                         wrap
80023                             .style('display', 'block')
80024                             .style('opacity', '0')
80025                             .transition()
80026                             .duration(200)
80027                             .style('opacity', '1')
80028                             .on('end', function() {
80029                                 redraw();
80030                             });
80031                     }
80032                 }
80033
80034
80035                 uiMapInMap.toggle = toggle;
80036
80037                 wrap = selection.selectAll('.map-in-map')
80038                     .data([0]);
80039
80040                 wrap = wrap.enter()
80041                     .append('div')
80042                     .attr('class', 'map-in-map')
80043                     .style('display', (_isHidden ? 'none' : 'block'))
80044                     .call(zoom)
80045                     .on('dblclick.zoom', null)
80046                     .merge(wrap);
80047
80048                 // reflow warning: Hardcode dimensions - currently can't resize it anyway..
80049                 _dMini = [200,150]; //utilGetDimensions(wrap);
80050                 _cMini = geoVecScale(_dMini, 0.5);
80051
80052                 context.map()
80053                     .on('drawn.map-in-map', function(drawn) {
80054                         if (drawn.full === true) {
80055                             redraw();
80056                         }
80057                     });
80058
80059                 redraw();
80060
80061                 context.keybinding()
80062                     .on(t('background.minimap.key'), toggle);
80063             }
80064
80065             return mapInMap;
80066         }
80067
80068         function uiConfirm(selection) {
80069             var modalSelection = uiModal(selection);
80070
80071             modalSelection.select('.modal')
80072                 .classed('modal-alert', true);
80073
80074             var section = modalSelection.select('.content');
80075
80076             section.append('div')
80077                 .attr('class', 'modal-section header');
80078
80079             section.append('div')
80080                 .attr('class', 'modal-section message-text');
80081
80082             var buttons = section.append('div')
80083                 .attr('class', 'modal-section buttons cf');
80084
80085
80086             modalSelection.okButton = function() {
80087                 buttons
80088                     .append('button')
80089                     .attr('class', 'button ok-button action')
80090                     .on('click.confirm', function() {
80091                         modalSelection.remove();
80092                     })
80093                     .text(t('confirm.okay'))
80094                     .node()
80095                     .focus();
80096
80097                 return modalSelection;
80098             };
80099
80100
80101             return modalSelection;
80102         }
80103
80104         function uiSettingsCustomBackground(context) {
80105             var dispatch$1 = dispatch('change');
80106
80107             function render(selection) {
80108                 // keep separate copies of original and current settings
80109                 var _origSettings = {
80110                     template: context.storage('background-custom-template')
80111                 };
80112                 var _currSettings = {
80113                     template: context.storage('background-custom-template')
80114                 };
80115
80116                 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
80117                 var modal = uiConfirm(selection).okButton();
80118
80119                 modal
80120                     .classed('settings-modal settings-custom-background', true);
80121
80122                 modal.select('.modal-section.header')
80123                     .append('h3')
80124                     .text(t('settings.custom_background.header'));
80125
80126
80127                 var textSection = modal.select('.modal-section.message-text');
80128
80129                 textSection
80130                     .append('pre')
80131                     .attr('class', 'instructions-template')
80132                     .text(t('settings.custom_background.instructions', { example: example }));
80133
80134                 textSection
80135                     .append('textarea')
80136                     .attr('class', 'field-template')
80137                     .attr('placeholder', t('settings.custom_background.template.placeholder'))
80138                     .call(utilNoAuto)
80139                     .property('value', _currSettings.template);
80140
80141
80142                 // insert a cancel button
80143                 var buttonSection = modal.select('.modal-section.buttons');
80144
80145                 buttonSection
80146                     .insert('button', '.ok-button')
80147                     .attr('class', 'button cancel-button secondary-action')
80148                     .text(t('confirm.cancel'));
80149
80150
80151                 buttonSection.select('.cancel-button')
80152                     .on('click.cancel', clickCancel);
80153
80154                 buttonSection.select('.ok-button')
80155                     .attr('disabled', isSaveDisabled)
80156                     .on('click.save', clickSave);
80157
80158
80159                 function isSaveDisabled() {
80160                     return null;
80161                 }
80162
80163
80164                 // restore the original template
80165                 function clickCancel() {
80166                     textSection.select('.field-template').property('value', _origSettings.template);
80167                     context.storage('background-custom-template', _origSettings.template);
80168                     this.blur();
80169                     modal.close();
80170                 }
80171
80172                 // accept the current template
80173                 function clickSave() {
80174                     _currSettings.template = textSection.select('.field-template').property('value');
80175                     context.storage('background-custom-template', _currSettings.template);
80176                     this.blur();
80177                     modal.close();
80178                     dispatch$1.call('change', this, _currSettings);
80179                 }
80180             }
80181
80182             return utilRebind(render, dispatch$1, 'on');
80183         }
80184
80185         function uiBackground(context) {
80186             var key = t('background.key');
80187
80188             var _pane = d3_select(null), _toggleButton = d3_select(null);
80189
80190             var _customSource = context.background().findSource('custom');
80191             var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
80192
80193             var _backgroundList = d3_select(null);
80194             var _overlayList = d3_select(null);
80195             var _displayOptionsContainer = d3_select(null);
80196             var _offsetContainer = d3_select(null);
80197
80198             var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
80199             var backgroundOffset = uiBackgroundOffset(context);
80200
80201             var settingsCustomBackground = uiSettingsCustomBackground(context)
80202                 .on('change', customChanged);
80203
80204
80205             function setTooltips(selection) {
80206                 selection.each(function(d, i, nodes) {
80207                     var item = d3_select(this).select('label');
80208                     var span = item.select('span');
80209                     var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
80210                     var description = d.description();
80211                     var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
80212
80213                     item.call(tooltip().destroyAny);
80214
80215                     if (d === _previousBackground) {
80216                         item.call(tooltip()
80217                             .placement(placement)
80218                             .html(true)
80219                             .title(function() {
80220                                 var tip = '<div>' + t('background.switch') + '</div>';
80221                                 return uiTooltipHtml(tip, uiCmd('⌘' + key));
80222                             })
80223                         );
80224                     } else if (description || isOverflowing) {
80225                         item.call(tooltip()
80226                             .placement(placement)
80227                             .title(description || d.name())
80228                         );
80229                     }
80230                 });
80231             }
80232
80233
80234             function updateLayerSelections(selection) {
80235                 function active(d) {
80236                     return context.background().showsLayer(d);
80237                 }
80238
80239                 selection.selectAll('li')
80240                     .classed('active', active)
80241                     .classed('switch', function(d) { return d === _previousBackground; })
80242                     .call(setTooltips)
80243                     .selectAll('input')
80244                     .property('checked', active);
80245             }
80246
80247
80248             function chooseBackground(d) {
80249                 if (d.id === 'custom' && !d.template()) {
80250                     return editCustom();
80251                 }
80252
80253                 event.preventDefault();
80254                 _previousBackground = context.background().baseLayerSource();
80255                 context.storage('background-last-used-toggle', _previousBackground.id);
80256                 context.storage('background-last-used', d.id);
80257                 context.background().baseLayerSource(d);
80258                 _backgroundList.call(updateLayerSelections);
80259                 document.activeElement.blur();
80260             }
80261
80262
80263             function customChanged(d) {
80264                 if (d && d.template) {
80265                     _customSource.template(d.template);
80266                     chooseBackground(_customSource);
80267                 } else {
80268                     _customSource.template('');
80269                     chooseBackground(context.background().findSource('none'));
80270                 }
80271             }
80272
80273
80274             function editCustom() {
80275                 event.preventDefault();
80276                 context.container()
80277                     .call(settingsCustomBackground);
80278             }
80279
80280
80281             function chooseOverlay(d) {
80282                 event.preventDefault();
80283                 context.background().toggleOverlayLayer(d);
80284                 _overlayList.call(updateLayerSelections);
80285                 document.activeElement.blur();
80286             }
80287
80288
80289             function drawListItems(layerList, type, change, filter) {
80290                 var sources = context.background()
80291                     .sources(context.map().extent())
80292                     .filter(filter);
80293
80294                 var layerLinks = layerList.selectAll('li')
80295                     .data(sources, function(d) { return d.name(); });
80296
80297                 layerLinks.exit()
80298                     .remove();
80299
80300                 var enter = layerLinks.enter()
80301                     .append('li')
80302                     .classed('layer-custom', function(d) { return d.id === 'custom'; })
80303                     .classed('best', function(d) { return d.best(); });
80304
80305                 enter.filter(function(d) { return d.id === 'custom'; })
80306                     .append('button')
80307                     .attr('class', 'layer-browse')
80308                     .call(tooltip()
80309                         .title(t('settings.custom_background.tooltip'))
80310                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80311                     )
80312                     .on('click', editCustom)
80313                     .call(svgIcon('#iD-icon-more'));
80314
80315                 enter.filter(function(d) { return d.best(); })
80316                     .append('div')
80317                     .attr('class', 'best')
80318                     .call(tooltip()
80319                         .title(t('background.best_imagery'))
80320                         .placement((textDirection === 'rtl') ? 'right' : 'left')
80321                     )
80322                     .append('span')
80323                     .html('&#9733;');
80324
80325                 var label = enter
80326                     .append('label');
80327
80328                 label
80329                     .append('input')
80330                     .attr('type', type)
80331                     .attr('name', 'layers')
80332                     .on('change', change);
80333
80334                 label
80335                     .append('span')
80336                     .text(function(d) { return d.name(); });
80337
80338
80339                 layerList.selectAll('li')
80340                     .sort(sortSources)
80341                     .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
80342
80343                 layerList
80344                     .call(updateLayerSelections);
80345
80346
80347                 function sortSources(a, b) {
80348                     return a.best() && !b.best() ? -1
80349                         : b.best() && !a.best() ? 1
80350                         : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
80351                 }
80352             }
80353
80354
80355             function renderBackgroundList(selection) {
80356
80357                 // the background list
80358                 var container = selection.selectAll('.layer-background-list')
80359                     .data([0]);
80360
80361                 _backgroundList = container.enter()
80362                     .append('ul')
80363                     .attr('class', 'layer-list layer-background-list')
80364                     .attr('dir', 'auto')
80365                     .merge(container);
80366
80367
80368                 // add minimap toggle below list
80369                 var minimapEnter = selection.selectAll('.minimap-toggle-list')
80370                     .data([0])
80371                     .enter()
80372                     .append('ul')
80373                     .attr('class', 'layer-list minimap-toggle-list')
80374                     .append('li')
80375                     .attr('class', 'minimap-toggle-item');
80376
80377                 var minimapLabelEnter = minimapEnter
80378                     .append('label')
80379                     .call(tooltip()
80380                         .html(true)
80381                         .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
80382                         .placement('top')
80383                     );
80384
80385                 minimapLabelEnter
80386                     .append('input')
80387                     .attr('type', 'checkbox')
80388                     .on('change', function() {
80389                         event.preventDefault();
80390                         uiMapInMap.toggle();
80391                     });
80392
80393                 minimapLabelEnter
80394                     .append('span')
80395                     .text(t('background.minimap.description'));
80396
80397
80398                 // "Info / Report a Problem" link
80399                 selection.selectAll('.imagery-faq')
80400                     .data([0])
80401                     .enter()
80402                     .append('div')
80403                     .attr('class', 'imagery-faq')
80404                     .append('a')
80405                     .attr('target', '_blank')
80406                     .attr('tabindex', -1)
80407                     .call(svgIcon('#iD-icon-out-link', 'inline'))
80408                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
80409                     .append('span')
80410                     .text(t('background.imagery_source_faq'));
80411
80412                 updateBackgroundList();
80413             }
80414
80415
80416             function renderOverlayList(selection) {
80417                 var container = selection.selectAll('.layer-overlay-list')
80418                     .data([0]);
80419
80420                 _overlayList = container.enter()
80421                     .append('ul')
80422                     .attr('class', 'layer-list layer-overlay-list')
80423                     .attr('dir', 'auto')
80424                     .merge(container);
80425
80426                 updateOverlayList();
80427             }
80428
80429             function updateBackgroundList() {
80430                 _backgroundList
80431                     .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
80432             }
80433
80434             function updateOverlayList() {
80435                 _overlayList
80436                     .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
80437             }
80438
80439
80440             function update() {
80441                 if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
80442                     updateBackgroundList();
80443                 }
80444
80445                 if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
80446                     updateOverlayList();
80447                 }
80448
80449                 _displayOptionsContainer
80450                     .call(backgroundDisplayOptions);
80451
80452                 _offsetContainer
80453                     .call(backgroundOffset);
80454             }
80455
80456
80457             function quickSwitch() {
80458                 if (event) {
80459                     event.stopImmediatePropagation();
80460                     event.preventDefault();
80461                 }
80462                 if (_previousBackground) {
80463                     chooseBackground(_previousBackground);
80464                 }
80465             }
80466
80467             var paneTooltip = tooltip()
80468                 .placement((textDirection === 'rtl') ? 'right' : 'left')
80469                 .html(true)
80470                 .title(uiTooltipHtml(t('background.description'), key));
80471
80472             uiBackground.togglePane = function() {
80473                 if (event) event.preventDefault();
80474                 paneTooltip.hide(_toggleButton);
80475                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
80476             };
80477
80478             function hidePane() {
80479                 context.ui().togglePanes();
80480             }
80481
80482             uiBackground.renderToggleButton = function(selection) {
80483
80484                 _toggleButton = selection
80485                     .append('button')
80486                     .attr('tabindex', -1)
80487                     .on('click', uiBackground.togglePane)
80488                     .call(svgIcon('#iD-icon-layers', 'light'))
80489                     .call(paneTooltip);
80490             };
80491
80492             uiBackground.renderPane = function(selection) {
80493
80494                 _pane = selection
80495                     .append('div')
80496                     .attr('class', 'fillL map-pane background-pane hide')
80497                     .attr('pane', 'background');
80498
80499
80500                 var heading = _pane
80501                     .append('div')
80502                     .attr('class', 'pane-heading');
80503
80504                 heading
80505                     .append('h2')
80506                     .text(t('background.title'));
80507
80508                 heading
80509                     .append('button')
80510                     .on('click', hidePane)
80511                     .call(svgIcon('#iD-icon-close'));
80512
80513
80514                 var content = _pane
80515                     .append('div')
80516                     .attr('class', 'pane-content');
80517
80518                 // background list
80519                 content
80520                     .append('div')
80521                     .attr('class', 'background-background-list-container')
80522                     .call(uiDisclosure(context, 'background_list', true)
80523                         .title(t('background.backgrounds'))
80524                         .content(renderBackgroundList)
80525                     );
80526
80527                 // overlay list
80528                 content
80529                     .append('div')
80530                     .attr('class', 'background-overlay-list-container')
80531                     .call(uiDisclosure(context, 'overlay_list', true)
80532                         .title(t('background.overlays'))
80533                         .content(renderOverlayList)
80534                     );
80535
80536                 // display options
80537                 _displayOptionsContainer = content
80538                     .append('div')
80539                     .attr('class', 'background-display-options');
80540
80541                 // offset controls
80542                 _offsetContainer = content
80543                     .append('div')
80544                     .attr('class', 'background-offset');
80545
80546
80547                 // add listeners
80548                 context.map()
80549                     .on('move.background-update',
80550                         debounce(function() { window.requestIdleCallback(update); }, 1000)
80551                     );
80552
80553
80554                 context.background()
80555                     .on('change.background-update', update);
80556
80557
80558                 update();
80559
80560                 context.keybinding()
80561                     .on(key, uiBackground.togglePane)
80562                     .on(uiCmd('⌘' + key), quickSwitch);
80563             };
80564
80565             return uiBackground;
80566         }
80567
80568         function uiContributors(context) {
80569             var osm = context.connection(),
80570                 debouncedUpdate = debounce(function() { update(); }, 1000),
80571                 limit = 4,
80572                 hidden = false,
80573                 wrap = d3_select(null);
80574
80575
80576             function update() {
80577                 if (!osm) return;
80578
80579                 var users = {},
80580                     entities = context.intersects(context.map().extent());
80581
80582                 entities.forEach(function(entity) {
80583                     if (entity && entity.user) users[entity.user] = true;
80584                 });
80585
80586                 var u = Object.keys(users),
80587                     subset = u.slice(0, u.length > limit ? limit - 1 : limit);
80588
80589                 wrap.html('')
80590                     .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
80591
80592                 var userList = d3_select(document.createElement('span'));
80593
80594                 userList.selectAll()
80595                     .data(subset)
80596                     .enter()
80597                     .append('a')
80598                     .attr('class', 'user-link')
80599                     .attr('href', function(d) { return osm.userURL(d); })
80600                     .attr('target', '_blank')
80601                     .attr('tabindex', -1)
80602                     .text(String);
80603
80604                 if (u.length > limit) {
80605                     var count = d3_select(document.createElement('span'));
80606
80607                     count.append('a')
80608                         .attr('target', '_blank')
80609                         .attr('tabindex', -1)
80610                         .attr('href', function() {
80611                             return osm.changesetsURL(context.map().center(), context.map().zoom());
80612                         })
80613                         .text(u.length - limit + 1);
80614
80615                     wrap.append('span')
80616                         .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
80617
80618                 } else {
80619                     wrap.append('span')
80620                         .html(t('contributors.list', { users: userList.html() }));
80621                 }
80622
80623                 if (!u.length) {
80624                     hidden = true;
80625                     wrap
80626                         .transition()
80627                         .style('opacity', 0);
80628
80629                 } else if (hidden) {
80630                     wrap
80631                         .transition()
80632                         .style('opacity', 1);
80633                 }
80634             }
80635
80636
80637             return function(selection) {
80638                 if (!osm) return;
80639                 wrap = selection;
80640                 update();
80641
80642                 osm.on('loaded.contributors', debouncedUpdate);
80643                 context.map().on('move.contributors', debouncedUpdate);
80644             };
80645         }
80646
80647         function uiFeatureInfo(context) {
80648             function update(selection) {
80649                 var features = context.features();
80650                 var stats = features.stats();
80651                 var count = 0;
80652                 var hiddenList = features.hidden().map(function(k) {
80653                     if (stats[k]) {
80654                         count += stats[k];
80655                         return String(stats[k]) + ' ' + t('feature.' + k + '.description');
80656                     }
80657                 }).filter(Boolean);
80658
80659                 selection.html('');
80660
80661                 if (hiddenList.length) {
80662                     var tooltipBehavior = tooltip()
80663                         .placement('top')
80664                         .html(true)
80665                         .title(function() {
80666                             return uiTooltipHtml(hiddenList.join('<br/>'));
80667                         });
80668
80669                     var warning = selection.append('a')
80670                         .attr('href', '#')
80671                         .attr('tabindex', -1)
80672                         .html(t('feature_info.hidden_warning', { count: count }))
80673                         .call(tooltipBehavior)
80674                         .on('click', function() {
80675                             tooltipBehavior.hide(warning);
80676                             // open map data panel?
80677                             event.preventDefault();
80678                         });
80679                 }
80680
80681                 selection
80682                     .classed('hide', !hiddenList.length);
80683             }
80684
80685
80686             return function(selection) {
80687                 update(selection);
80688
80689                 context.features().on('change.feature_info', function() {
80690                     update(selection);
80691                 });
80692             };
80693         }
80694
80695         function uiFullScreen(context) {
80696             var element = context.container().node();
80697             // var button = d3_select(null);
80698
80699
80700             function getFullScreenFn() {
80701                 if (element.requestFullscreen) {
80702                     return element.requestFullscreen;
80703                 } else if (element.msRequestFullscreen) {
80704                     return element.msRequestFullscreen;
80705                 } else if (element.mozRequestFullScreen) {
80706                     return element.mozRequestFullScreen;
80707                 } else if (element.webkitRequestFullscreen) {
80708                     return element.webkitRequestFullscreen;
80709                 }
80710             }
80711
80712
80713             function getExitFullScreenFn() {
80714                 if (document.exitFullscreen) {
80715                     return document.exitFullscreen;
80716                 } else if (document.msExitFullscreen) {
80717                     return document.msExitFullscreen;
80718                 } else if (document.mozCancelFullScreen) {
80719                     return document.mozCancelFullScreen;
80720                 } else if (document.webkitExitFullscreen) {
80721                     return document.webkitExitFullscreen;
80722                 }
80723             }
80724
80725
80726             function isFullScreen() {
80727                 return document.fullscreenElement ||
80728                     document.mozFullScreenElement ||
80729                     document.webkitFullscreenElement ||
80730                     document.msFullscreenElement;
80731             }
80732
80733
80734             function isSupported() {
80735                 return !!getFullScreenFn();
80736             }
80737
80738
80739             function fullScreen() {
80740                 event.preventDefault();
80741                 if (!isFullScreen()) {
80742                     // button.classed('active', true);
80743                     getFullScreenFn().apply(element);
80744                 } else {
80745                     // button.classed('active', false);
80746                     getExitFullScreenFn().apply(document);
80747                 }
80748             }
80749
80750
80751             return function() { // selection) {
80752                 if (!isSupported()) return;
80753
80754                 // button = selection.append('button')
80755                 //     .attr('title', t('full_screen'))
80756                 //     .attr('tabindex', -1)
80757                 //     .on('click', fullScreen)
80758                 //     .call(tooltip);
80759
80760                 // button.append('span')
80761                 //     .attr('class', 'icon full-screen');
80762
80763                 var detected = utilDetect();
80764                 var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
80765                 context.keybinding().on(keys, fullScreen);
80766             };
80767         }
80768
80769         function uiGeolocate(context) {
80770             var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
80771             var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
80772             var layer = context.layers().layer('geolocate');
80773             var _position;
80774             var _extent;
80775             var _timeoutID;
80776
80777
80778             function click() {
80779                 if (context.inIntro()) return;
80780                 context.enter(modeBrowse(context));
80781                 if (!layer.enabled()) {
80782                     if (!_position) {
80783                         context.container().call(locating);
80784                         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
80785                     } else {
80786                         zoomTo();
80787                     }
80788                 } else {
80789                     layer.enabled(null, false);
80790                 }
80791                 // This timeout ensures that we still call finish() even if
80792                 // the user declines to share their location in Firefox
80793                 _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
80794             }
80795
80796             function zoomTo() {
80797                 var map = context.map();
80798                 layer.enabled(_position, true);
80799                 map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
80800             }
80801
80802
80803             function success(geolocation) {
80804                 _position = geolocation;
80805                 var coords = _position.coords;
80806                 _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
80807                 zoomTo();
80808                 finish();
80809             }
80810
80811
80812             function error() {
80813                 finish();
80814             }
80815
80816
80817             function finish() {
80818                 locating.close();  // unblock ui
80819                 if (_timeoutID) { clearTimeout(_timeoutID); }
80820                 _timeoutID = undefined;
80821             }
80822
80823
80824             return function(selection) {
80825                 if (!navigator.geolocation) return;
80826
80827                 selection
80828                     .append('button')
80829                     .attr('tabindex', -1)
80830                     .attr('title', t('geolocate.title'))
80831                     .on('click', click)
80832                     .call(svgIcon('#iD-icon-geolocate', 'light'))
80833                     .call(tooltip()
80834                         .placement((textDirection === 'rtl') ? 'right' : 'left'));
80835             };
80836         }
80837
80838         var marked = createCommonjsModule(function (module, exports) {
80839         (function(root) {
80840
80841         /**
80842          * Block-Level Grammar
80843          */
80844
80845         var block = {
80846           newline: /^\n+/,
80847           code: /^( {4}[^\n]+\n*)+/,
80848           fences: /^ {0,3}(`{3,}|~{3,})([^`~\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
80849           hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
80850           heading: /^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,
80851           blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
80852           list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
80853           html: '^ {0,3}(?:' // optional indentation
80854             + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
80855             + '|comment[^\\n]*(\\n+|$)' // (2)
80856             + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
80857             + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
80858             + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
80859             + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
80860             + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
80861             + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
80862             + ')',
80863           def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
80864           nptable: noop,
80865           table: noop,
80866           lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
80867           // regex template, placeholders will be replaced according to different paragraph
80868           // interruption rules of commonmark and the original markdown spec:
80869           _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,
80870           text: /^[^\n]+/
80871         };
80872
80873         block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
80874         block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
80875         block.def = edit(block.def)
80876           .replace('label', block._label)
80877           .replace('title', block._title)
80878           .getRegex();
80879
80880         block.bullet = /(?:[*+-]|\d{1,9}\.)/;
80881         block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
80882         block.item = edit(block.item, 'gm')
80883           .replace(/bull/g, block.bullet)
80884           .getRegex();
80885
80886         block.list = edit(block.list)
80887           .replace(/bull/g, block.bullet)
80888           .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
80889           .replace('def', '\\n+(?=' + block.def.source + ')')
80890           .getRegex();
80891
80892         block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
80893           + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
80894           + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
80895           + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
80896           + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
80897           + '|track|ul';
80898         block._comment = /<!--(?!-?>)[\s\S]*?-->/;
80899         block.html = edit(block.html, 'i')
80900           .replace('comment', block._comment)
80901           .replace('tag', block._tag)
80902           .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
80903           .getRegex();
80904
80905         block.paragraph = edit(block._paragraph)
80906           .replace('hr', block.hr)
80907           .replace('heading', ' {0,3}#{1,6} +')
80908           .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
80909           .replace('blockquote', ' {0,3}>')
80910           .replace('fences', ' {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n')
80911           .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
80912           .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
80913           .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
80914           .getRegex();
80915
80916         block.blockquote = edit(block.blockquote)
80917           .replace('paragraph', block.paragraph)
80918           .getRegex();
80919
80920         /**
80921          * Normal Block Grammar
80922          */
80923
80924         block.normal = merge({}, block);
80925
80926         /**
80927          * GFM Block Grammar
80928          */
80929
80930         block.gfm = merge({}, block.normal, {
80931           nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
80932           table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
80933         });
80934
80935         /**
80936          * Pedantic grammar (original John Gruber's loose markdown specification)
80937          */
80938
80939         block.pedantic = merge({}, block.normal, {
80940           html: edit(
80941             '^ *(?:comment *(?:\\n|\\s*$)'
80942             + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
80943             + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
80944             .replace('comment', block._comment)
80945             .replace(/tag/g, '(?!(?:'
80946               + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
80947               + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
80948               + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
80949             .getRegex(),
80950           def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
80951           heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
80952           fences: noop, // fences not supported
80953           paragraph: edit(block.normal._paragraph)
80954             .replace('hr', block.hr)
80955             .replace('heading', ' *#{1,6} *[^\n]')
80956             .replace('lheading', block.lheading)
80957             .replace('blockquote', ' {0,3}>')
80958             .replace('|fences', '')
80959             .replace('|list', '')
80960             .replace('|html', '')
80961             .getRegex()
80962         });
80963
80964         /**
80965          * Block Lexer
80966          */
80967
80968         function Lexer(options) {
80969           this.tokens = [];
80970           this.tokens.links = Object.create(null);
80971           this.options = options || marked.defaults;
80972           this.rules = block.normal;
80973
80974           if (this.options.pedantic) {
80975             this.rules = block.pedantic;
80976           } else if (this.options.gfm) {
80977             this.rules = block.gfm;
80978           }
80979         }
80980
80981         /**
80982          * Expose Block Rules
80983          */
80984
80985         Lexer.rules = block;
80986
80987         /**
80988          * Static Lex Method
80989          */
80990
80991         Lexer.lex = function(src, options) {
80992           var lexer = new Lexer(options);
80993           return lexer.lex(src);
80994         };
80995
80996         /**
80997          * Preprocessing
80998          */
80999
81000         Lexer.prototype.lex = function(src) {
81001           src = src
81002             .replace(/\r\n|\r/g, '\n')
81003             .replace(/\t/g, '    ')
81004             .replace(/\u00a0/g, ' ')
81005             .replace(/\u2424/g, '\n');
81006
81007           return this.token(src, true);
81008         };
81009
81010         /**
81011          * Lexing
81012          */
81013
81014         Lexer.prototype.token = function(src, top) {
81015           src = src.replace(/^ +$/gm, '');
81016           var next,
81017               loose,
81018               cap,
81019               bull,
81020               b,
81021               item,
81022               listStart,
81023               listItems,
81024               t,
81025               space,
81026               i,
81027               tag,
81028               l,
81029               isordered,
81030               istask,
81031               ischecked;
81032
81033           while (src) {
81034             // newline
81035             if (cap = this.rules.newline.exec(src)) {
81036               src = src.substring(cap[0].length);
81037               if (cap[0].length > 1) {
81038                 this.tokens.push({
81039                   type: 'space'
81040                 });
81041               }
81042             }
81043
81044             // code
81045             if (cap = this.rules.code.exec(src)) {
81046               var lastToken = this.tokens[this.tokens.length - 1];
81047               src = src.substring(cap[0].length);
81048               // An indented code block cannot interrupt a paragraph.
81049               if (lastToken && lastToken.type === 'paragraph') {
81050                 lastToken.text += '\n' + cap[0].trimRight();
81051               } else {
81052                 cap = cap[0].replace(/^ {4}/gm, '');
81053                 this.tokens.push({
81054                   type: 'code',
81055                   codeBlockStyle: 'indented',
81056                   text: !this.options.pedantic
81057                     ? rtrim(cap, '\n')
81058                     : cap
81059                 });
81060               }
81061               continue;
81062             }
81063
81064             // fences
81065             if (cap = this.rules.fences.exec(src)) {
81066               src = src.substring(cap[0].length);
81067               this.tokens.push({
81068                 type: 'code',
81069                 lang: cap[2] ? cap[2].trim() : cap[2],
81070                 text: cap[3] || ''
81071               });
81072               continue;
81073             }
81074
81075             // heading
81076             if (cap = this.rules.heading.exec(src)) {
81077               src = src.substring(cap[0].length);
81078               this.tokens.push({
81079                 type: 'heading',
81080                 depth: cap[1].length,
81081                 text: cap[2]
81082               });
81083               continue;
81084             }
81085
81086             // table no leading pipe (gfm)
81087             if (cap = this.rules.nptable.exec(src)) {
81088               item = {
81089                 type: 'table',
81090                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
81091                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
81092                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
81093               };
81094
81095               if (item.header.length === item.align.length) {
81096                 src = src.substring(cap[0].length);
81097
81098                 for (i = 0; i < item.align.length; i++) {
81099                   if (/^ *-+: *$/.test(item.align[i])) {
81100                     item.align[i] = 'right';
81101                   } else if (/^ *:-+: *$/.test(item.align[i])) {
81102                     item.align[i] = 'center';
81103                   } else if (/^ *:-+ *$/.test(item.align[i])) {
81104                     item.align[i] = 'left';
81105                   } else {
81106                     item.align[i] = null;
81107                   }
81108                 }
81109
81110                 for (i = 0; i < item.cells.length; i++) {
81111                   item.cells[i] = splitCells(item.cells[i], item.header.length);
81112                 }
81113
81114                 this.tokens.push(item);
81115
81116                 continue;
81117               }
81118             }
81119
81120             // hr
81121             if (cap = this.rules.hr.exec(src)) {
81122               src = src.substring(cap[0].length);
81123               this.tokens.push({
81124                 type: 'hr'
81125               });
81126               continue;
81127             }
81128
81129             // blockquote
81130             if (cap = this.rules.blockquote.exec(src)) {
81131               src = src.substring(cap[0].length);
81132
81133               this.tokens.push({
81134                 type: 'blockquote_start'
81135               });
81136
81137               cap = cap[0].replace(/^ *> ?/gm, '');
81138
81139               // Pass `top` to keep the current
81140               // "toplevel" state. This is exactly
81141               // how markdown.pl works.
81142               this.token(cap, top);
81143
81144               this.tokens.push({
81145                 type: 'blockquote_end'
81146               });
81147
81148               continue;
81149             }
81150
81151             // list
81152             if (cap = this.rules.list.exec(src)) {
81153               src = src.substring(cap[0].length);
81154               bull = cap[2];
81155               isordered = bull.length > 1;
81156
81157               listStart = {
81158                 type: 'list_start',
81159                 ordered: isordered,
81160                 start: isordered ? +bull : '',
81161                 loose: false
81162               };
81163
81164               this.tokens.push(listStart);
81165
81166               // Get each top-level item.
81167               cap = cap[0].match(this.rules.item);
81168
81169               listItems = [];
81170               next = false;
81171               l = cap.length;
81172               i = 0;
81173
81174               for (; i < l; i++) {
81175                 item = cap[i];
81176
81177                 // Remove the list item's bullet
81178                 // so it is seen as the next token.
81179                 space = item.length;
81180                 item = item.replace(/^ *([*+-]|\d+\.) */, '');
81181
81182                 // Outdent whatever the
81183                 // list item contains. Hacky.
81184                 if (~item.indexOf('\n ')) {
81185                   space -= item.length;
81186                   item = !this.options.pedantic
81187                     ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
81188                     : item.replace(/^ {1,4}/gm, '');
81189                 }
81190
81191                 // Determine whether the next list item belongs here.
81192                 // Backpedal if it does not belong in this list.
81193                 if (i !== l - 1) {
81194                   b = block.bullet.exec(cap[i + 1])[0];
81195                   if (bull.length > 1 ? b.length === 1
81196                     : (b.length > 1 || (this.options.smartLists && b !== bull))) {
81197                     src = cap.slice(i + 1).join('\n') + src;
81198                     i = l - 1;
81199                   }
81200                 }
81201
81202                 // Determine whether item is loose or not.
81203                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
81204                 // for discount behavior.
81205                 loose = next || /\n\n(?!\s*$)/.test(item);
81206                 if (i !== l - 1) {
81207                   next = item.charAt(item.length - 1) === '\n';
81208                   if (!loose) loose = next;
81209                 }
81210
81211                 if (loose) {
81212                   listStart.loose = true;
81213                 }
81214
81215                 // Check for task list items
81216                 istask = /^\[[ xX]\] /.test(item);
81217                 ischecked = undefined;
81218                 if (istask) {
81219                   ischecked = item[1] !== ' ';
81220                   item = item.replace(/^\[[ xX]\] +/, '');
81221                 }
81222
81223                 t = {
81224                   type: 'list_item_start',
81225                   task: istask,
81226                   checked: ischecked,
81227                   loose: loose
81228                 };
81229
81230                 listItems.push(t);
81231                 this.tokens.push(t);
81232
81233                 // Recurse.
81234                 this.token(item, false);
81235
81236                 this.tokens.push({
81237                   type: 'list_item_end'
81238                 });
81239               }
81240
81241               if (listStart.loose) {
81242                 l = listItems.length;
81243                 i = 0;
81244                 for (; i < l; i++) {
81245                   listItems[i].loose = true;
81246                 }
81247               }
81248
81249               this.tokens.push({
81250                 type: 'list_end'
81251               });
81252
81253               continue;
81254             }
81255
81256             // html
81257             if (cap = this.rules.html.exec(src)) {
81258               src = src.substring(cap[0].length);
81259               this.tokens.push({
81260                 type: this.options.sanitize
81261                   ? 'paragraph'
81262                   : 'html',
81263                 pre: !this.options.sanitizer
81264                   && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
81265                 text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]
81266               });
81267               continue;
81268             }
81269
81270             // def
81271             if (top && (cap = this.rules.def.exec(src))) {
81272               src = src.substring(cap[0].length);
81273               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
81274               tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
81275               if (!this.tokens.links[tag]) {
81276                 this.tokens.links[tag] = {
81277                   href: cap[2],
81278                   title: cap[3]
81279                 };
81280               }
81281               continue;
81282             }
81283
81284             // table (gfm)
81285             if (cap = this.rules.table.exec(src)) {
81286               item = {
81287                 type: 'table',
81288                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
81289                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
81290                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
81291               };
81292
81293               if (item.header.length === item.align.length) {
81294                 src = src.substring(cap[0].length);
81295
81296                 for (i = 0; i < item.align.length; i++) {
81297                   if (/^ *-+: *$/.test(item.align[i])) {
81298                     item.align[i] = 'right';
81299                   } else if (/^ *:-+: *$/.test(item.align[i])) {
81300                     item.align[i] = 'center';
81301                   } else if (/^ *:-+ *$/.test(item.align[i])) {
81302                     item.align[i] = 'left';
81303                   } else {
81304                     item.align[i] = null;
81305                   }
81306                 }
81307
81308                 for (i = 0; i < item.cells.length; i++) {
81309                   item.cells[i] = splitCells(
81310                     item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
81311                     item.header.length);
81312                 }
81313
81314                 this.tokens.push(item);
81315
81316                 continue;
81317               }
81318             }
81319
81320             // lheading
81321             if (cap = this.rules.lheading.exec(src)) {
81322               src = src.substring(cap[0].length);
81323               this.tokens.push({
81324                 type: 'heading',
81325                 depth: cap[2].charAt(0) === '=' ? 1 : 2,
81326                 text: cap[1]
81327               });
81328               continue;
81329             }
81330
81331             // top-level paragraph
81332             if (top && (cap = this.rules.paragraph.exec(src))) {
81333               src = src.substring(cap[0].length);
81334               this.tokens.push({
81335                 type: 'paragraph',
81336                 text: cap[1].charAt(cap[1].length - 1) === '\n'
81337                   ? cap[1].slice(0, -1)
81338                   : cap[1]
81339               });
81340               continue;
81341             }
81342
81343             // text
81344             if (cap = this.rules.text.exec(src)) {
81345               // Top-level should never reach here.
81346               src = src.substring(cap[0].length);
81347               this.tokens.push({
81348                 type: 'text',
81349                 text: cap[0]
81350               });
81351               continue;
81352             }
81353
81354             if (src) {
81355               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81356             }
81357           }
81358
81359           return this.tokens;
81360         };
81361
81362         /**
81363          * Inline-Level Grammar
81364          */
81365
81366         var inline = {
81367           escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
81368           autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
81369           url: noop,
81370           tag: '^comment'
81371             + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
81372             + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
81373             + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
81374             + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
81375             + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
81376           link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
81377           reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
81378           nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
81379           strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
81380           em: /^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
81381           code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
81382           br: /^( {2,}|\\)\n(?!\s*$)/,
81383           del: noop,
81384           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
81385         };
81386
81387         // list of punctuation marks from common mark spec
81388         // without ` and ] to workaround Rule 17 (inline code blocks/links)
81389         inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
81390         inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
81391
81392         inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
81393
81394         inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
81395         inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
81396         inline.autolink = edit(inline.autolink)
81397           .replace('scheme', inline._scheme)
81398           .replace('email', inline._email)
81399           .getRegex();
81400
81401         inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
81402
81403         inline.tag = edit(inline.tag)
81404           .replace('comment', block._comment)
81405           .replace('attribute', inline._attribute)
81406           .getRegex();
81407
81408         inline._label = /(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
81409         inline._href = /<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/;
81410         inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
81411
81412         inline.link = edit(inline.link)
81413           .replace('label', inline._label)
81414           .replace('href', inline._href)
81415           .replace('title', inline._title)
81416           .getRegex();
81417
81418         inline.reflink = edit(inline.reflink)
81419           .replace('label', inline._label)
81420           .getRegex();
81421
81422         /**
81423          * Normal Inline Grammar
81424          */
81425
81426         inline.normal = merge({}, inline);
81427
81428         /**
81429          * Pedantic Inline Grammar
81430          */
81431
81432         inline.pedantic = merge({}, inline.normal, {
81433           strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
81434           em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
81435           link: edit(/^!?\[(label)\]\((.*?)\)/)
81436             .replace('label', inline._label)
81437             .getRegex(),
81438           reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
81439             .replace('label', inline._label)
81440             .getRegex()
81441         });
81442
81443         /**
81444          * GFM Inline Grammar
81445          */
81446
81447         inline.gfm = merge({}, inline.normal, {
81448           escape: edit(inline.escape).replace('])', '~|])').getRegex(),
81449           _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
81450           url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
81451           _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
81452           del: /^~+(?=\S)([\s\S]*?\S)~+/,
81453           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
81454         });
81455
81456         inline.gfm.url = edit(inline.gfm.url, 'i')
81457           .replace('email', inline.gfm._extended_email)
81458           .getRegex();
81459         /**
81460          * GFM + Line Breaks Inline Grammar
81461          */
81462
81463         inline.breaks = merge({}, inline.gfm, {
81464           br: edit(inline.br).replace('{2,}', '*').getRegex(),
81465           text: edit(inline.gfm.text)
81466             .replace('\\b_', '\\b_| {2,}\\n')
81467             .replace(/\{2,\}/g, '*')
81468             .getRegex()
81469         });
81470
81471         /**
81472          * Inline Lexer & Compiler
81473          */
81474
81475         function InlineLexer(links, options) {
81476           this.options = options || marked.defaults;
81477           this.links = links;
81478           this.rules = inline.normal;
81479           this.renderer = this.options.renderer || new Renderer();
81480           this.renderer.options = this.options;
81481
81482           if (!this.links) {
81483             throw new Error('Tokens array requires a `links` property.');
81484           }
81485
81486           if (this.options.pedantic) {
81487             this.rules = inline.pedantic;
81488           } else if (this.options.gfm) {
81489             if (this.options.breaks) {
81490               this.rules = inline.breaks;
81491             } else {
81492               this.rules = inline.gfm;
81493             }
81494           }
81495         }
81496
81497         /**
81498          * Expose Inline Rules
81499          */
81500
81501         InlineLexer.rules = inline;
81502
81503         /**
81504          * Static Lexing/Compiling Method
81505          */
81506
81507         InlineLexer.output = function(src, links, options) {
81508           var inline = new InlineLexer(links, options);
81509           return inline.output(src);
81510         };
81511
81512         /**
81513          * Lexing/Compiling
81514          */
81515
81516         InlineLexer.prototype.output = function(src) {
81517           var out = '',
81518               link,
81519               text,
81520               href,
81521               title,
81522               cap,
81523               prevCapZero;
81524
81525           while (src) {
81526             // escape
81527             if (cap = this.rules.escape.exec(src)) {
81528               src = src.substring(cap[0].length);
81529               out += escape(cap[1]);
81530               continue;
81531             }
81532
81533             // tag
81534             if (cap = this.rules.tag.exec(src)) {
81535               if (!this.inLink && /^<a /i.test(cap[0])) {
81536                 this.inLink = true;
81537               } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
81538                 this.inLink = false;
81539               }
81540               if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81541                 this.inRawBlock = true;
81542               } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81543                 this.inRawBlock = false;
81544               }
81545
81546               src = src.substring(cap[0].length);
81547               out += this.options.sanitize
81548                 ? this.options.sanitizer
81549                   ? this.options.sanitizer(cap[0])
81550                   : escape(cap[0])
81551                 : cap[0];
81552               continue;
81553             }
81554
81555             // link
81556             if (cap = this.rules.link.exec(src)) {
81557               var lastParenIndex = findClosingBracket(cap[2], '()');
81558               if (lastParenIndex > -1) {
81559                 var linkLen = 4 + cap[1].length + lastParenIndex;
81560                 cap[2] = cap[2].substring(0, lastParenIndex);
81561                 cap[0] = cap[0].substring(0, linkLen).trim();
81562                 cap[3] = '';
81563               }
81564               src = src.substring(cap[0].length);
81565               this.inLink = true;
81566               href = cap[2];
81567               if (this.options.pedantic) {
81568                 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
81569
81570                 if (link) {
81571                   href = link[1];
81572                   title = link[3];
81573                 } else {
81574                   title = '';
81575                 }
81576               } else {
81577                 title = cap[3] ? cap[3].slice(1, -1) : '';
81578               }
81579               href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
81580               out += this.outputLink(cap, {
81581                 href: InlineLexer.escapes(href),
81582                 title: InlineLexer.escapes(title)
81583               });
81584               this.inLink = false;
81585               continue;
81586             }
81587
81588             // reflink, nolink
81589             if ((cap = this.rules.reflink.exec(src))
81590                 || (cap = this.rules.nolink.exec(src))) {
81591               src = src.substring(cap[0].length);
81592               link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
81593               link = this.links[link.toLowerCase()];
81594               if (!link || !link.href) {
81595                 out += cap[0].charAt(0);
81596                 src = cap[0].substring(1) + src;
81597                 continue;
81598               }
81599               this.inLink = true;
81600               out += this.outputLink(cap, link);
81601               this.inLink = false;
81602               continue;
81603             }
81604
81605             // strong
81606             if (cap = this.rules.strong.exec(src)) {
81607               src = src.substring(cap[0].length);
81608               out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
81609               continue;
81610             }
81611
81612             // em
81613             if (cap = this.rules.em.exec(src)) {
81614               src = src.substring(cap[0].length);
81615               out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
81616               continue;
81617             }
81618
81619             // code
81620             if (cap = this.rules.code.exec(src)) {
81621               src = src.substring(cap[0].length);
81622               out += this.renderer.codespan(escape(cap[2].trim(), true));
81623               continue;
81624             }
81625
81626             // br
81627             if (cap = this.rules.br.exec(src)) {
81628               src = src.substring(cap[0].length);
81629               out += this.renderer.br();
81630               continue;
81631             }
81632
81633             // del (gfm)
81634             if (cap = this.rules.del.exec(src)) {
81635               src = src.substring(cap[0].length);
81636               out += this.renderer.del(this.output(cap[1]));
81637               continue;
81638             }
81639
81640             // autolink
81641             if (cap = this.rules.autolink.exec(src)) {
81642               src = src.substring(cap[0].length);
81643               if (cap[2] === '@') {
81644                 text = escape(this.mangle(cap[1]));
81645                 href = 'mailto:' + text;
81646               } else {
81647                 text = escape(cap[1]);
81648                 href = text;
81649               }
81650               out += this.renderer.link(href, null, text);
81651               continue;
81652             }
81653
81654             // url (gfm)
81655             if (!this.inLink && (cap = this.rules.url.exec(src))) {
81656               if (cap[2] === '@') {
81657                 text = escape(cap[0]);
81658                 href = 'mailto:' + text;
81659               } else {
81660                 // do extended autolink path validation
81661                 do {
81662                   prevCapZero = cap[0];
81663                   cap[0] = this.rules._backpedal.exec(cap[0])[0];
81664                 } while (prevCapZero !== cap[0]);
81665                 text = escape(cap[0]);
81666                 if (cap[1] === 'www.') {
81667                   href = 'http://' + text;
81668                 } else {
81669                   href = text;
81670                 }
81671               }
81672               src = src.substring(cap[0].length);
81673               out += this.renderer.link(href, null, text);
81674               continue;
81675             }
81676
81677             // text
81678             if (cap = this.rules.text.exec(src)) {
81679               src = src.substring(cap[0].length);
81680               if (this.inRawBlock) {
81681                 out += this.renderer.text(this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]);
81682               } else {
81683                 out += this.renderer.text(escape(this.smartypants(cap[0])));
81684               }
81685               continue;
81686             }
81687
81688             if (src) {
81689               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81690             }
81691           }
81692
81693           return out;
81694         };
81695
81696         InlineLexer.escapes = function(text) {
81697           return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
81698         };
81699
81700         /**
81701          * Compile Link
81702          */
81703
81704         InlineLexer.prototype.outputLink = function(cap, link) {
81705           var href = link.href,
81706               title = link.title ? escape(link.title) : null;
81707
81708           return cap[0].charAt(0) !== '!'
81709             ? this.renderer.link(href, title, this.output(cap[1]))
81710             : this.renderer.image(href, title, escape(cap[1]));
81711         };
81712
81713         /**
81714          * Smartypants Transformations
81715          */
81716
81717         InlineLexer.prototype.smartypants = function(text) {
81718           if (!this.options.smartypants) return text;
81719           return text
81720             // em-dashes
81721             .replace(/---/g, '\u2014')
81722             // en-dashes
81723             .replace(/--/g, '\u2013')
81724             // opening singles
81725             .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
81726             // closing singles & apostrophes
81727             .replace(/'/g, '\u2019')
81728             // opening doubles
81729             .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
81730             // closing doubles
81731             .replace(/"/g, '\u201d')
81732             // ellipses
81733             .replace(/\.{3}/g, '\u2026');
81734         };
81735
81736         /**
81737          * Mangle Links
81738          */
81739
81740         InlineLexer.prototype.mangle = function(text) {
81741           if (!this.options.mangle) return text;
81742           var out = '',
81743               l = text.length,
81744               i = 0,
81745               ch;
81746
81747           for (; i < l; i++) {
81748             ch = text.charCodeAt(i);
81749             if (Math.random() > 0.5) {
81750               ch = 'x' + ch.toString(16);
81751             }
81752             out += '&#' + ch + ';';
81753           }
81754
81755           return out;
81756         };
81757
81758         /**
81759          * Renderer
81760          */
81761
81762         function Renderer(options) {
81763           this.options = options || marked.defaults;
81764         }
81765
81766         Renderer.prototype.code = function(code, infostring, escaped) {
81767           var lang = (infostring || '').match(/\S*/)[0];
81768           if (this.options.highlight) {
81769             var out = this.options.highlight(code, lang);
81770             if (out != null && out !== code) {
81771               escaped = true;
81772               code = out;
81773             }
81774           }
81775
81776           if (!lang) {
81777             return '<pre><code>'
81778               + (escaped ? code : escape(code, true))
81779               + '</code></pre>';
81780           }
81781
81782           return '<pre><code class="'
81783             + this.options.langPrefix
81784             + escape(lang, true)
81785             + '">'
81786             + (escaped ? code : escape(code, true))
81787             + '</code></pre>\n';
81788         };
81789
81790         Renderer.prototype.blockquote = function(quote) {
81791           return '<blockquote>\n' + quote + '</blockquote>\n';
81792         };
81793
81794         Renderer.prototype.html = function(html) {
81795           return html;
81796         };
81797
81798         Renderer.prototype.heading = function(text, level, raw, slugger) {
81799           if (this.options.headerIds) {
81800             return '<h'
81801               + level
81802               + ' id="'
81803               + this.options.headerPrefix
81804               + slugger.slug(raw)
81805               + '">'
81806               + text
81807               + '</h'
81808               + level
81809               + '>\n';
81810           }
81811           // ignore IDs
81812           return '<h' + level + '>' + text + '</h' + level + '>\n';
81813         };
81814
81815         Renderer.prototype.hr = function() {
81816           return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
81817         };
81818
81819         Renderer.prototype.list = function(body, ordered, start) {
81820           var type = ordered ? 'ol' : 'ul',
81821               startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
81822           return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
81823         };
81824
81825         Renderer.prototype.listitem = function(text) {
81826           return '<li>' + text + '</li>\n';
81827         };
81828
81829         Renderer.prototype.checkbox = function(checked) {
81830           return '<input '
81831             + (checked ? 'checked="" ' : '')
81832             + 'disabled="" type="checkbox"'
81833             + (this.options.xhtml ? ' /' : '')
81834             + '> ';
81835         };
81836
81837         Renderer.prototype.paragraph = function(text) {
81838           return '<p>' + text + '</p>\n';
81839         };
81840
81841         Renderer.prototype.table = function(header, body) {
81842           if (body) body = '<tbody>' + body + '</tbody>';
81843
81844           return '<table>\n'
81845             + '<thead>\n'
81846             + header
81847             + '</thead>\n'
81848             + body
81849             + '</table>\n';
81850         };
81851
81852         Renderer.prototype.tablerow = function(content) {
81853           return '<tr>\n' + content + '</tr>\n';
81854         };
81855
81856         Renderer.prototype.tablecell = function(content, flags) {
81857           var type = flags.header ? 'th' : 'td';
81858           var tag = flags.align
81859             ? '<' + type + ' align="' + flags.align + '">'
81860             : '<' + type + '>';
81861           return tag + content + '</' + type + '>\n';
81862         };
81863
81864         // span level renderer
81865         Renderer.prototype.strong = function(text) {
81866           return '<strong>' + text + '</strong>';
81867         };
81868
81869         Renderer.prototype.em = function(text) {
81870           return '<em>' + text + '</em>';
81871         };
81872
81873         Renderer.prototype.codespan = function(text) {
81874           return '<code>' + text + '</code>';
81875         };
81876
81877         Renderer.prototype.br = function() {
81878           return this.options.xhtml ? '<br/>' : '<br>';
81879         };
81880
81881         Renderer.prototype.del = function(text) {
81882           return '<del>' + text + '</del>';
81883         };
81884
81885         Renderer.prototype.link = function(href, title, text) {
81886           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81887           if (href === null) {
81888             return text;
81889           }
81890           var out = '<a href="' + escape(href) + '"';
81891           if (title) {
81892             out += ' title="' + title + '"';
81893           }
81894           out += '>' + text + '</a>';
81895           return out;
81896         };
81897
81898         Renderer.prototype.image = function(href, title, text) {
81899           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81900           if (href === null) {
81901             return text;
81902           }
81903
81904           var out = '<img src="' + href + '" alt="' + text + '"';
81905           if (title) {
81906             out += ' title="' + title + '"';
81907           }
81908           out += this.options.xhtml ? '/>' : '>';
81909           return out;
81910         };
81911
81912         Renderer.prototype.text = function(text) {
81913           return text;
81914         };
81915
81916         /**
81917          * TextRenderer
81918          * returns only the textual part of the token
81919          */
81920
81921         function TextRenderer() {}
81922
81923         // no need for block level renderers
81924
81925         TextRenderer.prototype.strong =
81926         TextRenderer.prototype.em =
81927         TextRenderer.prototype.codespan =
81928         TextRenderer.prototype.del =
81929         TextRenderer.prototype.text = function(text) {
81930           return text;
81931         };
81932
81933         TextRenderer.prototype.link =
81934         TextRenderer.prototype.image = function(href, title, text) {
81935           return '' + text;
81936         };
81937
81938         TextRenderer.prototype.br = function() {
81939           return '';
81940         };
81941
81942         /**
81943          * Parsing & Compiling
81944          */
81945
81946         function Parser(options) {
81947           this.tokens = [];
81948           this.token = null;
81949           this.options = options || marked.defaults;
81950           this.options.renderer = this.options.renderer || new Renderer();
81951           this.renderer = this.options.renderer;
81952           this.renderer.options = this.options;
81953           this.slugger = new Slugger();
81954         }
81955
81956         /**
81957          * Static Parse Method
81958          */
81959
81960         Parser.parse = function(src, options) {
81961           var parser = new Parser(options);
81962           return parser.parse(src);
81963         };
81964
81965         /**
81966          * Parse Loop
81967          */
81968
81969         Parser.prototype.parse = function(src) {
81970           this.inline = new InlineLexer(src.links, this.options);
81971           // use an InlineLexer with a TextRenderer to extract pure text
81972           this.inlineText = new InlineLexer(
81973             src.links,
81974             merge({}, this.options, { renderer: new TextRenderer() })
81975           );
81976           this.tokens = src.reverse();
81977
81978           var out = '';
81979           while (this.next()) {
81980             out += this.tok();
81981           }
81982
81983           return out;
81984         };
81985
81986         /**
81987          * Next Token
81988          */
81989
81990         Parser.prototype.next = function() {
81991           this.token = this.tokens.pop();
81992           return this.token;
81993         };
81994
81995         /**
81996          * Preview Next Token
81997          */
81998
81999         Parser.prototype.peek = function() {
82000           return this.tokens[this.tokens.length - 1] || 0;
82001         };
82002
82003         /**
82004          * Parse Text Tokens
82005          */
82006
82007         Parser.prototype.parseText = function() {
82008           var body = this.token.text;
82009
82010           while (this.peek().type === 'text') {
82011             body += '\n' + this.next().text;
82012           }
82013
82014           return this.inline.output(body);
82015         };
82016
82017         /**
82018          * Parse Current Token
82019          */
82020
82021         Parser.prototype.tok = function() {
82022           switch (this.token.type) {
82023             case 'space': {
82024               return '';
82025             }
82026             case 'hr': {
82027               return this.renderer.hr();
82028             }
82029             case 'heading': {
82030               return this.renderer.heading(
82031                 this.inline.output(this.token.text),
82032                 this.token.depth,
82033                 unescape(this.inlineText.output(this.token.text)),
82034                 this.slugger);
82035             }
82036             case 'code': {
82037               return this.renderer.code(this.token.text,
82038                 this.token.lang,
82039                 this.token.escaped);
82040             }
82041             case 'table': {
82042               var header = '',
82043                   body = '',
82044                   i,
82045                   row,
82046                   cell,
82047                   j;
82048
82049               // header
82050               cell = '';
82051               for (i = 0; i < this.token.header.length; i++) {
82052                 cell += this.renderer.tablecell(
82053                   this.inline.output(this.token.header[i]),
82054                   { header: true, align: this.token.align[i] }
82055                 );
82056               }
82057               header += this.renderer.tablerow(cell);
82058
82059               for (i = 0; i < this.token.cells.length; i++) {
82060                 row = this.token.cells[i];
82061
82062                 cell = '';
82063                 for (j = 0; j < row.length; j++) {
82064                   cell += this.renderer.tablecell(
82065                     this.inline.output(row[j]),
82066                     { header: false, align: this.token.align[j] }
82067                   );
82068                 }
82069
82070                 body += this.renderer.tablerow(cell);
82071               }
82072               return this.renderer.table(header, body);
82073             }
82074             case 'blockquote_start': {
82075               body = '';
82076
82077               while (this.next().type !== 'blockquote_end') {
82078                 body += this.tok();
82079               }
82080
82081               return this.renderer.blockquote(body);
82082             }
82083             case 'list_start': {
82084               body = '';
82085               var ordered = this.token.ordered,
82086                   start = this.token.start;
82087
82088               while (this.next().type !== 'list_end') {
82089                 body += this.tok();
82090               }
82091
82092               return this.renderer.list(body, ordered, start);
82093             }
82094             case 'list_item_start': {
82095               body = '';
82096               var loose = this.token.loose;
82097               var checked = this.token.checked;
82098               var task = this.token.task;
82099
82100               if (this.token.task) {
82101                 body += this.renderer.checkbox(checked);
82102               }
82103
82104               while (this.next().type !== 'list_item_end') {
82105                 body += !loose && this.token.type === 'text'
82106                   ? this.parseText()
82107                   : this.tok();
82108               }
82109               return this.renderer.listitem(body, task, checked);
82110             }
82111             case 'html': {
82112               // TODO parse inline content if parameter markdown=1
82113               return this.renderer.html(this.token.text);
82114             }
82115             case 'paragraph': {
82116               return this.renderer.paragraph(this.inline.output(this.token.text));
82117             }
82118             case 'text': {
82119               return this.renderer.paragraph(this.parseText());
82120             }
82121             default: {
82122               var errMsg = 'Token with "' + this.token.type + '" type was not found.';
82123               if (this.options.silent) {
82124                 console.log(errMsg);
82125               } else {
82126                 throw new Error(errMsg);
82127               }
82128             }
82129           }
82130         };
82131
82132         /**
82133          * Slugger generates header id
82134          */
82135
82136         function Slugger() {
82137           this.seen = {};
82138         }
82139
82140         /**
82141          * Convert string to unique id
82142          */
82143
82144         Slugger.prototype.slug = function(value) {
82145           var slug = value
82146             .toLowerCase()
82147             .trim()
82148             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
82149             .replace(/\s/g, '-');
82150
82151           if (this.seen.hasOwnProperty(slug)) {
82152             var originalSlug = slug;
82153             do {
82154               this.seen[originalSlug]++;
82155               slug = originalSlug + '-' + this.seen[originalSlug];
82156             } while (this.seen.hasOwnProperty(slug));
82157           }
82158           this.seen[slug] = 0;
82159
82160           return slug;
82161         };
82162
82163         /**
82164          * Helpers
82165          */
82166
82167         function escape(html, encode) {
82168           if (encode) {
82169             if (escape.escapeTest.test(html)) {
82170               return html.replace(escape.escapeReplace, function(ch) { return escape.replacements[ch]; });
82171             }
82172           } else {
82173             if (escape.escapeTestNoEncode.test(html)) {
82174               return html.replace(escape.escapeReplaceNoEncode, function(ch) { return escape.replacements[ch]; });
82175             }
82176           }
82177
82178           return html;
82179         }
82180
82181         escape.escapeTest = /[&<>"']/;
82182         escape.escapeReplace = /[&<>"']/g;
82183         escape.replacements = {
82184           '&': '&amp;',
82185           '<': '&lt;',
82186           '>': '&gt;',
82187           '"': '&quot;',
82188           "'": '&#39;'
82189         };
82190
82191         escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
82192         escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
82193
82194         function unescape(html) {
82195           // explicitly match decimal, hex, and named HTML entities
82196           return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
82197             n = n.toLowerCase();
82198             if (n === 'colon') return ':';
82199             if (n.charAt(0) === '#') {
82200               return n.charAt(1) === 'x'
82201                 ? String.fromCharCode(parseInt(n.substring(2), 16))
82202                 : String.fromCharCode(+n.substring(1));
82203             }
82204             return '';
82205           });
82206         }
82207
82208         function edit(regex, opt) {
82209           regex = regex.source || regex;
82210           opt = opt || '';
82211           return {
82212             replace: function(name, val) {
82213               val = val.source || val;
82214               val = val.replace(/(^|[^\[])\^/g, '$1');
82215               regex = regex.replace(name, val);
82216               return this;
82217             },
82218             getRegex: function() {
82219               return new RegExp(regex, opt);
82220             }
82221           };
82222         }
82223
82224         function cleanUrl(sanitize, base, href) {
82225           if (sanitize) {
82226             try {
82227               var prot = decodeURIComponent(unescape(href))
82228                 .replace(/[^\w:]/g, '')
82229                 .toLowerCase();
82230             } catch (e) {
82231               return null;
82232             }
82233             if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
82234               return null;
82235             }
82236           }
82237           if (base && !originIndependentUrl.test(href)) {
82238             href = resolveUrl(base, href);
82239           }
82240           try {
82241             href = encodeURI(href).replace(/%25/g, '%');
82242           } catch (e) {
82243             return null;
82244           }
82245           return href;
82246         }
82247
82248         function resolveUrl(base, href) {
82249           if (!baseUrls[' ' + base]) {
82250             // we can ignore everything in base after the last slash of its path component,
82251             // but we might need to add _that_
82252             // https://tools.ietf.org/html/rfc3986#section-3
82253             if (/^[^:]+:\/*[^/]*$/.test(base)) {
82254               baseUrls[' ' + base] = base + '/';
82255             } else {
82256               baseUrls[' ' + base] = rtrim(base, '/', true);
82257             }
82258           }
82259           base = baseUrls[' ' + base];
82260
82261           if (href.slice(0, 2) === '//') {
82262             return base.replace(/:[\s\S]*/, ':') + href;
82263           } else if (href.charAt(0) === '/') {
82264             return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
82265           } else {
82266             return base + href;
82267           }
82268         }
82269         var baseUrls = {};
82270         var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
82271
82272         function noop() {}
82273         noop.exec = noop;
82274
82275         function merge(obj) {
82276           var i = 1,
82277               target,
82278               key;
82279
82280           for (; i < arguments.length; i++) {
82281             target = arguments[i];
82282             for (key in target) {
82283               if (Object.prototype.hasOwnProperty.call(target, key)) {
82284                 obj[key] = target[key];
82285               }
82286             }
82287           }
82288
82289           return obj;
82290         }
82291
82292         function splitCells(tableRow, count) {
82293           // ensure that every cell-delimiting pipe has a space
82294           // before it to distinguish it from an escaped pipe
82295           var row = tableRow.replace(/\|/g, function(match, offset, str) {
82296                 var escaped = false,
82297                     curr = offset;
82298                 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
82299                 if (escaped) {
82300                   // odd number of slashes means | is escaped
82301                   // so we leave it alone
82302                   return '|';
82303                 } else {
82304                   // add space before unescaped |
82305                   return ' |';
82306                 }
82307               }),
82308               cells = row.split(/ \|/),
82309               i = 0;
82310
82311           if (cells.length > count) {
82312             cells.splice(count);
82313           } else {
82314             while (cells.length < count) cells.push('');
82315           }
82316
82317           for (; i < cells.length; i++) {
82318             // leading or trailing whitespace is ignored per the gfm spec
82319             cells[i] = cells[i].trim().replace(/\\\|/g, '|');
82320           }
82321           return cells;
82322         }
82323
82324         // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
82325         // /c*$/ is vulnerable to REDOS.
82326         // invert: Remove suffix of non-c chars instead. Default falsey.
82327         function rtrim(str, c, invert) {
82328           if (str.length === 0) {
82329             return '';
82330           }
82331
82332           // Length of suffix matching the invert condition.
82333           var suffLen = 0;
82334
82335           // Step left until we fail to match the invert condition.
82336           while (suffLen < str.length) {
82337             var currChar = str.charAt(str.length - suffLen - 1);
82338             if (currChar === c && !invert) {
82339               suffLen++;
82340             } else if (currChar !== c && invert) {
82341               suffLen++;
82342             } else {
82343               break;
82344             }
82345           }
82346
82347           return str.substr(0, str.length - suffLen);
82348         }
82349
82350         function findClosingBracket(str, b) {
82351           if (str.indexOf(b[1]) === -1) {
82352             return -1;
82353           }
82354           var level = 0;
82355           for (var i = 0; i < str.length; i++) {
82356             if (str[i] === '\\') {
82357               i++;
82358             } else if (str[i] === b[0]) {
82359               level++;
82360             } else if (str[i] === b[1]) {
82361               level--;
82362               if (level < 0) {
82363                 return i;
82364               }
82365             }
82366           }
82367           return -1;
82368         }
82369
82370         function checkSanitizeDeprecation(opt) {
82371           if (opt && opt.sanitize && !opt.silent) {
82372             console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
82373           }
82374         }
82375
82376         /**
82377          * Marked
82378          */
82379
82380         function marked(src, opt, callback) {
82381           // throw error in case of non string input
82382           if (typeof src === 'undefined' || src === null) {
82383             throw new Error('marked(): input parameter is undefined or null');
82384           }
82385           if (typeof src !== 'string') {
82386             throw new Error('marked(): input parameter is of type '
82387               + Object.prototype.toString.call(src) + ', string expected');
82388           }
82389
82390           if (callback || typeof opt === 'function') {
82391             if (!callback) {
82392               callback = opt;
82393               opt = null;
82394             }
82395
82396             opt = merge({}, marked.defaults, opt || {});
82397             checkSanitizeDeprecation(opt);
82398
82399             var highlight = opt.highlight,
82400                 tokens,
82401                 pending,
82402                 i = 0;
82403
82404             try {
82405               tokens = Lexer.lex(src, opt);
82406             } catch (e) {
82407               return callback(e);
82408             }
82409
82410             pending = tokens.length;
82411
82412             var done = function(err) {
82413               if (err) {
82414                 opt.highlight = highlight;
82415                 return callback(err);
82416               }
82417
82418               var out;
82419
82420               try {
82421                 out = Parser.parse(tokens, opt);
82422               } catch (e) {
82423                 err = e;
82424               }
82425
82426               opt.highlight = highlight;
82427
82428               return err
82429                 ? callback(err)
82430                 : callback(null, out);
82431             };
82432
82433             if (!highlight || highlight.length < 3) {
82434               return done();
82435             }
82436
82437             delete opt.highlight;
82438
82439             if (!pending) return done();
82440
82441             for (; i < tokens.length; i++) {
82442               (function(token) {
82443                 if (token.type !== 'code') {
82444                   return --pending || done();
82445                 }
82446                 return highlight(token.text, token.lang, function(err, code) {
82447                   if (err) return done(err);
82448                   if (code == null || code === token.text) {
82449                     return --pending || done();
82450                   }
82451                   token.text = code;
82452                   token.escaped = true;
82453                   --pending || done();
82454                 });
82455               })(tokens[i]);
82456             }
82457
82458             return;
82459           }
82460           try {
82461             if (opt) opt = merge({}, marked.defaults, opt);
82462             checkSanitizeDeprecation(opt);
82463             return Parser.parse(Lexer.lex(src, opt), opt);
82464           } catch (e) {
82465             e.message += '\nPlease report this to https://github.com/markedjs/marked.';
82466             if ((opt || marked.defaults).silent) {
82467               return '<p>An error occurred:</p><pre>'
82468                 + escape(e.message + '', true)
82469                 + '</pre>';
82470             }
82471             throw e;
82472           }
82473         }
82474
82475         /**
82476          * Options
82477          */
82478
82479         marked.options =
82480         marked.setOptions = function(opt) {
82481           merge(marked.defaults, opt);
82482           return marked;
82483         };
82484
82485         marked.getDefaults = function() {
82486           return {
82487             baseUrl: null,
82488             breaks: false,
82489             gfm: true,
82490             headerIds: true,
82491             headerPrefix: '',
82492             highlight: null,
82493             langPrefix: 'language-',
82494             mangle: true,
82495             pedantic: false,
82496             renderer: new Renderer(),
82497             sanitize: false,
82498             sanitizer: null,
82499             silent: false,
82500             smartLists: false,
82501             smartypants: false,
82502             xhtml: false
82503           };
82504         };
82505
82506         marked.defaults = marked.getDefaults();
82507
82508         /**
82509          * Expose
82510          */
82511
82512         marked.Parser = Parser;
82513         marked.parser = Parser.parse;
82514
82515         marked.Renderer = Renderer;
82516         marked.TextRenderer = TextRenderer;
82517
82518         marked.Lexer = Lexer;
82519         marked.lexer = Lexer.lex;
82520
82521         marked.InlineLexer = InlineLexer;
82522         marked.inlineLexer = InlineLexer.output;
82523
82524         marked.Slugger = Slugger;
82525
82526         marked.parse = marked;
82527
82528         {
82529           module.exports = marked;
82530         }
82531         })();
82532         });
82533
82534         function pointBox(loc, context) {
82535             var rect = context.surfaceRect();
82536             var point = context.curtainProjection(loc);
82537             return {
82538                 left: point[0] + rect.left - 40,
82539                 top: point[1] + rect.top - 60,
82540                 width: 80,
82541                 height: 90
82542             };
82543         }
82544
82545
82546         function pad$2(locOrBox, padding, context) {
82547             var box;
82548             if (locOrBox instanceof Array) {
82549                 var rect = context.surfaceRect();
82550                 var point = context.curtainProjection(locOrBox);
82551                 box = {
82552                     left: point[0] + rect.left,
82553                     top: point[1] + rect.top
82554                 };
82555             } else {
82556                 box = locOrBox;
82557             }
82558
82559             return {
82560                 left: box.left - padding,
82561                 top: box.top - padding,
82562                 width: (box.width || 0) + 2 * padding,
82563                 height: (box.width || 0) + 2 * padding
82564             };
82565         }
82566
82567
82568         function icon(name, svgklass, useklass) {
82569             return '<svg class="icon ' + (svgklass || '') + '">' +
82570                  '<use xlink:href="' + name + '"' +
82571                  (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
82572         }
82573
82574
82575         function slugify(text) {
82576             return text.toString().toLowerCase()
82577                 .replace(/\s+/g, '-')           // Replace spaces with -
82578                 .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
82579                 .replace(/\-\-+/g, '-')         // Replace multiple - with single -
82580                 .replace(/^-+/, '')             // Trim - from start of text
82581                 .replace(/-+$/, '');            // Trim - from end of text
82582         }
82583
82584
82585         // console warning for missing walkthrough names
82586         var missingStrings = {};
82587         function checkKey(key, text) {
82588             if (t(key, { default: undefined}) === undefined) {
82589                 if (missingStrings.hasOwnProperty(key)) return;  // warn once
82590                 missingStrings[key] = text;
82591                 var missing = key + ': ' + text;
82592                 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
82593             }
82594         }
82595
82596
82597         function localize(obj) {
82598             var key;
82599
82600             // Assign name if entity has one..
82601             var name = obj.tags && obj.tags.name;
82602             if (name) {
82603                 key = 'intro.graph.name.' + slugify(name);
82604                 obj.tags.name = t(key, { default: name });
82605                 checkKey(key, name);
82606             }
82607
82608             // Assign street name if entity has one..
82609             var street = obj.tags && obj.tags['addr:street'];
82610             if (street) {
82611                 key = 'intro.graph.name.' + slugify(street);
82612                 obj.tags['addr:street'] = t(key, { default: street });
82613                 checkKey(key, street);
82614
82615                 // Add address details common across walkthrough..
82616                 var addrTags = [
82617                     'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
82618                     'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
82619                 ];
82620                 addrTags.forEach(function(k) {
82621                     var key = 'intro.graph.' + k;
82622                     var tag = 'addr:' + k;
82623                     var val = obj.tags && obj.tags[tag];
82624                     var str = t(key, { default: val });
82625
82626                     if (str) {
82627                         if (str.match(/^<.*>$/) !== null) {
82628                             delete obj.tags[tag];
82629                         } else {
82630                             obj.tags[tag] = str;
82631                         }
82632                     }
82633                 });
82634             }
82635
82636             return obj;
82637         }
82638
82639
82640         // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
82641         function isMostlySquare(points) {
82642             // note: uses 15 here instead of the 12 from actionOrthogonalize because
82643             // actionOrthogonalize can actually straighten some larger angles as it iterates
82644             var threshold = 15; // degrees within right or straight
82645             var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
82646             var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
82647
82648             for (var i = 0; i < points.length; i++) {
82649                 var a = points[(i - 1 + points.length) % points.length];
82650                 var origin = points[i];
82651                 var b = points[(i + 1) % points.length];
82652
82653                 var dotp = geoVecNormalizedDot(a, b, origin);
82654                 var mag = Math.abs(dotp);
82655                 if (mag > lowerBound && mag < upperBound) {
82656                     return false;
82657                 }
82658             }
82659
82660             return true;
82661         }
82662
82663
82664         function selectMenuItem(operation) {
82665             var selector = '.edit-menu .edit-menu-item-' + operation +
82666                 ', .radial-menu .radial-menu-item-' + operation;
82667             return d3_select(selector);
82668         }
82669
82670
82671         function transitionTime(point1, point2) {
82672             var distance = geoSphericalDistance(point1, point2);
82673             if (distance === 0)
82674                 return 0;
82675             else if (distance < 80)
82676                 return 500;
82677             else
82678                 return 1000;
82679         }
82680
82681         var dataIntroGraph = {n1:{id:"n1",loc:[-85.631039,41.948829]},n10:{id:"n10",loc:[-85.634733,41.941588]},n100:{id:"n100",loc:[-85.637395,41.942252]},n1000:{id:"n1000",loc:[-85.632699,41.944763]},n1001:{id:"n1001",loc:[-85.632685,41.944763]},n1002:{id:"n1002",loc:[-85.632673,41.944755]},n1003:{id:"n1003",loc:[-85.632595,41.944682]},n1004:{id:"n1004",loc:[-85.632576,41.944673]},n1005:{id:"n1005",loc:[-85.632551,41.944667]},n1006:{id:"n1006",loc:[-85.63253,41.944667]},n1007:{id:"n1007",loc:[-85.632502,41.944669]},n1008:{id:"n1008",loc:[-85.632483,41.944677]},n1009:{id:"n1009",loc:[-85.632383,41.944731]},n101:{id:"n101",loc:[-85.637357,41.942252]},n1010:{id:"n1010",loc:[-85.63349,41.944976],tags:{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Sherwin Williams",shop:"paint",brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams"}},n1011:{id:"n1011",loc:[-85.633548,41.945034],tags:{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Unique Jewelry",shop:"jewelry"}},n1012:{id:"n1012",loc:[-85.633683,41.945129],tags:{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"World Fare",shop:"gift"}},n1013:{id:"n1013",loc:[-85.634563,41.945469],tags:{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Golden Finch Framing",shop:"frame"}},n1014:{id:"n1014",loc:[-85.634469,41.945379],tags:{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Dollar Tree",brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",shop:"variety_store"}},n1015:{id:"n1015",loc:[-85.634227,41.945159],tags:{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"theatre",name:"Riviera Theatre"}},n1016:{id:"n1016",loc:[-85.634057,41.945012],tags:{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"River City Appliance",shop:"appliance"}},n1017:{id:"n1017",loc:[-85.633879,41.945325],tags:{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paparazzi Tattoo",shop:"tattoo"}},n1018:{id:"n1018",loc:[-85.634914,41.945839],tags:{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"bank",name:"Southern Michigan Bank"}},n1019:{id:"n1019",loc:[-85.634513,41.946181]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634079,41.946194]},n1021:{id:"n1021",loc:[-85.634357,41.945805]},n1022:{id:"n1022",loc:[-85.634389,41.945788]},n1023:{id:"n1023",loc:[-85.634491,41.94581]},n1024:{id:"n1024",loc:[-85.634513,41.945853]},n1025:{id:"n1025",loc:[-85.634506,41.94583]},n1026:{id:"n1026",loc:[-85.634762,41.946056],tags:{crossing:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634766,41.946178]},n1028:{id:"n1028",loc:[-85.634622,41.946179],tags:{crossing:"marked",highway:"crossing"}},n1029:{id:"n1029",loc:[-85.640655,41.942057]},n103:{id:"n103",loc:[-85.637386,41.942054]},n1030:{id:"n1030",loc:[-85.640947,41.942057]},n1031:{id:"n1031",loc:[-85.640957,41.942593]},n1032:{id:"n1032",loc:[-85.630953,41.960873]},n1033:{id:"n1033",loc:[-85.632174,41.960679]},n1034:{id:"n1034",loc:[-85.638785,41.943066]},n1035:{id:"n1035",loc:[-85.638853,41.943065]},n1036:{id:"n1036",loc:[-85.638855,41.943183]},n1037:{id:"n1037",loc:[-85.638552,41.943189]},n1038:{id:"n1038",loc:[-85.63855,41.943149]},n1039:{id:"n1039",loc:[-85.638638,41.943068]},n104:{id:"n104",loc:[-85.637387,41.942125]},n1040:{id:"n1040",loc:[-85.638638,41.943078]},n1041:{id:"n1041",loc:[-85.638813,41.943163]},n1042:{id:"n1042",loc:[-85.638684,41.943165]},n1043:{id:"n1043",loc:[-85.638682,41.943105]},n1044:{id:"n1044",loc:[-85.638706,41.943105]},n1045:{id:"n1045",loc:[-85.638707,41.943117]},n1046:{id:"n1046",loc:[-85.638812,41.943115]},n1047:{id:"n1047",loc:[-85.638769,41.943407]},n1048:{id:"n1048",loc:[-85.638549,41.943407]},n1049:{id:"n1049",loc:[-85.638567,41.943555]},n105:{id:"n105",loc:[-85.637319,41.942125]},n1050:{id:"n1050",loc:[-85.638426,41.943554]},n1051:{id:"n1051",loc:[-85.638427,41.94346]},n1052:{id:"n1052",loc:[-85.638568,41.943461]},n1053:{id:"n1053",loc:[-85.639264,41.943415]},n1054:{id:"n1054",loc:[-85.639082,41.943417]},n1055:{id:"n1055",loc:[-85.63908,41.943331]},n1056:{id:"n1056",loc:[-85.639136,41.94333]},n1057:{id:"n1057",loc:[-85.639158,41.943312]},n1058:{id:"n1058",loc:[-85.639188,41.943313]},n1059:{id:"n1059",loc:[-85.639211,41.943331]},n106:{id:"n106",loc:[-85.637319,41.942137]},n1060:{id:"n1060",loc:[-85.639262,41.943331]},n1061:{id:"n1061",loc:[-85.638986,41.943515]},n1062:{id:"n1062",loc:[-85.63888,41.943521]},n1063:{id:"n1063",loc:[-85.638871,41.943436]},n1064:{id:"n1064",loc:[-85.638958,41.943431]},n1065:{id:"n1065",loc:[-85.638979,41.943443]},n1066:{id:"n1066",loc:[-85.63926,41.943703]},n1067:{id:"n1067",loc:[-85.639152,41.943704]},n1068:{id:"n1068",loc:[-85.639152,41.943691]},n1069:{id:"n1069",loc:[-85.639063,41.943691]},n107:{id:"n107",loc:[-85.637259,41.942137]},n1070:{id:"n1070",loc:[-85.639062,41.943613]},n1071:{id:"n1071",loc:[-85.639259,41.943611]},n1072:{id:"n1072",loc:[-85.639117,41.943726]},n1073:{id:"n1073",loc:[-85.639118,41.943767]},n1074:{id:"n1074",loc:[-85.639051,41.943768]},n1075:{id:"n1075",loc:[-85.63905,41.943727]},n1076:{id:"n1076",loc:[-85.638627,41.943716]},n1077:{id:"n1077",loc:[-85.63863,41.943634]},n1078:{id:"n1078",loc:[-85.63844,41.943631]},n1079:{id:"n1079",loc:[-85.638437,41.943729]},n108:{id:"n108",loc:[-85.637259,41.942126]},n1080:{id:"n1080",loc:[-85.638533,41.94373]},n1081:{id:"n1081",loc:[-85.638534,41.943715]},n1082:{id:"n1082",loc:[-85.638678,41.943941]},n1083:{id:"n1083",loc:[-85.638522,41.943944]},n1084:{id:"n1084",loc:[-85.63852,41.943864]},n1085:{id:"n1085",loc:[-85.638676,41.943861]},n1086:{id:"n1086",loc:[-85.638663,41.944059]},n1087:{id:"n1087",loc:[-85.638513,41.944061]},n1088:{id:"n1088",loc:[-85.638511,41.943991]},n1089:{id:"n1089",loc:[-85.638661,41.943989]},n109:{id:"n109",loc:[-85.637193,41.942126]},n1090:{id:"n1090",loc:[-85.63865,41.944134]},n1091:{id:"n1091",loc:[-85.638429,41.944144]},n1092:{id:"n1092",loc:[-85.638426,41.944106]},n1093:{id:"n1093",loc:[-85.638476,41.944104]},n1094:{id:"n1094",loc:[-85.638475,41.94409]},n1095:{id:"n1095",loc:[-85.638594,41.944084]},n1096:{id:"n1096",loc:[-85.638595,41.944101]},n1097:{id:"n1097",loc:[-85.638647,41.944099]},n1098:{id:"n1098",loc:[-85.63829,41.944154]},n1099:{id:"n1099",loc:[-85.638558,41.944155]},n11:{id:"n11",loc:[-85.634602,41.941523]},n110:{id:"n110",loc:[-85.637192,41.942053]},n1100:{id:"n1100",loc:[-85.638558,41.944338]},n1101:{id:"n1101",loc:[-85.638851,41.944408]},n1102:{id:"n1102",loc:[-85.637771,41.943989]},n1103:{id:"n1103",loc:[-85.639345,41.943964]},n1104:{id:"n1104",loc:[-85.638515,41.94397]},n1105:{id:"n1105",loc:[-85.639256,41.943928]},n1106:{id:"n1106",loc:[-85.639157,41.943929]},n1107:{id:"n1107",loc:[-85.639156,41.9439]},n1108:{id:"n1108",loc:[-85.639118,41.9439]},n1109:{id:"n1109",loc:[-85.639116,41.94382]},n111:{id:"n111",loc:[-85.637248,41.942053]},n1110:{id:"n1110",loc:[-85.639202,41.943819]},n1111:{id:"n1111",loc:[-85.639202,41.943837]},n1112:{id:"n1112",loc:[-85.639293,41.943836]},n1113:{id:"n1113",loc:[-85.639295,41.943898]},n1114:{id:"n1114",loc:[-85.639255,41.943898]},n1115:{id:"n1115",loc:[-85.639296,41.944083]},n1116:{id:"n1116",loc:[-85.639144,41.944084]},n1117:{id:"n1117",loc:[-85.639143,41.944026]},n1118:{id:"n1118",loc:[-85.639162,41.944026]},n1119:{id:"n1119",loc:[-85.639162,41.944]},n112:{id:"n112",loc:[-85.637248,41.942042]},n1120:{id:"n1120",loc:[-85.639295,41.943999]},n1121:{id:"n1121",loc:[-85.639131,41.944139]},n1122:{id:"n1122",loc:[-85.63901,41.94414]},n1123:{id:"n1123",loc:[-85.63901,41.944076]},n1124:{id:"n1124",loc:[-85.63913,41.944075]},n1125:{id:"n1125",loc:[-85.639092,41.944155]},n1126:{id:"n1126",loc:[-85.639093,41.944308]},n1127:{id:"n1127",loc:[-85.639225,41.944308]},n1128:{id:"n1128",loc:[-85.639225,41.94429]},n1129:{id:"n1129",loc:[-85.639253,41.944289]},n113:{id:"n113",loc:[-85.637338,41.942041]},n1130:{id:"n1130",loc:[-85.639253,41.944269]},n1131:{id:"n1131",loc:[-85.639243,41.944269]},n1132:{id:"n1132",loc:[-85.639243,41.944229]},n1133:{id:"n1133",loc:[-85.639224,41.944229]},n1134:{id:"n1134",loc:[-85.639224,41.944196]},n1135:{id:"n1135",loc:[-85.639195,41.944196]},n1136:{id:"n1136",loc:[-85.639195,41.944155]},n1137:{id:"n1137",loc:[-85.639072,41.944154]},n1138:{id:"n1138",loc:[-85.638865,41.944154]},n1139:{id:"n1139",loc:[-85.638863,41.943967]},n114:{id:"n114",loc:[-85.637338,41.942055]},n1140:{id:"n1140",loc:[-85.6386,41.942698]},n1141:{id:"n1141",loc:[-85.639348,41.942698]},n1142:{id:"n1142",loc:[-85.639377,41.944984]},n1143:{id:"n1143",loc:[-85.63937,41.945013]},n1144:{id:"n1144",loc:[-85.639357,41.945033]},n1145:{id:"n1145",loc:[-85.639353,41.945053]},n1146:{id:"n1146",loc:[-85.639352,41.945084]},n1147:{id:"n1147",loc:[-85.638278,41.945516]},n1148:{id:"n1148",loc:[-85.637505,41.945801]},n1149:{id:"n1149",loc:[-85.637327,41.945857]},n115:{id:"n115",loc:[-85.637583,41.941943]},n1150:{id:"n1150",loc:[-85.637168,41.945899]},n1151:{id:"n1151",loc:[-85.637017,41.94593]},n1152:{id:"n1152",loc:[-85.637185,41.945938]},n1153:{id:"n1153",loc:[-85.63682,41.945963]},n1154:{id:"n1154",loc:[-85.636639,41.945984]},n1155:{id:"n1155",loc:[-85.636439,41.945999]},n1156:{id:"n1156",loc:[-85.635801,41.945999]},n1157:{id:"n1157",loc:[-85.635769,41.945908]},n1158:{id:"n1158",loc:[-85.635953,41.946154]},n1159:{id:"n1159",loc:[-85.635472,41.94598]},n116:{id:"n116",loc:[-85.637584,41.941983]},n1160:{id:"n1160",loc:[-85.635409,41.945981]},n1161:{id:"n1161",loc:[-85.635583,41.945987]},n1162:{id:"n1162",loc:[-85.636452,41.945805]},n1163:{id:"n1163",loc:[-85.636425,41.94582]},n1164:{id:"n1164",loc:[-85.636396,41.945817]},n1165:{id:"n1165",loc:[-85.636368,41.945797]},n1166:{id:"n1166",loc:[-85.636346,41.945767]},n1167:{id:"n1167",loc:[-85.636307,41.945745]},n1168:{id:"n1168",loc:[-85.636194,41.94565]},n1169:{id:"n1169",loc:[-85.636121,41.945579]},n117:{id:"n117",loc:[-85.63751,41.941983]},n1170:{id:"n1170",loc:[-85.635995,41.945432]},n1171:{id:"n1171",loc:[-85.637564,41.943538]},n1172:{id:"n1172",loc:[-85.63756,41.943505]},n1173:{id:"n1173",loc:[-85.637435,41.943489]},n1174:{id:"n1174",loc:[-85.637093,41.943556]},n1175:{id:"n1175",loc:[-85.634836,41.941574]},n1176:{id:"n1176",loc:[-85.634692,41.9415]},n1177:{id:"n1177",loc:[-85.634261,41.941337]},n1178:{id:"n1178",loc:[-85.634208,41.940962]},n1179:{id:"n1179",loc:[-85.635247,41.940968]},n118:{id:"n118",loc:[-85.637509,41.941944]},n1180:{id:"n1180",loc:[-85.63514,41.941205]},n1181:{id:"n1181",loc:[-85.634858,41.941511]},n1182:{id:"n1182",loc:[-85.630725,41.943465]},n1183:{id:"n1183",loc:[-85.632591,41.942826]},n1184:{id:"n1184",loc:[-85.634487,41.941928]},n1185:{id:"n1185",loc:[-85.634499,41.942056]},n1186:{id:"n1186",loc:[-85.63433,41.943102]},n1187:{id:"n1187",loc:[-85.634158,41.943151]},n1188:{id:"n1188",loc:[-85.634107,41.94305]},n1189:{id:"n1189",loc:[-85.634279,41.943002]},n119:{id:"n119",loc:[-85.637724,41.941973]},n1190:{id:"n1190",loc:[-85.634362,41.943762]},n1191:{id:"n1191",loc:[-85.634331,41.943731]},n1192:{id:"n1192",loc:[-85.634396,41.943695]},n1193:{id:"n1193",loc:[-85.634426,41.943726]},n1194:{id:"n1194",loc:[-85.621569,41.956021]},n1195:{id:"n1195",loc:[-85.621574,41.956164]},n1196:{id:"n1196",loc:[-85.621489,41.956165]},n1197:{id:"n1197",loc:[-85.621488,41.956136]},n1198:{id:"n1198",loc:[-85.621372,41.956139]},n1199:{id:"n1199",loc:[-85.621369,41.956049]},n12:{id:"n12",loc:[-85.63359,41.941093]},n120:{id:"n120",loc:[-85.637633,41.941973]},n1200:{id:"n1200",loc:[-85.621493,41.956047]},n1201:{id:"n1201",loc:[-85.621492,41.956022]},n1202:{id:"n1202",loc:[-85.619744,41.953192]},n1203:{id:"n1203",loc:[-85.619059,41.953902]},n1204:{id:"n1204",loc:[-85.623984,41.95469]},n1205:{id:"n1205",loc:[-85.630159,41.958208]},n1206:{id:"n1206",loc:[-85.63002,41.958208]},n1207:{id:"n1207",loc:[-85.630021,41.95814]},n1208:{id:"n1208",loc:[-85.63,41.95814]},n1209:{id:"n1209",loc:[-85.63,41.958043]},n121:{id:"n121",loc:[-85.637633,41.941853]},n1210:{id:"n1210",loc:[-85.630159,41.958043]},n1211:{id:"n1211",loc:[-85.630304,41.957566]},n1212:{id:"n1212",loc:[-85.630303,41.957684]},n1213:{id:"n1213",loc:[-85.630073,41.957683]},n1214:{id:"n1214",loc:[-85.630072,41.957721]},n1215:{id:"n1215",loc:[-85.629993,41.95772]},n1216:{id:"n1216",loc:[-85.629993,41.95768]},n1217:{id:"n1217",loc:[-85.629968,41.95768]},n1218:{id:"n1218",loc:[-85.629969,41.957588]},n1219:{id:"n1219",loc:[-85.630219,41.95759]},n122:{id:"n122",loc:[-85.637724,41.941853]},n1220:{id:"n1220",loc:[-85.630219,41.957566]},n1221:{id:"n1221",loc:[-85.630717,41.957744]},n1222:{id:"n1222",loc:[-85.630596,41.957745]},n1223:{id:"n1223",loc:[-85.630598,41.957553]},n1224:{id:"n1224",loc:[-85.630717,41.957555]},n1225:{id:"n1225",loc:[-85.630609,41.957745]},n1226:{id:"n1226",loc:[-85.63061,41.957789]},n1227:{id:"n1227",loc:[-85.630327,41.957791]},n1228:{id:"n1228",loc:[-85.630324,41.95752]},n1229:{id:"n1229",loc:[-85.630325,41.95756]},n123:{id:"n123",loc:[-85.637773,41.941988]},n1230:{id:"n1230",loc:[-85.63057,41.95756]},n1231:{id:"n1231",loc:[-85.63069,41.958016]},n1232:{id:"n1232",loc:[-85.630586,41.958017]},n1233:{id:"n1233",loc:[-85.630584,41.957956]},n1234:{id:"n1234",loc:[-85.630614,41.957956]},n1235:{id:"n1235",loc:[-85.630611,41.957835]},n1236:{id:"n1236",loc:[-85.630737,41.957833]},n1237:{id:"n1237",loc:[-85.630739,41.957921]},n1238:{id:"n1238",loc:[-85.630688,41.957922]},n1239:{id:"n1239",loc:[-85.630719,41.958291]},n124:{id:"n124",loc:[-85.637773,41.942046]},n1240:{id:"n1240",loc:[-85.630592,41.958291]},n1241:{id:"n1241",loc:[-85.630593,41.958108]},n1242:{id:"n1242",loc:[-85.630701,41.958109]},n1243:{id:"n1243",loc:[-85.6307,41.958173]},n1244:{id:"n1244",loc:[-85.630711,41.958173]},n1245:{id:"n1245",loc:[-85.630711,41.958233]},n1246:{id:"n1246",loc:[-85.630719,41.958233]},n1247:{id:"n1247",loc:[-85.630523,41.958329]},n1248:{id:"n1248",loc:[-85.630388,41.958329]},n1249:{id:"n1249",loc:[-85.630387,41.958262]},n125:{id:"n125",loc:[-85.637693,41.942047]},n1250:{id:"n1250",loc:[-85.630523,41.958261]},n1251:{id:"n1251",loc:[-85.63072,41.958636]},n1252:{id:"n1252",loc:[-85.630721,41.958709]},n1253:{id:"n1253",loc:[-85.630503,41.958712]},n1254:{id:"n1254",loc:[-85.630498,41.958511]},n1255:{id:"n1255",loc:[-85.630635,41.95851]},n1256:{id:"n1256",loc:[-85.630638,41.958636]},n1257:{id:"n1257",loc:[-85.630437,41.958822]},n1258:{id:"n1258",loc:[-85.630437,41.958849]},n1259:{id:"n1259",loc:[-85.630393,41.958849]},n126:{id:"n126",loc:[-85.637692,41.941988]},n1260:{id:"n1260",loc:[-85.630393,41.958822]},n1261:{id:"n1261",loc:[-85.630605,41.959102]},n1262:{id:"n1262",loc:[-85.63049,41.959104]},n1263:{id:"n1263",loc:[-85.630487,41.958996]},n1264:{id:"n1264",loc:[-85.630462,41.958996]},n1265:{id:"n1265",loc:[-85.63046,41.958922]},n1266:{id:"n1266",loc:[-85.630562,41.958921]},n1267:{id:"n1267",loc:[-85.630564,41.958992]},n1268:{id:"n1268",loc:[-85.630602,41.958992]},n1269:{id:"n1269",loc:[-85.630126,41.957096]},n127:{id:"n127",loc:[-85.637604,41.941994]},n1270:{id:"n1270",loc:[-85.630129,41.957283]},n1271:{id:"n1271",loc:[-85.629993,41.957284]},n1272:{id:"n1272",loc:[-85.629992,41.957216]},n1273:{id:"n1273",loc:[-85.630015,41.957215]},n1274:{id:"n1274",loc:[-85.630013,41.957097]},n1275:{id:"n1275",loc:[-85.630211,41.956592]},n1276:{id:"n1276",loc:[-85.630211,41.956676]},n1277:{id:"n1277",loc:[-85.630162,41.956676]},n1278:{id:"n1278",loc:[-85.630162,41.95676]},n1279:{id:"n1279",loc:[-85.630037,41.956761]},n128:{id:"n128",loc:[-85.637604,41.942057]},n1280:{id:"n1280",loc:[-85.630037,41.956592]},n1281:{id:"n1281",loc:[-85.630309,41.95653]},n1282:{id:"n1282",loc:[-85.630326,41.957065]},n1283:{id:"n1283",loc:[-85.630118,41.957065]},n1284:{id:"n1284",loc:[-85.630119,41.957096]},n1285:{id:"n1285",loc:[-85.63067,41.957307]},n1286:{id:"n1286",loc:[-85.630536,41.957308]},n1287:{id:"n1287",loc:[-85.630533,41.957111]},n1288:{id:"n1288",loc:[-85.630667,41.95711]},n1289:{id:"n1289",loc:[-85.630676,41.956808]},n129:{id:"n129",loc:[-85.63748,41.942057]},n1290:{id:"n1290",loc:[-85.630551,41.956808]},n1291:{id:"n1291",loc:[-85.630552,41.956982]},n1292:{id:"n1292",loc:[-85.63059,41.956982]},n1293:{id:"n1293",loc:[-85.63059,41.957001]},n1294:{id:"n1294",loc:[-85.630692,41.957001]},n1295:{id:"n1295",loc:[-85.630692,41.956936]},n1296:{id:"n1296",loc:[-85.630676,41.956936]},n1297:{id:"n1297",loc:[-85.630496,41.956889]},n1298:{id:"n1298",loc:[-85.630501,41.956947]},n1299:{id:"n1299",loc:[-85.630377,41.956953]},n13:{id:"n13",loc:[-85.633643,41.941143]},n130:{id:"n130",loc:[-85.63748,41.941994]},n1300:{id:"n1300",loc:[-85.630359,41.956938]},n1301:{id:"n1301",loc:[-85.630359,41.956912]},n1302:{id:"n1302",loc:[-85.63038,41.956894]},n1303:{id:"n1303",loc:[-85.630679,41.956747]},n1304:{id:"n1304",loc:[-85.630572,41.956748]},n1305:{id:"n1305",loc:[-85.63057,41.956668]},n1306:{id:"n1306",loc:[-85.630501,41.956669]},n1307:{id:"n1307",loc:[-85.630499,41.95659]},n1308:{id:"n1308",loc:[-85.630565,41.956589]},n1309:{id:"n1309",loc:[-85.630564,41.956541]},n131:{id:"n131",loc:[-85.637431,41.941832]},n1310:{id:"n1310",loc:[-85.630686,41.956539]},n1311:{id:"n1311",loc:[-85.630688,41.956631]},n1312:{id:"n1312",loc:[-85.630676,41.956631]},n1313:{id:"n1313",loc:[-85.630686,41.956487]},n1314:{id:"n1314",loc:[-85.63059,41.956487]},n1315:{id:"n1315",loc:[-85.63059,41.956396]},n1316:{id:"n1316",loc:[-85.630686,41.956396]},n1317:{id:"n1317",loc:[-85.630643,41.9563]},n1318:{id:"n1318",loc:[-85.630548,41.956301]},n1319:{id:"n1319",loc:[-85.630545,41.956217]},n132:{id:"n132",loc:[-85.637432,41.94189]},n1320:{id:"n1320",loc:[-85.630529,41.956214]},n1321:{id:"n1321",loc:[-85.630521,41.956202]},n1322:{id:"n1322",loc:[-85.63052,41.95618]},n1323:{id:"n1323",loc:[-85.630527,41.956169]},n1324:{id:"n1324",loc:[-85.630544,41.956163]},n1325:{id:"n1325",loc:[-85.630543,41.956094]},n1326:{id:"n1326",loc:[-85.630641,41.956093]},n1327:{id:"n1327",loc:[-85.630642,41.956134]},n1328:{id:"n1328",loc:[-85.630656,41.956134]},n1329:{id:"n1329",loc:[-85.630657,41.956252]},n133:{id:"n133",loc:[-85.637412,41.94189]},n1330:{id:"n1330",loc:[-85.630643,41.956252]},n1331:{id:"n1331",loc:[-85.630409,41.956044]},n1332:{id:"n1332",loc:[-85.630409,41.956075]},n1333:{id:"n1333",loc:[-85.630195,41.956078]},n1334:{id:"n1334",loc:[-85.630195,41.9561]},n1335:{id:"n1335",loc:[-85.630088,41.956101]},n1336:{id:"n1336",loc:[-85.630087,41.956048]},n1337:{id:"n1337",loc:[-85.630345,41.956114]},n1338:{id:"n1338",loc:[-85.630328,41.956113]},n1339:{id:"n1339",loc:[-85.63034,41.956189]},n134:{id:"n134",loc:[-85.637413,41.941938]},n1340:{id:"n1340",loc:[-85.630355,41.956185]},n1341:{id:"n1341",loc:[-85.630311,41.956117]},n1342:{id:"n1342",loc:[-85.630297,41.956125]},n1343:{id:"n1343",loc:[-85.630287,41.956136]},n1344:{id:"n1344",loc:[-85.630283,41.956149]},n1345:{id:"n1345",loc:[-85.630285,41.956162]},n1346:{id:"n1346",loc:[-85.630293,41.956174]},n1347:{id:"n1347",loc:[-85.630306,41.956183]},n1348:{id:"n1348",loc:[-85.630322,41.956188]},n1349:{id:"n1349",loc:[-85.630368,41.956179]},n135:{id:"n135",loc:[-85.637342,41.941939]},n1350:{id:"n1350",loc:[-85.630378,41.95617]},n1351:{id:"n1351",loc:[-85.630384,41.956159]},n1352:{id:"n1352",loc:[-85.630385,41.956147]},n1353:{id:"n1353",loc:[-85.630381,41.956136]},n1354:{id:"n1354",loc:[-85.630372,41.956126]},n1355:{id:"n1355",loc:[-85.63036,41.956118]},n1356:{id:"n1356",loc:[-85.630776,41.956041]},n1357:{id:"n1357",loc:[-85.630195,41.956036]},n1358:{id:"n1358",loc:[-85.630137,41.956037]},n1359:{id:"n1359",loc:[-85.630136,41.956006]},n136:{id:"n136",loc:[-85.637342,41.941914]},n1360:{id:"n1360",loc:[-85.630194,41.956005]},n1361:{id:"n1361",loc:[-85.629864,41.956039]},n1362:{id:"n1362",loc:[-85.629864,41.955862]},n1363:{id:"n1363",loc:[-85.629541,41.958291]},n1364:{id:"n1364",loc:[-85.629419,41.958292]},n1365:{id:"n1365",loc:[-85.629417,41.958168]},n1366:{id:"n1366",loc:[-85.629445,41.958168]},n1367:{id:"n1367",loc:[-85.629444,41.958109]},n1368:{id:"n1368",loc:[-85.629537,41.958108]},n1369:{id:"n1369",loc:[-85.629351,41.958136]},n137:{id:"n137",loc:[-85.637212,41.941916]},n1370:{id:"n1370",loc:[-85.629352,41.958202]},n1371:{id:"n1371",loc:[-85.629365,41.958202]},n1372:{id:"n1372",loc:[-85.629365,41.958223]},n1373:{id:"n1373",loc:[-85.629291,41.958224]},n1374:{id:"n1374",loc:[-85.62929,41.958137]},n1375:{id:"n1375",loc:[-85.629443,41.958073]},n1376:{id:"n1376",loc:[-85.629252,41.958075]},n1377:{id:"n1377",loc:[-85.629253,41.95827]},n1378:{id:"n1378",loc:[-85.629566,41.957585]},n1379:{id:"n1379",loc:[-85.629566,41.957692]},n138:{id:"n138",loc:[-85.637211,41.941835]},n1380:{id:"n1380",loc:[-85.629281,41.957693]},n1381:{id:"n1381",loc:[-85.62928,41.957585]},n1382:{id:"n1382",loc:[-85.629004,41.957599]},n1383:{id:"n1383",loc:[-85.629004,41.957682]},n1384:{id:"n1384",loc:[-85.628902,41.957682]},n1385:{id:"n1385",loc:[-85.628902,41.957723]},n1386:{id:"n1386",loc:[-85.628731,41.957724]},n1387:{id:"n1387",loc:[-85.628731,41.9576]},n1388:{id:"n1388",loc:[-85.62836,41.957679]},n1389:{id:"n1389",loc:[-85.628359,41.957759]},n139:{id:"n139",loc:[-85.637293,41.941834]},n1390:{id:"n1390",loc:[-85.628062,41.957757]},n1391:{id:"n1391",loc:[-85.628063,41.957657]},n1392:{id:"n1392",loc:[-85.628198,41.957657]},n1393:{id:"n1393",loc:[-85.628198,41.957678]},n1394:{id:"n1394",loc:[-85.627775,41.958095]},n1395:{id:"n1395",loc:[-85.627608,41.958095]},n1396:{id:"n1396",loc:[-85.627606,41.957829]},n1397:{id:"n1397",loc:[-85.627774,41.957829]},n1398:{id:"n1398",loc:[-85.626816,41.957636]},n1399:{id:"n1399",loc:[-85.626787,41.957681]},n14:{id:"n14",loc:[-85.633643,41.940122]},n140:{id:"n140",loc:[-85.637293,41.941823]},n1400:{id:"n1400",loc:[-85.626673,41.95764]},n1401:{id:"n1401",loc:[-85.626703,41.957594]},n1402:{id:"n1402",loc:[-85.62694,41.95752]},n1403:{id:"n1403",loc:[-85.62688,41.957611]},n1404:{id:"n1404",loc:[-85.626798,41.957582]},n1405:{id:"n1405",loc:[-85.626793,41.95759]},n1406:{id:"n1406",loc:[-85.626657,41.95754]},n1407:{id:"n1407",loc:[-85.626666,41.957526]},n1408:{id:"n1408",loc:[-85.626584,41.957497]},n1409:{id:"n1409",loc:[-85.626638,41.957415]},n141:{id:"n141",loc:[-85.637363,41.941822]},n1410:{id:"n1410",loc:[-85.626731,41.957449]},n1411:{id:"n1411",loc:[-85.626725,41.957457]},n1412:{id:"n1412",loc:[-85.626843,41.9575]},n1413:{id:"n1413",loc:[-85.626851,41.957487]},n1414:{id:"n1414",loc:[-85.626579,41.957521]},n1415:{id:"n1415",loc:[-85.626537,41.957587]},n1416:{id:"n1416",loc:[-85.626427,41.957551]},n1417:{id:"n1417",loc:[-85.626468,41.957483]},n1418:{id:"n1418",loc:[-85.626592,41.957639]},n1419:{id:"n1419",loc:[-85.626807,41.957713]},n142:{id:"n142",loc:[-85.637364,41.941833]},n1420:{id:"n1420",loc:[-85.627129,41.957401]},n1421:{id:"n1421",loc:[-85.627209,41.95742]},n1422:{id:"n1422",loc:[-85.627302,41.957435]},n1423:{id:"n1423",loc:[-85.629566,41.957048]},n1424:{id:"n1424",loc:[-85.629568,41.957215]},n1425:{id:"n1425",loc:[-85.629383,41.957216]},n1426:{id:"n1426",loc:[-85.629384,41.95727]},n1427:{id:"n1427",loc:[-85.629231,41.957271]},n1428:{id:"n1428",loc:[-85.62923,41.957198]},n1429:{id:"n1429",loc:[-85.629322,41.957198]},n143:{id:"n143",loc:[-85.637559,41.942448]},n1430:{id:"n1430",loc:[-85.629321,41.957108]},n1431:{id:"n1431",loc:[-85.629441,41.957108]},n1432:{id:"n1432",loc:[-85.62944,41.957049]},n1433:{id:"n1433",loc:[-85.629337,41.957018]},n1434:{id:"n1434",loc:[-85.629366,41.957028]},n1435:{id:"n1435",loc:[-85.629375,41.957044]},n1436:{id:"n1436",loc:[-85.629354,41.957071]},n1437:{id:"n1437",loc:[-85.629317,41.957071]},n1438:{id:"n1438",loc:[-85.62929,41.957074]},n1439:{id:"n1439",loc:[-85.62927,41.957084]},n144:{id:"n144",loc:[-85.637036,41.942454]},n1440:{id:"n1440",loc:[-85.629232,41.957081]},n1441:{id:"n1441",loc:[-85.629222,41.957057]},n1442:{id:"n1442",loc:[-85.629259,41.957025]},n1443:{id:"n1443",loc:[-85.629293,41.957017]},n1444:{id:"n1444",loc:[-85.629251,41.957085]},n1445:{id:"n1445",loc:[-85.629235,41.957041]},n1446:{id:"n1446",loc:[-85.62937,41.95706]},n1447:{id:"n1447",loc:[-85.629531,41.956909]},n1448:{id:"n1448",loc:[-85.629408,41.956909]},n1449:{id:"n1449",loc:[-85.629402,41.956681]},n145:{id:"n145",loc:[-85.636692,41.942828]},n1450:{id:"n1450",loc:[-85.62953,41.956681]},n1451:{id:"n1451",loc:[-85.629402,41.956728]},n1452:{id:"n1452",loc:[-85.629408,41.956845]},n1453:{id:"n1453",loc:[-85.629385,41.956845]},n1454:{id:"n1454",loc:[-85.629384,41.956728]},n1455:{id:"n1455",loc:[-85.629063,41.956973]},n1456:{id:"n1456",loc:[-85.629064,41.957009]},n1457:{id:"n1457",loc:[-85.62902,41.957009]},n1458:{id:"n1458",loc:[-85.629019,41.956973]},n1459:{id:"n1459",loc:[-85.629136,41.956633]},n146:{id:"n146",loc:[-85.635929,41.942826]},n1460:{id:"n1460",loc:[-85.629084,41.956632]},n1461:{id:"n1461",loc:[-85.629084,41.956605]},n1462:{id:"n1462",loc:[-85.629136,41.956605]},n1463:{id:"n1463",loc:[-85.629153,41.956657]},n1464:{id:"n1464",loc:[-85.627914,41.956661]},n1465:{id:"n1465",loc:[-85.630096,41.956101]},n1466:{id:"n1466",loc:[-85.630097,41.95612]},n1467:{id:"n1467",loc:[-85.630011,41.956121]},n1468:{id:"n1468",loc:[-85.630015,41.956374]},n1469:{id:"n1469",loc:[-85.629148,41.95626]},n147:{id:"n147",loc:[-85.636433,41.942828]},n1470:{id:"n1470",loc:[-85.629527,41.956591]},n1471:{id:"n1471",loc:[-85.629405,41.956591]},n1472:{id:"n1472",loc:[-85.629405,41.956459]},n1473:{id:"n1473",loc:[-85.629369,41.956459]},n1474:{id:"n1474",loc:[-85.629369,41.956424]},n1475:{id:"n1475",loc:[-85.629413,41.956424]},n1476:{id:"n1476",loc:[-85.629414,41.956326]},n1477:{id:"n1477",loc:[-85.629522,41.956326]},n1478:{id:"n1478",loc:[-85.629522,41.956487]},n1479:{id:"n1479",loc:[-85.629527,41.956487]},n148:{id:"n148",loc:[-85.636435,41.942864],tags:{entrance:"yes"}},n1480:{id:"n1480",loc:[-85.629414,41.95634]},n1481:{id:"n1481",loc:[-85.629149,41.956338]},n1482:{id:"n1482",loc:[-85.62931,41.956531]},n1483:{id:"n1483",loc:[-85.629291,41.95655]},n1484:{id:"n1484",loc:[-85.629255,41.95655]},n1485:{id:"n1485",loc:[-85.629236,41.956533]},n1486:{id:"n1486",loc:[-85.629237,41.956461]},n1487:{id:"n1487",loc:[-85.629257,41.956445]},n1488:{id:"n1488",loc:[-85.629257,41.956428]},n1489:{id:"n1489",loc:[-85.629287,41.956428]},n149:{id:"n149",loc:[-85.637235,41.942622]},n1490:{id:"n1490",loc:[-85.629287,41.956445]},n1491:{id:"n1491",loc:[-85.62931,41.95646]},n1492:{id:"n1492",loc:[-85.629049,41.956425]},n1493:{id:"n1493",loc:[-85.628907,41.956427]},n1494:{id:"n1494",loc:[-85.628907,41.956455]},n1495:{id:"n1495",loc:[-85.628841,41.956455]},n1496:{id:"n1496",loc:[-85.62884,41.956424]},n1497:{id:"n1497",loc:[-85.628764,41.956425]},n1498:{id:"n1498",loc:[-85.628762,41.956323]},n1499:{id:"n1499",loc:[-85.628808,41.956323]},n15:{id:"n15",loc:[-85.633477,41.940187]},n150:{id:"n150",loc:[-85.637247,41.943116]},n1500:{id:"n1500",loc:[-85.628808,41.956314]},n1501:{id:"n1501",loc:[-85.628911,41.956313]},n1502:{id:"n1502",loc:[-85.628911,41.956322]},n1503:{id:"n1503",loc:[-85.62896,41.956322]},n1504:{id:"n1504",loc:[-85.62896,41.956348]},n1505:{id:"n1505",loc:[-85.629047,41.956347]},n1506:{id:"n1506",loc:[-85.628893,41.957263]},n1507:{id:"n1507",loc:[-85.628788,41.957264]},n1508:{id:"n1508",loc:[-85.628786,41.95711]},n1509:{id:"n1509",loc:[-85.628894,41.957109]},n151:{id:"n151",loc:[-85.637564,41.943116]},n1510:{id:"n1510",loc:[-85.628893,41.957075]},n1511:{id:"n1511",loc:[-85.628965,41.957075]},n1512:{id:"n1512",loc:[-85.628965,41.957111]},n1513:{id:"n1513",loc:[-85.629035,41.95711]},n1514:{id:"n1514",loc:[-85.629036,41.957209]},n1515:{id:"n1515",loc:[-85.628893,41.95721]},n1516:{id:"n1516",loc:[-85.631348,41.95773]},n1517:{id:"n1517",loc:[-85.631101,41.957732]},n1518:{id:"n1518",loc:[-85.631099,41.957558]},n1519:{id:"n1519",loc:[-85.63123,41.957557]},n152:{id:"n152",loc:[-85.637552,41.942619]},n1520:{id:"n1520",loc:[-85.631231,41.957618]},n1521:{id:"n1521",loc:[-85.63129,41.957618]},n1522:{id:"n1522",loc:[-85.63129,41.957651]},n1523:{id:"n1523",loc:[-85.631346,41.957651]},n1524:{id:"n1524",loc:[-85.631366,41.95802]},n1525:{id:"n1525",loc:[-85.631141,41.958021]},n1526:{id:"n1526",loc:[-85.63114,41.957943]},n1527:{id:"n1527",loc:[-85.631167,41.957943]},n1528:{id:"n1528",loc:[-85.631166,41.957808]},n1529:{id:"n1529",loc:[-85.631301,41.957807]},n153:{id:"n153",loc:[-85.63763,41.942528]},n1530:{id:"n1530",loc:[-85.631302,41.95789]},n1531:{id:"n1531",loc:[-85.631364,41.95789]},n1532:{id:"n1532",loc:[-85.631539,41.957754]},n1533:{id:"n1533",loc:[-85.631069,41.957756]},n1534:{id:"n1534",loc:[-85.631536,41.957518]},n1535:{id:"n1535",loc:[-85.631543,41.957995]},n1536:{id:"n1536",loc:[-85.631531,41.957748]},n1537:{id:"n1537",loc:[-85.631485,41.957748]},n1538:{id:"n1538",loc:[-85.631484,41.957698]},n1539:{id:"n1539",loc:[-85.631531,41.957698]},n154:{id:"n154",loc:[-85.637151,41.94253]},n1540:{id:"n1540",loc:[-85.631586,41.957742]},n1541:{id:"n1541",loc:[-85.63155,41.957742]},n1542:{id:"n1542",loc:[-85.631551,41.957702]},n1543:{id:"n1543",loc:[-85.631587,41.957702]},n1544:{id:"n1544",loc:[-85.631534,41.95807]},n1545:{id:"n1545",loc:[-85.631534,41.958097]},n1546:{id:"n1546",loc:[-85.631491,41.958097]},n1547:{id:"n1547",loc:[-85.631491,41.95807]},n1548:{id:"n1548",loc:[-85.631304,41.958861]},n1549:{id:"n1549",loc:[-85.631186,41.958862]},n155:{id:"n155",loc:[-85.63715,41.942424]},n1550:{id:"n1550",loc:[-85.631182,41.958653]},n1551:{id:"n1551",loc:[-85.6313,41.958651]},n1552:{id:"n1552",loc:[-85.631293,41.95854]},n1553:{id:"n1553",loc:[-85.631176,41.958539]},n1554:{id:"n1554",loc:[-85.631176,41.958377]},n1555:{id:"n1555",loc:[-85.631297,41.958377]},n1556:{id:"n1556",loc:[-85.631297,41.958422]},n1557:{id:"n1557",loc:[-85.631333,41.958422]},n1558:{id:"n1558",loc:[-85.631333,41.958479]},n1559:{id:"n1559",loc:[-85.631293,41.958479]},n156:{id:"n156",loc:[-85.637629,41.942422]},n1560:{id:"n1560",loc:[-85.631951,41.958908]},n1561:{id:"n1561",loc:[-85.631838,41.958909]},n1562:{id:"n1562",loc:[-85.631837,41.958847]},n1563:{id:"n1563",loc:[-85.631859,41.958847]},n1564:{id:"n1564",loc:[-85.631858,41.958746]},n1565:{id:"n1565",loc:[-85.631961,41.958745]},n1566:{id:"n1566",loc:[-85.631962,41.958812]},n1567:{id:"n1567",loc:[-85.631949,41.958813]},n1568:{id:"n1568",loc:[-85.631579,41.958913]},n1569:{id:"n1569",loc:[-85.631567,41.95864]},n157:{id:"n157",loc:[-85.638232,41.942477]},n1570:{id:"n1570",loc:[-85.631942,41.958639]},n1571:{id:"n1571",loc:[-85.631543,41.958594]},n1572:{id:"n1572",loc:[-85.631543,41.958065]},n1573:{id:"n1573",loc:[-85.631888,41.958546]},n1574:{id:"n1574",loc:[-85.631804,41.958546]},n1575:{id:"n1575",loc:[-85.631803,41.95841]},n1576:{id:"n1576",loc:[-85.631886,41.958409]},n1577:{id:"n1577",loc:[-85.631897,41.958125]},n1578:{id:"n1578",loc:[-85.631755,41.958126]},n1579:{id:"n1579",loc:[-85.631756,41.958174]},n158:{id:"n158",loc:[-85.637775,41.942483]},n1580:{id:"n1580",loc:[-85.63178,41.958174]},n1581:{id:"n1581",loc:[-85.631782,41.958272]},n1582:{id:"n1582",loc:[-85.631922,41.958271]},n1583:{id:"n1583",loc:[-85.631922,41.958244]},n1584:{id:"n1584",loc:[-85.631883,41.958245]},n1585:{id:"n1585",loc:[-85.631882,41.958175]},n1586:{id:"n1586",loc:[-85.631898,41.958175]},n1587:{id:"n1587",loc:[-85.631924,41.958032]},n1588:{id:"n1588",loc:[-85.631762,41.958032]},n1589:{id:"n1589",loc:[-85.63176,41.957827]},n159:{id:"n159",loc:[-85.638107,41.942512]},n1590:{id:"n1590",loc:[-85.631888,41.957826]},n1591:{id:"n1591",loc:[-85.631888,41.957892]},n1592:{id:"n1592",loc:[-85.631871,41.957892]},n1593:{id:"n1593",loc:[-85.631872,41.957949]},n1594:{id:"n1594",loc:[-85.631923,41.957949]},n1595:{id:"n1595",loc:[-85.631695,41.95795]},n1596:{id:"n1596",loc:[-85.631666,41.957975]},n1597:{id:"n1597",loc:[-85.63163,41.957975]},n1598:{id:"n1598",loc:[-85.6316,41.957951]},n1599:{id:"n1599",loc:[-85.6316,41.95785]},n16:{id:"n16",loc:[-85.63341,41.94032]},n160:{id:"n160",loc:[-85.637763,41.942514]},n1600:{id:"n1600",loc:[-85.63166,41.95785]},n1601:{id:"n1601",loc:[-85.631696,41.957873]},n1602:{id:"n1602",loc:[-85.631924,41.957762]},n1603:{id:"n1603",loc:[-85.631762,41.957762]},n1604:{id:"n1604",loc:[-85.631762,41.957708]},n1605:{id:"n1605",loc:[-85.631785,41.957708]},n1606:{id:"n1606",loc:[-85.631785,41.957606]},n1607:{id:"n1607",loc:[-85.631734,41.957606]},n1608:{id:"n1608",loc:[-85.631734,41.957538]},n1609:{id:"n1609",loc:[-85.631821,41.957538]},n161:{id:"n161",loc:[-85.637763,41.942445]},n1610:{id:"n1610",loc:[-85.631935,41.957545]},n1611:{id:"n1611",loc:[-85.631821,41.957544]},n1612:{id:"n1612",loc:[-85.631935,41.957645]},n1613:{id:"n1613",loc:[-85.631924,41.957645]},n1614:{id:"n1614",loc:[-85.627135,41.953828]},n1615:{id:"n1615",loc:[-85.633517,41.941353],tags:{man_made:"lighthouse","seamark:type":"light_major"}},n1616:{id:"n1616",loc:[-85.633659,41.942041],tags:{amenity:"bbq"}},n1617:{id:"n1617",loc:[-85.63662,41.942911],tags:{amenity:"toilets"}},n1618:{id:"n1618",loc:[-85.637487,41.943876],tags:{amenity:"toilets"}},n1619:{id:"n1619",loc:[-85.634938,41.941917],tags:{amenity:"toilets"}},n162:{id:"n162",loc:[-85.638107,41.942443]},n1620:{id:"n1620",loc:[-85.632427,41.941678],tags:{amenity:"bbq"}},n1621:{id:"n1621",loc:[-85.638033,41.944568],tags:{amenity:"bbq"}},n1622:{id:"n1622",loc:[-85.638052,41.944522],tags:{amenity:"bbq"}},n1623:{id:"n1623",loc:[-85.635001,41.941965]},n1624:{id:"n1624",loc:[-85.634635,41.941884]},n1625:{id:"n1625",loc:[-85.634667,41.941894]},n1626:{id:"n1626",loc:[-85.634791,41.942011]},n1627:{id:"n1627",loc:[-85.634749,41.941938]},n1628:{id:"n1628",loc:[-85.627295,41.953946],tags:{barrier:"gate"}},n1629:{id:"n1629",loc:[-85.629076,41.954689]},n163:{id:"n163",loc:[-85.638813,41.942475]},n1630:{id:"n1630",loc:[-85.640667,41.942595]},n1631:{id:"n1631",loc:[-85.639455,41.94261]},n1632:{id:"n1632",loc:[-85.643407,41.942336]},n1633:{id:"n1633",loc:[-85.641845,41.941316]},n1634:{id:"n1634",loc:[-85.643322,41.942224]},n1635:{id:"n1635",loc:[-85.643301,41.942124]},n1636:{id:"n1636",loc:[-85.640639,41.941326]},n1637:{id:"n1637",loc:[-85.640614,41.940058]},n1638:{id:"n1638",loc:[-85.639428,41.941335]},n1639:{id:"n1639",loc:[-85.643078,41.941293]},n164:{id:"n164",loc:[-85.63883,41.942422]},n1640:{id:"n1640",loc:[-85.64371,41.942302]},n1641:{id:"n1641",loc:[-85.643056,41.94001]},n1642:{id:"n1642",loc:[-85.643097,41.942575],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n1643:{id:"n1643",loc:[-85.641855,41.942586]},n1644:{id:"n1644",loc:[-85.643549,41.942209]},n1645:{id:"n1645",loc:[-85.639359,41.94007]},n1646:{id:"n1646",loc:[-85.642797,41.940522]},n1647:{id:"n1647",loc:[-85.642589,41.940523]},n1648:{id:"n1648",loc:[-85.642587,41.940287]},n1649:{id:"n1649",loc:[-85.642797,41.940286]},n165:{id:"n165",loc:[-85.63883,41.942508]},n1650:{id:"n1650",loc:[-85.642571,41.940523]},n1651:{id:"n1651",loc:[-85.642568,41.940286]},n1652:{id:"n1652",loc:[-85.642316,41.940289]},n1653:{id:"n1653",loc:[-85.642321,41.940436]},n1654:{id:"n1654",loc:[-85.642292,41.940458]},n1655:{id:"n1655",loc:[-85.642287,41.940483]},n1656:{id:"n1656",loc:[-85.642323,41.940509]},n1657:{id:"n1657",loc:[-85.642385,41.940511]},n1658:{id:"n1658",loc:[-85.642408,41.940526]},n1659:{id:"n1659",loc:[-85.641962,41.94109]},n166:{id:"n166",loc:[-85.638364,41.942508]},n1660:{id:"n1660",loc:[-85.642753,41.941084]},n1661:{id:"n1661",loc:[-85.642752,41.941004]},n1662:{id:"n1662",loc:[-85.642806,41.941003]},n1663:{id:"n1663",loc:[-85.642803,41.940731]},n1664:{id:"n1664",loc:[-85.642741,41.940732]},n1665:{id:"n1665",loc:[-85.64274,41.940645]},n1666:{id:"n1666",loc:[-85.641957,41.940651]},n1667:{id:"n1667",loc:[-85.642937,41.941241]},n1668:{id:"n1668",loc:[-85.641776,41.941253]},n1669:{id:"n1669",loc:[-85.641766,41.940598]},n167:{id:"n167",loc:[-85.638836,41.942167]},n1670:{id:"n1670",loc:[-85.64198,41.940598]},n1671:{id:"n1671",loc:[-85.641961,41.940137]},n1672:{id:"n1672",loc:[-85.642934,41.94012]},n1673:{id:"n1673",loc:[-85.643074,41.941173]},n1674:{id:"n1674",loc:[-85.642841,41.940997]},n1675:{id:"n1675",loc:[-85.642839,41.940721]},n1676:{id:"n1676",loc:[-85.643065,41.940552]},n1677:{id:"n1677",loc:[-85.642732,41.94124]},n1678:{id:"n1678",loc:[-85.641815,41.941246]},n1679:{id:"n1679",loc:[-85.641813,41.941132]},n168:{id:"n168",loc:[-85.638836,41.94229]},n1680:{id:"n1680",loc:[-85.641839,41.941111]},n1681:{id:"n1681",loc:[-85.641884,41.941098]},n1682:{id:"n1682",loc:[-85.642732,41.941092]},n1683:{id:"n1683",loc:[-85.642776,41.941302]},n1684:{id:"n1684",loc:[-85.632788,41.946236]},n1685:{id:"n1685",loc:[-85.622342,41.953127]},n1686:{id:"n1686",loc:[-85.641848,41.941167]},n1687:{id:"n1687",loc:[-85.643753,41.941503]},n1688:{id:"n1688",loc:[-85.643762,41.942119]},n1689:{id:"n1689",loc:[-85.64238,41.942262]},n169:{id:"n169",loc:[-85.638594,41.94229]},n1690:{id:"n1690",loc:[-85.642374,41.941944]},n1691:{id:"n1691",loc:[-85.642518,41.941943]},n1692:{id:"n1692",loc:[-85.642519,41.94198]},n1693:{id:"n1693",loc:[-85.642831,41.941977]},n1694:{id:"n1694",loc:[-85.642837,41.942312]},n1695:{id:"n1695",loc:[-85.642495,41.942315]},n1696:{id:"n1696",loc:[-85.642494,41.942261]},n1697:{id:"n1697",loc:[-85.641087,41.942433]},n1698:{id:"n1698",loc:[-85.641081,41.942006]},n1699:{id:"n1699",loc:[-85.641244,41.942005]},n17:{id:"n17",loc:[-85.633478,41.94081]},n170:{id:"n170",loc:[-85.638594,41.942422]},n1700:{id:"n1700",loc:[-85.64125,41.942431]},n1701:{id:"n1701",loc:[-85.641331,41.942968]},n1702:{id:"n1702",loc:[-85.641328,41.942713]},n1703:{id:"n1703",loc:[-85.641521,41.942712]},n1704:{id:"n1704",loc:[-85.641523,41.942924]},n1705:{id:"n1705",loc:[-85.641504,41.942924]},n1706:{id:"n1706",loc:[-85.641505,41.942967]},n1707:{id:"n1707",loc:[-85.638612,41.942408]},n1708:{id:"n1708",loc:[-85.638612,41.942327]},n1709:{id:"n1709",loc:[-85.638775,41.942327]},n171:{id:"n171",loc:[-85.638364,41.942356]},n1710:{id:"n1710",loc:[-85.638775,41.942299]},n1711:{id:"n1711",loc:[-85.638835,41.942298]},n1712:{id:"n1712",loc:[-85.638835,41.942407]},n1713:{id:"n1713",loc:[-85.639116,41.942444]},n1714:{id:"n1714",loc:[-85.639114,41.942362]},n1715:{id:"n1715",loc:[-85.639294,41.94236]},n1716:{id:"n1716",loc:[-85.639296,41.942442]},n1717:{id:"n1717",loc:[-85.639808,41.942385]},n1718:{id:"n1718",loc:[-85.639805,41.942285]},n1719:{id:"n1719",loc:[-85.639988,41.942283]},n172:{id:"n172",loc:[-85.638364,41.942167]},n1720:{id:"n1720",loc:[-85.63999,41.942383]},n1721:{id:"n1721",loc:[-85.639633,41.943023]},n1722:{id:"n1722",loc:[-85.639867,41.943019]},n1723:{id:"n1723",loc:[-85.639866,41.942964]},n1724:{id:"n1724",loc:[-85.639888,41.942963]},n1725:{id:"n1725",loc:[-85.639883,41.942779]},n1726:{id:"n1726",loc:[-85.639851,41.94278]},n1727:{id:"n1727",loc:[-85.63985,41.94274]},n1728:{id:"n1728",loc:[-85.639789,41.942741]},n1729:{id:"n1729",loc:[-85.639789,41.942753]},n173:{id:"n173",loc:[-85.639038,41.942463]},n1730:{id:"n1730",loc:[-85.639698,41.942754]},n1731:{id:"n1731",loc:[-85.639699,41.942788]},n1732:{id:"n1732",loc:[-85.639675,41.942789]},n1733:{id:"n1733",loc:[-85.639676,41.94283]},n1734:{id:"n1734",loc:[-85.639701,41.942829]},n1735:{id:"n1735",loc:[-85.639702,41.942869]},n1736:{id:"n1736",loc:[-85.639629,41.94287]},n1737:{id:"n1737",loc:[-85.643568,41.942946]},n1738:{id:"n1738",loc:[-85.643568,41.942777]},n1739:{id:"n1739",loc:[-85.643401,41.942777]},n174:{id:"n174",loc:[-85.638897,41.942464]},n1740:{id:"n1740",loc:[-85.643401,41.942863]},n1741:{id:"n1741",loc:[-85.643448,41.942863]},n1742:{id:"n1742",loc:[-85.643448,41.942946]},n1743:{id:"n1743",loc:[-85.642836,41.942981]},n1744:{id:"n1744",loc:[-85.642917,41.942979]},n1745:{id:"n1745",loc:[-85.642914,41.942904]},n1746:{id:"n1746",loc:[-85.642938,41.942903]},n1747:{id:"n1747",loc:[-85.642935,41.942813]},n1748:{id:"n1748",loc:[-85.642775,41.942816]},n1749:{id:"n1749",loc:[-85.642778,41.942906]},n175:{id:"n175",loc:[-85.638897,41.942423]},n1750:{id:"n1750",loc:[-85.642833,41.942905]},n1751:{id:"n1751",loc:[-85.642302,41.942886]},n1752:{id:"n1752",loc:[-85.642299,41.942721]},n1753:{id:"n1753",loc:[-85.642422,41.94272]},n1754:{id:"n1754",loc:[-85.642425,41.942868]},n1755:{id:"n1755",loc:[-85.642385,41.942869]},n1756:{id:"n1756",loc:[-85.642385,41.942885]},n1757:{id:"n1757",loc:[-85.641533,41.942939]},n1758:{id:"n1758",loc:[-85.64161,41.942877]},n1759:{id:"n1759",loc:[-85.641676,41.942922]},n176:{id:"n176",loc:[-85.638853,41.942423]},n1760:{id:"n1760",loc:[-85.6416,41.942985]},n1761:{id:"n1761",loc:[-85.64206,41.942802]},n1762:{id:"n1762",loc:[-85.642059,41.942741]},n1763:{id:"n1763",loc:[-85.642196,41.942741]},n1764:{id:"n1764",loc:[-85.642196,41.942818]},n1765:{id:"n1765",loc:[-85.642128,41.942819]},n1766:{id:"n1766",loc:[-85.642128,41.942801]},n1767:{id:"n1767",loc:[-85.640943,41.942934]},n1768:{id:"n1768",loc:[-85.641035,41.942933]},n1769:{id:"n1769",loc:[-85.641032,41.942797]},n177:{id:"n177",loc:[-85.638852,41.94237]},n1770:{id:"n1770",loc:[-85.640997,41.942798]},n1771:{id:"n1771",loc:[-85.640996,41.942764]},n1772:{id:"n1772",loc:[-85.640861,41.942766]},n1773:{id:"n1773",loc:[-85.640862,41.942848]},n1774:{id:"n1774",loc:[-85.640941,41.942847]},n1775:{id:"n1775",loc:[-85.643766,41.942226]},n1776:{id:"n1776",loc:[-85.643768,41.942407]},n1777:{id:"n1777",loc:[-85.643218,41.94177]},n1778:{id:"n1778",loc:[-85.64321,41.941327]},n1779:{id:"n1779",loc:[-85.643649,41.941323]},n178:{id:"n178",loc:[-85.638892,41.94237]},n1780:{id:"n1780",loc:[-85.643656,41.941716]},n1781:{id:"n1781",loc:[-85.64358,41.941717]},n1782:{id:"n1782",loc:[-85.64358,41.941767]},n1783:{id:"n1783",loc:[-85.64382,41.941495]},n1784:{id:"n1784",loc:[-85.643817,41.941317]},n1785:{id:"n1785",loc:[-85.643235,41.941833]},n1786:{id:"n1786",loc:[-85.64335,41.941842]},n1787:{id:"n1787",loc:[-85.643504,41.941903]},n1788:{id:"n1788",loc:[-85.643554,41.941946]},n1789:{id:"n1789",loc:[-85.643618,41.942015]},n179:{id:"n179",loc:[-85.638891,41.942334]},n1790:{id:"n1790",loc:[-85.64346,41.941971]},n1791:{id:"n1791",loc:[-85.643528,41.942468]},n1792:{id:"n1792",loc:[-85.643621,41.942363]},n1793:{id:"n1793",loc:[-85.643496,41.942297]},n1794:{id:"n1794",loc:[-85.643446,41.942246]},n1795:{id:"n1795",loc:[-85.643398,41.942177]},n1796:{id:"n1796",loc:[-85.643398,41.942031]},n1797:{id:"n1797",loc:[-85.621531,41.952693]},n1798:{id:"n1798",loc:[-85.643221,41.942028]},n1799:{id:"n1799",loc:[-85.643225,41.942276]},n18:{id:"n18",loc:[-85.63345,41.94071]},n180:{id:"n180",loc:[-85.639037,41.942334]},n1800:{id:"n1800",loc:[-85.643265,41.942347]},n1801:{id:"n1801",loc:[-85.643323,41.942413]},n1802:{id:"n1802",loc:[-85.643411,41.94247]},n1803:{id:"n1803",loc:[-85.643459,41.942435]},n1804:{id:"n1804",loc:[-85.643767,41.942307]},n1805:{id:"n1805",loc:[-85.643661,41.942293]},n1806:{id:"n1806",loc:[-85.643578,41.942247]},n1807:{id:"n1807",loc:[-85.643522,41.942125]},n1808:{id:"n1808",loc:[-85.643515,41.942061]},n1809:{id:"n1809",loc:[-85.643346,41.941924]},n181:{id:"n181",loc:[-85.638074,41.941839]},n1810:{id:"n1810",loc:[-85.643086,41.94192]},n1811:{id:"n1811",loc:[-85.643529,41.94217]},n1812:{id:"n1812",loc:[-85.643489,41.942003]},n1813:{id:"n1813",loc:[-85.643295,41.941919]},n1814:{id:"n1814",loc:[-85.643305,41.942163]},n1815:{id:"n1815",loc:[-85.643354,41.942285]},n1816:{id:"n1816",loc:[-85.643472,41.942389]},n1817:{id:"n1817",loc:[-85.643608,41.942271]},n1818:{id:"n1818",loc:[-85.643876,41.941402]},n1819:{id:"n1819",loc:[-85.643818,41.941369]},n182:{id:"n182",loc:[-85.638076,41.941942]},n1820:{id:"n1820",loc:[-85.643682,41.941304]},n1821:{id:"n1821",loc:[-85.64359,41.941286]},n1822:{id:"n1822",loc:[-85.643317,41.941727]},n1823:{id:"n1823",loc:[-85.643301,41.941286]},n1824:{id:"n1824",loc:[-85.643553,41.941698]},n1825:{id:"n1825",loc:[-85.643543,41.941286]},n1826:{id:"n1826",loc:[-85.636967,41.940118]},n1827:{id:"n1827",loc:[-85.63378,41.940114]},n1828:{id:"n1828",loc:[-85.637254,41.940075]},n1829:{id:"n1829",loc:[-85.637002,41.941355]},n183:{id:"n183",loc:[-85.637955,41.941944]},n1830:{id:"n1830",loc:[-85.643532,41.94204]},n1831:{id:"n1831",loc:[-85.638235,41.942615]},n1832:{id:"n1832",loc:[-85.637039,41.942624]},n1833:{id:"n1833",loc:[-85.636369,41.94266]},n1834:{id:"n1834",loc:[-85.63582,41.942771],tags:{highway:"traffic_signals",traffic_signals:"emergency","traffic_signals:direction":"both"}},n1835:{id:"n1835",loc:[-85.634873,41.943044]},n1836:{id:"n1836",loc:[-85.643482,41.941976]},n1837:{id:"n1837",loc:[-85.64345,41.941945]},n1838:{id:"n1838",loc:[-85.641885,41.943851]},n1839:{id:"n1839",loc:[-85.641915,41.945121]},n184:{id:"n184",loc:[-85.637953,41.94184]},n1840:{id:"n1840",loc:[-85.639454,41.943871]},n1841:{id:"n1841",loc:[-85.639491,41.945191]},n1842:{id:"n1842",loc:[-85.635775,41.940113]},n1843:{id:"n1843",loc:[-85.638206,41.941345]},n1844:{id:"n1844",loc:[-85.640721,41.94513]},n1845:{id:"n1845",loc:[-85.643137,41.945103]},n1846:{id:"n1846",loc:[-85.638199,41.940079]},n1847:{id:"n1847",loc:[-85.640688,41.943861]},n1848:{id:"n1848",loc:[-85.643397,41.941924]},n1849:{id:"n1849",loc:[-85.643117,41.943841]},n185:{id:"n185",loc:[-85.637953,41.941866]},n1850:{id:"n1850",loc:[-85.636731,41.94263]},n1851:{id:"n1851",loc:[-85.63518,41.942955],tags:{highway:"crossing",crossing:"unmarked"}},n1852:{id:"n1852",loc:[-85.636152,41.942695]},n1853:{id:"n1853",loc:[-85.644202,41.941499]},n1854:{id:"n1854",loc:[-85.644211,41.942116]},n1855:{id:"n1855",loc:[-85.644233,41.942404]},n1856:{id:"n1856",loc:[-85.644231,41.942223]},n1857:{id:"n1857",loc:[-85.644133,41.941315]},n1858:{id:"n1858",loc:[-85.644136,41.941493]},n1859:{id:"n1859",loc:[-85.644345,41.942307]},n186:{id:"n186",loc:[-85.637873,41.941867]},n1860:{id:"n1860",loc:[-85.644232,41.942304]},n1861:{id:"n1861",loc:[-85.644134,41.941403]},n1862:{id:"n1862",loc:[-85.63607,41.943005],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"fire_station",name:"Three Rivers Fire Department"}},n1863:{id:"n1863",loc:[-85.637,41.941236]},n1864:{id:"n1864",loc:[-85.634476,41.941475]},n1865:{id:"n1865",loc:[-85.635036,41.941858]},n1866:{id:"n1866",loc:[-85.635362,41.941962]},n1867:{id:"n1867",loc:[-85.635806,41.941962]},n1868:{id:"n1868",loc:[-85.63295,41.943006]},n1869:{id:"n1869",loc:[-85.634692,41.943098]},n187:{id:"n187",loc:[-85.637877,41.941975]},n1870:{id:"n1870",loc:[-85.633128,41.940484]},n1871:{id:"n1871",loc:[-85.633117,41.942798]},n1872:{id:"n1872",loc:[-85.633303,41.942412]},n1873:{id:"n1873",loc:[-85.633482,41.941912]},n1874:{id:"n1874",loc:[-85.633455,41.941359]},n1875:{id:"n1875",loc:[-85.633162,41.942679]},n1876:{id:"n1876",loc:[-85.634274,41.943479]},n1877:{id:"n1877",loc:[-85.634678,41.942909]},n1878:{id:"n1878",loc:[-85.6339,41.941453]},n1879:{id:"n1879",loc:[-85.634571,41.942774]},n188:{id:"n188",loc:[-85.636855,41.942488]},n1880:{id:"n1880",loc:[-85.63419,41.941732]},n1881:{id:"n1881",loc:[-85.634067,41.941565]},n1882:{id:"n1882",loc:[-85.63436,41.942358]},n1883:{id:"n1883",loc:[-85.634327,41.942247]},n1884:{id:"n1884",loc:[-85.633391,41.941231]},n1885:{id:"n1885",loc:[-85.634303,41.941972]},n1886:{id:"n1886",loc:[-85.633541,41.940147]},n1887:{id:"n1887",loc:[-85.633433,41.940252]},n1888:{id:"n1888",loc:[-85.633402,41.940411]},n1889:{id:"n1889",loc:[-85.633551,41.941023]},n189:{id:"n189",loc:[-85.636702,41.942488]},n1890:{id:"n1890",loc:[-85.633719,41.941186]},n1891:{id:"n1891",loc:[-85.633067,41.941845]},n1892:{id:"n1892",loc:[-85.634902,41.942766]},n1893:{id:"n1893",loc:[-85.634603,41.942202]},n1894:{id:"n1894",loc:[-85.634858,41.942152]},n1895:{id:"n1895",loc:[-85.634842,41.942269]},n1896:{id:"n1896",loc:[-85.634907,41.942313]},n1897:{id:"n1897",loc:[-85.635049,41.942331]},n1898:{id:"n1898",loc:[-85.635101,41.942281]},n1899:{id:"n1899",loc:[-85.635129,41.942144]},n19:{id:"n19",loc:[-85.633009,41.942229]},n190:{id:"n190",loc:[-85.636702,41.942434]},n1900:{id:"n1900",loc:[-85.635531,41.942143]},n1901:{id:"n1901",loc:[-85.635534,41.942577]},n1902:{id:"n1902",loc:[-85.635158,41.942656]},n1903:{id:"n1903",loc:[-85.635121,41.942703]},n1904:{id:"n1904",loc:[-85.635087,41.941508]},n1905:{id:"n1905",loc:[-85.63536,41.941106]},n1906:{id:"n1906",loc:[-85.635442,41.941094]},n1907:{id:"n1907",loc:[-85.635508,41.941104]},n1908:{id:"n1908",loc:[-85.635569,41.941125]},n1909:{id:"n1909",loc:[-85.635583,41.941106]},n191:{id:"n191",loc:[-85.636761,41.942434]},n1910:{id:"n1910",loc:[-85.635555,41.940976]},n1911:{id:"n1911",loc:[-85.635501,41.940915]},n1912:{id:"n1912",loc:[-85.635392,41.940922]},n1913:{id:"n1913",loc:[-85.635276,41.940974]},n1914:{id:"n1914",loc:[-85.63517,41.941204]},n1915:{id:"n1915",loc:[-85.634888,41.941517]},n1916:{id:"n1916",loc:[-85.634897,41.941576]},n1917:{id:"n1917",loc:[-85.634961,41.94164]},n1918:{id:"n1918",loc:[-85.635028,41.941659]},n1919:{id:"n1919",loc:[-85.635118,41.941621]},n192:{id:"n192",loc:[-85.636761,41.942369]},n1920:{id:"n1920",loc:[-85.635085,41.941558]},n1921:{id:"n1921",loc:[-85.63504,41.94136]},n1922:{id:"n1922",loc:[-85.635221,41.941077]},n1923:{id:"n1923",loc:[-85.634387,41.941559]},n1924:{id:"n1924",loc:[-85.634351,41.941587]},n1925:{id:"n1925",loc:[-85.634416,41.941756]},n1926:{id:"n1926",loc:[-85.634461,41.941797]},n1927:{id:"n1927",loc:[-85.634501,41.941819]},n1928:{id:"n1928",loc:[-85.634597,41.941816]},n1929:{id:"n1929",loc:[-85.634732,41.941724]},n193:{id:"n193",loc:[-85.636855,41.942369]},n1930:{id:"n1930",loc:[-85.634672,41.941775]},n1931:{id:"n1931",loc:[-85.633403,41.939101]},n1932:{id:"n1932",loc:[-85.633297,41.939397]},n1933:{id:"n1933",loc:[-85.633205,41.939674]},n1934:{id:"n1934",loc:[-85.63322,41.939777]},n1935:{id:"n1935",loc:[-85.633345,41.939936]},n1936:{id:"n1936",loc:[-85.633376,41.940002]},n1937:{id:"n1937",loc:[-85.633266,41.940228]},n1938:{id:"n1938",loc:[-85.633236,41.940352]},n1939:{id:"n1939",loc:[-85.633282,41.94063]},n194:{id:"n194",loc:[-85.636645,41.94249]},n1940:{id:"n1940",loc:[-85.633364,41.940874]},n1941:{id:"n1941",loc:[-85.633439,41.941052]},n1942:{id:"n1942",loc:[-85.633582,41.941172]},n1943:{id:"n1943",loc:[-85.633748,41.941273]},n1944:{id:"n1944",loc:[-85.634317,41.941527]},n1945:{id:"n1945",loc:[-85.634389,41.94174]},n1946:{id:"n1946",loc:[-85.634441,41.941801]},n1947:{id:"n1947",loc:[-85.634514,41.941837]},n1948:{id:"n1948",loc:[-85.634485,41.942005]},n1949:{id:"n1949",loc:[-85.63457,41.942202]},n195:{id:"n195",loc:[-85.636565,41.94249]},n1950:{id:"n1950",loc:[-85.634869,41.942769]},n1951:{id:"n1951",loc:[-85.634943,41.942792]},n1952:{id:"n1952",loc:[-85.635139,41.942882]},n1953:{id:"n1953",loc:[-85.634962,41.943161]},n1954:{id:"n1954",loc:[-85.635002,41.943131]},n1955:{id:"n1955",loc:[-85.635005,41.943091]},n1956:{id:"n1956",loc:[-85.635216,41.943033]},n1957:{id:"n1957",loc:[-85.634817,41.94267]},n1958:{id:"n1958",loc:[-85.634614,41.942599]},n1959:{id:"n1959",loc:[-85.634494,41.942381]},n196:{id:"n196",loc:[-85.636565,41.942474]},n1960:{id:"n1960",loc:[-85.634486,41.9423]},n1961:{id:"n1961",loc:[-85.634671,41.941795]},n1962:{id:"n1962",loc:[-85.634595,41.941831]},n1963:{id:"n1963",loc:[-85.634332,41.941866]},n1964:{id:"n1964",loc:[-85.634207,41.941885]},n1965:{id:"n1965",loc:[-85.634133,41.941892]},n1966:{id:"n1966",loc:[-85.634131,41.942203]},n1967:{id:"n1967",loc:[-85.634047,41.942327]},n1968:{id:"n1968",loc:[-85.634219,41.942793]},n1969:{id:"n1969",loc:[-85.634061,41.942392]},n197:{id:"n197",loc:[-85.636514,41.942474]},n1970:{id:"n1970",loc:[-85.633989,41.942407]},n1971:{id:"n1971",loc:[-85.633971,41.942356]},n1972:{id:"n1972",loc:[-85.63361,41.942423]},n1973:{id:"n1973",loc:[-85.633714,41.942682]},n1974:{id:"n1974",loc:[-85.633698,41.942863]},n1975:{id:"n1975",loc:[-85.633882,41.942865]},n1976:{id:"n1976",loc:[-85.633941,41.943007]},n1977:{id:"n1977",loc:[-85.633887,41.943035]},n1978:{id:"n1978",loc:[-85.633768,41.942815]},n1979:{id:"n1979",loc:[-85.633682,41.942351]},n198:{id:"n198",loc:[-85.636514,41.942326]},n1980:{id:"n1980",loc:[-85.634037,41.942273]},n1981:{id:"n1981",loc:[-85.634029,41.942252]},n1982:{id:"n1982",loc:[-85.633673,41.942331]},n1983:{id:"n1983",loc:[-85.634219,41.942571]},n1984:{id:"n1984",loc:[-85.634252,41.942565]},n1985:{id:"n1985",loc:[-85.634144,41.942299]},n1986:{id:"n1986",loc:[-85.634115,41.942306]},n1987:{id:"n1987",loc:[-85.634059,41.943094]},n1988:{id:"n1988",loc:[-85.633944,41.942903]},n1989:{id:"n1989",loc:[-85.634311,41.942821]},n199:{id:"n199",loc:[-85.636561,41.942326]},n1990:{id:"n1990",loc:[-85.634351,41.94277]},n1991:{id:"n1991",loc:[-85.634153,41.942254]},n1992:{id:"n1992",loc:[-85.634092,41.94222]},n1993:{id:"n1993",loc:[-85.633571,41.942336]},n1994:{id:"n1994",loc:[-85.633513,41.942387]},n1995:{id:"n1995",loc:[-85.633509,41.942455]},n1996:{id:"n1996",loc:[-85.63363,41.942665]},n1997:{id:"n1997",loc:[-85.63414,41.94286]},n1998:{id:"n1998",loc:[-85.63397,41.942449]},n1999:{id:"n1999",loc:[-85.633551,41.942529]},n2:{id:"n2",loc:[-85.627421,41.953877]},n20:{id:"n20",loc:[-85.633013,41.941438]},n200:{id:"n200",loc:[-85.636561,41.942311]},n2000:{id:"n2000",loc:[-85.633741,41.942493]},n2001:{id:"n2001",loc:[-85.633894,41.942869]},n2002:{id:"n2002",loc:[-85.634132,41.941954]},n2003:{id:"n2003",loc:[-85.634032,41.942038]},n2004:{id:"n2004",loc:[-85.633765,41.942238]},n2005:{id:"n2005",loc:[-85.63376,41.942268]},n2006:{id:"n2006",loc:[-85.633768,41.942293]},n2007:{id:"n2007",loc:[-85.633808,41.942386]},n2008:{id:"n2008",loc:[-85.634946,41.941663]},n2009:{id:"n2009",loc:[-85.63511,41.941697]},n201:{id:"n201",loc:[-85.636621,41.942311]},n2010:{id:"n2010",loc:[-85.635337,41.94168]},n2011:{id:"n2011",loc:[-85.634997,41.942251]},n2012:{id:"n2012",loc:[-85.635013,41.942173]},n2013:{id:"n2013",loc:[-85.634876,41.942157]},n2014:{id:"n2014",loc:[-85.634859,41.942235]},n2015:{id:"n2015",loc:[-85.634992,41.941951]},n2016:{id:"n2016",loc:[-85.634952,41.941877]},n2017:{id:"n2017",loc:[-85.634844,41.94191]},n2018:{id:"n2018",loc:[-85.634884,41.941983]},n2019:{id:"n2019",loc:[-85.635189,41.941691]},n202:{id:"n202",loc:[-85.636621,41.942351]},n2020:{id:"n2020",loc:[-85.635089,41.941896]},n2021:{id:"n2021",loc:[-85.635077,41.941964]},n2022:{id:"n2022",loc:[-85.635058,41.942147]},n2023:{id:"n2023",loc:[-85.635099,41.942161]},n2024:{id:"n2024",loc:[-85.635099,41.942213]},n2025:{id:"n2025",loc:[-85.635079,41.942285]},n2026:{id:"n2026",loc:[-85.635047,41.942316]},n2027:{id:"n2027",loc:[-85.634925,41.9423]},n2028:{id:"n2028",loc:[-85.634911,41.942276]},n2029:{id:"n2029",loc:[-85.634917,41.942242]},n203:{id:"n203",loc:[-85.63666,41.942351]},n2030:{id:"n2030",loc:[-85.634698,41.941898]},n2031:{id:"n2031",loc:[-85.634964,41.941878]},n2032:{id:"n2032",loc:[-85.635025,41.941929]},n2033:{id:"n2033",loc:[-85.634862,41.941887]},n2034:{id:"n2034",loc:[-85.634811,41.94181]},n2035:{id:"n2035",loc:[-85.634731,41.941745]},n2036:{id:"n2036",loc:[-85.634933,41.94176]},n2037:{id:"n2037",loc:[-85.634942,41.942145]},n2038:{id:"n2038",loc:[-85.634944,41.942065]},n2039:{id:"n2039",loc:[-85.634914,41.941996]},n204:{id:"n204",loc:[-85.63666,41.942453]},n2040:{id:"n2040",loc:[-85.634981,41.941979]},n2041:{id:"n2041",loc:[-85.633419,41.942172]},n2042:{id:"n2042",loc:[-85.633509,41.941631]},n2043:{id:"n2043",loc:[-85.633686,41.942937]},n2044:{id:"n2044",loc:[-85.633371,41.942722]},n2045:{id:"n2045",loc:[-85.633291,41.942538]},n2046:{id:"n2046",loc:[-85.633902,41.940941]},n2047:{id:"n2047",loc:[-85.635254,41.940939]},n2048:{id:"n2048",loc:[-85.635686,41.940829]},n2049:{id:"n2049",loc:[-85.635712,41.942681]},n205:{id:"n205",loc:[-85.636645,41.942453]},n2050:{id:"n2050",loc:[-85.633721,41.942118]},n2051:{id:"n2051",loc:[-85.633698,41.942057]},n2052:{id:"n2052",loc:[-85.633591,41.942079]},n2053:{id:"n2053",loc:[-85.633614,41.94214]},n2054:{id:"n2054",loc:[-85.633968,41.941099]},n2055:{id:"n2055",loc:[-85.633907,41.941138]},n2056:{id:"n2056",loc:[-85.633968,41.941197]},n2057:{id:"n2057",loc:[-85.63404,41.941162]},n2058:{id:"n2058",loc:[-85.634839,41.941665]},n2059:{id:"n2059",loc:[-85.635314,41.943035]},n206:{id:"n206",loc:[-85.636394,41.942471]},n2060:{id:"n2060",loc:[-85.634919,41.943142]},n2061:{id:"n2061",loc:[-85.636433,41.942959],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"townhall",name:"Three Rivers City Hall"}},n2062:{id:"n2062",loc:[-85.637039,41.942789]},n2063:{id:"n2063",loc:[-85.636333,41.94279]},n2064:{id:"n2064",loc:[-85.634484,41.940726]},n2065:{id:"n2065",loc:[-85.634483,41.940603]},n2066:{id:"n2066",loc:[-85.634908,41.940601]},n2067:{id:"n2067",loc:[-85.634908,41.94053]},n2068:{id:"n2068",loc:[-85.634934,41.94053]},n2069:{id:"n2069",loc:[-85.634934,41.940496]},n207:{id:"n207",loc:[-85.636262,41.942472]},n2070:{id:"n2070",loc:[-85.63504,41.940495]},n2071:{id:"n2071",loc:[-85.63504,41.940531]},n2072:{id:"n2072",loc:[-85.635068,41.940531]},n2073:{id:"n2073",loc:[-85.635071,41.940794]},n2074:{id:"n2074",loc:[-85.635183,41.940793]},n2075:{id:"n2075",loc:[-85.635185,41.940916]},n2076:{id:"n2076",loc:[-85.634799,41.940919]},n2077:{id:"n2077",loc:[-85.634798,41.940798]},n2078:{id:"n2078",loc:[-85.634925,41.940797]},n2079:{id:"n2079",loc:[-85.634924,41.940724]},n208:{id:"n208",loc:[-85.636261,41.94233]},n2080:{id:"n2080",loc:[-85.637448,41.938233]},n2081:{id:"n2081",loc:[-85.634168,41.943279]},n2082:{id:"n2082",loc:[-85.635744,41.938248]},n2083:{id:"n2083",loc:[-85.638744,41.951211]},n2084:{id:"n2084",loc:[-85.636421,41.946392]},n2085:{id:"n2085",loc:[-85.635965,41.945809]},n2086:{id:"n2086",loc:[-85.635683,41.945449]},n2087:{id:"n2087",loc:[-85.635281,41.945025]},n2088:{id:"n2088",loc:[-85.632443,41.942574]},n2089:{id:"n2089",loc:[-85.638243,41.943674]},n209:{id:"n209",loc:[-85.636353,41.942329]},n2090:{id:"n2090",loc:[-85.638228,41.943747]},n2091:{id:"n2091",loc:[-85.638163,41.943797]},n2092:{id:"n2092",loc:[-85.638089,41.943832]},n2093:{id:"n2093",loc:[-85.637969,41.943841]},n2094:{id:"n2094",loc:[-85.637841,41.943833]},n2095:{id:"n2095",loc:[-85.637342,41.943734]},n2096:{id:"n2096",loc:[-85.637232,41.943707]},n2097:{id:"n2097",loc:[-85.637163,41.943668]},n2098:{id:"n2098",loc:[-85.637118,41.943615]},n2099:{id:"n2099",loc:[-85.637078,41.943494]},n21:{id:"n21",loc:[-85.634126,41.942228]},n210:{id:"n210",loc:[-85.636354,41.94239]},n2100:{id:"n2100",loc:[-85.632903,41.998429],tags:{railway:"level_crossing"}},n2101:{id:"n2101",loc:[-85.633616,41.943581],tags:{railway:"level_crossing"}},n2102:{id:"n2102",loc:[-85.636943,41.947311]},n2103:{id:"n2103",loc:[-85.6376,41.94854]},n2104:{id:"n2104",loc:[-85.634565,41.93631]},n2105:{id:"n2105",loc:[-85.629597,41.942562]},n2106:{id:"n2106",loc:[-85.630821,41.943077]},n2107:{id:"n2107",loc:[-85.627473,41.940659]},n2108:{id:"n2108",loc:[-85.629708,41.942872]},n2109:{id:"n2109",loc:[-85.634093,41.935448]},n211:{id:"n211",loc:[-85.636393,41.94239]},n2110:{id:"n2110",loc:[-85.630413,41.94366]},n2111:{id:"n2111",loc:[-85.630488,41.942662]},n2112:{id:"n2112",loc:[-85.63361,41.936749]},n2113:{id:"n2113",loc:[-85.630038,41.941808]},n2114:{id:"n2114",loc:[-85.632016,41.942922]},n2115:{id:"n2115",loc:[-85.631525,41.944303]},n2116:{id:"n2116",loc:[-85.626862,41.94022]},n2117:{id:"n2117",loc:[-85.629673,41.94121]},n2118:{id:"n2118",loc:[-85.632752,41.943101]},n2119:{id:"n2119",loc:[-85.631147,41.943201]},n212:{id:"n212",loc:[-85.63444,41.943176]},n2120:{id:"n2120",loc:[-85.624974,41.940579]},n2121:{id:"n2121",loc:[-85.629518,41.941783]},n2122:{id:"n2122",loc:[-85.632349,41.942699]},n2123:{id:"n2123",loc:[-85.628418,41.940356]},n2124:{id:"n2124",loc:[-85.629147,41.94129]},n2125:{id:"n2125",loc:[-85.631111,41.943979]},n2126:{id:"n2126",loc:[-85.632087,41.940013]},n2127:{id:"n2127",loc:[-85.634469,41.935057]},n2128:{id:"n2128",loc:[-85.630097,41.943449]},n2129:{id:"n2129",loc:[-85.6331,41.937878]},n213:{id:"n213",loc:[-85.63375,41.942814]},n2130:{id:"n2130",loc:[-85.625274,41.941114]},n2131:{id:"n2131",loc:[-85.632632,41.941217]},n2132:{id:"n2132",loc:[-85.632739,41.941926]},n2133:{id:"n2133",loc:[-85.631647,41.94366]},n2134:{id:"n2134",loc:[-85.635059,41.935456]},n2135:{id:"n2135",loc:[-85.631259,41.944349]},n2136:{id:"n2136",loc:[-85.626336,41.940811]},n2137:{id:"n2137",loc:[-85.631507,41.943875]},n2138:{id:"n2138",loc:[-85.625081,41.940859]},n2139:{id:"n2139",loc:[-85.625778,41.940093]},n214:{id:"n214",loc:[-85.633674,41.942869]},n2140:{id:"n2140",loc:[-85.632641,41.942436]},n2141:{id:"n2141",loc:[-85.628825,41.941034]},n2142:{id:"n2142",loc:[-85.627913,41.940292]},n2143:{id:"n2143",loc:[-85.628943,41.940516]},n2144:{id:"n2144",loc:[-85.63139,41.943941]},n2145:{id:"n2145",loc:[-85.630081,41.94204]},n2146:{id:"n2146",loc:[-85.632194,41.93963]},n2147:{id:"n2147",loc:[-85.632913,41.93939]},n2148:{id:"n2148",loc:[-85.632001,41.943492]},n2149:{id:"n2149",loc:[-85.63149,41.943154]},n215:{id:"n215",loc:[-85.633542,41.942768]},n2150:{id:"n2150",loc:[-85.625167,41.940117]},n2151:{id:"n2151",loc:[-85.63287,41.939941]},n2152:{id:"n2152",loc:[-85.630789,41.943732]},n2153:{id:"n2153",loc:[-85.632173,41.940348]},n2154:{id:"n2154",loc:[-85.626587,41.940113]},n2155:{id:"n2155",loc:[-85.62684,41.940667]},n2156:{id:"n2156",loc:[-85.632527,41.938904]},n2157:{id:"n2157",loc:[-85.624866,41.94018]},n2158:{id:"n2158",loc:[-85.633267,41.93872]},n2159:{id:"n2159",loc:[-85.62934,41.940843]},n216:{id:"n216",loc:[-85.633618,41.942714]},n2160:{id:"n2160",loc:[-85.62272,41.953817]},n2161:{id:"n2161",loc:[-85.622555,41.954453]},n2162:{id:"n2162",loc:[-85.637225,41.944128]},n2163:{id:"n2163",loc:[-85.622628,41.953683]},n2164:{id:"n2164",loc:[-85.635441,41.943989]},n2165:{id:"n2165",loc:[-85.622629,41.953807]},n2166:{id:"n2166",loc:[-85.62262,41.953807]},n2167:{id:"n2167",loc:[-85.62262,41.953837]},n2168:{id:"n2168",loc:[-85.622532,41.953838]},n2169:{id:"n2169",loc:[-85.637469,41.944579]},n217:{id:"n217",loc:[-85.634001,41.942336]},n2170:{id:"n2170",loc:[-85.63688,41.943935]},n2171:{id:"n2171",loc:[-85.638263,41.946367]},n2172:{id:"n2172",loc:[-85.622532,41.953807]},n2173:{id:"n2173",loc:[-85.622353,41.953808]},n2174:{id:"n2174",loc:[-85.622352,41.953685]},n2175:{id:"n2175",loc:[-85.622464,41.953684]},n2176:{id:"n2176",loc:[-85.622464,41.953648]},n2177:{id:"n2177",loc:[-85.637136,41.94576]},n2178:{id:"n2178",loc:[-85.622521,41.953648]},n2179:{id:"n2179",loc:[-85.637129,41.945415]},n218:{id:"n218",loc:[-85.633825,41.942376]},n2180:{id:"n2180",loc:[-85.637473,41.94607]},n2181:{id:"n2181",loc:[-85.622521,41.953683]},n2182:{id:"n2182",loc:[-85.622717,41.954104]},n2183:{id:"n2183",loc:[-85.637769,41.946095]},n2184:{id:"n2184",loc:[-85.623872,41.953515]},n2185:{id:"n2185",loc:[-85.623851,41.953588]},n2186:{id:"n2186",loc:[-85.631385,41.94433]},n2187:{id:"n2187",loc:[-85.623608,41.953543]},n2188:{id:"n2188",loc:[-85.637308,41.944882]},n2189:{id:"n2189",loc:[-85.634898,41.944041]},n219:{id:"n219",loc:[-85.633807,41.942334]},n2190:{id:"n2190",loc:[-85.623604,41.953442]},n2191:{id:"n2191",loc:[-85.623705,41.953442]},n2192:{id:"n2192",loc:[-85.623708,41.953493]},n2193:{id:"n2193",loc:[-85.624064,41.952655]},n2194:{id:"n2194",loc:[-85.62395,41.952654]},n2195:{id:"n2195",loc:[-85.623951,41.952579]},n2196:{id:"n2196",loc:[-85.637435,41.944342]},n2197:{id:"n2197",loc:[-85.624064,41.952579]},n2198:{id:"n2198",loc:[-85.623812,41.952648]},n2199:{id:"n2199",loc:[-85.623813,41.952705]},n22:{id:"n22",loc:[-85.633531,41.942357]},n220:{id:"n220",loc:[-85.633983,41.942294]},n2200:{id:"n2200",loc:[-85.637169,41.945098]},n2201:{id:"n2201",loc:[-85.623552,41.952707]},n2202:{id:"n2202",loc:[-85.623551,41.95263]},n2203:{id:"n2203",loc:[-85.623701,41.952629]},n2204:{id:"n2204",loc:[-85.635894,41.943719]},n2205:{id:"n2205",loc:[-85.637297,41.945992]},n2206:{id:"n2206",loc:[-85.623724,41.952648]},n2207:{id:"n2207",loc:[-85.623812,41.952438]},n2208:{id:"n2208",loc:[-85.625239,41.952197]},n2209:{id:"n2209",loc:[-85.625232,41.952257]},n221:{id:"n221",loc:[-85.634182,41.942495]},n2210:{id:"n2210",loc:[-85.635175,41.94408]},n2211:{id:"n2211",loc:[-85.636381,41.943761]},n2212:{id:"n2212",loc:[-85.625115,41.952249]},n2213:{id:"n2213",loc:[-85.638578,41.946644]},n2214:{id:"n2214",loc:[-85.625122,41.952189]},n2215:{id:"n2215",loc:[-85.625085,41.952031]},n2216:{id:"n2216",loc:[-85.636126,41.943713]},n2217:{id:"n2217",loc:[-85.635005,41.944041]},n2218:{id:"n2218",loc:[-85.63714,41.945328]},n2219:{id:"n2219",loc:[-85.634871,41.943292]},n222:{id:"n222",loc:[-85.634149,41.942503]},n2220:{id:"n2220",loc:[-85.635705,41.943799]},n2221:{id:"n2221",loc:[-85.634995,41.943576]},n2222:{id:"n2222",loc:[-85.635026,41.943829]},n2223:{id:"n2223",loc:[-85.632874,41.941031]},n2224:{id:"n2224",loc:[-85.632531,41.940233]},n2225:{id:"n2225",loc:[-85.634247,41.936003]},n2226:{id:"n2226",loc:[-85.62929,41.941127]},n2227:{id:"n2227",loc:[-85.630428,41.943266]},n2228:{id:"n2228",loc:[-85.631608,41.943425]},n2229:{id:"n2229",loc:[-85.632316,41.943042]},n223:{id:"n223",loc:[-85.634098,41.942373]},n2230:{id:"n2230",loc:[-85.628711,41.940744]},n2231:{id:"n2231",loc:[-85.627831,41.940536]},n2232:{id:"n2232",loc:[-85.625514,41.94052]},n2233:{id:"n2233",loc:[-85.631127,41.943545]},n2234:{id:"n2234",loc:[-85.632909,41.942531]},n2235:{id:"n2235",loc:[-85.632917,41.938796]},n2236:{id:"n2236",loc:[-85.626716,41.94044]},n2237:{id:"n2237",loc:[-85.630122,41.942852]},n2238:{id:"n2238",loc:[-85.632509,41.939674]},n2239:{id:"n2239",loc:[-85.634762,41.935237]},n224:{id:"n224",loc:[-85.634131,41.942366]},n2240:{id:"n2240",loc:[-85.63384,41.937025]},n2241:{id:"n2241",loc:[-85.629741,41.941909]},n2242:{id:"n2242",loc:[-85.635254,41.945001],tags:{railway:"level_crossing"}},n2243:{id:"n2243",loc:[-85.634005,41.938168]},n2244:{id:"n2244",loc:[-85.63393,41.938335]},n2245:{id:"n2245",loc:[-85.633859,41.93846]},n2246:{id:"n2246",loc:[-85.633663,41.938776]},n2247:{id:"n2247",loc:[-85.633513,41.938936]},n2248:{id:"n2248",loc:[-85.635295,41.943225]},n2249:{id:"n2249",loc:[-85.635393,41.943293]},n225:{id:"n225",loc:[-85.635986,41.94177]},n2250:{id:"n2250",loc:[-85.635645,41.94332]},n2251:{id:"n2251",loc:[-85.63629,41.943328]},n2252:{id:"n2252",loc:[-85.636554,41.943372]},n2253:{id:"n2253",loc:[-85.636869,41.943526]},n2254:{id:"n2254",loc:[-85.637099,41.943704]},n2255:{id:"n2255",loc:[-85.637268,41.943773]},n2256:{id:"n2256",loc:[-85.637483,41.943821]},n2257:{id:"n2257",loc:[-85.637616,41.943929]},n2258:{id:"n2258",loc:[-85.637752,41.944114]},n2259:{id:"n2259",loc:[-85.638399,41.944308]},n226:{id:"n226",loc:[-85.635982,41.941523]},n2260:{id:"n2260",loc:[-85.638573,41.944451]},n2261:{id:"n2261",loc:[-85.638702,41.944574]},n2262:{id:"n2262",loc:[-85.638718,41.944652]},n2263:{id:"n2263",loc:[-85.638715,41.944809]},n2264:{id:"n2264",loc:[-85.638766,41.944988]},n2265:{id:"n2265",loc:[-85.638773,41.945136]},n2266:{id:"n2266",loc:[-85.638705,41.945251]},n2267:{id:"n2267",loc:[-85.638335,41.944291]},n2268:{id:"n2268",loc:[-85.638474,41.944352]},n2269:{id:"n2269",loc:[-85.635408,41.943429]},n227:{id:"n227",loc:[-85.636108,41.941521]},n2270:{id:"n2270",loc:[-85.635271,41.943654]},n2271:{id:"n2271",loc:[-85.635266,41.943744]},n2272:{id:"n2272",loc:[-85.635271,41.943819]},n2273:{id:"n2273",loc:[-85.635192,41.943876]},n2274:{id:"n2274",loc:[-85.635129,41.943857]},n2275:{id:"n2275",loc:[-85.635122,41.943764]},n2276:{id:"n2276",loc:[-85.635124,41.943664]},n2277:{id:"n2277",loc:[-85.63515,41.943611]},n2278:{id:"n2278",loc:[-85.635106,41.943534]},n2279:{id:"n2279",loc:[-85.634972,41.943197]},n228:{id:"n228",loc:[-85.636109,41.941559]},n2280:{id:"n2280",loc:[-85.633978,41.938227]},n2281:{id:"n2281",loc:[-85.634216,41.943255]},n2282:{id:"n2282",loc:[-85.634434,41.943622]},n2283:{id:"n2283",loc:[-85.632406,41.940854]},n2284:{id:"n2284",loc:[-85.632488,41.941063],tags:{leisure:"slipway"}},n2285:{id:"n2285",loc:[-85.632726,41.941537]},n2286:{id:"n2286",loc:[-85.632639,41.94136]},n2287:{id:"n2287",loc:[-85.632704,41.941439]},n2288:{id:"n2288",loc:[-85.632289,41.940601]},n2289:{id:"n2289",loc:[-85.632541,41.942526]},n229:{id:"n229",loc:[-85.636145,41.941559]},n2290:{id:"n2290",loc:[-85.634058,41.943173]},n2291:{id:"n2291",loc:[-85.636175,41.945974]},n2292:{id:"n2292",loc:[-85.636528,41.945975]},n2293:{id:"n2293",loc:[-85.637092,41.945893]},n2294:{id:"n2294",loc:[-85.637881,41.945647]},n2295:{id:"n2295",loc:[-85.639329,41.945162]},n2296:{id:"n2296",loc:[-85.639323,41.945026]},n2297:{id:"n2297",loc:[-85.638826,41.945032]},n2298:{id:"n2298",loc:[-85.638817,41.944174]},n2299:{id:"n2299",loc:[-85.638291,41.94418]},n23:{id:"n23",loc:[-85.633504,41.942418]},n230:{id:"n230",loc:[-85.636145,41.941551]},n2300:{id:"n2300",loc:[-85.63828,41.943811]},n2301:{id:"n2301",loc:[-85.638195,41.943601]},n2302:{id:"n2302",loc:[-85.63719,41.943592]},n2303:{id:"n2303",loc:[-85.636697,41.943273]},n2304:{id:"n2304",loc:[-85.635375,41.943274]},n2305:{id:"n2305",loc:[-85.635091,41.943547]},n2306:{id:"n2306",loc:[-85.63442,41.944117]},n2307:{id:"n2307",loc:[-85.635117,41.943717]},n2308:{id:"n2308",loc:[-85.635601,41.945177]},n2309:{id:"n2309",loc:[-85.635819,41.945494]},n231:{id:"n231",loc:[-85.636312,41.941549]},n2310:{id:"n2310",loc:[-85.635303,41.944891]},n2311:{id:"n2311",loc:[-85.637674,41.943802]},n2312:{id:"n2312",loc:[-85.638263,41.944272]},n2313:{id:"n2313",loc:[-85.634267,41.935266]},n2314:{id:"n2314",loc:[-85.639788,41.945152]},n2315:{id:"n2315",loc:[-85.639645,41.945167]},n2316:{id:"n2316",loc:[-85.639362,41.945233]},n2317:{id:"n2317",loc:[-85.638616,41.945163]},n2318:{id:"n2318",loc:[-85.638514,41.944936]},n2319:{id:"n2319",loc:[-85.638578,41.94503]},n232:{id:"n232",loc:[-85.636314,41.941649]},n2320:{id:"n2320",loc:[-85.638578,41.945215]},n2321:{id:"n2321",loc:[-85.640495,41.947015]},n2322:{id:"n2322",loc:[-85.639577,41.946495]},n2323:{id:"n2323",loc:[-85.638935,41.946087]},n2324:{id:"n2324",loc:[-85.637535,41.94584]},n2325:{id:"n2325",loc:[-85.638357,41.945404]},n2326:{id:"n2326",loc:[-85.638051,41.94553]},n2327:{id:"n2327",loc:[-85.637732,41.945555]},n2328:{id:"n2328",loc:[-85.637657,41.945524]},n2329:{id:"n2329",loc:[-85.637598,41.945467]},n233:{id:"n233",loc:[-85.636152,41.94165]},n2330:{id:"n2330",loc:[-85.637669,41.945318]},n2331:{id:"n2331",loc:[-85.637894,41.945171]},n2332:{id:"n2332",loc:[-85.637923,41.945082]},n2333:{id:"n2333",loc:[-85.63793,41.944756]},n2334:{id:"n2334",loc:[-85.637976,41.944696]},n2335:{id:"n2335",loc:[-85.638044,41.944671]},n2336:{id:"n2336",loc:[-85.638129,41.944597]},n2337:{id:"n2337",loc:[-85.638252,41.944413]},n2338:{id:"n2338",loc:[-85.638092,41.945442]},n2339:{id:"n2339",loc:[-85.638409,41.945315]},n234:{id:"n234",loc:[-85.636152,41.941628]},n2340:{id:"n2340",loc:[-85.638325,41.944771]},n2341:{id:"n2341",loc:[-85.638103,41.944744]},n2342:{id:"n2342",loc:[-85.637976,41.944781]},n2343:{id:"n2343",loc:[-85.637983,41.944865]},n2344:{id:"n2344",loc:[-85.638063,41.945074]},n2345:{id:"n2345",loc:[-85.638041,41.945206]},n2346:{id:"n2346",loc:[-85.637907,41.945309]},n2347:{id:"n2347",loc:[-85.637925,41.94539]},n2348:{id:"n2348",loc:[-85.637998,41.94545]},n2349:{id:"n2349",loc:[-85.637135,41.946254]},n235:{id:"n235",loc:[-85.63611,41.941628]},n2350:{id:"n2350",loc:[-85.636837,41.946615]},n2351:{id:"n2351",loc:[-85.637954,41.948909]},n2352:{id:"n2352",loc:[-85.638382,41.949786]},n2353:{id:"n2353",loc:[-85.639367,41.951242]},n2354:{id:"n2354",loc:[-85.640554,41.951777]},n2355:{id:"n2355",loc:[-85.6411,41.952234]},n2356:{id:"n2356",loc:[-85.641742,41.952657]},n2357:{id:"n2357",loc:[-85.642321,41.952941]},n2358:{id:"n2358",loc:[-85.64277,41.953228]},n2359:{id:"n2359",loc:[-85.643333,41.953825]},n236:{id:"n236",loc:[-85.636113,41.941768]},n2360:{id:"n2360",loc:[-85.643579,41.954365]},n2361:{id:"n2361",loc:[-85.644439,41.954105]},n2362:{id:"n2362",loc:[-85.64506,41.954]},n2363:{id:"n2363",loc:[-85.645483,41.953911]},n2364:{id:"n2364",loc:[-85.646046,41.953853]},n2365:{id:"n2365",loc:[-85.646318,41.953717]},n2366:{id:"n2366",loc:[-85.646276,41.953414]},n2367:{id:"n2367",loc:[-85.631063,41.957478],tags:{emergency:"fire_hydrant"}},n2368:{id:"n2368",loc:[-85.630996,41.955857],tags:{emergency:"fire_hydrant"}},n2369:{id:"n2369",loc:[-85.630976,41.954608],tags:{emergency:"fire_hydrant"}},n237:{id:"n237",loc:[-85.635983,41.941589],tags:{entrance:"yes"}},n2370:{id:"n2370",loc:[-85.646,41.953154]},n2371:{id:"n2371",loc:[-85.645222,41.953193]},n2372:{id:"n2372",loc:[-85.644732,41.953181]},n2373:{id:"n2373",loc:[-85.644064,41.953298]},n2374:{id:"n2374",loc:[-85.643818,41.953177]},n2375:{id:"n2375",loc:[-85.644001,41.95284]},n2376:{id:"n2376",loc:[-85.628174,41.95456],tags:{emergency:"fire_hydrant"}},n2377:{id:"n2377",loc:[-85.644267,41.952591]},n2378:{id:"n2378",loc:[-85.644288,41.952328]},n2379:{id:"n2379",loc:[-85.627276,41.953987],tags:{emergency:"fire_hydrant"}},n238:{id:"n238",loc:[-85.635906,41.94159]},n2380:{id:"n2380",loc:[-85.644262,41.952153]},n2381:{id:"n2381",loc:[-85.644168,41.95204]},n2382:{id:"n2382",loc:[-85.64421,41.951749]},n2383:{id:"n2383",loc:[-85.64385,41.951586]},n2384:{id:"n2384",loc:[-85.62736,41.955964],tags:{emergency:"fire_hydrant"}},n2385:{id:"n2385",loc:[-85.626307,41.957198],tags:{emergency:"fire_hydrant"}},n2386:{id:"n2386",loc:[-85.643589,41.951323]},n2387:{id:"n2387",loc:[-85.62747,41.957509],tags:{emergency:"fire_hydrant"}},n2388:{id:"n2388",loc:[-85.628665,41.957492],tags:{emergency:"fire_hydrant"}},n2389:{id:"n2389",loc:[-85.642535,41.951031]},n239:{id:"n239",loc:[-85.635883,41.940182]},n2390:{id:"n2390",loc:[-85.642269,41.95088]},n2391:{id:"n2391",loc:[-85.641878,41.950814]},n2392:{id:"n2392",loc:[-85.641549,41.950806]},n2393:{id:"n2393",loc:[-85.641103,41.950549]},n2394:{id:"n2394",loc:[-85.630864,41.959046],tags:{emergency:"fire_hydrant"}},n2395:{id:"n2395",loc:[-85.632249,41.958969],tags:{emergency:"fire_hydrant"}},n2396:{id:"n2396",loc:[-85.641037,41.949821]},n2397:{id:"n2397",loc:[-85.641006,41.949433]},n2398:{id:"n2398",loc:[-85.632232,41.95859],tags:{emergency:"fire_hydrant"}},n2399:{id:"n2399",loc:[-85.632071,41.958345],tags:{emergency:"fire_hydrant"}},n24:{id:"n24",loc:[-85.634346,41.942792]},n240:{id:"n240",loc:[-85.635916,41.942648]},n2400:{id:"n2400",loc:[-85.632228,41.9573],tags:{emergency:"fire_hydrant"}},n2401:{id:"n2401",loc:[-85.641152,41.948257]},n2402:{id:"n2402",loc:[-85.641055,41.947304]},n2403:{id:"n2403",loc:[-85.638022,41.945897]},n2404:{id:"n2404",loc:[-85.638672,41.950778]},n2405:{id:"n2405",loc:[-85.63666,41.944492],tags:{name:"Memory Isle",place:"island"}},n2406:{id:"n2406",loc:[-85.634982,41.946262],tags:{amenity:"post_office",name:"Three Rivers Post Office"}},n2407:{id:"n2407",loc:[-85.633676,41.946036]},n2408:{id:"n2408",loc:[-85.633736,41.946078]},n2409:{id:"n2409",loc:[-85.633997,41.946185]},n241:{id:"n241",loc:[-85.635805,41.941906]},n2410:{id:"n2410",loc:[-85.634448,41.945626],tags:{highway:"traffic_signals",traffic_signals:"signal"}},n2411:{id:"n2411",loc:[-85.63456,41.945731],tags:{crossing:"marked",highway:"crossing"}},n2412:{id:"n2412",loc:[-85.634592,41.94578]},n2413:{id:"n2413",loc:[-85.634607,41.945815]},n2414:{id:"n2414",loc:[-85.634614,41.945864]},n2415:{id:"n2415",loc:[-85.636066,41.946185]},n2416:{id:"n2416",loc:[-85.636128,41.946352]},n2417:{id:"n2417",loc:[-85.636142,41.946452]},n2418:{id:"n2418",loc:[-85.635327,41.945292]},n2419:{id:"n2419",loc:[-85.635648,41.94558]},n242:{id:"n242",loc:[-85.635909,41.941906]},n2420:{id:"n2420",loc:[-85.635769,41.945729]},n2421:{id:"n2421",loc:[-85.637349,41.945897]},n2422:{id:"n2422",loc:[-85.632211,41.95596],tags:{emergency:"fire_hydrant"}},n2423:{id:"n2423",loc:[-85.635942,41.94598]},n2424:{id:"n2424",loc:[-85.636443,41.946042]},n2425:{id:"n2425",loc:[-85.635819,41.946052]},n2426:{id:"n2426",loc:[-85.636669,41.946025]},n2427:{id:"n2427",loc:[-85.636832,41.946005]},n2428:{id:"n2428",loc:[-85.637039,41.945968]},n2429:{id:"n2429",loc:[-85.636291,41.946046]},n243:{id:"n243",loc:[-85.636359,41.941904]},n2430:{id:"n2430",loc:[-85.634005,41.943367]},n2431:{id:"n2431",loc:[-85.633366,41.943724]},n2432:{id:"n2432",loc:[-85.634617,41.946057]},n2433:{id:"n2433",loc:[-85.636534,41.944793]},n2434:{id:"n2434",loc:[-85.637055,41.945188]},n2435:{id:"n2435",loc:[-85.636153,41.944618]},n2436:{id:"n2436",loc:[-85.636803,41.944944]},n2437:{id:"n2437",loc:[-85.633389,41.945735]},n2438:{id:"n2438",loc:[-85.633536,41.94585]},n2439:{id:"n2439",loc:[-85.63363,41.945993]},n244:{id:"n244",loc:[-85.636351,41.941438]},n2440:{id:"n2440",loc:[-85.633268,41.94568]},n2441:{id:"n2441",loc:[-85.635947,41.94546]},n2442:{id:"n2442",loc:[-85.636277,41.945268]},n2443:{id:"n2443",loc:[-85.635203,41.944287]},n2444:{id:"n2444",loc:[-85.634876,41.944477]},n2445:{id:"n2445",loc:[-85.634975,41.944419]},n2446:{id:"n2446",loc:[-85.633877,41.943438]},n2447:{id:"n2447",loc:[-85.63508,41.945113]},n2448:{id:"n2448",loc:[-85.635372,41.944932]},n2449:{id:"n2449",loc:[-85.636594,41.945935]},n245:{id:"n245",loc:[-85.635903,41.941436]},n2450:{id:"n2450",loc:[-85.636901,41.945747]},n2451:{id:"n2451",loc:[-85.636329,41.945228]},n2452:{id:"n2452",loc:[-85.636025,41.945417]},n2453:{id:"n2453",loc:[-85.634002,41.944644]},n2454:{id:"n2454",loc:[-85.63407,41.944692]},n2455:{id:"n2455",loc:[-85.634114,41.944756]},n2456:{id:"n2456",loc:[-85.633762,41.944809]},n2457:{id:"n2457",loc:[-85.634184,41.944807]},n2458:{id:"n2458",loc:[-85.634291,41.944819]},n2459:{id:"n2459",loc:[-85.634639,41.944845]},n246:{id:"n246",loc:[-85.635798,41.941436]},n2460:{id:"n2460",loc:[-85.633822,41.944861]},n2461:{id:"n2461",loc:[-85.63411,41.944855]},n2462:{id:"n2462",loc:[-85.63435,41.944872]},n2463:{id:"n2463",loc:[-85.63441,41.944903]},n2464:{id:"n2464",loc:[-85.633883,41.944913]},n2465:{id:"n2465",loc:[-85.634164,41.944896]},n2466:{id:"n2466",loc:[-85.633487,41.944926]},n2467:{id:"n2467",loc:[-85.634736,41.944929]},n2468:{id:"n2468",loc:[-85.633944,41.944965]},n2469:{id:"n2469",loc:[-85.633555,41.944983]},n247:{id:"n247",loc:[-85.635929,41.941511]},n2470:{id:"n2470",loc:[-85.633995,41.945013]},n2471:{id:"n2471",loc:[-85.633614,41.945037]},n2472:{id:"n2472",loc:[-85.634848,41.945031]},n2473:{id:"n2473",loc:[-85.634049,41.945061]},n2474:{id:"n2474",loc:[-85.633678,41.945094]},n2475:{id:"n2475",loc:[-85.63317,41.945111]},n2476:{id:"n2476",loc:[-85.633357,41.945103]},n2477:{id:"n2477",loc:[-85.633728,41.945136]},n2478:{id:"n2478",loc:[-85.634146,41.945148]},n2479:{id:"n2479",loc:[-85.633416,41.945157]},n248:{id:"n248",loc:[-85.635929,41.941317]},n2480:{id:"n2480",loc:[-85.634625,41.945172]},n2481:{id:"n2481",loc:[-85.633239,41.945174]},n2482:{id:"n2482",loc:[-85.63469,41.945185]},n2483:{id:"n2483",loc:[-85.634661,41.945203]},n2484:{id:"n2484",loc:[-85.63348,41.945214]},n2485:{id:"n2485",loc:[-85.633578,41.945221]},n2486:{id:"n2486",loc:[-85.634742,41.945231]},n2487:{id:"n2487",loc:[-85.634251,41.94525]},n2488:{id:"n2488",loc:[-85.633524,41.945254]},n2489:{id:"n2489",loc:[-85.63468,41.945271]},n249:{id:"n249",loc:[-85.636414,41.941316]},n2490:{id:"n2490",loc:[-85.633885,41.945272]},n2491:{id:"n2491",loc:[-85.634795,41.945288]},n2492:{id:"n2492",loc:[-85.634742,41.94532]},n2493:{id:"n2493",loc:[-85.633946,41.945327]},n2494:{id:"n2494",loc:[-85.634844,41.945331]},n2495:{id:"n2495",loc:[-85.63435,41.945349]},n2496:{id:"n2496",loc:[-85.633733,41.945357]},n2497:{id:"n2497",loc:[-85.633987,41.945375]},n2498:{id:"n2498",loc:[-85.634911,41.945419]},n2499:{id:"n2499",loc:[-85.634049,41.945431]},n25:{id:"n25",loc:[-85.634333,41.942809]},n250:{id:"n250",loc:[-85.636414,41.941511]},n2500:{id:"n2500",loc:[-85.633705,41.945461]},n2501:{id:"n2501",loc:[-85.633642,41.945408]},n2502:{id:"n2502",loc:[-85.634493,41.945475]},n2503:{id:"n2503",loc:[-85.634106,41.945484]},n2504:{id:"n2504",loc:[-85.635008,41.945505]},n2505:{id:"n2505",loc:[-85.633757,41.945506]},n2506:{id:"n2506",loc:[-85.634542,41.945519]},n2507:{id:"n2507",loc:[-85.634162,41.945536]},n2508:{id:"n2508",loc:[-85.633843,41.945547]},n2509:{id:"n2509",loc:[-85.634919,41.94556]},n251:{id:"n251",loc:[-85.636819,41.941617]},n2510:{id:"n2510",loc:[-85.633818,41.945561]},n2511:{id:"n2511",loc:[-85.634638,41.94559]},n2512:{id:"n2512",loc:[-85.633901,41.945598]},n2513:{id:"n2513",loc:[-85.634257,41.945626]},n2514:{id:"n2514",loc:[-85.633967,41.945652]},n2515:{id:"n2515",loc:[-85.634735,41.945676]},n2516:{id:"n2516",loc:[-85.635057,41.945683]},n2517:{id:"n2517",loc:[-85.635296,41.945703]},n2518:{id:"n2518",loc:[-85.635112,41.945703]},n2519:{id:"n2519",loc:[-85.634782,41.945729]},n252:{id:"n252",loc:[-85.636718,41.941619]},n2520:{id:"n2520",loc:[-85.634052,41.945747]},n2521:{id:"n2521",loc:[-85.635296,41.945757]},n2522:{id:"n2522",loc:[-85.635314,41.945757]},n2523:{id:"n2523",loc:[-85.635112,41.945761]},n2524:{id:"n2524",loc:[-85.634841,41.945778]},n2525:{id:"n2525",loc:[-85.635315,41.945939]},n2526:{id:"n2526",loc:[-85.634841,41.945921]},n2527:{id:"n2527",loc:[-85.635461,41.944879]},n2528:{id:"n2528",loc:[-85.636024,41.945384]},n2529:{id:"n2529",loc:[-85.636145,41.945312]},n253:{id:"n253",loc:[-85.636716,41.941509]},n2530:{id:"n2530",loc:[-85.6356,41.944797]},n2531:{id:"n2531",loc:[-85.635135,41.944354]},n2532:{id:"n2532",loc:[-85.632988,41.945369]},n2533:{id:"n2533",loc:[-85.633376,41.94563]},n2534:{id:"n2534",loc:[-85.633539,41.945534]},n2535:{id:"n2535",loc:[-85.633238,41.945248]},n2536:{id:"n2536",loc:[-85.633166,41.945216]},n2537:{id:"n2537",loc:[-85.633114,41.945188]},n2538:{id:"n2538",loc:[-85.633078,41.945127]},n2539:{id:"n2539",loc:[-85.633066,41.94508]},n254:{id:"n254",loc:[-85.636732,41.941509]},n2540:{id:"n2540",loc:[-85.633222,41.945358]},n2541:{id:"n2541",loc:[-85.633425,41.945541]},n2542:{id:"n2542",loc:[-85.63299,41.9455]},n2543:{id:"n2543",loc:[-85.634374,41.944327]},n2544:{id:"n2544",loc:[-85.633648,41.943697]},n2545:{id:"n2545",loc:[-85.633533,41.943764]},n2546:{id:"n2546",loc:[-85.634239,41.944417]},n2547:{id:"n2547",loc:[-85.634122,41.944395]},n2548:{id:"n2548",loc:[-85.634235,41.944326]},n2549:{id:"n2549",loc:[-85.633613,41.943787]},n255:{id:"n255",loc:[-85.636731,41.941461]},n2550:{id:"n2550",loc:[-85.633915,41.943613]},n2551:{id:"n2551",loc:[-85.634015,41.943555]},n2552:{id:"n2552",loc:[-85.63433,41.943839]},n2553:{id:"n2553",loc:[-85.634236,41.943894]},n2554:{id:"n2554",loc:[-85.635413,41.946052]},n2555:{id:"n2555",loc:[-85.635405,41.94569]},n2556:{id:"n2556",loc:[-85.635684,41.945925]},n2557:{id:"n2557",loc:[-85.635614,41.945742]},n2558:{id:"n2558",loc:[-85.635401,41.945745]},n2559:{id:"n2559",loc:[-85.635406,41.945928]},n256:{id:"n256",loc:[-85.636799,41.941461]},n2560:{id:"n2560",loc:[-85.633478,41.943663]},n2561:{id:"n2561",loc:[-85.633291,41.943526]},n2562:{id:"n2562",loc:[-85.633094,41.943541]},n2563:{id:"n2563",loc:[-85.633302,41.943492]},n2564:{id:"n2564",loc:[-85.633047,41.943623]},n2565:{id:"n2565",loc:[-85.633275,41.943562]},n2566:{id:"n2566",loc:[-85.633351,41.943518]},n2567:{id:"n2567",loc:[-85.633224,41.9434]},n2568:{id:"n2568",loc:[-85.633235,41.943369]},n2569:{id:"n2569",loc:[-85.635179,41.943911]},n257:{id:"n257",loc:[-85.6368,41.9415]},n2570:{id:"n2570",loc:[-85.635146,41.943918]},n2571:{id:"n2571",loc:[-85.634888,41.943905]},n2572:{id:"n2572",loc:[-85.634832,41.943911]},n2573:{id:"n2573",loc:[-85.634638,41.944007]},n2574:{id:"n2574",loc:[-85.634568,41.94405]},n2575:{id:"n2575",loc:[-85.635994,41.94501]},n2576:{id:"n2576",loc:[-85.636388,41.944608]},n2577:{id:"n2577",loc:[-85.636215,41.944787]},n2578:{id:"n2578",loc:[-85.637948,41.944587]},n2579:{id:"n2579",loc:[-85.637849,41.944567]},n258:{id:"n258",loc:[-85.636814,41.9415]},n2580:{id:"n2580",loc:[-85.637895,41.944455]},n2581:{id:"n2581",loc:[-85.637996,41.944477]},n2582:{id:"n2582",loc:[-85.635525,41.94337]},n2583:{id:"n2583",loc:[-85.637847,41.943923]},n2584:{id:"n2584",loc:[-85.637891,41.944124]},n2585:{id:"n2585",loc:[-85.638167,41.944229]},n2586:{id:"n2586",loc:[-85.638236,41.944097]},n2587:{id:"n2587",loc:[-85.638207,41.944025]},n2588:{id:"n2588",loc:[-85.638141,41.943997]},n2589:{id:"n2589",loc:[-85.638057,41.944015]},n259:{id:"n259",loc:[-85.636815,41.941538]},n2590:{id:"n2590",loc:[-85.637902,41.944231]},n2591:{id:"n2591",loc:[-85.638134,41.944307]},n2592:{id:"n2592",loc:[-85.638242,41.944294]},n2593:{id:"n2593",loc:[-85.638274,41.944222]},n2594:{id:"n2594",loc:[-85.638236,41.944174]},n2595:{id:"n2595",loc:[-85.638207,41.944157]},n2596:{id:"n2596",loc:[-85.637818,41.943984]},n2597:{id:"n2597",loc:[-85.634996,41.944439]},n2598:{id:"n2598",loc:[-85.633946,41.945804]},n2599:{id:"n2599",loc:[-85.634102,41.945864]},n26:{id:"n26",loc:[-85.634346,41.942744]},n260:{id:"n260",loc:[-85.636827,41.941538]},n2600:{id:"n2600",loc:[-85.633819,41.945756]},n2601:{id:"n2601",loc:[-85.634025,41.945975]},n2602:{id:"n2602",loc:[-85.633742,41.945867]},n2603:{id:"n2603",loc:[-85.63373,41.946004]},n2604:{id:"n2604",loc:[-85.633947,41.946081]},n2605:{id:"n2605",loc:[-85.633872,41.945917]},n2606:{id:"n2606",loc:[-85.633825,41.945985]},n2607:{id:"n2607",loc:[-85.633762,41.94596]},n2608:{id:"n2608",loc:[-85.634224,41.946037]},n2609:{id:"n2609",loc:[-85.634357,41.945851]},n261:{id:"n261",loc:[-85.636828,41.941584]},n2610:{id:"n2610",loc:[-85.634398,41.945813]},n2611:{id:"n2611",loc:[-85.634461,41.945812]},n2612:{id:"n2612",loc:[-85.634501,41.945852]},n2613:{id:"n2613",loc:[-85.634503,41.94597]},n2614:{id:"n2614",loc:[-85.634462,41.945971]},n2615:{id:"n2615",loc:[-85.634465,41.946036]},n2616:{id:"n2616",loc:[-85.634235,41.946072]},n2617:{id:"n2617",loc:[-85.634447,41.946036]},n2618:{id:"n2618",loc:[-85.634448,41.946052]},n2619:{id:"n2619",loc:[-85.634494,41.946051]},n262:{id:"n262",loc:[-85.636819,41.941585]},n2620:{id:"n2620",loc:[-85.634497,41.946144]},n2621:{id:"n2621",loc:[-85.634453,41.946144]},n2622:{id:"n2622",loc:[-85.634454,41.94616]},n2623:{id:"n2623",loc:[-85.634393,41.946161]},n2624:{id:"n2624",loc:[-85.634394,41.94618]},n2625:{id:"n2625",loc:[-85.634345,41.94618]},n2626:{id:"n2626",loc:[-85.634344,41.946162]},n2627:{id:"n2627",loc:[-85.63427,41.946163]},n2628:{id:"n2628",loc:[-85.634266,41.946071]},n2629:{id:"n2629",loc:[-85.634148,41.946163]},n263:{id:"n263",loc:[-85.636854,41.941714]},n2630:{id:"n2630",loc:[-85.634213,41.946072]},n2631:{id:"n2631",loc:[-85.633293,41.946309]},n2632:{id:"n2632",loc:[-85.633122,41.946239]},n2633:{id:"n2633",loc:[-85.633295,41.946005]},n2634:{id:"n2634",loc:[-85.633395,41.946047]},n2635:{id:"n2635",loc:[-85.633404,41.946035]},n2636:{id:"n2636",loc:[-85.633459,41.946057]},n2637:{id:"n2637",loc:[-85.633387,41.946154]},n2638:{id:"n2638",loc:[-85.633403,41.946161]},n2639:{id:"n2639",loc:[-85.634176,41.946415]},n264:{id:"n264",loc:[-85.636855,41.941774]},n2640:{id:"n2640",loc:[-85.634179,41.946339]},n2641:{id:"n2641",loc:[-85.634455,41.946345]},n2642:{id:"n2642",loc:[-85.634452,41.946422]},n2643:{id:"n2643",loc:[-85.63437,41.946421]},n2644:{id:"n2644",loc:[-85.634367,41.946497]},n2645:{id:"n2645",loc:[-85.634289,41.946495]},n2646:{id:"n2646",loc:[-85.634291,41.946448]},n2647:{id:"n2647",loc:[-85.634269,41.946448]},n2648:{id:"n2648",loc:[-85.63427,41.946417]},n2649:{id:"n2649",loc:[-85.63484,41.946328]},n265:{id:"n265",loc:[-85.636822,41.941774]},n2650:{id:"n2650",loc:[-85.634839,41.946187]},n2651:{id:"n2651",loc:[-85.635148,41.946186]},n2652:{id:"n2652",loc:[-85.635148,41.946216]},n2653:{id:"n2653",loc:[-85.63521,41.946216]},n2654:{id:"n2654",loc:[-85.63521,41.946348]},n2655:{id:"n2655",loc:[-85.635154,41.946348]},n2656:{id:"n2656",loc:[-85.635153,41.946327]},n2657:{id:"n2657",loc:[-85.634037,41.946957]},n2658:{id:"n2658",loc:[-85.634253,41.946953]},n2659:{id:"n2659",loc:[-85.63481,41.946543]},n266:{id:"n266",loc:[-85.636822,41.941778]},n2660:{id:"n2660",loc:[-85.634809,41.946459]},n2661:{id:"n2661",loc:[-85.635154,41.946458]},n2662:{id:"n2662",loc:[-85.635155,41.946554]},n2663:{id:"n2663",loc:[-85.635022,41.946547]},n2664:{id:"n2664",loc:[-85.635022,41.946573]},n2665:{id:"n2665",loc:[-85.634909,41.946574]},n2666:{id:"n2666",loc:[-85.634909,41.946561]},n2667:{id:"n2667",loc:[-85.634896,41.947159]},n2668:{id:"n2668",loc:[-85.634894,41.947032]},n2669:{id:"n2669",loc:[-85.635024,41.947031]},n267:{id:"n267",loc:[-85.636756,41.941779]},n2670:{id:"n2670",loc:[-85.635026,41.947158]},n2671:{id:"n2671",loc:[-85.635233,41.947105]},n2672:{id:"n2672",loc:[-85.635236,41.946991]},n2673:{id:"n2673",loc:[-85.635369,41.946993]},n2674:{id:"n2674",loc:[-85.635366,41.947107]},n2675:{id:"n2675",loc:[-85.634824,41.946929]},n2676:{id:"n2676",loc:[-85.634825,41.946818]},n2677:{id:"n2677",loc:[-85.63512,41.946819]},n2678:{id:"n2678",loc:[-85.635119,41.94693]},n2679:{id:"n2679",loc:[-85.634796,41.946806]},n268:{id:"n268",loc:[-85.636756,41.941774]},n2680:{id:"n2680",loc:[-85.634792,41.946604]},n2681:{id:"n2681",loc:[-85.634948,41.946602]},n2682:{id:"n2682",loc:[-85.634949,41.946645]},n2683:{id:"n2683",loc:[-85.634975,41.946644]},n2684:{id:"n2684",loc:[-85.634974,41.946599]},n2685:{id:"n2685",loc:[-85.635117,41.946598]},n2686:{id:"n2686",loc:[-85.635122,41.946801]},n2687:{id:"n2687",loc:[-85.634981,41.946803]},n2688:{id:"n2688",loc:[-85.634979,41.946752]},n2689:{id:"n2689",loc:[-85.634952,41.946752]},n269:{id:"n269",loc:[-85.636721,41.941774]},n2690:{id:"n2690",loc:[-85.634953,41.946804]},n2691:{id:"n2691",loc:[-85.634649,41.946841]},n2692:{id:"n2692",loc:[-85.634331,41.94684]},n2693:{id:"n2693",loc:[-85.634183,41.946809]},n2694:{id:"n2694",loc:[-85.633699,41.946607]},n2695:{id:"n2695",loc:[-85.634487,41.946664]},n2696:{id:"n2696",loc:[-85.634486,41.946598]},n2697:{id:"n2697",loc:[-85.63423,41.946599]},n2698:{id:"n2698",loc:[-85.634231,41.946662]},n2699:{id:"n2699",loc:[-85.634284,41.946662]},n27:{id:"n27",loc:[-85.634136,41.943183]},n270:{id:"n270",loc:[-85.63672,41.941714]},n2700:{id:"n2700",loc:[-85.634284,41.946679]},n2701:{id:"n2701",loc:[-85.634365,41.946679]},n2702:{id:"n2702",loc:[-85.634365,41.946664]},n2703:{id:"n2703",loc:[-85.635443,41.947015]},n2704:{id:"n2704",loc:[-85.635442,41.946801]},n2705:{id:"n2705",loc:[-85.63603,41.9468]},n2706:{id:"n2706",loc:[-85.636028,41.947016]},n2707:{id:"n2707",loc:[-85.635457,41.946582]},n2708:{id:"n2708",loc:[-85.635455,41.946211]},n2709:{id:"n2709",loc:[-85.635636,41.946579]},n271:{id:"n271",loc:[-85.636767,41.941713]},n2710:{id:"n2710",loc:[-85.635716,41.9468]},n2711:{id:"n2711",loc:[-85.635969,41.9468]},n2712:{id:"n2712",loc:[-85.635973,41.946295]},n2713:{id:"n2713",loc:[-85.636019,41.946484]},n2714:{id:"n2714",loc:[-85.636022,41.946388]},n2715:{id:"n2715",loc:[-85.635961,41.946493]},n2716:{id:"n2716",loc:[-85.635713,41.94621]},n2717:{id:"n2717",loc:[-85.635416,41.946142]},n2718:{id:"n2718",loc:[-85.635759,41.946203]},n2719:{id:"n2719",loc:[-85.636153,41.946747]},n272:{id:"n272",loc:[-85.636767,41.941706]},n2720:{id:"n2720",loc:[-85.635417,41.946915]},n2721:{id:"n2721",loc:[-85.636154,41.946915]},n2722:{id:"n2722",loc:[-85.635866,41.946473]},n2723:{id:"n2723",loc:[-85.635717,41.946633]},n2724:{id:"n2724",loc:[-85.635556,41.946166]},n2725:{id:"n2725",loc:[-85.63556,41.946556]},n2726:{id:"n2726",loc:[-85.635731,41.946594]},n2727:{id:"n2727",loc:[-85.635866,41.946595]},n2728:{id:"n2728",loc:[-85.635456,41.947028]},n2729:{id:"n2729",loc:[-85.635796,41.947023]},n273:{id:"n273",loc:[-85.636779,41.941698]},n2730:{id:"n2730",loc:[-85.635798,41.947091]},n2731:{id:"n2731",loc:[-85.63573,41.947092]},n2732:{id:"n2732",loc:[-85.635733,41.947233]},n2733:{id:"n2733",loc:[-85.636283,41.946863]},n2734:{id:"n2734",loc:[-85.63628,41.946706]},n2735:{id:"n2735",loc:[-85.636341,41.946705]},n2736:{id:"n2736",loc:[-85.636273,41.946584]},n2737:{id:"n2737",loc:[-85.636396,41.946545]},n2738:{id:"n2738",loc:[-85.636474,41.946684]},n2739:{id:"n2739",loc:[-85.636511,41.946861]},n274:{id:"n274",loc:[-85.636798,41.941697]},n2740:{id:"n2740",loc:[-85.633713,41.947184]},n2741:{id:"n2741",loc:[-85.633651,41.94716]},n2742:{id:"n2742",loc:[-85.633704,41.947085]},n2743:{id:"n2743",loc:[-85.6336,41.947044]},n2744:{id:"n2744",loc:[-85.633506,41.947177]},n2745:{id:"n2745",loc:[-85.629586,41.952469]},n2746:{id:"n2746",loc:[-85.634723,41.953681]},n2747:{id:"n2747",loc:[-85.63478,41.959007]},n2748:{id:"n2748",loc:[-85.632793,41.94405],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n2749:{id:"n2749",loc:[-85.634648,41.947325]},n275:{id:"n275",loc:[-85.63681,41.941705]},n2750:{id:"n2750",loc:[-85.625078,41.952097]},n2751:{id:"n2751",loc:[-85.633195,41.94734]},n2752:{id:"n2752",loc:[-85.626447,41.957168]},n2753:{id:"n2753",loc:[-85.632023,41.949012]},n2754:{id:"n2754",loc:[-85.630835,41.950656]},n2755:{id:"n2755",loc:[-85.634655,41.948612]},n2756:{id:"n2756",loc:[-85.636182,41.948605]},n2757:{id:"n2757",loc:[-85.634729,41.954667]},n2758:{id:"n2758",loc:[-85.634686,41.951159]},n2759:{id:"n2759",loc:[-85.636206,41.951146]},n276:{id:"n276",loc:[-85.63681,41.941714]},n2760:{id:"n2760",loc:[-85.634668,41.949891]},n2761:{id:"n2761",loc:[-85.634701,41.952422]},n2762:{id:"n2762",loc:[-85.634747,41.955907]},n2763:{id:"n2763",loc:[-85.627975,41.954695]},n2764:{id:"n2764",loc:[-85.626832,41.954698]},n2765:{id:"n2765",loc:[-85.632278,41.948624]},n2766:{id:"n2766",loc:[-85.628639,41.953725]},n2767:{id:"n2767",loc:[-85.636233,41.95241]},n2768:{id:"n2768",loc:[-85.631385,41.949913]},n2769:{id:"n2769",loc:[-85.630486,41.951194]},n277:{id:"n277",loc:[-85.636861,41.942041]},n2770:{id:"n2770",loc:[-85.624937,41.952088]},n2771:{id:"n2771",loc:[-85.624945,41.952022]},n2772:{id:"n2772",loc:[-85.636162,41.94731]},n2773:{id:"n2773",loc:[-85.636188,41.949881]},n2774:{id:"n2774",loc:[-85.631422,41.948294]},n2775:{id:"n2775",loc:[-85.632844,41.945547]},n2776:{id:"n2776",loc:[-85.632484,41.945344]},n2777:{id:"n2777",loc:[-85.631775,41.944636]},n2778:{id:"n2778",loc:[-85.632656,41.945471]},n2779:{id:"n2779",loc:[-85.631959,41.944827]},n278:{id:"n278",loc:[-85.636862,41.942099]},n2780:{id:"n2780",loc:[-85.631679,41.94438]},n2781:{id:"n2781",loc:[-85.625129,41.959272]},n2782:{id:"n2782",loc:[-85.632446,41.944861]},n2783:{id:"n2783",loc:[-85.632804,41.945477]},n2784:{id:"n2784",loc:[-85.632255,41.944962]},n2785:{id:"n2785",loc:[-85.632736,41.944757]},n2786:{id:"n2786",loc:[-85.632543,41.94486]},n2787:{id:"n2787",loc:[-85.632889,41.945561]},n2788:{id:"n2788",loc:[-85.632091,41.944949]},n2789:{id:"n2789",loc:[-85.632537,41.944713]},n279:{id:"n279",loc:[-85.636807,41.942099]},n2790:{id:"n2790",loc:[-85.632279,41.94485]},n2791:{id:"n2791",loc:[-85.632749,41.943247]},n2792:{id:"n2792",loc:[-85.632824,41.943152]},n2793:{id:"n2793",loc:[-85.632929,41.94317]},n2794:{id:"n2794",loc:[-85.632897,41.943078]},n2795:{id:"n2795",loc:[-85.632626,41.943231]},n2796:{id:"n2796",loc:[-85.634048,41.947257]},n2797:{id:"n2797",loc:[-85.634264,41.947252]},n2798:{id:"n2798",loc:[-85.635418,41.947317]},n2799:{id:"n2799",loc:[-85.635461,41.947237]},n28:{id:"n28",loc:[-85.63821,41.944308]},n280:{id:"n280",loc:[-85.636807,41.942126]},n2800:{id:"n2800",loc:[-85.632868,41.946229]},n2801:{id:"n2801",loc:[-85.633673,41.947242]},n2802:{id:"n2802",loc:[-85.623604,41.945881],tags:{amenity:"school",name:"Barrows School"}},n2803:{id:"n2803",loc:[-85.627401,41.943496]},n2804:{id:"n2804",loc:[-85.627403,41.943625]},n2805:{id:"n2805",loc:[-85.626409,41.943215]},n2806:{id:"n2806",loc:[-85.624884,41.943508]},n2807:{id:"n2807",loc:[-85.625191,41.943509]},n2808:{id:"n2808",loc:[-85.624882,41.94382]},n2809:{id:"n2809",loc:[-85.624893,41.945618]},n281:{id:"n281",loc:[-85.636726,41.942126]},n2810:{id:"n2810",loc:[-85.624912,41.946524]},n2811:{id:"n2811",loc:[-85.622721,41.946535]},n2812:{id:"n2812",loc:[-85.627399,41.94469]},n2813:{id:"n2813",loc:[-85.622716,41.945622]},n2814:{id:"n2814",loc:[-85.624886,41.944724]},n2815:{id:"n2815",loc:[-85.622674,41.944737]},n2816:{id:"n2816",loc:[-85.625092,41.945063]},n2817:{id:"n2817",loc:[-85.625233,41.945064]},n2818:{id:"n2818",loc:[-85.625229,41.944871]},n2819:{id:"n2819",loc:[-85.625066,41.944871]},n282:{id:"n282",loc:[-85.636726,41.942098]},n2820:{id:"n2820",loc:[-85.625024,41.944901]},n2821:{id:"n2821",loc:[-85.625025,41.944924]},n2822:{id:"n2822",loc:[-85.625087,41.944926]},n2823:{id:"n2823",loc:[-85.625349,41.944506]},n2824:{id:"n2824",loc:[-85.625347,41.944388]},n2825:{id:"n2825",loc:[-85.625152,41.94439]},n2826:{id:"n2826",loc:[-85.625152,41.944431]},n2827:{id:"n2827",loc:[-85.625134,41.944431]},n2828:{id:"n2828",loc:[-85.625136,41.944508]},n2829:{id:"n2829",loc:[-85.623236,41.946341]},n283:{id:"n283",loc:[-85.636708,41.942098]},n2830:{id:"n2830",loc:[-85.623241,41.946067]},n2831:{id:"n2831",loc:[-85.623207,41.946067]},n2832:{id:"n2832",loc:[-85.623212,41.945827]},n2833:{id:"n2833",loc:[-85.622981,41.945825]},n2834:{id:"n2834",loc:[-85.622976,41.946063]},n2835:{id:"n2835",loc:[-85.623006,41.946063]},n2836:{id:"n2836",loc:[-85.623002,41.946256]},n2837:{id:"n2837",loc:[-85.623075,41.946256]},n2838:{id:"n2838",loc:[-85.623074,41.946339]},n2839:{id:"n2839",loc:[-85.624574,41.951755]},n284:{id:"n284",loc:[-85.636708,41.942041]},n2840:{id:"n2840",loc:[-85.62498,41.951844]},n2841:{id:"n2841",loc:[-85.625086,41.95188]},n2842:{id:"n2842",loc:[-85.625135,41.951922]},n2843:{id:"n2843",loc:[-85.615273,41.945637]},n2844:{id:"n2844",loc:[-85.620172,41.945627]},n2845:{id:"n2845",loc:[-85.625167,41.951985]},n2846:{id:"n2846",loc:[-85.622741,41.947437]},n2847:{id:"n2847",loc:[-85.624907,41.947428]},n2848:{id:"n2848",loc:[-85.627046,41.940995]},n2849:{id:"n2849",loc:[-85.627295,41.941304]},n285:{id:"n285",loc:[-85.635618,41.941852]},n2850:{id:"n2850",loc:[-85.627352,41.94148]},n2851:{id:"n2851",loc:[-85.62737,41.942261]},n2852:{id:"n2852",loc:[-85.6264,41.942263]},n2853:{id:"n2853",loc:[-85.622769,41.949228]},n2854:{id:"n2854",loc:[-85.624937,41.949218]},n2855:{id:"n2855",loc:[-85.630001,41.944664]},n2856:{id:"n2856",loc:[-85.624873,41.942022]},n2857:{id:"n2857",loc:[-85.622761,41.948333]},n2858:{id:"n2858",loc:[-85.624924,41.948334]},n2859:{id:"n2859",loc:[-85.620051,41.94383]},n286:{id:"n286",loc:[-85.635621,41.94202]},n2860:{id:"n2860",loc:[-85.627629,41.946498]},n2861:{id:"n2861",loc:[-85.622757,41.950111]},n2862:{id:"n2862",loc:[-85.623685,41.954624]},n2863:{id:"n2863",loc:[-85.621459,41.944756]},n2864:{id:"n2864",loc:[-85.628637,41.944676]},n2865:{id:"n2865",loc:[-85.630125,41.944654]},n2866:{id:"n2866",loc:[-85.625196,41.952097]},n2867:{id:"n2867",loc:[-85.630257,41.944637]},n2868:{id:"n2868",loc:[-85.631247,41.944459]},n2869:{id:"n2869",loc:[-85.624867,41.94159]},n287:{id:"n287",loc:[-85.63524,41.942023]},n2870:{id:"n2870",loc:[-85.624958,41.950343]},n2871:{id:"n2871",loc:[-85.624948,41.950484]},n2872:{id:"n2872",loc:[-85.624813,41.950983]},n2873:{id:"n2873",loc:[-85.624723,41.951789]},n2874:{id:"n2874",loc:[-85.624262,41.9512]},n2875:{id:"n2875",loc:[-85.62414,41.951201]},n2876:{id:"n2876",loc:[-85.624139,41.95112]},n2877:{id:"n2877",loc:[-85.628481,41.945611]},n2878:{id:"n2878",loc:[-85.620072,41.946538]},n2879:{id:"n2879",loc:[-85.622763,41.95099]},n288:{id:"n288",loc:[-85.635237,41.941855]},n2880:{id:"n2880",loc:[-85.62814,41.946963]},n2881:{id:"n2881",loc:[-85.628245,41.947031]},n2882:{id:"n2882",loc:[-85.628331,41.947066]},n2883:{id:"n2883",loc:[-85.629722,41.944444],tags:{leisure:"park",name:"Scouter Park"}},n2884:{id:"n2884",loc:[-85.629977,41.943907]},n2885:{id:"n2885",loc:[-85.629947,41.943775]},n2886:{id:"n2886",loc:[-85.629899,41.943625]},n2887:{id:"n2887",loc:[-85.632286,41.944257]},n2888:{id:"n2888",loc:[-85.632523,41.944179]},n2889:{id:"n2889",loc:[-85.632141,41.944293]},n289:{id:"n289",loc:[-85.635568,41.940475]},n2890:{id:"n2890",loc:[-85.631571,41.9444]},n2891:{id:"n2891",loc:[-85.643236,41.941895]},n2892:{id:"n2892",loc:[-85.62865,41.945353]},n2893:{id:"n2893",loc:[-85.628594,41.945481]},n2894:{id:"n2894",loc:[-85.628581,41.947169]},n2895:{id:"n2895",loc:[-85.631843,41.943793]},n2896:{id:"n2896",loc:[-85.632299,41.943472]},n2897:{id:"n2897",loc:[-85.631519,41.944881]},n2898:{id:"n2898",loc:[-85.628429,41.947219]},n2899:{id:"n2899",loc:[-85.63145,41.945162]},n29:{id:"n29",loc:[-85.637963,41.944263]},n290:{id:"n290",loc:[-85.634584,41.940477]},n2900:{id:"n2900",loc:[-85.630939,41.945519]},n2901:{id:"n2901",loc:[-85.62903,41.945719]},n2902:{id:"n2902",loc:[-85.630521,41.945559]},n2903:{id:"n2903",loc:[-85.629294,41.945585]},n2904:{id:"n2904",loc:[-85.629845,41.945543]},n2905:{id:"n2905",loc:[-85.631497,41.944625]},n2906:{id:"n2906",loc:[-85.630281,41.945553]},n2907:{id:"n2907",loc:[-85.628553,41.946973]},n2908:{id:"n2908",loc:[-85.631383,41.945338]},n2909:{id:"n2909",loc:[-85.628843,41.946103]},n291:{id:"n291",loc:[-85.634583,41.940203]},n2910:{id:"n2910",loc:[-85.631193,41.945473]},n2911:{id:"n2911",loc:[-85.628897,41.945944]},n2912:{id:"n2912",loc:[-85.628789,41.946454]},n2913:{id:"n2913",loc:[-85.632548,41.944563]},n2914:{id:"n2914",loc:[-85.627527,41.944555]},n2915:{id:"n2915",loc:[-85.62752,41.943726]},n2916:{id:"n2916",loc:[-85.627894,41.943723]},n2917:{id:"n2917",loc:[-85.627897,41.943919]},n2918:{id:"n2918",loc:[-85.627991,41.943934]},n2919:{id:"n2919",loc:[-85.628082,41.943966]},n292:{id:"n292",loc:[-85.635567,41.940201]},n2920:{id:"n2920",loc:[-85.628177,41.944015]},n2921:{id:"n2921",loc:[-85.628193,41.944048]},n2922:{id:"n2922",loc:[-85.628167,41.944054]},n2923:{id:"n2923",loc:[-85.628193,41.944094]},n2924:{id:"n2924",loc:[-85.628213,41.944144]},n2925:{id:"n2925",loc:[-85.628214,41.944199]},n2926:{id:"n2926",loc:[-85.62833,41.944196]},n2927:{id:"n2927",loc:[-85.628328,41.944262]},n2928:{id:"n2928",loc:[-85.628173,41.944262]},n2929:{id:"n2929",loc:[-85.628171,41.944293]},n293:{id:"n293",loc:[-85.635818,41.942677],tags:{crossing:"marked",highway:"crossing"}},n2930:{id:"n2930",loc:[-85.628039,41.944296]},n2931:{id:"n2931",loc:[-85.62804,41.944329]},n2932:{id:"n2932",loc:[-85.627829,41.944335]},n2933:{id:"n2933",loc:[-85.627835,41.94455]},n2936:{id:"n2936",loc:[-85.632823,41.945994]},n294:{id:"n294",loc:[-85.635696,41.942712]},n2940:{id:"n2940",loc:[-85.632192,41.945973]},n2941:{id:"n2941",loc:[-85.63226,41.94587]},n2942:{id:"n2942",loc:[-85.632721,41.946036]},n2943:{id:"n2943",loc:[-85.632641,41.946142]},n2944:{id:"n2944",loc:[-85.62937,41.947467]},n2945:{id:"n2945",loc:[-85.62959,41.942936]},n2946:{id:"n2946",loc:[-85.629551,41.94284]},n2947:{id:"n2947",loc:[-85.629501,41.942704]},n2948:{id:"n2948",loc:[-85.629472,41.942578]},n2949:{id:"n2949",loc:[-85.629361,41.941801]},n295:{id:"n295",loc:[-85.635679,41.941962]},n2950:{id:"n2950",loc:[-85.629339,41.941716]},n2951:{id:"n2951",loc:[-85.629315,41.94166]},n2952:{id:"n2952",loc:[-85.629279,41.941602]},n2953:{id:"n2953",loc:[-85.629227,41.941556]},n2954:{id:"n2954",loc:[-85.624261,41.95112]},n2955:{id:"n2955",loc:[-85.629153,41.941524]},n2956:{id:"n2956",loc:[-85.626904,41.941098]},n2957:{id:"n2957",loc:[-85.624588,41.951294]},n2958:{id:"n2958",loc:[-85.631844,41.942945]},n2959:{id:"n2959",loc:[-85.625854,41.949222]},n296:{id:"n296",loc:[-85.635672,41.941337]},n2960:{id:"n2960",loc:[-85.625146,41.955238]},n2961:{id:"n2961",loc:[-85.626745,41.948296]},n2962:{id:"n2962",loc:[-85.625721,41.95524]},n2963:{id:"n2963",loc:[-85.624706,41.952317]},n2964:{id:"n2964",loc:[-85.62609,41.956147]},n2965:{id:"n2965",loc:[-85.624401,41.954928]},n2966:{id:"n2966",loc:[-85.626558,41.955367]},n2967:{id:"n2967",loc:[-85.62468,41.955096]},n2968:{id:"n2968",loc:[-85.624159,41.953929]},n2969:{id:"n2969",loc:[-85.62506,41.951113]},n297:{id:"n297",loc:[-85.635658,41.941284]},n2970:{id:"n2970",loc:[-85.624942,41.951591]},n2971:{id:"n2971",loc:[-85.627399,41.947546]},n2972:{id:"n2972",loc:[-85.627695,41.947404]},n2973:{id:"n2973",loc:[-85.625925,41.94896]},n2974:{id:"n2974",loc:[-85.625725,41.950211]},n2975:{id:"n2975",loc:[-85.627008,41.947963]},n2976:{id:"n2976",loc:[-85.624373,41.953458]},n2977:{id:"n2977",loc:[-85.624137,41.954392]},n2978:{id:"n2978",loc:[-85.628257,41.947307]},n2979:{id:"n2979",loc:[-85.625281,41.95066]},n298:{id:"n298",loc:[-85.635602,41.941166]},n2980:{id:"n2980",loc:[-85.625865,41.949804]},n2981:{id:"n2981",loc:[-85.626508,41.955932]},n2982:{id:"n2982",loc:[-85.626333,41.955216]},n2983:{id:"n2983",loc:[-85.626637,41.955676]},n2984:{id:"n2984",loc:[-85.624223,41.954599]},n2985:{id:"n2985",loc:[-85.626219,41.948671]},n2986:{id:"n2986",loc:[-85.624556,41.953043]},n2987:{id:"n2987",loc:[-85.625598,41.956302]},n2988:{id:"n2988",loc:[-85.624571,41.952971]},n2989:{id:"n2989",loc:[-85.627141,41.940727]},n299:{id:"n299",loc:[-85.635598,41.941138]},n2990:{id:"n2990",loc:[-85.627102,41.939144]},n2991:{id:"n2991",loc:[-85.627127,41.940086]},n2992:{id:"n2992",loc:[-85.627116,41.940843]},n2993:{id:"n2993",loc:[-85.627132,41.9402]},n2994:{id:"n2994",loc:[-85.629734,41.940078]},n2995:{id:"n2995",loc:[-85.6276,41.937412]},n2996:{id:"n2996",loc:[-85.627451,41.937549]},n2997:{id:"n2997",loc:[-85.627375,41.937618]},n2998:{id:"n2998",loc:[-85.627278,41.937728]},n2999:{id:"n2999",loc:[-85.627199,41.937842]},n3:{id:"n3",loc:[-85.627345,41.953983]},n30:{id:"n30",loc:[-85.637882,41.944205]},n300:{id:"n300",loc:[-85.635614,41.941076]},n3000:{id:"n3000",loc:[-85.627141,41.937981]},n3001:{id:"n3001",loc:[-85.627109,41.938153]},n3002:{id:"n3002",loc:[-85.627101,41.938699]},n3003:{id:"n3003",loc:[-85.628311,41.942261]},n3004:{id:"n3004",loc:[-85.628439,41.940082]},n3005:{id:"n3005",loc:[-85.619538,41.942622],tags:{leisure:"slipway"}},n3006:{id:"n3006",loc:[-85.619872,41.942618]},n3007:{id:"n3007",loc:[-85.619755,41.942612]},n3008:{id:"n3008",loc:[-85.619647,41.942628]},n3009:{id:"n3009",loc:[-85.619415,41.942626]},n301:{id:"n301",loc:[-85.635659,41.940956]},n3010:{id:"n3010",loc:[-85.619212,41.942623]},n3011:{id:"n3011",loc:[-85.631485,41.942472]},n3012:{id:"n3012",loc:[-85.630986,41.941786]},n3013:{id:"n3013",loc:[-85.631797,41.942006]},n3014:{id:"n3014",loc:[-85.630972,41.941162]},n3015:{id:"n3015",loc:[-85.631396,41.941611],tags:{railway:"level_crossing"}},n3016:{id:"n3016",loc:[-85.631878,41.941545]},n3017:{id:"n3017",loc:[-85.630461,41.94055]},n3018:{id:"n3018",loc:[-85.629751,41.939539],tags:{railway:"level_crossing"}},n3019:{id:"n3019",loc:[-85.631663,41.941513]},n302:{id:"n302",loc:[-85.635666,41.940922]},n3020:{id:"n3020",loc:[-85.631328,41.941375]},n3021:{id:"n3021",loc:[-85.632554,41.941779]},n3022:{id:"n3022",loc:[-85.63245,41.941769]},n3023:{id:"n3023",loc:[-85.632475,41.941644]},n3024:{id:"n3024",loc:[-85.632581,41.941654]},n3025:{id:"n3025",loc:[-85.631957,41.941352]},n3026:{id:"n3026",loc:[-85.632293,41.941139]},n3027:{id:"n3027",loc:[-85.632315,41.941153]},n3028:{id:"n3028",loc:[-85.632302,41.941262]},n3029:{id:"n3029",loc:[-85.63237,41.941267]},n303:{id:"n303",loc:[-85.635667,41.940877]},n3030:{id:"n3030",loc:[-85.632356,41.941538]},n3031:{id:"n3031",loc:[-85.632134,41.941678]},n3032:{id:"n3032",loc:[-85.631942,41.941687]},n3033:{id:"n3033",loc:[-85.63203,41.941694]},n3034:{id:"n3034",loc:[-85.632166,41.941555]},n3035:{id:"n3035",loc:[-85.632412,41.941416]},n3036:{id:"n3036",loc:[-85.63248,41.941342]},n3037:{id:"n3037",loc:[-85.632502,41.941259]},n3038:{id:"n3038",loc:[-85.632453,41.941161]},n3039:{id:"n3039",loc:[-85.63235,41.941103]},n304:{id:"n304",loc:[-85.635668,41.940655]},n3040:{id:"n3040",loc:[-85.632236,41.941118]},n3041:{id:"n3041",loc:[-85.631894,41.941355]},n3042:{id:"n3042",loc:[-85.631859,41.941411]},n3043:{id:"n3043",loc:[-85.632011,41.941587]},n3044:{id:"n3044",loc:[-85.632446,41.941379]},n3045:{id:"n3045",loc:[-85.632511,41.941416]},n3046:{id:"n3046",loc:[-85.632545,41.941634]},n3047:{id:"n3047",loc:[-85.632612,41.94164]},n3048:{id:"n3048",loc:[-85.632595,41.942197]},n3049:{id:"n3049",loc:[-85.632565,41.942241]},n305:{id:"n305",loc:[-85.635628,41.940617]},n3050:{id:"n3050",loc:[-85.632515,41.942256]},n3051:{id:"n3051",loc:[-85.63245,41.94223]},n3052:{id:"n3052",loc:[-85.632401,41.942174]},n3053:{id:"n3053",loc:[-85.632391,41.942115]},n3054:{id:"n3054",loc:[-85.632029,41.941859]},n3055:{id:"n3055",loc:[-85.631828,41.941639]},n3056:{id:"n3056",loc:[-85.631829,41.941508]},n3057:{id:"n3057",loc:[-85.631281,41.94312]},n3058:{id:"n3058",loc:[-85.631421,41.943065]},n3059:{id:"n3059",loc:[-85.631339,41.942949]},n306:{id:"n306",loc:[-85.635623,41.940272]},n3060:{id:"n3060",loc:[-85.631199,41.943004]},n3061:{id:"n3061",loc:[-85.631102,41.942931]},n3062:{id:"n3062",loc:[-85.631009,41.942809]},n3063:{id:"n3063",loc:[-85.631383,41.94265]},n3064:{id:"n3064",loc:[-85.631477,41.942773]},n3065:{id:"n3065",loc:[-85.630638,41.942809]},n3066:{id:"n3066",loc:[-85.630738,41.942943]},n3067:{id:"n3067",loc:[-85.630841,41.9429]},n3068:{id:"n3068",loc:[-85.630741,41.942766]},n3069:{id:"n3069",loc:[-85.63054,41.942603]},n307:{id:"n307",loc:[-85.635651,41.940183]},n3070:{id:"n3070",loc:[-85.630498,41.942619]},n3071:{id:"n3071",loc:[-85.630567,41.942718]},n3072:{id:"n3072",loc:[-85.630616,41.942698]},n3073:{id:"n3073",loc:[-85.630642,41.94273]},n3074:{id:"n3074",loc:[-85.630686,41.942714]},n3075:{id:"n3075",loc:[-85.630715,41.942754]},n3076:{id:"n3076",loc:[-85.6309,41.942681]},n3077:{id:"n3077",loc:[-85.630843,41.942605]},n3078:{id:"n3078",loc:[-85.6309,41.942581]},n3079:{id:"n3079",loc:[-85.630832,41.942487]},n308:{id:"n308",loc:[-85.635777,41.940183],tags:{crossing:"marked",highway:"crossing"}},n3080:{id:"n3080",loc:[-85.630773,41.942509]},n3081:{id:"n3081",loc:[-85.630718,41.942436]},n3082:{id:"n3082",loc:[-85.630485,41.942524]},n3083:{id:"n3083",loc:[-85.631468,41.941233]},n3084:{id:"n3084",loc:[-85.631334,41.94114]},n3085:{id:"n3085",loc:[-85.632052,41.940568]},n3086:{id:"n3086",loc:[-85.63219,41.940663]},n3087:{id:"n3087",loc:[-85.631323,41.940834]},n3088:{id:"n3088",loc:[-85.631122,41.941002]},n3089:{id:"n3089",loc:[-85.631321,41.941133]},n309:{id:"n309",loc:[-85.636939,41.942544]},n3090:{id:"n3090",loc:[-85.631521,41.940966]},n3091:{id:"n3091",loc:[-85.631103,41.940253]},n3092:{id:"n3092",loc:[-85.631226,41.940211]},n3093:{id:"n3093",loc:[-85.631597,41.940805]},n3094:{id:"n3094",loc:[-85.631474,41.940847]},n3095:{id:"n3095",loc:[-85.631811,41.940534]},n3096:{id:"n3096",loc:[-85.631588,41.94061]},n3097:{id:"n3097",loc:[-85.631438,41.940366]},n3098:{id:"n3098",loc:[-85.631661,41.94029]},n3099:{id:"n3099",loc:[-85.630621,41.940041]},n31:{id:"n31",loc:[-85.63827,41.944203]},n310:{id:"n310",loc:[-85.636323,41.942552]},n3100:{id:"n3100",loc:[-85.630436,41.939773]},n3101:{id:"n3101",loc:[-85.63059,41.939714]},n3102:{id:"n3102",loc:[-85.630775,41.939983]},n3103:{id:"n3103",loc:[-85.63047,41.940167]},n3104:{id:"n3104",loc:[-85.63013,41.939686]},n3105:{id:"n3105",loc:[-85.630302,41.939618]},n3106:{id:"n3106",loc:[-85.630641,41.9401]},n3107:{id:"n3107",loc:[-85.630966,41.940619]},n3108:{id:"n3108",loc:[-85.630874,41.940493]},n3109:{id:"n3109",loc:[-85.630933,41.940469]},n311:{id:"n311",loc:[-85.636257,41.942555]},n3110:{id:"n3110",loc:[-85.630763,41.940236]},n3111:{id:"n3111",loc:[-85.63088,41.940189]},n3112:{id:"n3112",loc:[-85.631142,41.940548]},n3113:{id:"n3113",loc:[-85.630958,41.940871]},n3114:{id:"n3114",loc:[-85.630874,41.940778]},n3115:{id:"n3115",loc:[-85.631062,41.940684]},n3116:{id:"n3116",loc:[-85.631146,41.940777]},n3117:{id:"n3117",loc:[-85.632031,41.940575]},n3118:{id:"n3118",loc:[-85.631777,41.940186]},n3119:{id:"n3119",loc:[-85.631346,41.940179]},n312:{id:"n312",loc:[-85.636208,41.942561]},n3120:{id:"n3120",loc:[-85.631342,41.94012]},n3121:{id:"n3121",loc:[-85.631831,41.940118]},n3122:{id:"n3122",loc:[-85.632115,41.940543]},n3123:{id:"n3123",loc:[-85.631031,41.941683]},n3124:{id:"n3124",loc:[-85.630981,41.941608]},n3125:{id:"n3125",loc:[-85.631209,41.941516]},n3126:{id:"n3126",loc:[-85.631264,41.941586]},n3127:{id:"n3127",loc:[-85.630938,41.94155]},n3128:{id:"n3128",loc:[-85.631156,41.941462]},n3129:{id:"n3129",loc:[-85.631197,41.94152]},n313:{id:"n313",loc:[-85.636159,41.942573]},n3130:{id:"n3130",loc:[-85.630895,41.941485]},n3131:{id:"n3131",loc:[-85.630824,41.941389]},n3132:{id:"n3132",loc:[-85.630986,41.941323]},n3133:{id:"n3133",loc:[-85.631057,41.941419]},n3134:{id:"n3134",loc:[-85.630777,41.941328]},n3135:{id:"n3135",loc:[-85.630907,41.941274]},n3136:{id:"n3136",loc:[-85.630953,41.941335]},n3137:{id:"n3137",loc:[-85.630797,41.941247]},n3138:{id:"n3138",loc:[-85.630701,41.94117]},n3139:{id:"n3139",loc:[-85.630829,41.941113]},n314:{id:"n314",loc:[-85.635743,41.942881]},n3140:{id:"n3140",loc:[-85.6309,41.941201]},n3141:{id:"n3141",loc:[-85.630765,41.941206]},n3142:{id:"n3142",loc:[-85.630739,41.941218]},n3143:{id:"n3143",loc:[-85.630582,41.941039]},n3144:{id:"n3144",loc:[-85.630412,41.940818]},n3145:{id:"n3145",loc:[-85.630509,41.940777]},n3146:{id:"n3146",loc:[-85.630678,41.941004]},n3147:{id:"n3147",loc:[-85.630773,41.942166]},n3148:{id:"n3148",loc:[-85.630708,41.942074]},n3149:{id:"n3149",loc:[-85.630863,41.942013]},n315:{id:"n315",loc:[-85.635452,41.942966]},n3150:{id:"n3150",loc:[-85.630928,41.942105]},n3151:{id:"n3151",loc:[-85.630701,41.942026]},n3152:{id:"n3152",loc:[-85.630665,41.941971]},n3153:{id:"n3153",loc:[-85.630793,41.941918]},n3154:{id:"n3154",loc:[-85.630837,41.94197]},n3155:{id:"n3155",loc:[-85.630757,41.941871]},n3156:{id:"n3156",loc:[-85.630629,41.941923]},n3157:{id:"n3157",loc:[-85.630694,41.941783]},n3158:{id:"n3158",loc:[-85.630534,41.941847]},n3159:{id:"n3159",loc:[-85.630598,41.941935]},n316:{id:"n316",loc:[-85.634911,41.943118]},n3160:{id:"n3160",loc:[-85.631548,41.93938]},n3161:{id:"n3161",loc:[-85.631525,41.939919]},n3162:{id:"n3162",loc:[-85.631648,41.940043]},n3163:{id:"n3163",loc:[-85.624586,41.951121]},n3164:{id:"n3164",loc:[-85.622139,41.952064]},n3165:{id:"n3165",loc:[-85.622141,41.952144]},n3166:{id:"n3166",loc:[-85.621977,41.952146]},n3167:{id:"n3167",loc:[-85.621978,41.952211]},n3168:{id:"n3168",loc:[-85.62191,41.952212]},n3169:{id:"n3169",loc:[-85.633628,41.935437]},n317:{id:"n317",loc:[-85.634743,41.943167]},n3170:{id:"n3170",loc:[-85.632849,41.935518]},n3171:{id:"n3171",loc:[-85.632376,41.93574]},n3172:{id:"n3172",loc:[-85.631517,41.935897]},n3173:{id:"n3173",loc:[-85.630433,41.936124]},n3174:{id:"n3174",loc:[-85.630207,41.936427]},n3175:{id:"n3175",loc:[-85.630346,41.936795]},n3176:{id:"n3176",loc:[-85.62996,41.936974]},n3177:{id:"n3177",loc:[-85.629916,41.937488]},n3178:{id:"n3178",loc:[-85.629946,41.937802]},n3179:{id:"n3179",loc:[-85.629977,41.937905]},n318:{id:"n318",loc:[-85.634401,41.94328]},n3180:{id:"n3180",loc:[-85.63016,41.937909]},n3181:{id:"n3181",loc:[-85.630804,41.937791]},n3182:{id:"n3182",loc:[-85.631688,41.937808]},n3183:{id:"n3183",loc:[-85.631685,41.938008]},n3184:{id:"n3184",loc:[-85.631845,41.938116]},n3185:{id:"n3185",loc:[-85.63207,41.938181]},n3186:{id:"n3186",loc:[-85.632143,41.938371]},n3187:{id:"n3187",loc:[-85.632056,41.938435]},n3188:{id:"n3188",loc:[-85.631787,41.938457]},n3189:{id:"n3189",loc:[-85.631657,41.938728]},n319:{id:"n319",loc:[-85.634345,41.943299]},n3190:{id:"n3190",loc:[-85.631595,41.93775]},n3191:{id:"n3191",loc:[-85.630264,41.937839]},n3192:{id:"n3192",loc:[-85.628591,41.948536]},n3193:{id:"n3193",loc:[-85.63205,41.951181]},n3194:{id:"n3194",loc:[-85.632034,41.949909]},n3195:{id:"n3195",loc:[-85.630841,41.951191]},n3196:{id:"n3196",loc:[-85.632083,41.9537]},n3197:{id:"n3197",loc:[-85.630929,41.959037]},n3198:{id:"n3198",loc:[-85.632151,41.959028]},n3199:{id:"n3199",loc:[-85.630911,41.957428]},n32:{id:"n32",loc:[-85.638273,41.944246]},n320:{id:"n320",loc:[-85.634287,41.943326]},n3200:{id:"n3200",loc:[-85.63213,41.957427]},n3201:{id:"n3201",loc:[-85.632072,41.952447]},n3202:{id:"n3202",loc:[-85.632095,41.954677]},n3203:{id:"n3203",loc:[-85.632111,41.955911]},n3204:{id:"n3204",loc:[-85.630855,41.952457]},n3205:{id:"n3205",loc:[-85.630869,41.953709]},n3206:{id:"n3206",loc:[-85.63088,41.954682]},n3207:{id:"n3207",loc:[-85.630894,41.955913]},n3208:{id:"n3208",loc:[-85.633214,41.948619]},n3209:{id:"n3209",loc:[-85.633253,41.951171]},n321:{id:"n321",loc:[-85.634233,41.943354]},n3210:{id:"n3210",loc:[-85.633234,41.949901]},n3211:{id:"n3211",loc:[-85.633922,41.948616]},n3212:{id:"n3212",loc:[-85.625188,41.947832]},n3213:{id:"n3213",loc:[-85.625208,41.947775]},n3214:{id:"n3214",loc:[-85.625229,41.94776]},n3215:{id:"n3215",loc:[-85.625201,41.947749]},n3216:{id:"n3216",loc:[-85.625168,41.947707]},n3217:{id:"n3217",loc:[-85.625171,41.947609]},n3218:{id:"n3218",loc:[-85.625213,41.947564]},n3219:{id:"n3219",loc:[-85.62529,41.94756]},n322:{id:"n322",loc:[-85.634099,41.943429]},n3220:{id:"n3220",loc:[-85.625303,41.947533]},n3221:{id:"n3221",loc:[-85.625344,41.947482]},n3222:{id:"n3222",loc:[-85.625442,41.947468]},n3223:{id:"n3223",loc:[-85.62565,41.947494]},n3224:{id:"n3224",loc:[-85.625726,41.947613]},n3225:{id:"n3225",loc:[-85.625703,41.947728]},n3226:{id:"n3226",loc:[-85.625534,41.94781]},n3227:{id:"n3227",loc:[-85.625391,41.947822]},n3228:{id:"n3228",loc:[-85.625304,41.947859]},n3229:{id:"n3229",loc:[-85.625203,41.947885]},n323:{id:"n323",loc:[-85.633958,41.943507],tags:{highway:"crossing"}},n3230:{id:"n3230",loc:[-85.624691,41.948659]},n3231:{id:"n3231",loc:[-85.624328,41.948661]},n3232:{id:"n3232",loc:[-85.624331,41.949046]},n3233:{id:"n3233",loc:[-85.624694,41.949045]},n3234:{id:"n3234",loc:[-85.623623,41.949606]},n3235:{id:"n3235",loc:[-85.623623,41.9497]},n3236:{id:"n3236",loc:[-85.623357,41.9497]},n3237:{id:"n3237",loc:[-85.623357,41.949614]},n3238:{id:"n3238",loc:[-85.623974,41.949429]},n3239:{id:"n3239",loc:[-85.623974,41.949605]},n324:{id:"n324",loc:[-85.633698,41.943651],tags:{railway:"crossing"}},n3240:{id:"n3240",loc:[-85.624501,41.951226]},n3241:{id:"n3241",loc:[-85.624501,41.951123]},n3242:{id:"n3242",loc:[-85.624319,41.951123]},n3243:{id:"n3243",loc:[-85.624319,41.951226]},n3244:{id:"n3244",loc:[-85.624121,41.950866]},n3245:{id:"n3245",loc:[-85.624115,41.950525]},n3246:{id:"n3246",loc:[-85.624315,41.950523]},n3247:{id:"n3247",loc:[-85.62432,41.950865]},n3248:{id:"n3248",loc:[-85.624393,41.950867]},n3249:{id:"n3249",loc:[-85.62439,41.950596]},n325:{id:"n325",loc:[-85.633508,41.943757]},n3250:{id:"n3250",loc:[-85.624673,41.950594]},n3251:{id:"n3251",loc:[-85.624675,41.95082]},n3252:{id:"n3252",loc:[-85.62451,41.950821]},n3253:{id:"n3253",loc:[-85.62451,41.950866]},n3254:{id:"n3254",loc:[-85.624101,41.949346]},n3255:{id:"n3255",loc:[-85.624244,41.949346]},n3256:{id:"n3256",loc:[-85.624244,41.949368]},n3257:{id:"n3257",loc:[-85.62434,41.949368]},n3258:{id:"n3258",loc:[-85.624342,41.949351]},n3259:{id:"n3259",loc:[-85.624725,41.949348]},n326:{id:"n326",loc:[-85.634839,41.942974]},n3260:{id:"n3260",loc:[-85.624755,41.950495]},n3261:{id:"n3261",loc:[-85.624121,41.950502]},n3262:{id:"n3262",loc:[-85.625453,41.950163]},n3263:{id:"n3263",loc:[-85.625454,41.949976]},n3264:{id:"n3264",loc:[-85.625549,41.949977]},n3265:{id:"n3265",loc:[-85.62555,41.949833]},n3266:{id:"n3266",loc:[-85.625577,41.949833]},n3267:{id:"n3267",loc:[-85.625578,41.949656]},n3268:{id:"n3268",loc:[-85.625195,41.949655]},n3269:{id:"n3269",loc:[-85.625192,41.950162]},n327:{id:"n327",loc:[-85.634657,41.943028]},n3270:{id:"n3270",loc:[-85.622992,41.949614]},n3271:{id:"n3271",loc:[-85.622991,41.949431]},n3272:{id:"n3272",loc:[-85.620103,41.951]},n3273:{id:"n3273",loc:[-85.605644,41.947468]},n3274:{id:"n3274",loc:[-85.617421,41.947457]},n3275:{id:"n3275",loc:[-85.620078,41.947444]},n3276:{id:"n3276",loc:[-85.620087,41.94924]},n3277:{id:"n3277",loc:[-85.62156,41.948333]},n3278:{id:"n3278",loc:[-85.620106,41.950132]},n3279:{id:"n3279",loc:[-85.637412,41.951136]},n328:{id:"n328",loc:[-85.634222,41.943152]},n3280:{id:"n3280",loc:[-85.635429,41.948608]},n3281:{id:"n3281",loc:[-85.635047,41.947788]},n3282:{id:"n3282",loc:[-85.635048,41.947796]},n3283:{id:"n3283",loc:[-85.635002,41.947797]},n3284:{id:"n3284",loc:[-85.635002,41.947788]},n3285:{id:"n3285",loc:[-85.634914,41.94779]},n3286:{id:"n3286",loc:[-85.634913,41.947753]},n3287:{id:"n3287",loc:[-85.63494,41.947753]},n3288:{id:"n3288",loc:[-85.634938,41.947708]},n3289:{id:"n3289",loc:[-85.635124,41.947705]},n329:{id:"n329",loc:[-85.634099,41.943202]},n3290:{id:"n3290",loc:[-85.635126,41.947787]},n3291:{id:"n3291",loc:[-85.634972,41.947599]},n3292:{id:"n3292",loc:[-85.634921,41.9476]},n3293:{id:"n3293",loc:[-85.63485,41.947546]},n3294:{id:"n3294",loc:[-85.63485,41.947508]},n3295:{id:"n3295",loc:[-85.634924,41.947457]},n3296:{id:"n3296",loc:[-85.634967,41.947456]},n3297:{id:"n3297",loc:[-85.635041,41.947512]},n3298:{id:"n3298",loc:[-85.635041,41.947542]},n3299:{id:"n3299",loc:[-85.634244,41.947839]},n33:{id:"n33",loc:[-85.638257,41.944188]},n330:{id:"n330",loc:[-85.634093,41.943138]},n3300:{id:"n3300",loc:[-85.634243,41.947793]},n3301:{id:"n3301",loc:[-85.634244,41.947686]},n3302:{id:"n3302",loc:[-85.634243,41.947657]},n3303:{id:"n3303",loc:[-85.634462,41.947653]},n3304:{id:"n3304",loc:[-85.634468,41.947835]},n3305:{id:"n3305",loc:[-85.634416,41.948006]},n3306:{id:"n3306",loc:[-85.634415,41.947898]},n3307:{id:"n3307",loc:[-85.634275,41.947899]},n3308:{id:"n3308",loc:[-85.634275,41.947927]},n3309:{id:"n3309",loc:[-85.63425,41.947927]},n331:{id:"n331",loc:[-85.633938,41.943291]},n3310:{id:"n3310",loc:[-85.63425,41.947976]},n3311:{id:"n3311",loc:[-85.634274,41.947976]},n3312:{id:"n3312",loc:[-85.634275,41.948007]},n3313:{id:"n3313",loc:[-85.634342,41.947635]},n3314:{id:"n3314",loc:[-85.634339,41.947497]},n3315:{id:"n3315",loc:[-85.634313,41.94748]},n3316:{id:"n3316",loc:[-85.634287,41.947474]},n3317:{id:"n3317",loc:[-85.63498,41.94815]},n3318:{id:"n3318",loc:[-85.634891,41.94815]},n3319:{id:"n3319",loc:[-85.634892,41.948169]},n332:{id:"n332",loc:[-85.633535,41.943511],tags:{railway:"crossing"}},n3320:{id:"n3320",loc:[-85.634852,41.948169]},n3321:{id:"n3321",loc:[-85.634853,41.948268]},n3322:{id:"n3322",loc:[-85.634832,41.948268]},n3323:{id:"n3323",loc:[-85.634832,41.948296]},n3324:{id:"n3324",loc:[-85.634965,41.948295]},n3325:{id:"n3325",loc:[-85.634966,41.948321]},n3326:{id:"n3326",loc:[-85.634999,41.948321]},n3327:{id:"n3327",loc:[-85.634999,41.948295]},n3328:{id:"n3328",loc:[-85.635175,41.948293]},n3329:{id:"n3329",loc:[-85.635175,41.948262]},n333:{id:"n333",loc:[-85.63339,41.943596]},n3330:{id:"n3330",loc:[-85.635159,41.948262]},n3331:{id:"n3331",loc:[-85.635158,41.948152]},n3332:{id:"n3332",loc:[-85.635067,41.948152]},n3333:{id:"n3333",loc:[-85.635065,41.947966]},n3334:{id:"n3334",loc:[-85.634979,41.947966]},n3335:{id:"n3335",loc:[-85.634307,41.948326]},n3336:{id:"n3336",loc:[-85.634305,41.948298]},n3337:{id:"n3337",loc:[-85.634331,41.948055]},n3338:{id:"n3338",loc:[-85.634331,41.948046]},n3339:{id:"n3339",loc:[-85.634435,41.948047]},n334:{id:"n334",loc:[-85.632842,41.943895]},n3340:{id:"n3340",loc:[-85.634434,41.948375]},n3341:{id:"n3341",loc:[-85.634463,41.948373]},n3342:{id:"n3342",loc:[-85.634464,41.948456]},n3343:{id:"n3343",loc:[-85.63443,41.948457]},n3344:{id:"n3344",loc:[-85.634432,41.948505]},n3345:{id:"n3345",loc:[-85.637386,41.94906]},n3346:{id:"n3346",loc:[-85.637113,41.9486]},n3347:{id:"n3347",loc:[-85.635448,41.949424]},n335:{id:"n335",loc:[-85.633856,41.943315]},n3352:{id:"n3352",loc:[-85.635457,41.949787]},n3353:{id:"n3353",loc:[-85.635459,41.949886]},n336:{id:"n336",loc:[-85.633697,41.943405]},n337:{id:"n337",loc:[-85.63347,41.943181]},n3372:{id:"n3372",loc:[-85.634423,41.950964]},n3373:{id:"n3373",loc:[-85.634424,41.95074]},n3374:{id:"n3374",loc:[-85.634394,41.950284]},n3375:{id:"n3375",loc:[-85.634398,41.950626]},n3376:{id:"n3376",loc:[-85.63452,41.951063]},n3377:{id:"n3377",loc:[-85.634511,41.949977]},n3378:{id:"n3378",loc:[-85.637409,41.949873]},n3379:{id:"n3379",loc:[-85.634824,41.94996]},n338:{id:"n338",loc:[-85.633597,41.943109]},n3380:{id:"n3380",loc:[-85.635437,41.949954]},n3381:{id:"n3381",loc:[-85.634844,41.951064]},n3382:{id:"n3382",loc:[-85.635458,41.951058]},n3383:{id:"n3383",loc:[-85.633921,41.947333]},n3384:{id:"n3384",loc:[-85.634208,41.947793]},n3385:{id:"n3385",loc:[-85.634204,41.947687]},n3386:{id:"n3386",loc:[-85.63424,41.947475]},n3387:{id:"n3387",loc:[-85.63424,41.947635]},n3388:{id:"n3388",loc:[-85.634089,41.948328]},n3389:{id:"n3389",loc:[-85.63424,41.948299]},n339:{id:"n339",loc:[-85.633673,41.943184]},n3390:{id:"n3390",loc:[-85.634239,41.948212]},n3391:{id:"n3391",loc:[-85.634086,41.948214]},n3392:{id:"n3392",loc:[-85.63408,41.948056]},n3393:{id:"n3393",loc:[-85.634093,41.948506]},n3394:{id:"n3394",loc:[-85.64344,41.941866]},n3395:{id:"n3395",loc:[-85.63378,41.95099]},n3396:{id:"n3396",loc:[-85.633779,41.950967]},n3397:{id:"n3397",loc:[-85.63375,41.950746]},n3398:{id:"n3398",loc:[-85.63375,41.950697]},n3399:{id:"n3399",loc:[-85.633903,41.950696]},n34:{id:"n34",loc:[-85.638176,41.944312]},n340:{id:"n340",loc:[-85.633714,41.94316]},n3400:{id:"n3400",loc:[-85.633901,41.950436]},n3401:{id:"n3401",loc:[-85.633492,41.950438]},n3402:{id:"n3402",loc:[-85.633494,41.950756]},n3403:{id:"n3403",loc:[-85.633454,41.950756]},n3404:{id:"n3404",loc:[-85.633456,41.950992]},n3405:{id:"n3405",loc:[-85.633994,41.950284]},n3406:{id:"n3406",loc:[-85.633998,41.950628]},n3407:{id:"n3407",loc:[-85.633364,41.951068]},n3408:{id:"n3408",loc:[-85.633356,41.949982]},n3409:{id:"n3409",loc:[-85.643327,41.941903]},n341:{id:"n341",loc:[-85.633811,41.943256]},n3410:{id:"n3410",loc:[-85.633292,41.953691]},n3411:{id:"n3411",loc:[-85.637432,41.952399]},n3412:{id:"n3412",loc:[-85.633349,41.957422]},n3413:{id:"n3413",loc:[-85.633326,41.955909]},n3414:{id:"n3414",loc:[-85.633307,41.954673]},n3415:{id:"n3415",loc:[-85.633273,41.952436]},n3416:{id:"n3416",loc:[-85.633361,41.95823],tags:{highway:"turning_circle"}},n3417:{id:"n3417",loc:[-85.619899,41.945527]},n3418:{id:"n3418",loc:[-85.643422,41.941946]},n3419:{id:"n3419",loc:[-85.643505,41.942033]},n342:{id:"n342",loc:[-85.633801,41.943261]},n3420:{id:"n3420",loc:[-85.620088,41.945571]},n3421:{id:"n3421",loc:[-85.620051,41.945505]},n3422:{id:"n3422",loc:[-85.62001,41.94541]},n3423:{id:"n3423",loc:[-85.620982,41.944742]},n3424:{id:"n3424",loc:[-85.621305,41.944782]},n3425:{id:"n3425",loc:[-85.621174,41.944819]},n3426:{id:"n3426",loc:[-85.621029,41.944871]},n3427:{id:"n3427",loc:[-85.620741,41.945011]},n3428:{id:"n3428",loc:[-85.620616,41.945085]},n3429:{id:"n3429",loc:[-85.620506,41.945172]},n343:{id:"n343",loc:[-85.63374,41.943514]},n3430:{id:"n3430",loc:[-85.620394,41.945273]},n3431:{id:"n3431",loc:[-85.620316,41.94536]},n3432:{id:"n3432",loc:[-85.620257,41.945452]},n3433:{id:"n3433",loc:[-85.620212,41.945535]},n3434:{id:"n3434",loc:[-85.620101,41.945811]},n3435:{id:"n3435",loc:[-85.620081,41.945937]},n3436:{id:"n3436",loc:[-85.619899,41.943718]},n3437:{id:"n3437",loc:[-85.619969,41.943211]},n3438:{id:"n3438",loc:[-85.619894,41.943292]},n3439:{id:"n3439",loc:[-85.620047,41.944738]},n344:{id:"n344",loc:[-85.633665,41.943441]},n3440:{id:"n3440",loc:[-85.620226,41.946088]},n3441:{id:"n3441",loc:[-85.620225,41.945864]},n3442:{id:"n3442",loc:[-85.620518,41.945863]},n3443:{id:"n3443",loc:[-85.620519,41.945944]},n3444:{id:"n3444",loc:[-85.620388,41.945944]},n3445:{id:"n3445",loc:[-85.620389,41.946088]},n3446:{id:"n3446",loc:[-85.618405,41.946566]},n3447:{id:"n3447",loc:[-85.619156,41.946562]},n3448:{id:"n3448",loc:[-85.619154,41.946319]},n3449:{id:"n3449",loc:[-85.618736,41.946322]},n345:{id:"n345",loc:[-85.633162,41.942947]},n3450:{id:"n3450",loc:[-85.618733,41.94612]},n3451:{id:"n3451",loc:[-85.619317,41.946116]},n3452:{id:"n3452",loc:[-85.619316,41.946023]},n3453:{id:"n3453",loc:[-85.619622,41.946021]},n3454:{id:"n3454",loc:[-85.619624,41.946171]},n3455:{id:"n3455",loc:[-85.61977,41.94617]},n3456:{id:"n3456",loc:[-85.619769,41.94602]},n3457:{id:"n3457",loc:[-85.619732,41.94602]},n3458:{id:"n3458",loc:[-85.619731,41.945856]},n3459:{id:"n3459",loc:[-85.619617,41.945857]},n346:{id:"n346",loc:[-85.633598,41.943083]},n3460:{id:"n3460",loc:[-85.619616,41.945776]},n3461:{id:"n3461",loc:[-85.619447,41.945777]},n3462:{id:"n3462",loc:[-85.619415,41.945778]},n3463:{id:"n3463",loc:[-85.618378,41.945788]},n3464:{id:"n3464",loc:[-85.618384,41.946132]},n3465:{id:"n3465",loc:[-85.618503,41.94613]},n3466:{id:"n3466",loc:[-85.618506,41.946319]},n3467:{id:"n3467",loc:[-85.6184,41.94632]},n3468:{id:"n3468",loc:[-85.618248,41.946416]},n3469:{id:"n3469",loc:[-85.618247,41.946319]},n347:{id:"n347",loc:[-85.63343,41.943179]},n3470:{id:"n3470",loc:[-85.618039,41.946321]},n3471:{id:"n3471",loc:[-85.61804,41.946418]},n3472:{id:"n3472",loc:[-85.620118,41.951895]},n3473:{id:"n3473",loc:[-85.617075,41.95469]},n3474:{id:"n3474",loc:[-85.620107,41.952113]},n3475:{id:"n3475",loc:[-85.620091,41.95232]},n3476:{id:"n3476",loc:[-85.620047,41.952505]},n3477:{id:"n3477",loc:[-85.61998,41.952715]},n3478:{id:"n3478",loc:[-85.619861,41.952986]},n3479:{id:"n3479",loc:[-85.619622,41.953365]},n348:{id:"n348",loc:[-85.633669,41.94341]},n3480:{id:"n3480",loc:[-85.619441,41.953567]},n3481:{id:"n3481",loc:[-85.619259,41.953741]},n3482:{id:"n3482",loc:[-85.618835,41.954056]},n3483:{id:"n3483",loc:[-85.618602,41.954194]},n3484:{id:"n3484",loc:[-85.618305,41.954347]},n3485:{id:"n3485",loc:[-85.618006,41.954466]},n3486:{id:"n3486",loc:[-85.617611,41.954587]},n3487:{id:"n3487",loc:[-85.615094,41.943412]},n3488:{id:"n3488",loc:[-85.619337,41.943025]},n3489:{id:"n3489",loc:[-85.610477,41.945527]},n349:{id:"n349",loc:[-85.633566,41.943466]},n3490:{id:"n3490",loc:[-85.610477,41.943718]},n3491:{id:"n3491",loc:[-85.619804,41.942976]},n3492:{id:"n3492",loc:[-85.61921,41.942672]},n3493:{id:"n3493",loc:[-85.619862,41.942836]},n3494:{id:"n3494",loc:[-85.616326,41.942769]},n3495:{id:"n3495",loc:[-85.617953,41.942917]},n3496:{id:"n3496",loc:[-85.61972,41.942728]},n3497:{id:"n3497",loc:[-85.61944,41.942784]},n3498:{id:"n3498",loc:[-85.615323,41.942841]},n3499:{id:"n3499",loc:[-85.612923,41.943718]},n35:{id:"n35",loc:[-85.637928,41.944249]},n350:{id:"n350",loc:[-85.633031,41.942986]},n3500:{id:"n3500",loc:[-85.61958,41.942756]},n3501:{id:"n3501",loc:[-85.619643,41.942647],tags:{leisure:"fishing"}},n3502:{id:"n3502",loc:[-85.619935,41.942962]},n3503:{id:"n3503",loc:[-85.629677,41.954687]},n3504:{id:"n3504",loc:[-85.629083,41.953722]},n3505:{id:"n3505",loc:[-85.621907,41.952067]},n3506:{id:"n3506",loc:[-85.621788,41.952058]},n3507:{id:"n3507",loc:[-85.629665,41.953718]},n3508:{id:"n3508",loc:[-85.624454,41.954707]},n3509:{id:"n3509",loc:[-85.634609,41.954585]},n351:{id:"n351",loc:[-85.633238,41.94283]},n3510:{id:"n3510",loc:[-85.634595,41.953772]},n3511:{id:"n3511",loc:[-85.633425,41.953783]},n3512:{id:"n3512",loc:[-85.633439,41.954596]},n3517:{id:"n3517",loc:[-85.621789,41.952179]},n3518:{id:"n3518",loc:[-85.624105,41.954704]},n3519:{id:"n3519",loc:[-85.623306,41.954542]},n352:{id:"n352",loc:[-85.633173,41.943556]},n3520:{id:"n3520",loc:[-85.623123,41.954502]},n3521:{id:"n3521",loc:[-85.622965,41.954473]},n3522:{id:"n3522",loc:[-85.622822,41.954455]},n3523:{id:"n3523",loc:[-85.62269,41.954448]},n3524:{id:"n3524",loc:[-85.622388,41.954467]},n3525:{id:"n3525",loc:[-85.62403,41.954895]},n3526:{id:"n3526",loc:[-85.623579,41.954855]},n3527:{id:"n3527",loc:[-85.623836,41.954951]},n3528:{id:"n3528",loc:[-85.622473,41.954592]},n3529:{id:"n3529",loc:[-85.622753,41.95458]},n353:{id:"n353",loc:[-85.633127,41.943552]},n3530:{id:"n3530",loc:[-85.62404,41.955078]},n3531:{id:"n3531",loc:[-85.624126,41.954999]},n3532:{id:"n3532",loc:[-85.623171,41.954687]},n3533:{id:"n3533",loc:[-85.624276,41.955206]},n3534:{id:"n3534",loc:[-85.62491,41.952801]},n3535:{id:"n3535",loc:[-85.625186,41.952756]},n3536:{id:"n3536",loc:[-85.625552,41.952792]},n3537:{id:"n3537",loc:[-85.626001,41.952948]},n3538:{id:"n3538",loc:[-85.626528,41.952984]},n3539:{id:"n3539",loc:[-85.626942,41.952886]},n354:{id:"n354",loc:[-85.632745,41.943222]},n3540:{id:"n3540",loc:[-85.627092,41.952685]},n3541:{id:"n3541",loc:[-85.627212,41.95244]},n3542:{id:"n3542",loc:[-85.627158,41.952226]},n3543:{id:"n3543",loc:[-85.627002,41.951972]},n3544:{id:"n3544",loc:[-85.626822,41.951838]},n3545:{id:"n3545",loc:[-85.626528,41.951807]},n3546:{id:"n3546",loc:[-85.625653,41.951852]},n3547:{id:"n3547",loc:[-85.625348,41.951834]},n3548:{id:"n3548",loc:[-85.625114,41.951767]},n3549:{id:"n3549",loc:[-85.620627,41.954682]},n355:{id:"n355",loc:[-85.632756,41.943199]},n3550:{id:"n3550",loc:[-85.622758,41.951884]},n3551:{id:"n3551",loc:[-85.618135,41.954734]},n3552:{id:"n3552",loc:[-85.620229,41.95472]},n3553:{id:"n3553",loc:[-85.624491,41.955573]},n3554:{id:"n3554",loc:[-85.621792,41.958314]},n3555:{id:"n3555",loc:[-85.623395,41.960001]},n3556:{id:"n3556",loc:[-85.620461,41.956212]},n3557:{id:"n3557",loc:[-85.62109,41.956766]},n3558:{id:"n3558",loc:[-85.620246,41.956224]},n3559:{id:"n3559",loc:[-85.625017,41.956068]},n356:{id:"n356",loc:[-85.632855,41.943147]},n3560:{id:"n3560",loc:[-85.622795,41.959702]},n3561:{id:"n3561",loc:[-85.621573,41.958457]},n3562:{id:"n3562",loc:[-85.619631,41.9573]},n3563:{id:"n3563",loc:[-85.62095,41.956311]},n3564:{id:"n3564",loc:[-85.619694,41.957408]},n3565:{id:"n3565",loc:[-85.621079,41.957751]},n3566:{id:"n3566",loc:[-85.622426,41.961142]},n3567:{id:"n3567",loc:[-85.623251,41.960484]},n3568:{id:"n3568",loc:[-85.619084,41.956291]},n3569:{id:"n3569",loc:[-85.622227,41.959303]},n357:{id:"n357",loc:[-85.632888,41.94315]},n3570:{id:"n3570",loc:[-85.620976,41.959104]},n3571:{id:"n3571",loc:[-85.621208,41.95653]},n3572:{id:"n3572",loc:[-85.623531,41.95951]},n3573:{id:"n3573",loc:[-85.623556,41.957935]},n3574:{id:"n3574",loc:[-85.623037,41.95746]},n3575:{id:"n3575",loc:[-85.621175,41.956427]},n3576:{id:"n3576",loc:[-85.622651,41.960109]},n3577:{id:"n3577",loc:[-85.621803,41.960747]},n3578:{id:"n3578",loc:[-85.620791,41.961874]},n3579:{id:"n3579",loc:[-85.625295,41.956786]},n358:{id:"n358",loc:[-85.633232,41.943547]},n3580:{id:"n3580",loc:[-85.619662,41.956894]},n3581:{id:"n3581",loc:[-85.622442,41.958708]},n3582:{id:"n3582",loc:[-85.621744,41.955864]},n3583:{id:"n3583",loc:[-85.621336,41.959212]},n3584:{id:"n3584",loc:[-85.622801,41.957304]},n3585:{id:"n3585",loc:[-85.619973,41.957433]},n3586:{id:"n3586",loc:[-85.619556,41.955717]},n3587:{id:"n3587",loc:[-85.622978,41.958601]},n3588:{id:"n3588",loc:[-85.625396,41.956264]},n3589:{id:"n3589",loc:[-85.623525,41.958034]},n359:{id:"n359",loc:[-85.633302,41.94351]},n3590:{id:"n3590",loc:[-85.623299,41.959631]},n3591:{id:"n3591",loc:[-85.622678,41.959873]},n3592:{id:"n3592",loc:[-85.625553,41.956179]},n3593:{id:"n3593",loc:[-85.623557,41.959231]},n3594:{id:"n3594",loc:[-85.622843,41.957373]},n3595:{id:"n3595",loc:[-85.619378,41.955677]},n3596:{id:"n3596",loc:[-85.620092,41.955425]},n3597:{id:"n3597",loc:[-85.622666,41.96044]},n3598:{id:"n3598",loc:[-85.621996,41.960256]},n3599:{id:"n3599",loc:[-85.623273,41.959997]},n36:{id:"n36",loc:[-85.637894,41.945551]},n360:{id:"n360",loc:[-85.633442,41.943794],tags:{highway:"crossing"}},n3600:{id:"n3600",loc:[-85.62477,41.95689]},n3601:{id:"n3601",loc:[-85.621641,41.955015]},n3602:{id:"n3602",loc:[-85.622495,41.960392]},n3603:{id:"n3603",loc:[-85.61918,41.955565]},n3604:{id:"n3604",loc:[-85.620017,41.955505]},n3605:{id:"n3605",loc:[-85.621739,41.956315]},n3606:{id:"n3606",loc:[-85.622957,41.959837]},n3607:{id:"n3607",loc:[-85.620912,41.960919]},n3608:{id:"n3608",loc:[-85.625231,41.956235]},n3609:{id:"n3609",loc:[-85.620976,41.961868]},n361:{id:"n361",loc:[-85.633381,41.94383]},n3610:{id:"n3610",loc:[-85.620956,41.958908]},n3611:{id:"n3611",loc:[-85.619035,41.956139]},n3612:{id:"n3612",loc:[-85.623643,41.958669]},n3613:{id:"n3613",loc:[-85.61949,41.956539]},n3614:{id:"n3614",loc:[-85.621927,41.958242]},n3615:{id:"n3615",loc:[-85.620826,41.955721]},n3616:{id:"n3616",loc:[-85.621202,41.961321]},n3617:{id:"n3617",loc:[-85.624877,41.95594]},n3618:{id:"n3618",loc:[-85.62065,41.958369]},n3619:{id:"n3619",loc:[-85.621524,41.956279]},n362:{id:"n362",loc:[-85.632977,41.944053]},n3620:{id:"n3620",loc:[-85.624662,41.955932]},n3621:{id:"n3621",loc:[-85.623048,41.958509]},n3622:{id:"n3622",loc:[-85.62111,41.95754]},n3623:{id:"n3623",loc:[-85.621508,41.954847]},n3624:{id:"n3624",loc:[-85.620655,41.958601]},n3625:{id:"n3625",loc:[-85.62154,41.954971]},n3626:{id:"n3626",loc:[-85.621691,41.955521]},n3627:{id:"n3627",loc:[-85.62154,41.954739]},n3628:{id:"n3628",loc:[-85.621996,41.959913]},n3629:{id:"n3629",loc:[-85.622286,41.960699]},n363:{id:"n363",loc:[-85.632915,41.943981],tags:{crossing:"marked",highway:"crossing"}},n3630:{id:"n3630",loc:[-85.622844,41.9572]},n3631:{id:"n3631",loc:[-85.620252,41.955446]},n3632:{id:"n3632",loc:[-85.623434,41.957528]},n3633:{id:"n3633",loc:[-85.623429,41.956858]},n3634:{id:"n3634",loc:[-85.622957,41.957137]},n3635:{id:"n3635",loc:[-85.622554,41.959027]},n3636:{id:"n3636",loc:[-85.623289,41.958314]},n3637:{id:"n3637",loc:[-85.622977,41.960855]},n3638:{id:"n3638",loc:[-85.624008,41.956953]},n3639:{id:"n3639",loc:[-85.621278,41.960855]},n364:{id:"n364",loc:[-85.632724,41.943969],tags:{crossing:"marked",highway:"crossing"}},n3640:{id:"n3640",loc:[-85.623128,41.956993]},n3641:{id:"n3641",loc:[-85.622452,41.959183]},n3642:{id:"n3642",loc:[-85.621095,41.961082]},n3643:{id:"n3643",loc:[-85.622011,41.960544]},n3644:{id:"n3644",loc:[-85.621637,41.955385]},n3645:{id:"n3645",loc:[-85.620999,41.959271]},n3646:{id:"n3646",loc:[-85.620044,41.956347]},n3647:{id:"n3647",loc:[-85.621936,41.959682]},n3648:{id:"n3648",loc:[-85.623761,41.95685]},n3649:{id:"n3649",loc:[-85.621239,41.959343]},n365:{id:"n365",loc:[-85.632621,41.944034]},n3650:{id:"n3650",loc:[-85.621073,41.956012]},n3651:{id:"n3651",loc:[-85.621271,41.956184]},n3652:{id:"n3652",loc:[-85.623444,41.95778]},n3653:{id:"n3653",loc:[-85.62125,41.96186]},n3654:{id:"n3654",loc:[-85.62169,41.961059]},n3655:{id:"n3655",loc:[-85.620012,41.955637]},n3656:{id:"n3656",loc:[-85.621058,41.9573]},n3657:{id:"n3657",loc:[-85.621138,41.957663]},n3658:{id:"n3658",loc:[-85.620773,41.957895]},n3659:{id:"n3659",loc:[-85.62007,41.957157]},n366:{id:"n366",loc:[-85.632684,41.944109],tags:{crossing:"marked",highway:"crossing"}},n3660:{id:"n3660",loc:[-85.624534,41.955844]},n3661:{id:"n3661",loc:[-85.621932,41.960807]},n3662:{id:"n3662",loc:[-85.623358,41.958138]},n3663:{id:"n3663",loc:[-85.620456,41.955514]},n3664:{id:"n3664",loc:[-85.623504,41.957607]},n3665:{id:"n3665",loc:[-85.621444,41.960751]},n3666:{id:"n3666",loc:[-85.623492,41.960213]},n3667:{id:"n3667",loc:[-85.621669,41.954655]},n3668:{id:"n3668",loc:[-85.623106,41.958685]},n3669:{id:"n3669",loc:[-85.620922,41.957867]},n367:{id:"n367",loc:[-85.632738,41.944172]},n3670:{id:"n3670",loc:[-85.620092,41.957296]},n3671:{id:"n3671",loc:[-85.621669,41.955222]},n3672:{id:"n3672",loc:[-85.621614,41.960967]},n3673:{id:"n3673",loc:[-85.621691,41.955732]},n3674:{id:"n3674",loc:[-85.619207,41.956419]},n3675:{id:"n3675",loc:[-85.621116,41.956603]},n3676:{id:"n3676",loc:[-85.623311,41.956929]},n3677:{id:"n3677",loc:[-85.625671,41.956499]},n3678:{id:"n3678",loc:[-85.623525,41.956738]},n3679:{id:"n3679",loc:[-85.625381,41.956634]},n368:{id:"n368",loc:[-85.63287,41.944135],tags:{crossing:"marked",highway:"crossing"}},n3680:{id:"n3680",loc:[-85.620096,41.95677]},n3681:{id:"n3681",loc:[-85.623803,41.958745]},n3682:{id:"n3682",loc:[-85.623498,41.958457]},n3683:{id:"n3683",loc:[-85.624223,41.957009]},n3684:{id:"n3684",loc:[-85.620026,41.956946]},n3685:{id:"n3685",loc:[-85.623005,41.960124]},n3686:{id:"n3686",loc:[-85.619073,41.955832]},n3687:{id:"n3687",loc:[-85.621744,41.95501]},n3688:{id:"n3688",loc:[-85.620804,41.958781]},n3689:{id:"n3689",loc:[-85.619844,41.957448]},n369:{id:"n369",loc:[-85.63298,41.944076]},n3690:{id:"n3690",loc:[-85.623713,41.958872]},n3691:{id:"n3691",loc:[-85.622329,41.960507]},n3692:{id:"n3692",loc:[-85.620804,41.956244]},n3693:{id:"n3693",loc:[-85.621818,41.955968]},n3694:{id:"n3694",loc:[-85.621405,41.958697]},n3695:{id:"n3695",loc:[-85.620998,41.960996]},n3696:{id:"n3696",loc:[-85.621621,41.960444]},n3697:{id:"n3697",loc:[-85.620941,41.961637]},n3698:{id:"n3698",loc:[-85.622195,41.958333]},n3699:{id:"n3699",loc:[-85.621668,41.961529]},n37:{id:"n37",loc:[-85.637611,41.945383]},n370:{id:"n370",loc:[-85.633191,41.944471]},n3700:{id:"n3700",loc:[-85.621015,41.957049]},n3701:{id:"n3701",loc:[-85.619368,41.955521]},n3702:{id:"n3702",loc:[-85.651578,41.942534]},n3703:{id:"n3703",loc:[-85.651541,41.943847]},n3704:{id:"n3704",loc:[-85.651365,41.944817]},n3705:{id:"n3705",loc:[-85.651076,41.945985]},n3706:{id:"n3706",loc:[-85.650626,41.947213]},n3707:{id:"n3707",loc:[-85.649669,41.949161]},n3708:{id:"n3708",loc:[-85.641802,41.961801]},n3709:{id:"n3709",loc:[-85.623333,41.961987]},n371:{id:"n371",loc:[-85.633132,41.94372]},n3710:{id:"n3710",loc:[-85.620621,41.965658]},n3711:{id:"n3711",loc:[-85.605673,41.965764]},n3712:{id:"n3712",loc:[-85.605664,41.962094]},n3713:{id:"n3713",loc:[-85.583774,41.962178]},n3714:{id:"n3714",loc:[-85.583774,41.961789]},n3715:{id:"n3715",loc:[-85.581303,41.961783]},n3716:{id:"n3716",loc:[-85.581245,41.958394]},n3717:{id:"n3717",loc:[-85.585299,41.955483]},n3718:{id:"n3718",loc:[-85.585588,41.955331]},n3719:{id:"n3719",loc:[-85.586053,41.955163]},n372:{id:"n372",loc:[-85.633011,41.943788]},n3720:{id:"n3720",loc:[-85.58632,41.955076]},n3721:{id:"n3721",loc:[-85.586478,41.955025]},n3722:{id:"n3722",loc:[-85.58692,41.954947]},n3723:{id:"n3723",loc:[-85.587345,41.954913]},n3724:{id:"n3724",loc:[-85.605592,41.954766]},n3725:{id:"n3725",loc:[-85.605303,41.936236]},n3726:{id:"n3726",loc:[-85.606941,41.936117]},n3727:{id:"n3727",loc:[-85.60876,41.935856]},n3728:{id:"n3728",loc:[-85.610092,41.935451]},n3729:{id:"n3729",loc:[-85.610681,41.935247]},n373:{id:"n373",loc:[-85.632854,41.943632]},n3730:{id:"n3730",loc:[-85.611446,41.934955]},n3731:{id:"n3731",loc:[-85.612057,41.934696]},n3732:{id:"n3732",loc:[-85.613256,41.934084]},n3733:{id:"n3733",loc:[-85.613948,41.933682]},n3734:{id:"n3734",loc:[-85.614638,41.933212]},n3735:{id:"n3735",loc:[-85.619801,41.929305]},n3736:{id:"n3736",loc:[-85.619768,41.925548]},n3737:{id:"n3737",loc:[-85.625761,41.925597]},n3738:{id:"n3738",loc:[-85.6263,41.927323]},n3739:{id:"n3739",loc:[-85.633708,41.927402]},n374:{id:"n374",loc:[-85.632974,41.943565]},n3740:{id:"n3740",loc:[-85.633927,41.929109]},n3741:{id:"n3741",loc:[-85.639213,41.929088]},n3742:{id:"n3742",loc:[-85.639204,41.925488]},n3743:{id:"n3743",loc:[-85.651425,41.925406]},n3744:{id:"n3744",loc:[-85.643386,41.941933]},n3745:{id:"n3745",loc:[-85.642776,41.941161]},n3746:{id:"n3746",loc:[-85.637277,41.948812]},n3747:{id:"n3747",loc:[-85.637366,41.94897]},n3748:{id:"n3748",loc:[-85.637329,41.94889]},n3749:{id:"n3749",loc:[-85.629649,41.952596]},n375:{id:"n375",loc:[-85.632741,41.943351]},n3750:{id:"n3750",loc:[-85.630291,41.954684]},n3751:{id:"n3751",loc:[-85.630284,41.953713]},n3752:{id:"n3752",loc:[-85.630269,41.952463]},n3753:{id:"n3753",loc:[-85.633933,41.949896]},n3754:{id:"n3754",loc:[-85.629339,41.941467]},n3755:{id:"n3755",loc:[-85.629857,41.94316]},n3756:{id:"n3756",loc:[-85.629987,41.944025]},n3757:{id:"n3757",loc:[-85.628538,41.948604]},n3758:{id:"n3758",loc:[-85.627415,41.957442]},n3759:{id:"n3759",loc:[-85.627019,41.957369]},n376:{id:"n376",loc:[-85.63251,41.943481]},n3760:{id:"n3760",loc:[-85.62167,41.952179]},n3761:{id:"n3761",loc:[-85.62167,41.952138]},n3762:{id:"n3762",loc:[-85.621562,41.952139]},n3763:{id:"n3763",loc:[-85.621562,41.952058]},n3764:{id:"n3764",loc:[-85.621476,41.952043]},n3765:{id:"n3765",loc:[-85.621477,41.952132]},n3766:{id:"n3766",loc:[-85.621386,41.952132]},n3767:{id:"n3767",loc:[-85.621387,41.95214]},n3768:{id:"n3768",loc:[-85.621262,41.95214]},n3769:{id:"n3769",loc:[-85.621261,41.952038]},n377:{id:"n377",loc:[-85.632706,41.943715]},n3770:{id:"n3770",loc:[-85.621389,41.952038]},n3771:{id:"n3771",loc:[-85.621389,41.952043]},n3772:{id:"n3772",loc:[-85.620898,41.952024]},n3773:{id:"n3773",loc:[-85.620898,41.952085]},n3774:{id:"n3774",loc:[-85.620774,41.952084]},n3775:{id:"n3775",loc:[-85.620774,41.952023]},n3776:{id:"n3776",loc:[-85.620749,41.952036]},n3777:{id:"n3777",loc:[-85.620723,41.952097]},n3778:{id:"n3778",loc:[-85.626158,41.958996]},n3779:{id:"n3779",loc:[-85.626319,41.958686]},n378:{id:"n378",loc:[-85.638683,41.943295]},n3780:{id:"n3780",loc:[-85.626119,41.958629]},n3781:{id:"n3781",loc:[-85.626064,41.958733]},n3782:{id:"n3782",loc:[-85.626155,41.958759]},n3783:{id:"n3783",loc:[-85.626048,41.958965]},n3784:{id:"n3784",loc:[-85.620648,41.952079]},n3785:{id:"n3785",loc:[-85.63826,41.961213]},n3786:{id:"n3786",loc:[-85.638003,41.961614]},n3787:{id:"n3787",loc:[-85.638817,41.961902]},n3788:{id:"n3788",loc:[-85.639073,41.961501]},n3789:{id:"n3789",loc:[-85.620674,41.952018]},n379:{id:"n379",loc:[-85.638684,41.94323]},n3790:{id:"n3790",loc:[-85.62082,41.952106]},n3791:{id:"n3791",loc:[-85.620819,41.952143]},n3792:{id:"n3792",loc:[-85.620778,41.952143]},n3793:{id:"n3793",loc:[-85.620778,41.952106]},n3794:{id:"n3794",loc:[-85.620563,41.952276]},n3795:{id:"n3795",loc:[-85.620543,41.95238]},n3796:{id:"n3796",loc:[-85.620422,41.952367]},n3797:{id:"n3797",loc:[-85.620441,41.952263]},n3798:{id:"n3798",loc:[-85.620561,41.952266]},n3799:{id:"n3799",loc:[-85.620444,41.952254]},n38:{id:"n38",loc:[-85.63879,41.943295]},n380:{id:"n380",loc:[-85.638627,41.94322]},n3800:{id:"n3800",loc:[-85.620773,41.955585]},n3801:{id:"n3801",loc:[-85.621265,41.955989]},n3802:{id:"n3802",loc:[-85.620692,41.954969]},n3803:{id:"n3803",loc:[-85.620691,41.955367]},n3804:{id:"n3804",loc:[-85.620458,41.952178]},n3805:{id:"n3805",loc:[-85.620575,41.95219]},n3806:{id:"n3806",loc:[-85.617609,41.952712]},n3807:{id:"n3807",loc:[-85.617533,41.952801],tags:{entrance:"yes"}},n3808:{id:"n3808",loc:[-85.616816,41.952911]},n3809:{id:"n3809",loc:[-85.616797,41.952901]},n381:{id:"n381",loc:[-85.638624,41.943294]},n3810:{id:"n3810",loc:[-85.616343,41.952694]},n3811:{id:"n3811",loc:[-85.616336,41.952729]},n3812:{id:"n3812",loc:[-85.616343,41.952772]},n3813:{id:"n3813",loc:[-85.628479,41.948649]},n3814:{id:"n3814",loc:[-85.628413,41.948679]},n3815:{id:"n3815",loc:[-85.628336,41.948694]},n3816:{id:"n3816",loc:[-85.62826,41.948694]},n3817:{id:"n3817",loc:[-85.628185,41.948679]},n3818:{id:"n3818",loc:[-85.628103,41.948649]},n3819:{id:"n3819",loc:[-85.627482,41.948395]},n382:{id:"n382",loc:[-85.638437,41.943291]},n3820:{id:"n3820",loc:[-85.619957,41.951168]},n3821:{id:"n3821",loc:[-85.619955,41.952077]},n3822:{id:"n3822",loc:[-85.619843,41.952666]},n3823:{id:"n3823",loc:[-85.619513,41.95324]},n3824:{id:"n3824",loc:[-85.619163,41.953668]},n3825:{id:"n3825",loc:[-85.618813,41.953947]},n3826:{id:"n3826",loc:[-85.618265,41.954252]},n3827:{id:"n3827",loc:[-85.617691,41.954458]},n3828:{id:"n3828",loc:[-85.616978,41.95459]},n3829:{id:"n3829",loc:[-85.615408,41.954628]},n383:{id:"n383",loc:[-85.63844,41.943209]},n3830:{id:"n3830",loc:[-85.615374,41.951076]},n3831:{id:"n3831",loc:[-85.61932,41.947564]},n3832:{id:"n3832",loc:[-85.610553,41.94755]},n3833:{id:"n3833",loc:[-85.610572,41.951065]},n3834:{id:"n3834",loc:[-85.617548,41.94757]},n3835:{id:"n3835",loc:[-85.619842,41.947939]},n3836:{id:"n3836",loc:[-85.619874,41.950905]},n3837:{id:"n3837",loc:[-85.619695,41.950911]},n3838:{id:"n3838",loc:[-85.617591,41.951078]},n3839:{id:"n3839",loc:[-85.619551,41.951065]},n384:{id:"n384",loc:[-85.632616,41.944021]},n3840:{id:"n3840",loc:[-85.626813,41.947337]},n3841:{id:"n3841",loc:[-85.616371,41.952814]},n3842:{id:"n3842",loc:[-85.617205,41.951308]},n3843:{id:"n3843",loc:[-85.616795,41.950953]},n3844:{id:"n3844",loc:[-85.617441,41.950889]},n3845:{id:"n3845",loc:[-85.619155,41.949377]},n3846:{id:"n3846",loc:[-85.618556,41.949377]},n3847:{id:"n3847",loc:[-85.618557,41.948372]},n3848:{id:"n3848",loc:[-85.619156,41.948372]},n3849:{id:"n3849",loc:[-85.61927,41.949796]},n385:{id:"n385",loc:[-85.632319,41.944172]},n3850:{id:"n3850",loc:[-85.61926,41.948344]},n3851:{id:"n3851",loc:[-85.619219,41.948264]},n3852:{id:"n3852",loc:[-85.619147,41.948196]},n3853:{id:"n3853",loc:[-85.619049,41.948144]},n3854:{id:"n3854",loc:[-85.618942,41.948116]},n3855:{id:"n3855",loc:[-85.618822,41.948109]},n3856:{id:"n3856",loc:[-85.618699,41.94813]},n3857:{id:"n3857",loc:[-85.618937,41.951943]},n3858:{id:"n3858",loc:[-85.616762,41.952222]},n3859:{id:"n3859",loc:[-85.616799,41.95472]},n386:{id:"n386",loc:[-85.63221,41.944066]},n3860:{id:"n3860",loc:[-85.616458,41.954735]},n3861:{id:"n3861",loc:[-85.61763,41.951515]},n3862:{id:"n3862",loc:[-85.617735,41.951572]},n3863:{id:"n3863",loc:[-85.61929,41.951573]},n3864:{id:"n3864",loc:[-85.617134,41.951348]},n3865:{id:"n3865",loc:[-85.616598,41.95192]},n3866:{id:"n3866",loc:[-85.616557,41.951997]},n3867:{id:"n3867",loc:[-85.61658,41.952093]},n3868:{id:"n3868",loc:[-85.616636,41.952145]},n3869:{id:"n3869",loc:[-85.616918,41.952276]},n387:{id:"n387",loc:[-85.632524,41.943912]},n3870:{id:"n3870",loc:[-85.617098,41.952235]},n3871:{id:"n3871",loc:[-85.61892,41.951467]},n3872:{id:"n3872",loc:[-85.618035,41.951473]},n3873:{id:"n3873",loc:[-85.618036,41.951572]},n3874:{id:"n3874",loc:[-85.61892,41.951573]},n3875:{id:"n3875",loc:[-85.618919,41.951957]},n3876:{id:"n3876",loc:[-85.619457,41.952237]},n3877:{id:"n3877",loc:[-85.618178,41.953618]},n3878:{id:"n3878",loc:[-85.617658,41.953366]},n3879:{id:"n3879",loc:[-85.617987,41.953024]},n388:{id:"n388",loc:[-85.632268,41.943621]},n3880:{id:"n3880",loc:[-85.618429,41.953248]},n3881:{id:"n3881",loc:[-85.618554,41.953119]},n3882:{id:"n3882",loc:[-85.618077,41.952868]},n3883:{id:"n3883",loc:[-85.618039,41.952886]},n3884:{id:"n3884",loc:[-85.619375,41.952169]},n3885:{id:"n3885",loc:[-85.618137,41.953538]},n3886:{id:"n3886",loc:[-85.61799,41.953555]},n3887:{id:"n3887",loc:[-85.617729,41.953423]},n3888:{id:"n3888",loc:[-85.618101,41.953029]},n3889:{id:"n3889",loc:[-85.618516,41.953119]},n389:{id:"n389",loc:[-85.631951,41.943773]},n3890:{id:"n3890",loc:[-85.619132,41.952042]},n3891:{id:"n3891",loc:[-85.618235,41.952981]},n3892:{id:"n3892",loc:[-85.618485,41.952425]},n3893:{id:"n3893",loc:[-85.618676,41.952519]},n3894:{id:"n3894",loc:[-85.618942,41.952648]},n3895:{id:"n3895",loc:[-85.618287,41.953122]},n3896:{id:"n3896",loc:[-85.617914,41.953516]},n3897:{id:"n3897",loc:[-85.617836,41.953573]},n3898:{id:"n3898",loc:[-85.616477,41.95289]},n3899:{id:"n3899",loc:[-85.618441,41.953201]},n39:{id:"n39",loc:[-85.619931,41.951013]},n390:{id:"n390",loc:[-85.631981,41.943654]},n3900:{id:"n3900",loc:[-85.617537,41.953335]},n3901:{id:"n3901",loc:[-85.617221,41.953166]},n3902:{id:"n3902",loc:[-85.617253,41.953135]},n3903:{id:"n3903",loc:[-85.617211,41.953114]},n3904:{id:"n3904",loc:[-85.617197,41.95313]},n3905:{id:"n3905",loc:[-85.616802,41.952925]},n3906:{id:"n3906",loc:[-85.616771,41.952928]},n3907:{id:"n3907",loc:[-85.616493,41.952785]},n3908:{id:"n3908",loc:[-85.616823,41.952426]},n3909:{id:"n3909",loc:[-85.617191,41.952616]},n391:{id:"n391",loc:[-85.631886,41.943699]},n3910:{id:"n3910",loc:[-85.61724,41.952559]},n3911:{id:"n3911",loc:[-85.61721,41.952542]},n3912:{id:"n3912",loc:[-85.617395,41.952351]},n3913:{id:"n3913",loc:[-85.617426,41.952368]},n3914:{id:"n3914",loc:[-85.617483,41.952309]},n3915:{id:"n3915",loc:[-85.617332,41.952229]},n3916:{id:"n3916",loc:[-85.617451,41.952102]},n3917:{id:"n3917",loc:[-85.617477,41.952115]},n3918:{id:"n3918",loc:[-85.617658,41.951923]},n3919:{id:"n3919",loc:[-85.617634,41.95191]},n392:{id:"n392",loc:[-85.631807,41.943606]},n3920:{id:"n3920",loc:[-85.617747,41.951786]},n3921:{id:"n3921",loc:[-85.618268,41.952056]},n3922:{id:"n3922",loc:[-85.618211,41.952122]},n3923:{id:"n3923",loc:[-85.618386,41.95222]},n3924:{id:"n3924",loc:[-85.618098,41.952527]},n3925:{id:"n3925",loc:[-85.617916,41.95243]},n3926:{id:"n3926",loc:[-85.617854,41.952498]},n3927:{id:"n3927",loc:[-85.617769,41.952453]},n3928:{id:"n3928",loc:[-85.617476,41.952773]},n3929:{id:"n3929",loc:[-85.617876,41.952973]},n393:{id:"n393",loc:[-85.631902,41.943561]},n3930:{id:"n3930",loc:[-85.617174,41.953638]},n3931:{id:"n3931",loc:[-85.618016,41.953578]},n3932:{id:"n3932",loc:[-85.618107,41.953628]},n3933:{id:"n3933",loc:[-85.618067,41.954268]},n3934:{id:"n3934",loc:[-85.617864,41.954263]},n3935:{id:"n3935",loc:[-85.61762,41.954205]},n3936:{id:"n3936",loc:[-85.617437,41.954103]},n3937:{id:"n3937",loc:[-85.617294,41.953978]},n3938:{id:"n3938",loc:[-85.617217,41.95384]},n3939:{id:"n3939",loc:[-85.616814,41.954327]},n394:{id:"n394",loc:[-85.63236,41.943543]},n3940:{id:"n3940",loc:[-85.616778,41.95381]},n3941:{id:"n3941",loc:[-85.616585,41.953707]},n3942:{id:"n3942",loc:[-85.616458,41.954318]},n3943:{id:"n3943",loc:[-85.616643,41.954345]},n3944:{id:"n3944",loc:[-85.618133,41.951412]},n3945:{id:"n3945",loc:[-85.618326,41.951411]},n3946:{id:"n3946",loc:[-85.618503,41.95141]},n3947:{id:"n3947",loc:[-85.618681,41.951409]},n3948:{id:"n3948",loc:[-85.618868,41.951408]},n3949:{id:"n3949",loc:[-85.617047,41.95136]},n395:{id:"n395",loc:[-85.633839,41.944082]},n3950:{id:"n3950",loc:[-85.616502,41.951946]},n3951:{id:"n3951",loc:[-85.616497,41.952072]},n3952:{id:"n3952",loc:[-85.616565,41.952165]},n3953:{id:"n3953",loc:[-85.616663,41.952218]},n3954:{id:"n3954",loc:[-85.616733,41.952255]},n3955:{id:"n3955",loc:[-85.617238,41.952512],tags:{entrance:"yes"}},n3956:{id:"n3956",loc:[-85.617043,41.952406]},n3957:{id:"n3957",loc:[-85.617691,41.951711]},n3958:{id:"n3958",loc:[-85.617773,41.951679]},n3959:{id:"n3959",loc:[-85.619085,41.951681]},n396:{id:"n396",loc:[-85.63376,41.944097]},n3960:{id:"n3960",loc:[-85.617943,41.952895]},n3961:{id:"n3961",loc:[-85.618039,41.952938]},n3962:{id:"n3962",loc:[-85.61763,41.95336]},n3963:{id:"n3963",loc:[-85.617554,41.95344]},n3964:{id:"n3964",loc:[-85.617381,41.952366],tags:{entrance:"yes"}},n3965:{id:"n3965",loc:[-85.617184,41.952254]},n3966:{id:"n3966",loc:[-85.617208,41.952496]},n3967:{id:"n3967",loc:[-85.617124,41.952581],tags:{entrance:"yes"}},n3968:{id:"n3968",loc:[-85.618094,41.952735]},n3969:{id:"n3969",loc:[-85.617702,41.952525],tags:{entrance:"yes"}},n397:{id:"n397",loc:[-85.63361,41.943957]},n3970:{id:"n3970",loc:[-85.617554,41.952686],tags:{entrance:"yes"}},n3971:{id:"n3971",loc:[-85.617959,41.952878]},n3972:{id:"n3972",loc:[-85.616367,41.952655]},n3973:{id:"n3973",loc:[-85.616416,41.952851]},n3974:{id:"n3974",loc:[-85.619777,41.951075]},n3975:{id:"n3975",loc:[-85.618611,41.94817]},n3976:{id:"n3976",loc:[-85.618538,41.948229]},n3977:{id:"n3977",loc:[-85.617421,41.947559]},n3978:{id:"n3978",loc:[-85.617395,41.951039]},n3979:{id:"n3979",loc:[-85.618488,41.94829]},n398:{id:"n398",loc:[-85.633309,41.943886]},n3980:{id:"n3980",loc:[-85.610238,41.954774]},n3981:{id:"n3981",loc:[-85.617449,41.950756]},n3982:{id:"n3982",loc:[-85.617288,41.951286]},n3983:{id:"n3983",loc:[-85.61745,41.950197]},n3984:{id:"n3984",loc:[-85.617436,41.948908]},n3985:{id:"n3985",loc:[-85.615915,41.953804]},n3986:{id:"n3986",loc:[-85.615953,41.953968]},n3987:{id:"n3987",loc:[-85.616031,41.954085]},n3988:{id:"n3988",loc:[-85.616135,41.954181]},n3989:{id:"n3989",loc:[-85.616273,41.954263]},n399:{id:"n399",loc:[-85.633226,41.943931]},n3990:{id:"n3990",loc:[-85.618327,41.951083]},n3991:{id:"n3991",loc:[-85.618135,41.951084]},n3992:{id:"n3992",loc:[-85.618503,41.951082]},n3993:{id:"n3993",loc:[-85.618682,41.951081]},n3994:{id:"n3994",loc:[-85.618864,41.951082]},n3995:{id:"n3995",loc:[-85.616761,41.950101]},n3996:{id:"n3996",loc:[-85.617317,41.947558]},n3997:{id:"n3997",loc:[-85.617336,41.948883]},n3998:{id:"n3998",loc:[-85.616779,41.949295]},n3999:{id:"n3999",loc:[-85.616754,41.949349]},n4:{id:"n4",loc:[-85.622764,41.950892],tags:{highway:"stop",direction:"forward",stop:"minor"}},n40:{id:"n40",loc:[-85.619841,41.951037]},n400:{id:"n400",loc:[-85.63326,41.943966]},n4000:{id:"n4000",loc:[-85.616761,41.950865]},n4001:{id:"n4001",loc:[-85.616883,41.951041]},n4002:{id:"n4002",loc:[-85.617004,41.951142]},n4003:{id:"n4003",loc:[-85.617062,41.951248]},n4004:{id:"n4004",loc:[-85.616809,41.949273]},n4005:{id:"n4005",loc:[-85.616755,41.949489]},n4006:{id:"n4006",loc:[-85.616759,41.949971]},n4007:{id:"n4007",loc:[-85.616757,41.949702]},n4008:{id:"n4008",loc:[-85.618456,41.94836]},n4009:{id:"n4009",loc:[-85.618447,41.948428]},n401:{id:"n401",loc:[-85.63324,41.943976]},n4010:{id:"n4010",loc:[-85.618437,41.949322]},n4011:{id:"n4011",loc:[-85.618447,41.949418]},n4012:{id:"n4012",loc:[-85.618478,41.949491]},n4013:{id:"n4013",loc:[-85.618535,41.949559]},n4014:{id:"n4014",loc:[-85.618623,41.94962]},n4015:{id:"n4015",loc:[-85.618721,41.94966]},n4016:{id:"n4016",loc:[-85.618838,41.949674]},n4017:{id:"n4017",loc:[-85.618967,41.949667]},n4018:{id:"n4018",loc:[-85.619065,41.949632]},n4019:{id:"n4019",loc:[-85.61915,41.949578]},n402:{id:"n402",loc:[-85.63327,41.944006]},n4020:{id:"n4020",loc:[-85.619216,41.949507]},n4021:{id:"n4021",loc:[-85.61927,41.949399]},n4022:{id:"n4022",loc:[-85.619074,41.947639]},n4023:{id:"n4023",loc:[-85.619073,41.947793]},n4024:{id:"n4024",loc:[-85.618912,41.947793]},n4025:{id:"n4025",loc:[-85.618911,41.947947]},n4026:{id:"n4026",loc:[-85.618752,41.947947]},n4027:{id:"n4027",loc:[-85.618754,41.947637]},n4028:{id:"n4028",loc:[-85.617896,41.947599]},n4029:{id:"n4029",loc:[-85.617898,41.947811]},n403:{id:"n403",loc:[-85.633278,41.944002]},n4030:{id:"n4030",loc:[-85.617717,41.947812]},n4031:{id:"n4031",loc:[-85.617715,41.9476]},n4032:{id:"n4032",loc:[-85.619003,41.949828]},n4033:{id:"n4033",loc:[-85.619003,41.949882]},n4034:{id:"n4034",loc:[-85.618926,41.949882]},n4035:{id:"n4035",loc:[-85.618926,41.949828]},n4036:{id:"n4036",loc:[-85.618861,41.949809]},n4037:{id:"n4037",loc:[-85.618861,41.949898]},n4038:{id:"n4038",loc:[-85.618688,41.949898]},n4039:{id:"n4039",loc:[-85.618687,41.94981]},n404:{id:"n404",loc:[-85.63331,41.944036]},n4040:{id:"n4040",loc:[-85.618349,41.949473]},n4041:{id:"n4041",loc:[-85.618287,41.949473]},n4042:{id:"n4042",loc:[-85.618287,41.94942]},n4043:{id:"n4043",loc:[-85.618348,41.949419]},n4044:{id:"n4044",loc:[-85.62316,41.951604]},n4045:{id:"n4045",loc:[-85.623026,41.951605]},n4046:{id:"n4046",loc:[-85.623023,41.951466]},n4047:{id:"n4047",loc:[-85.623134,41.951465]},n4048:{id:"n4048",loc:[-85.623136,41.951539]},n4049:{id:"n4049",loc:[-85.623159,41.951539]},n405:{id:"n405",loc:[-85.633348,41.944015]},n4050:{id:"n4050",loc:[-85.623025,41.95155]},n4051:{id:"n4051",loc:[-85.622955,41.951551]},n4052:{id:"n4052",loc:[-85.622953,41.951507]},n4053:{id:"n4053",loc:[-85.623024,41.951506]},n4054:{id:"n4054",loc:[-85.623318,41.951242]},n4055:{id:"n4055",loc:[-85.623175,41.951241]},n4056:{id:"n4056",loc:[-85.623176,41.951153]},n4057:{id:"n4057",loc:[-85.623319,41.951154]},n4058:{id:"n4058",loc:[-85.623077,41.951191]},n4059:{id:"n4059",loc:[-85.622973,41.951191]},n406:{id:"n406",loc:[-85.63338,41.944048]},n4060:{id:"n4060",loc:[-85.622972,41.951349]},n4061:{id:"n4061",loc:[-85.623059,41.95135]},n4062:{id:"n4062",loc:[-85.62306,41.951301]},n4063:{id:"n4063",loc:[-85.623077,41.951301]},n4064:{id:"n4064",loc:[-85.623117,41.951405]},n4065:{id:"n4065",loc:[-85.62312,41.951087]},n4066:{id:"n4066",loc:[-85.623118,41.951274]},n4067:{id:"n4067",loc:[-85.62328,41.951275]},n4068:{id:"n4068",loc:[-85.62328,41.951242]},n4069:{id:"n4069",loc:[-85.623179,41.951392]},n407:{id:"n407",loc:[-85.633431,41.94402]},n4070:{id:"n4070",loc:[-85.623141,41.951392]},n4071:{id:"n4071",loc:[-85.623142,41.95136]},n4072:{id:"n4072",loc:[-85.623179,41.951361]},n4073:{id:"n4073",loc:[-85.622565,41.951639]},n4074:{id:"n4074",loc:[-85.622565,41.951741]},n4075:{id:"n4075",loc:[-85.622463,41.95174]},n4076:{id:"n4076",loc:[-85.622463,41.95173]},n4077:{id:"n4077",loc:[-85.622442,41.95173]},n4078:{id:"n4078",loc:[-85.622442,41.951742]},n4079:{id:"n4079",loc:[-85.622361,41.951742]},n408:{id:"n408",loc:[-85.633425,41.944014]},n4080:{id:"n4080",loc:[-85.622362,41.951667]},n4081:{id:"n4081",loc:[-85.622441,41.951667]},n4082:{id:"n4082",loc:[-85.622441,41.951688]},n4083:{id:"n4083",loc:[-85.622461,41.951688]},n4084:{id:"n4084",loc:[-85.622461,41.951638]},n4085:{id:"n4085",loc:[-85.62255,41.951587]},n4086:{id:"n4086",loc:[-85.622449,41.95159]},n4087:{id:"n4087",loc:[-85.622441,41.951448]},n4088:{id:"n4088",loc:[-85.62253,41.951445]},n4089:{id:"n4089",loc:[-85.622532,41.951486]},n409:{id:"n409",loc:[-85.633457,41.943997]},n4090:{id:"n4090",loc:[-85.622555,41.951485]},n4091:{id:"n4091",loc:[-85.622558,41.951531]},n4092:{id:"n4092",loc:[-85.622547,41.951531]},n4093:{id:"n4093",loc:[-85.622451,41.95159]},n4094:{id:"n4094",loc:[-85.622452,41.95161]},n4095:{id:"n4095",loc:[-85.622106,41.951617]},n4096:{id:"n4096",loc:[-85.622133,41.951443]},n4097:{id:"n4097",loc:[-85.622552,41.951379]},n4098:{id:"n4098",loc:[-85.622443,41.95138]},n4099:{id:"n4099",loc:[-85.622441,41.951281]},n41:{id:"n41",loc:[-85.636233,41.942764]},n410:{id:"n410",loc:[-85.633429,41.943969]},n4100:{id:"n4100",loc:[-85.62255,41.95128]},n4101:{id:"n4101",loc:[-85.622541,41.951437]},n4102:{id:"n4102",loc:[-85.622441,41.951438]},n4103:{id:"n4103",loc:[-85.621561,41.951444]},n4104:{id:"n4104",loc:[-85.622302,41.951479]},n4105:{id:"n4105",loc:[-85.6223,41.95152]},n4106:{id:"n4106",loc:[-85.622169,41.951517]},n4107:{id:"n4107",loc:[-85.622171,41.951476]},n4108:{id:"n4108",loc:[-85.622543,41.951228]},n4109:{id:"n4109",loc:[-85.622433,41.951228]},n411:{id:"n411",loc:[-85.633442,41.943962]},n4110:{id:"n4110",loc:[-85.622433,41.951133]},n4111:{id:"n4111",loc:[-85.622543,41.951133]},n4112:{id:"n4112",loc:[-85.622356,41.951256]},n4113:{id:"n4113",loc:[-85.622293,41.951256]},n4114:{id:"n4114",loc:[-85.622292,41.9512]},n4115:{id:"n4115",loc:[-85.622313,41.9512]},n4116:{id:"n4116",loc:[-85.622312,41.951173]},n4117:{id:"n4117",loc:[-85.622364,41.951173]},n4118:{id:"n4118",loc:[-85.622365,41.951231]},n4119:{id:"n4119",loc:[-85.622355,41.951231]},n412:{id:"n412",loc:[-85.633411,41.943932]},n4120:{id:"n4120",loc:[-85.62197,41.951155]},n4121:{id:"n4121",loc:[-85.62197,41.951213]},n4122:{id:"n4122",loc:[-85.621848,41.951213]},n4123:{id:"n4123",loc:[-85.621848,41.951155]},n4124:{id:"n4124",loc:[-85.622193,41.951268]},n4125:{id:"n4125",loc:[-85.622194,41.951305]},n4126:{id:"n4126",loc:[-85.622121,41.951306]},n4127:{id:"n4127",loc:[-85.622121,41.951322]},n4128:{id:"n4128",loc:[-85.621984,41.951324]},n4129:{id:"n4129",loc:[-85.621983,41.951271]},n413:{id:"n413",loc:[-85.633421,41.943926]},n4130:{id:"n4130",loc:[-85.622171,41.9514]},n4131:{id:"n4131",loc:[-85.622148,41.951382]},n4132:{id:"n4132",loc:[-85.6221,41.951414]},n4133:{id:"n4133",loc:[-85.622122,41.951433]},n4134:{id:"n4134",loc:[-85.621782,41.951148]},n4135:{id:"n4135",loc:[-85.621783,41.951219]},n4136:{id:"n4136",loc:[-85.62164,41.951221]},n4137:{id:"n4137",loc:[-85.62164,41.951236]},n4138:{id:"n4138",loc:[-85.621556,41.951237]},n4139:{id:"n4139",loc:[-85.621555,41.95117]},n414:{id:"n414",loc:[-85.633376,41.94388]},n4140:{id:"n4140",loc:[-85.621644,41.951169]},n4141:{id:"n4141",loc:[-85.621643,41.951139]},n4142:{id:"n4142",loc:[-85.621719,41.951138]},n4143:{id:"n4143",loc:[-85.621719,41.951148]},n4144:{id:"n4144",loc:[-85.621409,41.951322]},n4145:{id:"n4145",loc:[-85.621338,41.951322]},n4146:{id:"n4146",loc:[-85.621336,41.95115]},n4147:{id:"n4147",loc:[-85.621521,41.951149]},n4148:{id:"n4148",loc:[-85.621522,41.951228]},n4149:{id:"n4149",loc:[-85.621408,41.951228]},n415:{id:"n415",loc:[-85.633348,41.943895]},n4150:{id:"n4150",loc:[-85.621284,41.951219]},n4151:{id:"n4151",loc:[-85.621153,41.951219]},n4152:{id:"n4152",loc:[-85.621152,41.951152]},n4153:{id:"n4153",loc:[-85.621283,41.951152]},n4154:{id:"n4154",loc:[-85.621159,41.951241]},n4155:{id:"n4155",loc:[-85.62116,41.951301]},n4156:{id:"n4156",loc:[-85.621088,41.951302]},n4157:{id:"n4157",loc:[-85.621088,41.951241]},n4158:{id:"n4158",loc:[-85.621049,41.951158]},n4159:{id:"n4159",loc:[-85.62105,41.951229]},n416:{id:"n416",loc:[-85.633341,41.943888]},n4160:{id:"n4160",loc:[-85.620976,41.951229]},n4161:{id:"n4161",loc:[-85.620977,41.951295]},n4162:{id:"n4162",loc:[-85.620887,41.951296]},n4163:{id:"n4163",loc:[-85.620886,41.951229]},n4164:{id:"n4164",loc:[-85.620862,41.951229]},n4165:{id:"n4165",loc:[-85.620861,41.951159]},n4166:{id:"n4166",loc:[-85.620626,41.951133]},n4167:{id:"n4167",loc:[-85.620626,41.951205]},n4168:{id:"n4168",loc:[-85.620412,41.951206]},n4169:{id:"n4169",loc:[-85.620411,41.951134]},n417:{id:"n417",loc:[-85.633321,41.943898]},n4170:{id:"n4170",loc:[-85.621775,41.951443]},n4171:{id:"n4171",loc:[-85.621777,41.951264]},n4172:{id:"n4172",loc:[-85.621565,41.951654]},n4173:{id:"n4173",loc:[-85.621331,41.951439]},n4174:{id:"n4174",loc:[-85.621031,41.951443]},n4175:{id:"n4175",loc:[-85.621836,41.951724]},n4176:{id:"n4176",loc:[-85.621834,41.951621]},n4177:{id:"n4177",loc:[-85.62197,41.951619]},n4178:{id:"n4178",loc:[-85.621972,41.951722]},n4179:{id:"n4179",loc:[-85.621772,41.951638]},n418:{id:"n418",loc:[-85.633547,41.943896]},n4180:{id:"n4180",loc:[-85.621772,41.951715]},n4181:{id:"n4181",loc:[-85.621699,41.951716]},n4182:{id:"n4182",loc:[-85.6217,41.951722]},n4183:{id:"n4183",loc:[-85.621641,41.951722]},n4184:{id:"n4184",loc:[-85.62164,41.951639]},n4185:{id:"n4185",loc:[-85.621505,41.951655]},n4186:{id:"n4186",loc:[-85.621505,41.951729]},n4187:{id:"n4187",loc:[-85.621389,41.951729]},n4188:{id:"n4188",loc:[-85.62139,41.951654]},n4189:{id:"n4189",loc:[-85.621105,41.951635]},n419:{id:"n419",loc:[-85.633467,41.944075]},n4190:{id:"n4190",loc:[-85.621104,41.951576]},n4191:{id:"n4191",loc:[-85.621168,41.951576]},n4192:{id:"n4192",loc:[-85.621168,41.951595]},n4193:{id:"n4193",loc:[-85.621261,41.951595]},n4194:{id:"n4194",loc:[-85.621261,41.951646]},n4195:{id:"n4195",loc:[-85.621294,41.951646]},n4196:{id:"n4196",loc:[-85.621294,41.951732]},n4197:{id:"n4197",loc:[-85.621251,41.951732]},n4198:{id:"n4198",loc:[-85.621251,41.95174]},n4199:{id:"n4199",loc:[-85.621175,41.951741]},n42:{id:"n42",loc:[-85.635996,41.942727]},n420:{id:"n420",loc:[-85.633578,41.944055]},n4200:{id:"n4200",loc:[-85.621175,41.951651]},n4201:{id:"n4201",loc:[-85.621189,41.951651]},n4202:{id:"n4202",loc:[-85.621189,41.951635]},n4203:{id:"n4203",loc:[-85.620554,41.951641]},n4204:{id:"n4204",loc:[-85.620555,41.951742]},n4205:{id:"n4205",loc:[-85.620719,41.951742]},n4206:{id:"n4206",loc:[-85.620719,41.951731]},n4207:{id:"n4207",loc:[-85.620803,41.95173]},n4208:{id:"n4208",loc:[-85.620803,41.951603]},n4209:{id:"n4209",loc:[-85.62072,41.951603]},n421:{id:"n421",loc:[-85.633462,41.944125]},n4210:{id:"n4210",loc:[-85.620721,41.951641]},n4211:{id:"n4211",loc:[-85.620269,41.953053]},n4212:{id:"n4212",loc:[-85.620229,41.953051]},n4213:{id:"n4213",loc:[-85.620231,41.953013]},n4214:{id:"n4214",loc:[-85.620271,41.953015]},n4215:{id:"n4215",loc:[-85.620215,41.953133]},n4216:{id:"n4216",loc:[-85.62013,41.953134]},n4217:{id:"n4217",loc:[-85.620129,41.953083]},n4218:{id:"n4218",loc:[-85.620214,41.953082]},n4219:{id:"n4219",loc:[-85.62016,41.953272]},n422:{id:"n422",loc:[-85.633372,41.944061]},n4220:{id:"n4220",loc:[-85.620046,41.953273]},n4221:{id:"n4221",loc:[-85.620045,41.953171]},n4222:{id:"n4222",loc:[-85.620088,41.953171]},n4223:{id:"n4223",loc:[-85.620087,41.953162]},n4224:{id:"n4224",loc:[-85.620121,41.953162]},n4225:{id:"n4225",loc:[-85.620121,41.953173]},n4226:{id:"n4226",loc:[-85.620157,41.953173]},n4227:{id:"n4227",loc:[-85.620158,41.953196]},n4228:{id:"n4228",loc:[-85.620189,41.953196]},n4229:{id:"n4229",loc:[-85.620189,41.953246]},n423:{id:"n423",loc:[-85.633509,41.943981]},n4230:{id:"n4230",loc:[-85.62016,41.953246]},n4231:{id:"n4231",loc:[-85.6195,41.954012]},n4232:{id:"n4232",loc:[-85.619438,41.954057]},n4233:{id:"n4233",loc:[-85.619418,41.954043]},n4234:{id:"n4234",loc:[-85.619381,41.954069]},n4235:{id:"n4235",loc:[-85.619399,41.954083]},n4236:{id:"n4236",loc:[-85.619339,41.954126]},n4237:{id:"n4237",loc:[-85.619584,41.954313]},n4238:{id:"n4238",loc:[-85.619743,41.954198]},n4239:{id:"n4239",loc:[-85.619453,41.954727]},n424:{id:"n424",loc:[-85.635421,41.945367]},n4240:{id:"n4240",loc:[-85.619503,41.954581]},n4241:{id:"n4241",loc:[-85.619597,41.954472]},n4242:{id:"n4242",loc:[-85.619862,41.95419]},n4243:{id:"n4243",loc:[-85.619506,41.953907]},n4244:{id:"n4244",loc:[-85.619261,41.9541]},n4245:{id:"n4245",loc:[-85.619246,41.954139]},n4246:{id:"n4246",loc:[-85.619244,41.9542]},n4247:{id:"n4247",loc:[-85.619259,41.954243]},n4248:{id:"n4248",loc:[-85.619285,41.954274]},n4249:{id:"n4249",loc:[-85.619123,41.954381]},n425:{id:"n425",loc:[-85.634425,41.943552]},n4250:{id:"n4250",loc:[-85.619641,41.954607]},n4251:{id:"n4251",loc:[-85.619383,41.954615]},n4252:{id:"n4252",loc:[-85.61896,41.954391]},n4253:{id:"n4253",loc:[-85.619211,41.954178]},n4254:{id:"n4254",loc:[-85.619115,41.954102]},n4255:{id:"n4255",loc:[-85.619519,41.953821]},n4256:{id:"n4256",loc:[-85.619956,41.954156]},n4257:{id:"n4257",loc:[-85.619851,41.954266]},n4258:{id:"n4258",loc:[-85.619779,41.95436]},n4259:{id:"n4259",loc:[-85.620525,41.954364]},n426:{id:"n426",loc:[-85.634248,41.943654]},n4260:{id:"n4260",loc:[-85.620398,41.954365]},n4261:{id:"n4261",loc:[-85.620398,41.954324]},n4262:{id:"n4262",loc:[-85.620525,41.954323]},n4263:{id:"n4263",loc:[-85.620359,41.954588]},n4264:{id:"n4264",loc:[-85.620321,41.954588]},n4265:{id:"n4265",loc:[-85.620321,41.954599]},n4266:{id:"n4266",loc:[-85.620296,41.954599]},n4267:{id:"n4267",loc:[-85.620296,41.954587]},n4268:{id:"n4268",loc:[-85.620262,41.954588]},n4269:{id:"n4269",loc:[-85.620261,41.954516]},n427:{id:"n427",loc:[-85.634177,41.943585]},n4270:{id:"n4270",loc:[-85.620282,41.954516]},n4271:{id:"n4271",loc:[-85.620282,41.954373]},n4272:{id:"n4272",loc:[-85.620378,41.954373]},n4273:{id:"n4273",loc:[-85.620379,41.954486]},n4274:{id:"n4274",loc:[-85.620348,41.954486]},n4275:{id:"n4275",loc:[-85.620348,41.954537]},n4276:{id:"n4276",loc:[-85.620359,41.954537]},n4277:{id:"n4277",loc:[-85.620463,41.95521]},n4278:{id:"n4278",loc:[-85.620409,41.955273]},n4279:{id:"n4279",loc:[-85.620205,41.955177]},n428:{id:"n428",loc:[-85.634354,41.943484]},n4280:{id:"n4280",loc:[-85.620288,41.955079]},n4281:{id:"n4281",loc:[-85.620379,41.955121]},n4282:{id:"n4282",loc:[-85.620349,41.955157]},n4283:{id:"n4283",loc:[-85.620083,41.955101]},n4284:{id:"n4284",loc:[-85.620083,41.954986]},n4285:{id:"n4285",loc:[-85.620016,41.954986]},n4286:{id:"n4286",loc:[-85.620016,41.954999]},n4287:{id:"n4287",loc:[-85.619941,41.954999]},n4288:{id:"n4288",loc:[-85.619941,41.954988]},n4289:{id:"n4289",loc:[-85.619815,41.954988]},n429:{id:"n429",loc:[-85.638577,41.943212]},n4290:{id:"n4290",loc:[-85.619815,41.955075]},n4291:{id:"n4291",loc:[-85.619948,41.955075]},n4292:{id:"n4292",loc:[-85.619948,41.955082]},n4293:{id:"n4293",loc:[-85.620004,41.955082]},n4294:{id:"n4294",loc:[-85.620004,41.955101]},n4295:{id:"n4295",loc:[-85.619293,41.955127]},n4296:{id:"n4296",loc:[-85.619208,41.955124]},n4297:{id:"n4297",loc:[-85.619212,41.955061]},n4298:{id:"n4298",loc:[-85.619297,41.955064]},n4299:{id:"n4299",loc:[-85.619068,41.954936]},n43:{id:"n43",loc:[-85.637047,41.943054]},n430:{id:"n430",loc:[-85.638576,41.943219]},n4300:{id:"n4300",loc:[-85.619003,41.954936]},n4301:{id:"n4301",loc:[-85.619004,41.955003]},n4302:{id:"n4302",loc:[-85.618994,41.955003]},n4303:{id:"n4303",loc:[-85.618994,41.955016]},n4304:{id:"n4304",loc:[-85.618973,41.955016]},n4305:{id:"n4305",loc:[-85.618973,41.955071]},n4306:{id:"n4306",loc:[-85.619061,41.955071]},n4307:{id:"n4307",loc:[-85.61906,41.955024]},n4308:{id:"n4308",loc:[-85.619105,41.955024]},n4309:{id:"n4309",loc:[-85.619105,41.954956]},n431:{id:"n431",loc:[-85.638653,41.943078]},n4310:{id:"n4310",loc:[-85.619068,41.954956]},n4311:{id:"n4311",loc:[-85.618294,41.954596]},n4312:{id:"n4312",loc:[-85.618235,41.954602]},n4313:{id:"n4313",loc:[-85.618222,41.954535]},n4314:{id:"n4314",loc:[-85.618281,41.954529]},n4315:{id:"n4315",loc:[-85.618593,41.954556]},n4316:{id:"n4316",loc:[-85.618551,41.954565]},n4317:{id:"n4317",loc:[-85.618545,41.954552]},n4318:{id:"n4318",loc:[-85.618493,41.954563]},n4319:{id:"n4319",loc:[-85.618449,41.954455]},n432:{id:"n432",loc:[-85.638654,41.943148]},n4320:{id:"n4320",loc:[-85.618544,41.954434]},n4321:{id:"n4321",loc:[-85.622545,41.950775]},n4322:{id:"n4322",loc:[-85.622546,41.950843]},n4323:{id:"n4323",loc:[-85.622503,41.950844]},n4324:{id:"n4324",loc:[-85.622503,41.950853]},n4325:{id:"n4325",loc:[-85.622479,41.950853]},n4326:{id:"n4326",loc:[-85.622478,41.950843]},n4327:{id:"n4327",loc:[-85.622425,41.950843]},n4328:{id:"n4328",loc:[-85.622425,41.950808]},n4329:{id:"n4329",loc:[-85.622366,41.950809]},n433:{id:"n433",loc:[-85.638387,41.943151]},n4330:{id:"n4330",loc:[-85.622364,41.950673]},n4331:{id:"n4331",loc:[-85.622448,41.950673]},n4332:{id:"n4332",loc:[-85.622449,41.950732]},n4333:{id:"n4333",loc:[-85.622479,41.950731]},n4334:{id:"n4334",loc:[-85.622479,41.950775]},n4335:{id:"n4335",loc:[-85.621909,41.950641]},n4336:{id:"n4336",loc:[-85.621864,41.950641]},n4337:{id:"n4337",loc:[-85.621865,41.950567]},n4338:{id:"n4338",loc:[-85.62191,41.950567]},n4339:{id:"n4339",loc:[-85.621787,41.950829]},n434:{id:"n434",loc:[-85.638386,41.94308]},n4340:{id:"n4340",loc:[-85.621786,41.950775]},n4341:{id:"n4341",loc:[-85.621588,41.950776]},n4342:{id:"n4342",loc:[-85.621589,41.950848]},n4343:{id:"n4343",loc:[-85.621737,41.950847]},n4344:{id:"n4344",loc:[-85.621737,41.950829]},n4345:{id:"n4345",loc:[-85.621509,41.950846]},n4346:{id:"n4346",loc:[-85.621399,41.950846]},n4347:{id:"n4347",loc:[-85.621398,41.95073]},n4348:{id:"n4348",loc:[-85.621509,41.95073]},n4349:{id:"n4349",loc:[-85.621217,41.950841]},n435:{id:"n435",loc:[-85.634427,41.943533]},n4350:{id:"n4350",loc:[-85.6211,41.95084]},n4351:{id:"n4351",loc:[-85.6211,41.950777]},n4352:{id:"n4352",loc:[-85.621218,41.950778]},n4353:{id:"n4353",loc:[-85.621055,41.950764]},n4354:{id:"n4354",loc:[-85.621054,41.950826]},n4355:{id:"n4355",loc:[-85.620988,41.950826]},n4356:{id:"n4356",loc:[-85.620988,41.950843]},n4357:{id:"n4357",loc:[-85.620842,41.950843]},n4358:{id:"n4358",loc:[-85.620842,41.950764]},n4359:{id:"n4359",loc:[-85.620825,41.950922]},n436:{id:"n436",loc:[-85.63428,41.943229]},n4360:{id:"n4360",loc:[-85.620824,41.950553]},n4361:{id:"n4361",loc:[-85.620543,41.950771]},n4362:{id:"n4362",loc:[-85.620431,41.950772]},n4363:{id:"n4363",loc:[-85.62043,41.950585]},n4364:{id:"n4364",loc:[-85.620542,41.950585]},n4365:{id:"n4365",loc:[-85.62068,41.950505]},n4366:{id:"n4366",loc:[-85.620681,41.950552]},n4367:{id:"n4367",loc:[-85.620589,41.950553]},n4368:{id:"n4368",loc:[-85.620588,41.950506]},n4369:{id:"n4369",loc:[-85.620539,41.950407]},n437:{id:"n437",loc:[-85.634499,41.943461]},n4370:{id:"n4370",loc:[-85.62054,41.950504]},n4371:{id:"n4371",loc:[-85.620416,41.950504]},n4372:{id:"n4372",loc:[-85.620416,41.950408]},n4373:{id:"n4373",loc:[-85.620742,41.95038]},n4374:{id:"n4374",loc:[-85.620527,41.95038]},n4375:{id:"n4375",loc:[-85.620528,41.950408]},n4376:{id:"n4376",loc:[-85.622449,41.950373]},n4377:{id:"n4377",loc:[-85.622452,41.950397]},n4378:{id:"n4378",loc:[-85.622336,41.950404]},n4379:{id:"n4379",loc:[-85.622333,41.950379]},n438:{id:"n438",loc:[-85.634514,41.943486]},n4380:{id:"n4380",loc:[-85.622263,41.950324]},n4381:{id:"n4381",loc:[-85.622261,41.950256]},n4382:{id:"n4382",loc:[-85.62236,41.950254]},n4383:{id:"n4383",loc:[-85.62236,41.95027]},n4384:{id:"n4384",loc:[-85.622402,41.950281]},n4385:{id:"n4385",loc:[-85.622403,41.9503]},n4386:{id:"n4386",loc:[-85.622439,41.950299]},n4387:{id:"n4387",loc:[-85.62244,41.950334]},n4388:{id:"n4388",loc:[-85.622414,41.950335]},n4389:{id:"n4389",loc:[-85.622414,41.95036]},n439:{id:"n439",loc:[-85.63452,41.943511]},n4390:{id:"n4390",loc:[-85.62231,41.950362]},n4391:{id:"n4391",loc:[-85.622309,41.950323]},n4392:{id:"n4392",loc:[-85.622015,41.950539]},n4393:{id:"n4393",loc:[-85.621909,41.95054]},n4394:{id:"n4394",loc:[-85.621909,41.950472]},n4395:{id:"n4395",loc:[-85.622015,41.950471]},n4396:{id:"n4396",loc:[-85.62199,41.950439]},n4397:{id:"n4397",loc:[-85.621956,41.95044]},n4398:{id:"n4398",loc:[-85.621955,41.950405]},n4399:{id:"n4399",loc:[-85.621988,41.950404]},n44:{id:"n44",loc:[-85.636799,41.943055]},n440:{id:"n440",loc:[-85.63451,41.943534]},n4400:{id:"n4400",loc:[-85.621668,41.950418]},n4401:{id:"n4401",loc:[-85.621667,41.950343]},n4402:{id:"n4402",loc:[-85.621745,41.950342]},n4403:{id:"n4403",loc:[-85.621744,41.950306]},n4404:{id:"n4404",loc:[-85.621764,41.950306]},n4405:{id:"n4405",loc:[-85.621763,41.950254]},n4406:{id:"n4406",loc:[-85.621861,41.950253]},n4407:{id:"n4407",loc:[-85.621861,41.950274]},n4408:{id:"n4408",loc:[-85.621896,41.950273]},n4409:{id:"n4409",loc:[-85.621898,41.950389]},n441:{id:"n441",loc:[-85.634483,41.943556]},n4410:{id:"n4410",loc:[-85.621843,41.95039]},n4411:{id:"n4411",loc:[-85.621843,41.950425]},n4412:{id:"n4412",loc:[-85.621789,41.950425]},n4413:{id:"n4413",loc:[-85.621789,41.950386]},n4414:{id:"n4414",loc:[-85.621752,41.950387]},n4415:{id:"n4415",loc:[-85.621753,41.950417]},n4416:{id:"n4416",loc:[-85.621556,41.950562]},n4417:{id:"n4417",loc:[-85.621552,41.950217]},n4418:{id:"n4418",loc:[-85.621788,41.950562]},n4419:{id:"n4419",loc:[-85.621155,41.950562]},n442:{id:"n442",loc:[-85.63419,41.943713]},n4420:{id:"n4420",loc:[-85.622473,41.950551]},n4421:{id:"n4421",loc:[-85.622043,41.950551]},n4422:{id:"n4422",loc:[-85.62142,41.950454]},n4423:{id:"n4423",loc:[-85.621315,41.950455]},n4424:{id:"n4424",loc:[-85.621313,41.950311]},n4425:{id:"n4425",loc:[-85.621388,41.950311]},n4426:{id:"n4426",loc:[-85.621387,41.950261]},n4427:{id:"n4427",loc:[-85.621468,41.95026]},n4428:{id:"n4428",loc:[-85.621468,41.950271]},n4429:{id:"n4429",loc:[-85.621503,41.95027]},n443:{id:"n443",loc:[-85.634462,41.943294]},n4430:{id:"n4430",loc:[-85.621505,41.950353]},n4431:{id:"n4431",loc:[-85.621483,41.950354]},n4432:{id:"n4432",loc:[-85.621483,41.950392]},n4433:{id:"n4433",loc:[-85.621419,41.950393]},n4434:{id:"n4434",loc:[-85.621213,41.95039]},n4435:{id:"n4435",loc:[-85.621127,41.950391]},n4436:{id:"n4436",loc:[-85.621126,41.950357]},n4437:{id:"n4437",loc:[-85.621094,41.950357]},n4438:{id:"n4438",loc:[-85.621094,41.950391]},n4439:{id:"n4439",loc:[-85.620977,41.950392]},n444:{id:"n444",loc:[-85.634298,41.943389]},n4440:{id:"n4440",loc:[-85.620975,41.950278]},n4441:{id:"n4441",loc:[-85.621087,41.950277]},n4442:{id:"n4442",loc:[-85.621088,41.950331]},n4443:{id:"n4443",loc:[-85.621211,41.950312]},n4444:{id:"n4444",loc:[-85.621104,41.950313]},n4445:{id:"n4445",loc:[-85.621105,41.950331]},n4446:{id:"n4446",loc:[-85.620706,41.950328]},n4447:{id:"n4447",loc:[-85.620606,41.950327]},n4448:{id:"n4448",loc:[-85.620607,41.950261]},n4449:{id:"n4449",loc:[-85.620707,41.950262]},n445:{id:"n445",loc:[-85.634527,41.943623]},n4450:{id:"n4450",loc:[-85.620599,41.950336]},n4451:{id:"n4451",loc:[-85.620559,41.950336]},n4452:{id:"n4452",loc:[-85.620559,41.950299]},n4453:{id:"n4453",loc:[-85.620599,41.950299]},n4454:{id:"n4454",loc:[-85.620545,41.950357]},n4455:{id:"n4455",loc:[-85.620418,41.950357]},n4456:{id:"n4456",loc:[-85.620417,41.950257]},n4457:{id:"n4457",loc:[-85.620544,41.950256]},n4458:{id:"n4458",loc:[-85.620246,41.950131],tags:{highway:"crossing"}},n4459:{id:"n4459",loc:[-85.620252,41.950956]},n446:{id:"n446",loc:[-85.634608,41.943577]},n4460:{id:"n4460",loc:[-85.620245,41.950179]},n4461:{id:"n4461",loc:[-85.620246,41.950088]},n4462:{id:"n4462",loc:[-85.620251,41.950885]},n4463:{id:"n4463",loc:[-85.620103,41.950884],tags:{crossing:"marked",highway:"crossing"}},n4464:{id:"n4464",loc:[-85.619992,41.950884]},n4465:{id:"n4465",loc:[-85.619704,41.951008]},n4466:{id:"n4466",loc:[-85.619599,41.951122]},n4467:{id:"n4467",loc:[-85.619264,41.951486]},n4468:{id:"n4468",loc:[-85.619179,41.951573],tags:{highway:"crossing"}},n4469:{id:"n4469",loc:[-85.620251,41.950999],tags:{highway:"crossing"}},n447:{id:"n447",loc:[-85.634555,41.943531]},n4470:{id:"n4470",loc:[-85.620249,41.951066]},n4471:{id:"n4471",loc:[-85.620256,41.951374]},n4472:{id:"n4472",loc:[-85.620249,41.951389]},n4473:{id:"n4473",loc:[-85.620249,41.951407]},n4474:{id:"n4474",loc:[-85.620255,41.951423]},n4475:{id:"n4475",loc:[-85.62026,41.951853]},n4476:{id:"n4476",loc:[-85.620262,41.951894],tags:{highway:"crossing"}},n4477:{id:"n4477",loc:[-85.620265,41.951957]},n4478:{id:"n4478",loc:[-85.620262,41.952135]},n4479:{id:"n4479",loc:[-85.620241,41.952424]},n448:{id:"n448",loc:[-85.634555,41.943482]},n4480:{id:"n4480",loc:[-85.620213,41.952583]},n4481:{id:"n4481",loc:[-85.620158,41.952754]},n4482:{id:"n4482",loc:[-85.620065,41.952942]},n4483:{id:"n4483",loc:[-85.619753,41.953439]},n4484:{id:"n4484",loc:[-85.619605,41.953626]},n4485:{id:"n4485",loc:[-85.619381,41.953834]},n4486:{id:"n4486",loc:[-85.619069,41.954066]},n4487:{id:"n4487",loc:[-85.618674,41.95429]},n4488:{id:"n4488",loc:[-85.621816,41.952389]},n4489:{id:"n4489",loc:[-85.6217,41.952386]},n449:{id:"n449",loc:[-85.634509,41.943427]},n4490:{id:"n4490",loc:[-85.621705,41.952306]},n4491:{id:"n4491",loc:[-85.621821,41.95231]},n4492:{id:"n4492",loc:[-85.621819,41.952272]},n4493:{id:"n4493",loc:[-85.621778,41.952272]},n4494:{id:"n4494",loc:[-85.621778,41.952199]},n4495:{id:"n4495",loc:[-85.621818,41.952199]},n4496:{id:"n4496",loc:[-85.621754,41.952281]},n4497:{id:"n4497",loc:[-85.621701,41.95228]},n4498:{id:"n4498",loc:[-85.621702,41.952197]},n4499:{id:"n4499",loc:[-85.621755,41.952197]},n45:{id:"n45",loc:[-85.636791,41.942792]},n450:{id:"n450",loc:[-85.63453,41.943365]},n4500:{id:"n4500",loc:[-85.628201,41.954694],tags:{highway:"stop",stop:"all",direction:"forward"}},n4501:{id:"n4501",loc:[-85.627921,41.954783],tags:{highway:"stop",stop:"all",direction:"backward"}},n4502:{id:"n4502",loc:[-85.62775,41.954696],tags:{highway:"stop",stop:"all",direction:"backward"}},n4503:{id:"n4503",loc:[-85.628046,41.954591],tags:{highway:"stop",stop:"all",direction:"forward"}},n4504:{id:"n4504",loc:[-85.631074,41.957428],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4505:{id:"n4505",loc:[-85.630768,41.957429],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4506:{id:"n4506",loc:[-85.629888,41.957432],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4507:{id:"n4507",loc:[-85.629565,41.957433],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4508:{id:"n4508",loc:[-85.629559,41.957343]},n4509:{id:"n4509",loc:[-85.628723,41.95735]},n451:{id:"n451",loc:[-85.634356,41.943468]},n4510:{id:"n4510",loc:[-85.62842,41.957515]},n4511:{id:"n4511",loc:[-85.627561,41.957525]},n4512:{id:"n4512",loc:[-85.630323,41.957508]},n4513:{id:"n4513",loc:[-85.630811,41.957506]},n4514:{id:"n4514",loc:[-85.630839,41.960874]},n4515:{id:"n4515",loc:[-85.631035,41.957506]},n4516:{id:"n4516",loc:[-85.632027,41.9575]},n4517:{id:"n4517",loc:[-85.631038,41.958066]},n4518:{id:"n4518",loc:[-85.630787,41.954769]},n4519:{id:"n4519",loc:[-85.630806,41.957342]},n452:{id:"n452",loc:[-85.634123,41.943596]},n4520:{id:"n4520",loc:[-85.630809,41.957428],tags:{highway:"crossing"}},n4521:{id:"n4521",loc:[-85.630912,41.957506],tags:{highway:"crossing"}},n4522:{id:"n4522",loc:[-85.631033,41.957428],tags:{highway:"crossing"}},n4523:{id:"n4523",loc:[-85.631032,41.957341]},n4524:{id:"n4524",loc:[-85.63091,41.957341],tags:{highway:"crossing"}},n4525:{id:"n4525",loc:[-85.631027,41.95597]},n4526:{id:"n4526",loc:[-85.631027,41.955913],tags:{highway:"crossing"}},n4527:{id:"n4527",loc:[-85.631025,41.955873]},n4528:{id:"n4528",loc:[-85.631073,41.955913],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4529:{id:"n4529",loc:[-85.631007,41.954766]},n453:{id:"n453",loc:[-85.634709,41.943926]},n4530:{id:"n4530",loc:[-85.630881,41.954768],tags:{highway:"crossing"}},n4531:{id:"n4531",loc:[-85.628022,41.954776]},n4532:{id:"n4532",loc:[-85.627385,41.95584]},n4533:{id:"n4533",loc:[-85.627329,41.955937]},n4534:{id:"n4534",loc:[-85.626583,41.957153]},n4535:{id:"n4535",loc:[-85.629675,41.954564],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4536:{id:"n4536",loc:[-85.630881,41.954806],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4537:{id:"n4537",loc:[-85.630879,41.954564],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4538:{id:"n4538",loc:[-85.630784,41.954682],tags:{highway:"crossing"}},n4539:{id:"n4539",loc:[-85.63078,41.954595]},n454:{id:"n454",loc:[-85.63525,41.943855]},n4540:{id:"n4540",loc:[-85.630879,41.954595],tags:{highway:"crossing"}},n4541:{id:"n4541",loc:[-85.631004,41.954594]},n4542:{id:"n4542",loc:[-85.631006,41.954681],tags:{highway:"crossing"}},n4543:{id:"n4543",loc:[-85.631045,41.959036],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4544:{id:"n4544",loc:[-85.632071,41.959029],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4545:{id:"n4545",loc:[-85.632257,41.959027],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4546:{id:"n4546",loc:[-85.631966,41.957427],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4547:{id:"n4547",loc:[-85.632297,41.957426],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4548:{id:"n4548",loc:[-85.631976,41.955911],tags:{highway:"give_way",direction:"forward"}},n4549:{id:"n4549",loc:[-85.632272,41.955911],tags:{highway:"give_way",direction:"backward"}},n455:{id:"n455",loc:[-85.635224,41.943869]},n4550:{id:"n4550",loc:[-85.632097,41.954805],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4551:{id:"n4551",loc:[-85.632094,41.954566],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4552:{id:"n4552",loc:[-85.626519,41.957256]},n4553:{id:"n4553",loc:[-85.625334,41.959165]},n4554:{id:"n4554",loc:[-85.626483,41.95806]},n4555:{id:"n4555",loc:[-85.626481,41.958175]},n4556:{id:"n4556",loc:[-85.626412,41.958174]},n4557:{id:"n4557",loc:[-85.626412,41.958202]},n4558:{id:"n4558",loc:[-85.62628,41.958201]},n4559:{id:"n4559",loc:[-85.626283,41.958057]},n456:{id:"n456",loc:[-85.638854,41.943104]},n4560:{id:"n4560",loc:[-85.622763,41.95109],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4561:{id:"n4561",loc:[-85.622858,41.950876],tags:{emergency:"fire_hydrant"}},n4562:{id:"n4562",loc:[-85.624073,41.950393]},n4563:{id:"n4563",loc:[-85.624077,41.950924]},n4564:{id:"n4564",loc:[-85.624599,41.950984],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4565:{id:"n4565",loc:[-85.624831,41.95119],tags:{emergency:"fire_hydrant"}},n4566:{id:"n4566",loc:[-85.624437,41.952568],tags:{emergency:"fire_hydrant"}},n4567:{id:"n4567",loc:[-85.624077,41.954606],tags:{emergency:"fire_hydrant"}},n4568:{id:"n4568",loc:[-85.624263,41.954888]},n4569:{id:"n4569",loc:[-85.624206,41.954919]},n457:{id:"n457",loc:[-85.635186,41.943901]},n4570:{id:"n4570",loc:[-85.624154,41.954865]},n4571:{id:"n4571",loc:[-85.624212,41.954835]},n4572:{id:"n4572",loc:[-85.622442,41.954401],tags:{emergency:"fire_hydrant"}},n4573:{id:"n4573",loc:[-85.619751,41.954658],tags:{emergency:"fire_hydrant"}},n4574:{id:"n4574",loc:[-85.617785,41.954534]},n4575:{id:"n4575",loc:[-85.617416,41.954721]},n4576:{id:"n4576",loc:[-85.617662,41.95474]},n4577:{id:"n4577",loc:[-85.618014,41.954717]},n4578:{id:"n4578",loc:[-85.617886,41.954671]},n4579:{id:"n4579",loc:[-85.617831,41.954612]},n458:{id:"n458",loc:[-85.635162,41.943917]},n4580:{id:"n4580",loc:[-85.617968,41.954752]},n4581:{id:"n4581",loc:[-85.617815,41.954752]},n4582:{id:"n4582",loc:[-85.617938,41.954695]},n4583:{id:"n4583",loc:[-85.617856,41.954642],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4584:{id:"n4584",loc:[-85.619116,41.954164],tags:{man_made:"flagpole"}},n4585:{id:"n4585",loc:[-85.619569,41.953255],tags:{emergency:"fire_hydrant"}},n4586:{id:"n4586",loc:[-85.620352,41.951894],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4587:{id:"n4587",loc:[-85.620485,41.951948],tags:{emergency:"fire_hydrant"}},n4588:{id:"n4588",loc:[-85.620316,41.950999],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4589:{id:"n4589",loc:[-85.620311,41.950131],tags:{highway:"stop",direction:"backward",stop:"minor"}},n459:{id:"n459",loc:[-85.634856,41.943905]},n4590:{id:"n4590",loc:[-85.620374,41.95018],tags:{emergency:"fire_hydrant"}},n4591:{id:"n4591",loc:[-85.620301,41.949239],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4592:{id:"n4592",loc:[-85.620278,41.947443],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4593:{id:"n4593",loc:[-85.619844,41.947444],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4594:{id:"n4594",loc:[-85.620191,41.947352],tags:{emergency:"fire_hydrant"}},n4595:{id:"n4595",loc:[-85.622819,41.947493],tags:{emergency:"fire_hydrant"}},n4596:{id:"n4596",loc:[-85.622744,41.947541],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4597:{id:"n4597",loc:[-85.622739,41.947316],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4598:{id:"n4598",loc:[-85.622909,41.948333],tags:{highway:"give_way"}},n4599:{id:"n4599",loc:[-85.622593,41.948333],tags:{highway:"give_way"}},n46:{id:"n46",loc:[-85.637131,41.94307]},n460:{id:"n460",loc:[-85.634811,41.944007]},n4600:{id:"n4600",loc:[-85.622835,41.948387],tags:{emergency:"fire_hydrant"}},n4601:{id:"n4601",loc:[-85.622768,41.949125],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4602:{id:"n4602",loc:[-85.622769,41.949325],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4603:{id:"n4603",loc:[-85.622837,41.949329],tags:{emergency:"fire_hydrant"}},n4604:{id:"n4604",loc:[-85.622614,41.950113],tags:{highway:"give_way",direction:"forward"}},n4605:{id:"n4605",loc:[-85.624777,41.949219],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4606:{id:"n4606",loc:[-85.624849,41.949106],tags:{emergency:"fire_hydrant"}},n4607:{id:"n4607",loc:[-85.624858,41.950119],tags:{emergency:"fire_hydrant"}},n4608:{id:"n4608",loc:[-85.624752,41.948334],tags:{highway:"give_way"}},n4609:{id:"n4609",loc:[-85.624845,41.948422],tags:{emergency:"fire_hydrant"}},n461:{id:"n461",loc:[-85.634987,41.943112]},n4610:{id:"n4610",loc:[-85.62484,41.947539],tags:{emergency:"fire_hydrant"}},n4611:{id:"n4611",loc:[-85.62476,41.947428],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4612:{id:"n4612",loc:[-85.620286,41.950926]},n4613:{id:"n4613",loc:[-85.618237,41.950963]},n4614:{id:"n4614",loc:[-85.618107,41.950876]},n4615:{id:"n4615",loc:[-85.618131,41.950393]},n4616:{id:"n4616",loc:[-85.618232,41.949913]},n4617:{id:"n4617",loc:[-85.619138,41.950212]},n4618:{id:"n4618",loc:[-85.619299,41.950388]},n4619:{id:"n4619",loc:[-85.619306,41.950897]},n462:{id:"n462",loc:[-85.634698,41.943194]},n4620:{id:"n4620",loc:[-85.619155,41.950958]},n4621:{id:"n4621",loc:[-85.620079,41.947715]},n4622:{id:"n4622",loc:[-85.619674,41.947728]},n4623:{id:"n4623",loc:[-85.619634,41.947735]},n4624:{id:"n4624",loc:[-85.619587,41.947756],tags:{barrier:"gate"}},n4625:{id:"n4625",loc:[-85.61953,41.947796]},n4626:{id:"n4626",loc:[-85.619475,41.947847]},n4627:{id:"n4627",loc:[-85.619433,41.947903]},n4628:{id:"n4628",loc:[-85.619402,41.947982]},n4629:{id:"n4629",loc:[-85.619394,41.948043]},n463:{id:"n463",loc:[-85.634632,41.943219]},n4630:{id:"n4630",loc:[-85.619395,41.948476]},n4631:{id:"n4631",loc:[-85.618367,41.947452]},n4632:{id:"n4632",loc:[-85.618371,41.947567],tags:{barrier:"gate"}},n4633:{id:"n4633",loc:[-85.618341,41.947622]},n4634:{id:"n4634",loc:[-85.618138,41.94773]},n4635:{id:"n4635",loc:[-85.618078,41.947814]},n4636:{id:"n4636",loc:[-85.618072,41.948009]},n4637:{id:"n4637",loc:[-85.618269,41.947666]},n4638:{id:"n4638",loc:[-85.618099,41.947765]},n4639:{id:"n4639",loc:[-85.618378,41.954453]},n464:{id:"n464",loc:[-85.63459,41.943239]},n4640:{id:"n4640",loc:[-85.618198,41.95453]},n4641:{id:"n4641",loc:[-85.618212,41.954623]},n4642:{id:"n4642",loc:[-85.635211,41.943103],tags:{leisure:"picnic_table"}},n4643:{id:"n4643",loc:[-85.635345,41.943448],tags:{leisure:"picnic_table"}},n4644:{id:"n4644",loc:[-85.635901,41.943353],tags:{amenity:"bench"}},n4645:{id:"n4645",loc:[-85.635818,41.942638],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4646:{id:"n4646",loc:[-85.635355,41.942044],tags:{leisure:"picnic_table"}},n4647:{id:"n4647",loc:[-85.635206,41.942045],tags:{leisure:"picnic_table"}},n4648:{id:"n4648",loc:[-85.63504,41.941992],tags:{leisure:"picnic_table"}},n4649:{id:"n4649",loc:[-85.635185,41.942001]},n465:{id:"n465",loc:[-85.634555,41.943263]},n4650:{id:"n4650",loc:[-85.635176,41.942021]},n4651:{id:"n4651",loc:[-85.635127,41.942008]},n4652:{id:"n4652",loc:[-85.635136,41.941988]},n4653:{id:"n4653",loc:[-85.635,41.941709],tags:{emergency:"fire_hydrant"}},n4654:{id:"n4654",loc:[-85.634893,41.941801]},n4655:{id:"n4655",loc:[-85.634937,41.941843]},n4656:{id:"n4656",loc:[-85.634963,41.941859]},n4657:{id:"n4657",loc:[-85.635027,41.941904]},n4658:{id:"n4658",loc:[-85.63494,41.94187]},n4659:{id:"n4659",loc:[-85.634951,41.941871]},n466:{id:"n466",loc:[-85.634526,41.943289]},n4660:{id:"n4660",loc:[-85.634753,41.941701],tags:{amenity:"drinking_water"}},n4661:{id:"n4661",loc:[-85.634717,41.941804],tags:{amenity:"bench"}},n4662:{id:"n4662",loc:[-85.634554,41.941883],tags:{amenity:"bench"}},n4663:{id:"n4663",loc:[-85.635002,41.941579],tags:{amenity:"fountain"}},n4664:{id:"n4664",loc:[-85.635258,41.94188],tags:{amenity:"waste_basket"}},n4665:{id:"n4665",loc:[-85.635262,41.941581],tags:{amenity:"bench"}},n4666:{id:"n4666",loc:[-85.635319,41.941744],tags:{amenity:"bench"}},n4667:{id:"n4667",loc:[-85.634702,41.941473],tags:{amenity:"waste_basket"}},n4668:{id:"n4668",loc:[-85.633981,41.941966],tags:{amenity:"bench"}},n4669:{id:"n4669",loc:[-85.63388,41.941743]},n467:{id:"n467",loc:[-85.635163,41.944985]},n4670:{id:"n4670",loc:[-85.633746,41.941741]},n4671:{id:"n4671",loc:[-85.633749,41.941664]},n4672:{id:"n4672",loc:[-85.633883,41.941667]},n4673:{id:"n4673",loc:[-85.634283,41.941183],tags:{leisure:"picnic_table"}},n4674:{id:"n4674",loc:[-85.634046,41.941102],tags:{amenity:"bbq"}},n4675:{id:"n4675",loc:[-85.63401,41.941093],tags:{amenity:"bbq"}},n4676:{id:"n4676",loc:[-85.633408,41.940862],tags:{amenity:"bench"}},n4677:{id:"n4677",loc:[-85.633359,41.940651],tags:{amenity:"bench"}},n4678:{id:"n4678",loc:[-85.634109,41.940831]},n4679:{id:"n4679",loc:[-85.63396,41.940867]},n468:{id:"n468",loc:[-85.635095,41.945035]},n4680:{id:"n4680",loc:[-85.633816,41.940913]},n4681:{id:"n4681",loc:[-85.633237,41.940455]},n4682:{id:"n4682",loc:[-85.634453,41.940025],tags:{emergency:"fire_hydrant"}},n4683:{id:"n4683",loc:[-85.635692,41.940218],tags:{emergency:"fire_hydrant"}},n4684:{id:"n4684",loc:[-85.635566,41.940102],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4685:{id:"n4685",loc:[-85.635961,41.940125],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4686:{id:"n4686",loc:[-85.635883,41.94012],tags:{crossing:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635774,41.940051],tags:{crossing:"marked",highway:"crossing"}},n4689:{id:"n4689",loc:[-85.635669,41.940043]},n469:{id:"n469",loc:[-85.634269,41.944431]},n4690:{id:"n4690",loc:[-85.635661,41.940107],tags:{crossing:"marked",highway:"crossing"}},n4691:{id:"n4691",loc:[-85.635424,41.941005],tags:{amenity:"fountain"}},n4692:{id:"n4692",loc:[-85.635542,41.941371],tags:{amenity:"bench"}},n4693:{id:"n4693",loc:[-85.635709,41.941341],tags:{emergency:"fire_hydrant"}},n4694:{id:"n4694",loc:[-85.637038,41.942513],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4695:{id:"n4695",loc:[-85.637174,41.941354],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4696:{id:"n4696",loc:[-85.637091,41.941273],tags:{emergency:"fire_hydrant"}},n4697:{id:"n4697",loc:[-85.638058,41.941346],tags:{highway:"give_way",direction:"forward"}},n4698:{id:"n4698",loc:[-85.638359,41.941344],tags:{highway:"give_way",direction:"backward"}},n4699:{id:"n4699",loc:[-85.638288,41.941236],tags:{emergency:"fire_hydrant"}},n47:{id:"n47",loc:[-85.636693,41.943073]},n470:{id:"n470",loc:[-85.634352,41.944376]},n4700:{id:"n4700",loc:[-85.63935,41.94128],tags:{emergency:"fire_hydrant"}},n4701:{id:"n4701",loc:[-85.639277,41.941337],tags:{highway:"give_way",direction:"forward"}},n4702:{id:"n4702",loc:[-85.639548,41.941334],tags:{highway:"give_way",direction:"backward"}},n4703:{id:"n4703",loc:[-85.642191,41.940039]},n4704:{id:"n4704",loc:[-85.640585,41.941263],tags:{emergency:"fire_hydrant"}},n4705:{id:"n4705",loc:[-85.64049,41.941327],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4706:{id:"n4706",loc:[-85.640803,41.941324],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4707:{id:"n4707",loc:[-85.641717,41.941317],tags:{highway:"stop",direction:"forward",stop:"all"}},n4708:{id:"n4708",loc:[-85.641846,41.941415],tags:{highway:"stop",direction:"backward",stop:"all"}},n4709:{id:"n4709",loc:[-85.641756,41.941392],tags:{emergency:"fire_hydrant"}},n471:{id:"n471",loc:[-85.634747,41.944561],tags:{railway:"crossing"}},n4710:{id:"n4710",loc:[-85.642014,41.941313],tags:{highway:"stop",direction:"forward",stop:"all"}},n4711:{id:"n4711",loc:[-85.641854,41.942455],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4712:{id:"n4712",loc:[-85.641859,41.942739],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4713:{id:"n4713",loc:[-85.640754,41.942707],tags:{emergency:"fire_hydrant"}},n4714:{id:"n4714",loc:[-85.640669,41.942716],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4715:{id:"n4715",loc:[-85.640664,41.942478],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4716:{id:"n4716",loc:[-85.63964,41.94274],tags:{man_made:"flagpole"}},n4717:{id:"n4717",loc:[-85.639455,41.942731],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4718:{id:"n4718",loc:[-85.63945,41.942492],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4719:{id:"n4719",loc:[-85.639527,41.942505],tags:{emergency:"fire_hydrant"}},n472:{id:"n472",loc:[-85.634667,41.944613]},n4720:{id:"n4720",loc:[-85.638238,41.942745],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4721:{id:"n4721",loc:[-85.638233,41.942511],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4722:{id:"n4722",loc:[-85.638018,41.94299],tags:{amenity:"waste_disposal"}},n4723:{id:"n4723",loc:[-85.637918,41.944152],tags:{amenity:"waste_basket"}},n4724:{id:"n4724",loc:[-85.635902,41.943291],tags:{leisure:"picnic_table"}},n4725:{id:"n4725",loc:[-85.63704,41.942741],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4726:{id:"n4726",loc:[-85.633467,41.943818],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4727:{id:"n4727",loc:[-85.633987,41.943531],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4728:{id:"n4728",loc:[-85.632154,41.943539],tags:{emergency:"fire_hydrant"}},n4729:{id:"n4729",loc:[-85.633567,41.944641],tags:{amenity:"bench"}},n473:{id:"n473",loc:[-85.634161,41.944371]},n4730:{id:"n4730",loc:[-85.633127,41.944574],tags:{amenity:"bench"}},n4731:{id:"n4731",loc:[-85.633439,41.944871],tags:{amenity:"bench"}},n4732:{id:"n4732",loc:[-85.633676,41.944799],tags:{amenity:"waste_basket"}},n4733:{id:"n4733",loc:[-85.633466,41.944862],tags:{amenity:"waste_basket"}},n4734:{id:"n4734",loc:[-85.633451,41.944847],tags:{emergency:"fire_hydrant"}},n4735:{id:"n4735",loc:[-85.634202,41.945543],tags:{amenity:"waste_basket"}},n4736:{id:"n4736",loc:[-85.634652,41.945472],tags:{leisure:"picnic_table"}},n4737:{id:"n4737",loc:[-85.6347,41.945445],tags:{leisure:"picnic_table"}},n4738:{id:"n4738",loc:[-85.634646,41.945662],tags:{emergency:"fire_hydrant"}},n4739:{id:"n4739",loc:[-85.634673,41.945687],tags:{amenity:"waste_basket"}},n474:{id:"n474",loc:[-85.633861,41.944117]},n4740:{id:"n4740",loc:[-85.63449,41.945827],tags:{amenity:"clock",display:"analog"}},n4741:{id:"n4741",loc:[-85.63481,41.946056],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4742:{id:"n4742",loc:[-85.634814,41.946176],tags:{amenity:"post_box"}},n4743:{id:"n4743",loc:[-85.638744,41.945328]},n4744:{id:"n4744",loc:[-85.63867,41.945228],tags:{amenity:"bench"}},n4745:{id:"n4745",loc:[-85.639487,41.945042],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4746:{id:"n4746",loc:[-85.639635,41.94387],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4747:{id:"n4747",loc:[-85.639549,41.943756],tags:{emergency:"fire_hydrant"}},n4748:{id:"n4748",loc:[-85.64055,41.943862],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4749:{id:"n4749",loc:[-85.640864,41.943859],tags:{highway:"stop",stop:"minor",direction:"backward"}},n475:{id:"n475",loc:[-85.633906,41.943535]},n4750:{id:"n4750",loc:[-85.640718,41.945022],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4751:{id:"n4751",loc:[-85.640664,41.945076],tags:{emergency:"fire_hydrant"}},n4752:{id:"n4752",loc:[-85.641913,41.94502],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4753:{id:"n4753",loc:[-85.641838,41.945076],tags:{emergency:"fire_hydrant"}},n4754:{id:"n4754",loc:[-85.642045,41.94385],tags:{highway:"give_way",direction:"backward"}},n4755:{id:"n4755",loc:[-85.641738,41.943852],tags:{highway:"give_way",direction:"forward"}},n4756:{id:"n4756",loc:[-85.642928,41.943843],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4757:{id:"n4757",loc:[-85.64305,41.943902],tags:{emergency:"fire_hydrant"}},n4758:{id:"n4758",loc:[-85.642986,41.945105],tags:{highway:"stop",direction:"backward",stop:"all"}},n4759:{id:"n4759",loc:[-85.643136,41.94502],tags:{highway:"stop",stop:"all",direction:"forward"}},n476:{id:"n476",loc:[-85.63423,41.943692]},n4760:{id:"n4760",loc:[-85.63169,41.947812]},n4761:{id:"n4761",loc:[-85.631307,41.947655]},n4762:{id:"n4762",loc:[-85.631407,41.947413]},n4763:{id:"n4763",loc:[-85.631173,41.947306]},n4764:{id:"n4764",loc:[-85.631316,41.947145]},n4765:{id:"n4765",loc:[-85.631476,41.947087]},n4766:{id:"n4766",loc:[-85.631793,41.946871]},n4767:{id:"n4767",loc:[-85.631884,41.946723]},n4768:{id:"n4768",loc:[-85.631814,41.946397]},n4769:{id:"n4769",loc:[-85.631382,41.947685]},n477:{id:"n477",loc:[-85.635096,41.942814]},n4770:{id:"n4770",loc:[-85.63109,41.947819]},n4771:{id:"n4771",loc:[-85.630921,41.947961]},n4772:{id:"n4772",loc:[-85.630249,41.947709]},n4773:{id:"n4773",loc:[-85.630149,41.947451]},n4774:{id:"n4774",loc:[-85.629733,41.947339]},n4775:{id:"n4775",loc:[-85.629755,41.946948]},n4776:{id:"n4776",loc:[-85.630457,41.947103]},n4777:{id:"n4777",loc:[-85.630934,41.946939]},n4778:{id:"n4778",loc:[-85.631277,41.946852]},n4779:{id:"n4779",loc:[-85.63142,41.946781]},n478:{id:"n478",loc:[-85.635058,41.942795]},n4780:{id:"n4780",loc:[-85.631116,41.946474]},n4781:{id:"n4781",loc:[-85.63073,41.945965]},n4782:{id:"n4782",loc:[-85.631337,41.94571]},n4783:{id:"n4783",loc:[-85.631589,41.945487]},n4784:{id:"n4784",loc:[-85.632278,41.945784]},n4785:{id:"n4785",loc:[-85.632105,41.946034]},n4786:{id:"n4786",loc:[-85.632532,41.946198]},n4787:{id:"n4787",loc:[-85.632566,41.946151]},n4788:{id:"n4788",loc:[-85.632684,41.946196]},n4789:{id:"n4789",loc:[-85.628676,41.947106]},n479:{id:"n479",loc:[-85.635002,41.94279]},n4790:{id:"n4790",loc:[-85.628973,41.946476]},n4791:{id:"n4791",loc:[-85.629094,41.946079]},n4792:{id:"n4792",loc:[-85.629226,41.94578]},n4793:{id:"n4793",loc:[-85.629479,41.945682]},n4794:{id:"n4794",loc:[-85.630606,41.94569]},n4795:{id:"n4795",loc:[-85.631255,41.945588]},n4796:{id:"n4796",loc:[-85.631546,41.945281]},n4797:{id:"n4797",loc:[-85.631629,41.944823]},n4798:{id:"n4798",loc:[-85.631766,41.944958]},n4799:{id:"n4799",loc:[-85.631689,41.945318]},n48:{id:"n48",loc:[-85.636689,41.94276]},n480:{id:"n480",loc:[-85.634908,41.94279]},n4800:{id:"n4800",loc:[-85.615069,41.945527]},n4801:{id:"n4801",loc:[-85.615058,41.946677]},n4802:{id:"n4802",loc:[-85.613692,41.946689]},n4803:{id:"n4803",loc:[-85.613475,41.946531]},n4804:{id:"n4804",loc:[-85.611717,41.946252]},n4805:{id:"n4805",loc:[-85.611353,41.946385]},n4806:{id:"n4806",loc:[-85.611304,41.947397]},n4807:{id:"n4807",loc:[-85.610564,41.947401]},n4808:{id:"n4808",loc:[-85.610553,41.947122]},n4809:{id:"n4809",loc:[-85.610194,41.946992]},n481:{id:"n481",loc:[-85.634478,41.942342]},n4810:{id:"n4810",loc:[-85.609976,41.946628]},n4811:{id:"n4811",loc:[-85.609769,41.946523]},n4812:{id:"n4812",loc:[-85.609307,41.946523]},n4813:{id:"n4813",loc:[-85.609035,41.946462]},n4814:{id:"n4814",loc:[-85.609018,41.943277]},n4815:{id:"n4815",loc:[-85.609617,41.943423]},n4816:{id:"n4816",loc:[-85.610471,41.943447]},n4817:{id:"n4817",loc:[-85.621491,41.949168]},n4818:{id:"n4818",loc:[-85.620266,41.94917]},n4819:{id:"n4819",loc:[-85.620262,41.947557]},n482:{id:"n482",loc:[-85.634521,41.942254]},n4820:{id:"n4820",loc:[-85.620825,41.947556]},n4821:{id:"n4821",loc:[-85.620827,41.948371]},n4822:{id:"n4822",loc:[-85.621489,41.94837]},n4823:{id:"n4823",loc:[-85.622865,41.950928]},n4824:{id:"n4824",loc:[-85.622858,41.949744]},n4825:{id:"n4825",loc:[-85.623696,41.949714]},n4826:{id:"n4826",loc:[-85.623696,41.949647]},n4827:{id:"n4827",loc:[-85.624019,41.949647]},n4828:{id:"n4828",loc:[-85.624024,41.950093]},n4829:{id:"n4829",loc:[-85.622885,41.949711]},n483:{id:"n483",loc:[-85.63425,41.941819]},n4830:{id:"n4830",loc:[-85.624584,41.951049]},n4831:{id:"n4831",loc:[-85.624669,41.9511]},n4832:{id:"n4832",loc:[-85.624316,41.952218]},n4833:{id:"n4833",loc:[-85.623819,41.952094]},n4834:{id:"n4834",loc:[-85.623385,41.952101]},n4835:{id:"n4835",loc:[-85.623456,41.951238]},n4836:{id:"n4836",loc:[-85.623535,41.951051]},n4837:{id:"n4837",loc:[-85.624693,41.950921]},n4838:{id:"n4838",loc:[-85.624727,41.950897]},n4839:{id:"n4839",loc:[-85.624869,41.950341]},n484:{id:"n484",loc:[-85.634324,41.942131]},n4840:{id:"n4840",loc:[-85.624859,41.949284]},n4841:{id:"n4841",loc:[-85.624788,41.949262]},n4842:{id:"n4842",loc:[-85.62402,41.949265]},n4843:{id:"n4843",loc:[-85.610382,41.954663]},n4844:{id:"n4844",loc:[-85.605675,41.954667]},n4845:{id:"n4845",loc:[-85.605669,41.949407]},n4846:{id:"n4846",loc:[-85.610376,41.949404]},n4847:{id:"n4847",loc:[-85.605552,41.958536]},n4848:{id:"n4848",loc:[-85.595755,41.958588]},n4849:{id:"n4849",loc:[-85.595732,41.956419]},n485:{id:"n485",loc:[-85.634211,41.941374]},n4850:{id:"n4850",loc:[-85.596908,41.955605]},n4851:{id:"n4851",loc:[-85.597723,41.955596]},n4852:{id:"n4852",loc:[-85.597715,41.954967]},n4853:{id:"n4853",loc:[-85.5874,41.955018]},n4854:{id:"n4854",loc:[-85.586615,41.955124]},n4855:{id:"n4855",loc:[-85.58613,41.955293]},n4856:{id:"n4856",loc:[-85.586166,41.962122]},n4857:{id:"n4857",loc:[-85.587008,41.955052]},n4858:{id:"n4858",loc:[-85.591685,41.95499]},n4859:{id:"n4859",loc:[-85.591718,41.956649]},n486:{id:"n486",loc:[-85.634085,41.940704]},n4860:{id:"n4860",loc:[-85.591133,41.956649]},n4861:{id:"n4861",loc:[-85.591061,41.95582]},n4862:{id:"n4862",loc:[-85.590677,41.95613]},n4863:{id:"n4863",loc:[-85.590826,41.956369]},n4864:{id:"n4864",loc:[-85.591016,41.954991]},n4865:{id:"n4865",loc:[-85.587656,41.954855]},n4866:{id:"n4866",loc:[-85.5964,41.955274]},n4867:{id:"n4867",loc:[-85.58776,41.96178]},n4868:{id:"n4868",loc:[-85.601172,41.960448]},n4869:{id:"n4869",loc:[-85.589489,41.960478]},n487:{id:"n487",loc:[-85.635567,41.940944]},n4870:{id:"n4870",loc:[-85.586664,41.960493]},n4871:{id:"n4871",loc:[-85.591227,41.95676]},n4872:{id:"n4872",loc:[-85.589424,41.958093]},n4873:{id:"n4873",loc:[-85.588779,41.957611]},n4874:{id:"n4874",loc:[-85.590583,41.956278]},n4875:{id:"n4875",loc:[-85.590759,41.957106]},n4876:{id:"n4876",loc:[-85.592213,41.958218]},n4877:{id:"n4877",loc:[-85.592262,41.958279]},n4878:{id:"n4878",loc:[-85.592304,41.958358]},n4879:{id:"n4879",loc:[-85.592351,41.95849]},n488:{id:"n488",loc:[-85.635542,41.940919]},n4880:{id:"n4880",loc:[-85.592363,41.958605]},n4881:{id:"n4881",loc:[-85.592383,41.96047]},n4882:{id:"n4882",loc:[-85.592376,41.959808]},n4883:{id:"n4883",loc:[-85.600825,41.959779]},n4884:{id:"n4884",loc:[-85.601084,41.959844]},n4885:{id:"n4885",loc:[-85.601144,41.959908]},n4886:{id:"n4886",loc:[-85.601164,41.960008]},n4887:{id:"n4887",loc:[-85.601162,41.960125]},n4888:{id:"n4888",loc:[-85.601134,41.960221]},n4889:{id:"n4889",loc:[-85.600993,41.960353]},n489:{id:"n489",loc:[-85.635514,41.940906]},n4890:{id:"n4890",loc:[-85.600794,41.960449]},n4891:{id:"n4891",loc:[-85.60098,41.959792]},n4892:{id:"n4892",loc:[-85.601067,41.960294]},n4893:{id:"n4893",loc:[-85.596829,41.959793]},n4894:{id:"n4894",loc:[-85.596839,41.960459]},n4895:{id:"n4895",loc:[-85.589364,41.958048]},n4896:{id:"n4896",loc:[-85.587374,41.959511]},n4897:{id:"n4897",loc:[-85.587286,41.959564]},n4898:{id:"n4898",loc:[-85.587163,41.959632]},n4899:{id:"n4899",loc:[-85.586694,41.959865]},n49:{id:"n49",loc:[-85.637127,41.942757]},n490:{id:"n490",loc:[-85.635469,41.940896]},n4900:{id:"n4900",loc:[-85.586634,41.959921]},n4901:{id:"n4901",loc:[-85.586607,41.960001]},n4902:{id:"n4902",loc:[-85.586599,41.960099]},n4903:{id:"n4903",loc:[-85.586602,41.96034]},n4904:{id:"n4904",loc:[-85.586669,41.960439]},n4905:{id:"n4905",loc:[-85.586758,41.960493]},n4906:{id:"n4906",loc:[-85.586618,41.960391]},n4907:{id:"n4907",loc:[-85.591201,41.956352]},n4908:{id:"n4908",loc:[-85.59112,41.954843]},n4909:{id:"n4909",loc:[-85.591536,41.956349]},n491:{id:"n491",loc:[-85.635667,41.940826]},n4910:{id:"n4910",loc:[-85.590953,41.956354]},n4911:{id:"n4911",loc:[-85.591468,41.956406]},n4912:{id:"n4912",loc:[-85.591469,41.956478]},n4913:{id:"n4913",loc:[-85.591123,41.956481]},n4914:{id:"n4914",loc:[-85.591121,41.956409]},n4915:{id:"n4915",loc:[-85.590826,41.955954]},n4916:{id:"n4916",loc:[-85.590612,41.956115]},n4917:{id:"n4917",loc:[-85.590402,41.955962]},n4918:{id:"n4918",loc:[-85.590622,41.955804]},n4919:{id:"n4919",loc:[-85.59011,41.956502]},n492:{id:"n492",loc:[-85.636197,41.940599]},n4920:{id:"n4920",loc:[-85.589877,41.956668]},n4921:{id:"n4921",loc:[-85.589777,41.95659]},n4922:{id:"n4922",loc:[-85.59001,41.956424]},n4923:{id:"n4923",loc:[-85.589595,41.956427]},n4924:{id:"n4924",loc:[-85.589434,41.956549]},n4925:{id:"n4925",loc:[-85.589262,41.956424]},n4926:{id:"n4926",loc:[-85.589422,41.956302]},n4927:{id:"n4927",loc:[-85.589358,41.956286]},n4928:{id:"n4928",loc:[-85.5892,41.956408]},n4929:{id:"n4929",loc:[-85.589032,41.956288]},n493:{id:"n493",loc:[-85.6362,41.940686]},n4930:{id:"n4930",loc:[-85.58919,41.956166]},n4931:{id:"n4931",loc:[-85.589165,41.956132]},n4932:{id:"n4932",loc:[-85.589002,41.956253]},n4933:{id:"n4933",loc:[-85.588826,41.956122]},n4934:{id:"n4934",loc:[-85.588989,41.956001]},n4935:{id:"n4935",loc:[-85.588673,41.955757]},n4936:{id:"n4936",loc:[-85.588502,41.955882]},n4937:{id:"n4937",loc:[-85.588339,41.955759]},n4938:{id:"n4938",loc:[-85.58851,41.955633]},n4939:{id:"n4939",loc:[-85.590382,41.955892]},n494:{id:"n494",loc:[-85.635969,41.94069]},n4940:{id:"n4940",loc:[-85.589923,41.956231]},n4941:{id:"n4941",loc:[-85.58984,41.956168]},n4942:{id:"n4942",loc:[-85.5903,41.95583]},n4943:{id:"n4943",loc:[-85.589636,41.956038]},n4944:{id:"n4944",loc:[-85.589546,41.956105]},n4945:{id:"n4945",loc:[-85.589045,41.955729]},n4946:{id:"n4946",loc:[-85.589135,41.955662]},n4947:{id:"n4947",loc:[-85.590718,41.955293]},n4948:{id:"n4948",loc:[-85.590718,41.955374]},n4949:{id:"n4949",loc:[-85.589211,41.955369]},n495:{id:"n495",loc:[-85.635965,41.940561]},n4950:{id:"n4950",loc:[-85.589212,41.955287]},n4951:{id:"n4951",loc:[-85.589675,41.956817]},n4952:{id:"n4952",loc:[-85.58947,41.95697]},n4953:{id:"n4953",loc:[-85.589219,41.956784]},n4954:{id:"n4954",loc:[-85.589425,41.95663]},n4955:{id:"n4955",loc:[-85.589373,41.95702]},n4956:{id:"n4956",loc:[-85.589171,41.957172]},n4957:{id:"n4957",loc:[-85.588962,41.957019]},n4958:{id:"n4958",loc:[-85.589164,41.956867]},n4959:{id:"n4959",loc:[-85.588881,41.955006]},n496:{id:"n496",loc:[-85.636031,41.94056]},n4960:{id:"n4960",loc:[-85.588804,41.955006]},n4961:{id:"n4961",loc:[-85.604773,41.954521]},n4962:{id:"n4962",loc:[-85.601603,41.954527]},n4963:{id:"n4963",loc:[-85.600823,41.954169]},n4964:{id:"n4964",loc:[-85.600828,41.950191]},n4965:{id:"n4965",loc:[-85.601673,41.949457]},n4966:{id:"n4966",loc:[-85.604464,41.949488]},n4967:{id:"n4967",loc:[-85.60538,41.950212]},n4968:{id:"n4968",loc:[-85.605395,41.954108]},n4969:{id:"n4969",loc:[-85.604771,41.954109]},n497:{id:"n497",loc:[-85.636032,41.940602]},n4970:{id:"n4970",loc:[-85.600613,41.953916]},n4971:{id:"n4971",loc:[-85.599758,41.954649]},n4972:{id:"n4972",loc:[-85.591194,41.954663]},n4973:{id:"n4973",loc:[-85.591182,41.950465]},n4974:{id:"n4974",loc:[-85.591871,41.950464]},n4975:{id:"n4975",loc:[-85.591868,41.949209]},n4976:{id:"n4976",loc:[-85.592155,41.949209]},n4977:{id:"n4977",loc:[-85.592155,41.94848]},n4978:{id:"n4978",loc:[-85.600615,41.948482]},n4979:{id:"n4979",loc:[-85.605421,41.949378]},n498:{id:"n498",loc:[-85.635783,41.940583]},n4980:{id:"n4980",loc:[-85.600614,41.949373]},n4981:{id:"n4981",loc:[-85.601316,41.94849]},n4982:{id:"n4982",loc:[-85.601592,41.947641]},n4983:{id:"n4983",loc:[-85.60395,41.947618]},n4984:{id:"n4984",loc:[-85.603973,41.948114]},n4985:{id:"n4985",loc:[-85.605398,41.948103]},n4986:{id:"n4986",loc:[-85.614017,41.965566]},n4987:{id:"n4987",loc:[-85.605787,41.965619]},n4988:{id:"n4988",loc:[-85.60577,41.963821]},n4989:{id:"n4989",loc:[-85.612886,41.963808]},n499:{id:"n499",loc:[-85.63589,41.940578]},n4990:{id:"n4990",loc:[-85.613207,41.963705]},n4991:{id:"n4991",loc:[-85.613511,41.963525]},n4992:{id:"n4992",loc:[-85.613667,41.963305]},n4993:{id:"n4993",loc:[-85.613779,41.962983]},n4994:{id:"n4994",loc:[-85.613797,41.959709]},n4995:{id:"n4995",loc:[-85.613663,41.95936]},n4996:{id:"n4996",loc:[-85.61339,41.959064]},n4997:{id:"n4997",loc:[-85.610503,41.956898]},n4998:{id:"n4998",loc:[-85.610485,41.956595]},n4999:{id:"n4999",loc:[-85.613892,41.956621]},n5:{id:"n5",loc:[-85.622744,41.95268]},n50:{id:"n50",loc:[-85.636673,41.943143]},n500:{id:"n500",loc:[-85.636198,41.940578]},n5000:{id:"n5000",loc:[-85.613866,41.958574]},n5001:{id:"n5001",loc:[-85.615262,41.958561]},n5002:{id:"n5002",loc:[-85.615279,41.959541]},n5003:{id:"n5003",loc:[-85.615314,41.95597]},n5004:{id:"n5004",loc:[-85.613887,41.955988]},n5005:{id:"n5005",loc:[-85.613074,41.962244]},n5006:{id:"n5006",loc:[-85.611678,41.963354]},n5007:{id:"n5007",loc:[-85.611678,41.963487]},n5008:{id:"n5008",loc:[-85.606906,41.963502]},n5009:{id:"n5009",loc:[-85.605777,41.962657]},n501:{id:"n501",loc:[-85.636251,41.940584]},n5010:{id:"n5010",loc:[-85.605711,41.9599]},n5011:{id:"n5011",loc:[-85.608139,41.9585]},n5012:{id:"n5012",loc:[-85.60814,41.956306]},n5013:{id:"n5013",loc:[-85.608854,41.95581]},n5014:{id:"n5014",loc:[-85.610039,41.955883]},n5015:{id:"n5015",loc:[-85.610068,41.956754]},n5016:{id:"n5016",loc:[-85.613058,41.959411]},n5017:{id:"n5017",loc:[-85.610234,41.957068]},n5018:{id:"n5018",loc:[-85.609826,41.95581]},n5019:{id:"n5019",loc:[-85.606987,41.958505]},n502:{id:"n502",loc:[-85.636279,41.940605]},n5020:{id:"n5020",loc:[-85.606498,41.958846]},n5021:{id:"n5021",loc:[-85.606013,41.959342]},n5022:{id:"n5022",loc:[-85.614553,41.961581]},n5023:{id:"n5023",loc:[-85.61465,41.96214]},n5024:{id:"n5024",loc:[-85.615277,41.962442]},n5025:{id:"n5025",loc:[-85.615451,41.962972]},n5026:{id:"n5026",loc:[-85.614355,41.964826]},n5027:{id:"n5027",loc:[-85.615133,41.964589]},n5028:{id:"n5028",loc:[-85.615342,41.963818]},n5029:{id:"n5029",loc:[-85.615971,41.963792]},n503:{id:"n503",loc:[-85.636285,41.940633]},n5030:{id:"n5030",loc:[-85.615751,41.963122]},n5031:{id:"n5031",loc:[-85.616575,41.963123]},n5032:{id:"n5032",loc:[-85.612527,41.963846]},n5033:{id:"n5033",loc:[-85.630653,41.940709]},n5034:{id:"n5034",loc:[-85.629858,41.939568]},n5035:{id:"n5035",loc:[-85.629847,41.937926]},n504:{id:"n504",loc:[-85.636281,41.940662]},n505:{id:"n505",loc:[-85.636266,41.940688]},n506:{id:"n506",loc:[-85.636236,41.940701]},n507:{id:"n507",loc:[-85.63619,41.940706]},n508:{id:"n508",loc:[-85.635892,41.940707]},n509:{id:"n509",loc:[-85.635785,41.9407]},n51:{id:"n51",loc:[-85.636673,41.942864]},n510:{id:"n510",loc:[-85.636044,41.940578]},n511:{id:"n511",loc:[-85.635946,41.940578]},n512:{id:"n512",loc:[-85.636475,41.940732]},n513:{id:"n513",loc:[-85.636475,41.940777]},n514:{id:"n514",loc:[-85.636405,41.940777]},n515:{id:"n515",loc:[-85.636405,41.940732]},n516:{id:"n516",loc:[-85.636471,41.940916]},n517:{id:"n517",loc:[-85.636471,41.940961]},n518:{id:"n518",loc:[-85.636404,41.940961]},n519:{id:"n519",loc:[-85.636404,41.940916]},n52:{id:"n52",loc:[-85.636227,41.942864]},n520:{id:"n520",loc:[-85.636286,41.941127]},n521:{id:"n521",loc:[-85.636203,41.941126]},n522:{id:"n522",loc:[-85.636204,41.941083]},n523:{id:"n523",loc:[-85.636287,41.941083]},n524:{id:"n524",loc:[-85.636124,41.941064]},n525:{id:"n525",loc:[-85.636,41.941065]},n526:{id:"n526",loc:[-85.636,41.940964]},n527:{id:"n527",loc:[-85.636045,41.940964]},n528:{id:"n528",loc:[-85.636045,41.940928]},n529:{id:"n529",loc:[-85.636111,41.940928]},n53:{id:"n53",loc:[-85.636227,41.943143]},n530:{id:"n530",loc:[-85.636111,41.940961]},n531:{id:"n531",loc:[-85.636123,41.940961]},n532:{id:"n532",loc:[-85.636124,41.940997]},n533:{id:"n533",loc:[-85.636164,41.940997]},n534:{id:"n534",loc:[-85.636164,41.941044]},n535:{id:"n535",loc:[-85.636124,41.941044]},n536:{id:"n536",loc:[-85.636534,41.941256]},n537:{id:"n537",loc:[-85.63645,41.941246]},n538:{id:"n538",loc:[-85.636462,41.941189]},n539:{id:"n539",loc:[-85.636546,41.941199]},n54:{id:"n54",loc:[-85.636198,41.943119]},n540:{id:"n540",loc:[-85.636802,41.941226]},n541:{id:"n541",loc:[-85.636701,41.941215]},n542:{id:"n542",loc:[-85.636709,41.941174]},n543:{id:"n543",loc:[-85.636656,41.941168]},n544:{id:"n544",loc:[-85.636666,41.941122]},n545:{id:"n545",loc:[-85.636781,41.941136]},n546:{id:"n546",loc:[-85.636774,41.94117]},n547:{id:"n547",loc:[-85.636812,41.941175]},n548:{id:"n548",loc:[-85.636803,41.941047]},n549:{id:"n549",loc:[-85.636785,41.941047]},n55:{id:"n55",loc:[-85.635945,41.94312]},n550:{id:"n550",loc:[-85.636785,41.941058]},n551:{id:"n551",loc:[-85.636644,41.941059]},n552:{id:"n552",loc:[-85.636644,41.941038]},n553:{id:"n553",loc:[-85.636581,41.941039]},n554:{id:"n554",loc:[-85.636581,41.940995]},n555:{id:"n555",loc:[-85.636746,41.940995]},n556:{id:"n556",loc:[-85.636746,41.940978]},n557:{id:"n557",loc:[-85.636803,41.940978]},n558:{id:"n558",loc:[-85.636781,41.940768]},n559:{id:"n559",loc:[-85.636783,41.940828]},n56:{id:"n56",loc:[-85.635943,41.942909]},n560:{id:"n560",loc:[-85.636761,41.940828]},n561:{id:"n561",loc:[-85.636762,41.940857]},n562:{id:"n562",loc:[-85.636641,41.940859]},n563:{id:"n563",loc:[-85.63664,41.940805]},n564:{id:"n564",loc:[-85.636676,41.940804]},n565:{id:"n565",loc:[-85.636675,41.940769]},n566:{id:"n566",loc:[-85.636733,41.94033]},n567:{id:"n567",loc:[-85.636471,41.940334]},n568:{id:"n568",loc:[-85.636469,41.940262]},n569:{id:"n569",loc:[-85.636731,41.940257]},n57:{id:"n57",loc:[-85.636227,41.942909]},n570:{id:"n570",loc:[-85.636798,41.940419]},n571:{id:"n571",loc:[-85.6368,41.940524]},n572:{id:"n572",loc:[-85.63664,41.940526]},n573:{id:"n573",loc:[-85.636638,41.940421]},n574:{id:"n574",loc:[-85.636372,41.940551]},n575:{id:"n575",loc:[-85.636338,41.94055]},n576:{id:"n576",loc:[-85.636339,41.940524]},n577:{id:"n577",loc:[-85.636373,41.940525]},n578:{id:"n578",loc:[-85.636388,41.940435]},n579:{id:"n579",loc:[-85.636222,41.940436]},n58:{id:"n58",loc:[-85.63627,41.943175]},n580:{id:"n580",loc:[-85.636222,41.940366]},n581:{id:"n581",loc:[-85.636387,41.940365]},n582:{id:"n582",loc:[-85.636158,41.940482]},n583:{id:"n583",loc:[-85.635963,41.940484]},n584:{id:"n584",loc:[-85.635961,41.940399]},n585:{id:"n585",loc:[-85.636156,41.940397]},n586:{id:"n586",loc:[-85.635987,41.940314]},n587:{id:"n587",loc:[-85.635987,41.940268]},n588:{id:"n588",loc:[-85.635968,41.940268]},n589:{id:"n589",loc:[-85.635967,41.940212]},n59:{id:"n59",loc:[-85.635531,41.943176]},n590:{id:"n590",loc:[-85.636082,41.940211]},n591:{id:"n591",loc:[-85.636083,41.94027]},n592:{id:"n592",loc:[-85.636064,41.94027]},n593:{id:"n593",loc:[-85.636064,41.940313]},n594:{id:"n594",loc:[-85.638071,41.941562]},n595:{id:"n595",loc:[-85.637953,41.941562]},n596:{id:"n596",loc:[-85.637952,41.941522]},n597:{id:"n597",loc:[-85.637876,41.941523]},n598:{id:"n598",loc:[-85.637876,41.941471]},n599:{id:"n599",loc:[-85.638035,41.94147]},n6:{id:"n6",loc:[-85.624925,41.950604]},n60:{id:"n60",loc:[-85.63542,41.942883]},n600:{id:"n600",loc:[-85.638035,41.941513]},n601:{id:"n601",loc:[-85.638071,41.941512]},n602:{id:"n602",loc:[-85.637038,41.942543],tags:{crossing:"marked",highway:"crossing"}},n603:{id:"n603",loc:[-85.637134,41.942542]},n604:{id:"n604",loc:[-85.638122,41.942532]},n605:{id:"n605",loc:[-85.638121,41.942478]},n606:{id:"n606",loc:[-85.638104,41.941424]},n607:{id:"n607",loc:[-85.637115,41.941438]},n608:{id:"n608",loc:[-85.637133,41.942453]},n609:{id:"n609",loc:[-85.637429,41.942004]},n61:{id:"n61",loc:[-85.635701,41.942802]},n610:{id:"n610",loc:[-85.637125,41.942004]},n611:{id:"n611",loc:[-85.637022,41.942004]},n612:{id:"n612",loc:[-85.635952,41.943579]},n613:{id:"n613",loc:[-85.635872,41.943594]},n614:{id:"n614",loc:[-85.635857,41.943551]},n615:{id:"n615",loc:[-85.635937,41.943535]},n616:{id:"n616",loc:[-85.63671,41.94344]},n617:{id:"n617",loc:[-85.636427,41.94334]},n618:{id:"n618",loc:[-85.635353,41.943279]},n619:{id:"n619",loc:[-85.635319,41.943257]},n62:{id:"n62",loc:[-85.6358,41.942997]},n620:{id:"n620",loc:[-85.638786,41.943105]},n621:{id:"n621",loc:[-85.634957,41.943146]},n622:{id:"n622",loc:[-85.635012,41.943119]},n623:{id:"n623",loc:[-85.632409,41.944222]},n624:{id:"n624",loc:[-85.631863,41.944749]},n625:{id:"n625",loc:[-85.631915,41.944722]},n626:{id:"n626",loc:[-85.631884,41.94464]},n627:{id:"n627",loc:[-85.631792,41.944359]},n628:{id:"n628",loc:[-85.631817,41.944703]},n629:{id:"n629",loc:[-85.633464,41.945787]},n63:{id:"n63",loc:[-85.635808,41.943176]},n630:{id:"n630",loc:[-85.633583,41.945919]},n631:{id:"n631",loc:[-85.63382,41.945698]},n632:{id:"n632",loc:[-85.633681,41.945571]},n633:{id:"n633",loc:[-85.634217,41.946824]},n634:{id:"n634",loc:[-85.634271,41.946836]},n635:{id:"n635",loc:[-85.634319,41.94573]},n636:{id:"n636",loc:[-85.634377,41.945672]},n637:{id:"n637",loc:[-85.634909,41.945354]},n638:{id:"n638",loc:[-85.634726,41.945493],tags:{artwork_type:"mural",tourism:"artwork"}},n639:{id:"n639",loc:[-85.63546,41.945612]},n64:{id:"n64",loc:[-85.63631,41.943253]},n640:{id:"n640",loc:[-85.635561,41.945493]},n641:{id:"n641",loc:[-85.635417,41.945565]},n642:{id:"n642",loc:[-85.635315,41.945583]},n643:{id:"n643",loc:[-85.63506,41.945383]},n644:{id:"n644",loc:[-85.635198,41.945199]},n645:{id:"n645",loc:[-85.635361,41.94558]},n646:{id:"n646",loc:[-85.635017,41.945066]},n647:{id:"n647",loc:[-85.634779,41.945206]},n648:{id:"n648",loc:[-85.63425,41.945655]},n649:{id:"n649",loc:[-85.634247,41.945631]},n65:{id:"n65",loc:[-85.635398,41.943259]},n650:{id:"n650",loc:[-85.634889,41.945921]},n651:{id:"n651",loc:[-85.634889,41.945939]},n652:{id:"n652",loc:[-85.634889,41.945761]},n653:{id:"n653",loc:[-85.63489,41.945778]},n654:{id:"n654",loc:[-85.635112,41.945715]},n655:{id:"n655",loc:[-85.635025,41.945714]},n656:{id:"n656",loc:[-85.635027,41.945761]},n657:{id:"n657",loc:[-85.635438,41.945665]},n658:{id:"n658",loc:[-85.635416,41.945676]},n659:{id:"n659",loc:[-85.635401,41.945709]},n66:{id:"n66",loc:[-85.635336,41.943036]},n660:{id:"n660",loc:[-85.635271,41.945566]},n661:{id:"n661",loc:[-85.636106,41.946268]},n662:{id:"n662",loc:[-85.635867,41.946747]},n663:{id:"n663",loc:[-85.636476,41.946797]},n664:{id:"n664",loc:[-85.63651,41.946796]},n665:{id:"n665",loc:[-85.635367,41.946389]},n666:{id:"n666",loc:[-85.635367,41.946437]},n667:{id:"n667",loc:[-85.634787,41.946441]},n668:{id:"n668",loc:[-85.6358,41.946243]},n669:{id:"n669",loc:[-85.635784,41.94622]},n67:{id:"n67",loc:[-85.635911,41.942899]},n670:{id:"n670",loc:[-85.635727,41.946195]},n671:{id:"n671",loc:[-85.635708,41.946588]},n672:{id:"n672",loc:[-85.635648,41.946561]},n673:{id:"n673",loc:[-85.635624,41.946555]},n674:{id:"n674",loc:[-85.635417,41.946559]},n675:{id:"n675",loc:[-85.634866,41.946561]},n676:{id:"n676",loc:[-85.634866,41.946543]},n677:{id:"n677",loc:[-85.635085,41.946546]},n678:{id:"n678",loc:[-85.635085,41.946554]},n679:{id:"n679",loc:[-85.634584,41.94488]},n68:{id:"n68",loc:[-85.635915,41.943156]},n680:{id:"n680",loc:[-85.634557,41.944882]},n681:{id:"n681",loc:[-85.634455,41.944943]},n682:{id:"n682",loc:[-85.634305,41.944968]},n683:{id:"n683",loc:[-85.634261,41.944927]},n684:{id:"n684",loc:[-85.634132,41.944741]},n685:{id:"n685",loc:[-85.633705,41.944759]},n686:{id:"n686",loc:[-85.633918,41.944616]},n687:{id:"n687",loc:[-85.633974,41.944663]},n688:{id:"n688",loc:[-85.6336,41.944665]},n689:{id:"n689",loc:[-85.633817,41.944528]},n69:{id:"n69",loc:[-85.63631,41.943157]},n690:{id:"n690",loc:[-85.633889,41.944485]},n691:{id:"n691",loc:[-85.633931,41.944525]},n692:{id:"n692",loc:[-85.633864,41.944563]},n693:{id:"n693",loc:[-85.633456,41.944524]},n694:{id:"n694",loc:[-85.633676,41.944399]},n695:{id:"n695",loc:[-85.633352,41.944415]},n696:{id:"n696",loc:[-85.633655,41.944234]},n697:{id:"n697",loc:[-85.633761,41.94435]},n698:{id:"n698",loc:[-85.633254,41.944318]},n699:{id:"n699",loc:[-85.633472,41.944188]},n7:{id:"n7",loc:[-85.638791,41.943231]},n70:{id:"n70",loc:[-85.63579,41.942967]},n700:{id:"n700",loc:[-85.633524,41.944237]},n701:{id:"n701",loc:[-85.633583,41.944202]},n702:{id:"n702",loc:[-85.633632,41.944247]},n703:{id:"n703",loc:[-85.633165,41.944228]},n704:{id:"n704",loc:[-85.633388,41.944105]},n705:{id:"n705",loc:[-85.633117,41.944175]},n706:{id:"n706",loc:[-85.633302,41.944077]},n707:{id:"n707",loc:[-85.633352,41.944126]},n708:{id:"n708",loc:[-85.633052,41.944107]},n709:{id:"n709",loc:[-85.633237,41.944009]},n71:{id:"n71",loc:[-85.637506,41.942824]},n710:{id:"n710",loc:[-85.633187,41.943955]},n711:{id:"n711",loc:[-85.633,41.944054]},n712:{id:"n712",loc:[-85.633155,41.944265]},n713:{id:"n713",loc:[-85.633669,41.944765]},n714:{id:"n714",loc:[-85.634468,41.945503]},n715:{id:"n715",loc:[-85.63455,41.945566]},n716:{id:"n716",loc:[-85.634737,41.945729]},n717:{id:"n717",loc:[-85.634753,41.945752]},n718:{id:"n718",loc:[-85.634756,41.945781]},n719:{id:"n719",loc:[-85.634758,41.945978]},n72:{id:"n72",loc:[-85.637511,41.943056]},n720:{id:"n720",loc:[-85.634363,41.945548],tags:{crossing:"marked",highway:"crossing"}},n721:{id:"n721",loc:[-85.634245,41.945599]},n722:{id:"n722",loc:[-85.633474,41.944889]},n723:{id:"n723",loc:[-85.632997,41.944418]},n724:{id:"n724",loc:[-85.63278,41.944183]},n725:{id:"n725",loc:[-85.63331,41.944429]},n726:{id:"n726",loc:[-85.633568,41.944829],tags:{crossing:"marked",highway:"crossing"}},n727:{id:"n727",loc:[-85.634669,41.94567]},n728:{id:"n728",loc:[-85.634462,41.945787]},n729:{id:"n729",loc:[-85.634272,41.945625]},n73:{id:"n73",loc:[-85.637361,41.943058]},n730:{id:"n730",loc:[-85.634344,41.945699],tags:{crossing:"marked",highway:"crossing"}},n731:{id:"n731",loc:[-85.634426,41.945783]},n732:{id:"n732",loc:[-85.632425,41.944137]},n733:{id:"n733",loc:[-85.632302,41.944192]},n734:{id:"n734",loc:[-85.632762,41.944174]},n735:{id:"n735",loc:[-85.632713,41.944179]},n736:{id:"n736",loc:[-85.632411,41.944327]},n737:{id:"n737",loc:[-85.632362,41.944341]},n738:{id:"n738",loc:[-85.632236,41.944204]},n739:{id:"n739",loc:[-85.634939,41.942165]},n74:{id:"n74",loc:[-85.637356,41.942825]},n740:{id:"n740",loc:[-85.635079,41.941535]},n741:{id:"n741",loc:[-85.635112,41.941595]},n742:{id:"n742",loc:[-85.635113,41.941633]},n743:{id:"n743",loc:[-85.635067,41.941652]},n744:{id:"n744",loc:[-85.634989,41.941651]},n745:{id:"n745",loc:[-85.634921,41.941609]},n746:{id:"n746",loc:[-85.634881,41.941544]},n747:{id:"n747",loc:[-85.635537,41.940939]},n748:{id:"n748",loc:[-85.635573,41.941048]},n749:{id:"n749",loc:[-85.635453,41.94091]},n75:{id:"n75",loc:[-85.638097,41.942833]},n750:{id:"n750",loc:[-85.635319,41.940943]},n751:{id:"n751",loc:[-85.637057,41.943224]},n752:{id:"n752",loc:[-85.636989,41.943296]},n753:{id:"n753",loc:[-85.636851,41.943299]},n754:{id:"n754",loc:[-85.636848,41.94322]},n755:{id:"n755",loc:[-85.636986,41.943217]},n756:{id:"n756",loc:[-85.637569,41.943454]},n757:{id:"n757",loc:[-85.637437,41.943458]},n758:{id:"n758",loc:[-85.637432,41.943384]},n759:{id:"n759",loc:[-85.637564,41.94338]},n76:{id:"n76",loc:[-85.638098,41.942912]},n760:{id:"n760",loc:[-85.637213,41.943378]},n761:{id:"n761",loc:[-85.637217,41.943435]},n762:{id:"n762",loc:[-85.637235,41.943434]},n763:{id:"n763",loc:[-85.637237,41.943465]},n764:{id:"n764",loc:[-85.637424,41.943459]},n765:{id:"n765",loc:[-85.637418,41.943371]},n766:{id:"n766",loc:[-85.638094,41.943149]},n767:{id:"n767",loc:[-85.638096,41.943201]},n768:{id:"n768",loc:[-85.638041,41.943202]},n769:{id:"n769",loc:[-85.638042,41.943216]},n77:{id:"n77",loc:[-85.637705,41.942913]},n770:{id:"n770",loc:[-85.637927,41.943218]},n771:{id:"n771",loc:[-85.637926,41.943201]},n772:{id:"n772",loc:[-85.637897,41.943201]},n773:{id:"n773",loc:[-85.637896,41.943155]},n774:{id:"n774",loc:[-85.637962,41.943153]},n775:{id:"n775",loc:[-85.637962,41.943134]},n776:{id:"n776",loc:[-85.638017,41.943132]},n777:{id:"n777",loc:[-85.638018,41.943151]},n778:{id:"n778",loc:[-85.638045,41.943289]},n779:{id:"n779",loc:[-85.638048,41.943363]},n78:{id:"n78",loc:[-85.637705,41.942834]},n780:{id:"n780",loc:[-85.637842,41.943367]},n781:{id:"n781",loc:[-85.637839,41.943296]},n782:{id:"n782",loc:[-85.637896,41.943295]},n783:{id:"n783",loc:[-85.637897,41.943314]},n784:{id:"n784",loc:[-85.637957,41.943312]},n785:{id:"n785",loc:[-85.637957,41.943291]},n786:{id:"n786",loc:[-85.637816,41.943375]},n787:{id:"n787",loc:[-85.637815,41.943416]},n788:{id:"n788",loc:[-85.637715,41.943415]},n789:{id:"n789",loc:[-85.637716,41.943374]},n79:{id:"n79",loc:[-85.638071,41.942298]},n790:{id:"n790",loc:[-85.637912,41.943545]},n791:{id:"n791",loc:[-85.637909,41.943479]},n792:{id:"n792",loc:[-85.637967,41.943477]},n793:{id:"n793",loc:[-85.637967,41.94346]},n794:{id:"n794",loc:[-85.638077,41.943457]},n795:{id:"n795",loc:[-85.638078,41.943473]},n796:{id:"n796",loc:[-85.638124,41.943471]},n797:{id:"n797",loc:[-85.638126,41.943514]},n798:{id:"n798",loc:[-85.638079,41.943515]},n799:{id:"n799",loc:[-85.638079,41.943532]},n8:{id:"n8",loc:[-85.635241,41.941948]},n80:{id:"n80",loc:[-85.638074,41.942431]},n800:{id:"n800",loc:[-85.638028,41.943534]},n801:{id:"n801",loc:[-85.638028,41.943542]},n802:{id:"n802",loc:[-85.638845,41.942983]},n803:{id:"n803",loc:[-85.638846,41.94305]},n804:{id:"n804",loc:[-85.638661,41.943052]},n805:{id:"n805",loc:[-85.63866,41.942984]},n806:{id:"n806",loc:[-85.638579,41.942753]},n807:{id:"n807",loc:[-85.638445,41.942755]},n808:{id:"n808",loc:[-85.638452,41.942978]},n809:{id:"n809",loc:[-85.638545,41.942976]},n81:{id:"n81",loc:[-85.637836,41.942433]},n810:{id:"n810",loc:[-85.638543,41.942935]},n811:{id:"n811",loc:[-85.638571,41.942934]},n812:{id:"n812",loc:[-85.63857,41.942901]},n813:{id:"n813",loc:[-85.638611,41.9429]},n814:{id:"n814",loc:[-85.638607,41.942769]},n815:{id:"n815",loc:[-85.63858,41.94277]},n816:{id:"n816",loc:[-85.638597,41.942614]},n817:{id:"n817",loc:[-85.638601,41.94273]},n818:{id:"n818",loc:[-85.638686,41.942731]},n819:{id:"n819",loc:[-85.638689,41.942917]},n82:{id:"n82",loc:[-85.637835,41.94242]},n820:{id:"n820",loc:[-85.638558,41.943018]},n821:{id:"n821",loc:[-85.638243,41.943019]},n822:{id:"n822",loc:[-85.637536,41.943887]},n823:{id:"n823",loc:[-85.63749,41.943926]},n824:{id:"n824",loc:[-85.63743,41.943886]},n825:{id:"n825",loc:[-85.637476,41.943847]},n826:{id:"n826",loc:[-85.637527,41.943846]},n827:{id:"n827",loc:[-85.637141,41.943728]},n828:{id:"n828",loc:[-85.637201,41.943755]},n829:{id:"n829",loc:[-85.636987,41.943608]},n83:{id:"n83",loc:[-85.63776,41.942421]},n830:{id:"n830",loc:[-85.637441,41.943807]},n831:{id:"n831",loc:[-85.637673,41.94399]},n832:{id:"n832",loc:[-85.637783,41.944137]},n833:{id:"n833",loc:[-85.63845,41.944333]},n834:{id:"n834",loc:[-85.638159,41.944248]},n835:{id:"n835",loc:[-85.637859,41.94416]},n836:{id:"n836",loc:[-85.638685,41.944542]},n837:{id:"n837",loc:[-85.638714,41.944611]},n838:{id:"n838",loc:[-85.638711,41.944757]},n839:{id:"n839",loc:[-85.638774,41.945069]},n84:{id:"n84",loc:[-85.637758,41.942339]},n840:{id:"n840",loc:[-85.638742,41.945205]},n841:{id:"n841",loc:[-85.640267,41.942403]},n842:{id:"n842",loc:[-85.640154,41.942404]},n843:{id:"n843",loc:[-85.640152,41.942249]},n844:{id:"n844",loc:[-85.640266,41.942248]},n845:{id:"n845",loc:[-85.640366,41.942599]},n846:{id:"n846",loc:[-85.640362,41.942192]},n847:{id:"n847",loc:[-85.640146,41.942191]},n848:{id:"n848",loc:[-85.640122,41.942196]},n849:{id:"n849",loc:[-85.640108,41.942211]},n85:{id:"n85",loc:[-85.637836,41.942339]},n850:{id:"n850",loc:[-85.640101,41.942236]},n851:{id:"n851",loc:[-85.640103,41.94241]},n852:{id:"n852",loc:[-85.64011,41.942435]},n853:{id:"n853",loc:[-85.640126,41.942445]},n854:{id:"n854",loc:[-85.640153,41.942451]},n855:{id:"n855",loc:[-85.640183,41.942452]},n856:{id:"n856",loc:[-85.640364,41.942452]},n857:{id:"n857",loc:[-85.640007,41.942452]},n858:{id:"n858",loc:[-85.639449,41.942461]},n859:{id:"n859",loc:[-85.640049,41.942391]},n86:{id:"n86",loc:[-85.637835,41.942301]},n860:{id:"n860",loc:[-85.640052,41.942503]},n861:{id:"n861",loc:[-85.639575,41.94251]},n862:{id:"n862",loc:[-85.639572,41.942398]},n863:{id:"n863",loc:[-85.638782,41.942227]},n864:{id:"n864",loc:[-85.63843,41.942226]},n865:{id:"n865",loc:[-85.63823,41.942183]},n866:{id:"n866",loc:[-85.638363,41.942216],tags:{barrier:"gate"}},n867:{id:"n867",loc:[-85.6384,41.942223]},n868:{id:"n868",loc:[-85.636042,41.942797]},n869:{id:"n869",loc:[-85.636308,41.942752]},n87:{id:"n87",loc:[-85.637566,41.942367]},n870:{id:"n870",loc:[-85.636516,41.942729]},n871:{id:"n871",loc:[-85.636782,41.942712]},n872:{id:"n872",loc:[-85.636944,41.942706]},n873:{id:"n873",loc:[-85.63704,41.942706]},n874:{id:"n874",loc:[-85.637237,41.942703]},n875:{id:"n875",loc:[-85.637553,41.9427]},n876:{id:"n876",loc:[-85.638236,41.942697]},n877:{id:"n877",loc:[-85.636284,41.942781]},n878:{id:"n878",loc:[-85.636551,41.942641]},n879:{id:"n879",loc:[-85.633914,41.943693]},n88:{id:"n88",loc:[-85.637566,41.94241]},n880:{id:"n880",loc:[-85.63389,41.943708]},n881:{id:"n881",loc:[-85.633866,41.943686]},n882:{id:"n882",loc:[-85.63389,41.943671]},n883:{id:"n883",loc:[-85.633857,41.943609]},n884:{id:"n884",loc:[-85.634858,41.944474]},n885:{id:"n885",loc:[-85.633988,41.943234]},n886:{id:"n886",loc:[-85.633999,41.943485]},n887:{id:"n887",loc:[-85.634109,41.943449],tags:{emergency:"fire_hydrant"}},n888:{id:"n888",loc:[-85.635728,41.942655],tags:{emergency:"fire_hydrant"}},n889:{id:"n889",loc:[-85.636499,41.942845],tags:{man_made:"flagpole"}},n89:{id:"n89",loc:[-85.637455,41.94241]},n890:{id:"n890",loc:[-85.636197,41.943073]},n891:{id:"n891",loc:[-85.636227,41.943073]},n892:{id:"n892",loc:[-85.637433,41.942933],tags:{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"restaurant",cuisine:"pizza",name:"Pizza Hut",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut"}},n893:{id:"n893",loc:[-85.637907,41.942879],tags:{amenity:"car_wash"}},n894:{id:"n894",loc:[-85.637661,41.943018]},n895:{id:"n895",loc:[-85.636933,41.942733],tags:{emergency:"fire_hydrant"}},n896:{id:"n896",loc:[-85.637661,41.94304]},n897:{id:"n897",loc:[-85.637562,41.943041]},n898:{id:"n898",loc:[-85.637556,41.942725]},n899:{id:"n899",loc:[-85.637656,41.942724]},n9:{id:"n9",loc:[-85.635159,41.941926]},n90:{id:"n90",loc:[-85.637454,41.942367]},n900:{id:"n900",loc:[-85.637657,41.942779]},n901:{id:"n901",loc:[-85.637983,41.942777]},n902:{id:"n902",loc:[-85.637982,41.942616]},n903:{id:"n903",loc:[-85.637777,41.942778]},n904:{id:"n904",loc:[-85.637775,41.942699]},n905:{id:"n905",loc:[-85.637772,41.942618]},n906:{id:"n906",loc:[-85.637982,41.942698]},n907:{id:"n907",loc:[-85.637941,41.942378],tags:{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Gem Pawnbroker",shop:"pawnbroker"}},n908:{id:"n908",loc:[-85.637515,41.942394],tags:{second_hand:"only",shop:"car"}},n909:{id:"n909",loc:[-85.638743,41.942374],tags:{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes",shop:"car_repair"}},n91:{id:"n91",loc:[-85.637565,41.942341]},n910:{id:"n910",loc:[-85.638594,41.942357]},n911:{id:"n911",loc:[-85.634312,41.943562],tags:{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"cafe",cuisine:"coffee_shop",name:"L.A.'s Coffee Cafe",outdoor_seating:"yes"}},n912:{id:"n912",loc:[-85.634404,41.943512]},n913:{id:"n913",loc:[-85.634391,41.943519],tags:{entrance:"yes"}},n914:{id:"n914",loc:[-85.634259,41.943538],tags:{entrance:"yes"}},n915:{id:"n915",loc:[-85.634247,41.943528]},n916:{id:"n916",loc:[-85.633747,41.943322],tags:{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Preferred Insurance Services",office:"insurance"}},n917:{id:"n917",loc:[-85.63299,41.943686],tags:{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lynn's Garage","service:vehicle:tyres":"yes",shop:"car_repair"}},n918:{id:"n918",loc:[-85.633438,41.944883]},n919:{id:"n919",loc:[-85.633265,41.944983]},n92:{id:"n92",loc:[-85.637481,41.942341]},n920:{id:"n920",loc:[-85.633315,41.945027]},n921:{id:"n921",loc:[-85.633376,41.944827]},n922:{id:"n922",loc:[-85.633199,41.944922]},n923:{id:"n923",loc:[-85.633316,41.944772]},n924:{id:"n924",loc:[-85.633147,41.944867]},n925:{id:"n925",loc:[-85.633261,41.944719]},n926:{id:"n926",loc:[-85.633096,41.944812]},n927:{id:"n927",loc:[-85.633191,41.944645]},n928:{id:"n928",loc:[-85.632981,41.94476]},n929:{id:"n929",loc:[-85.633062,41.94483]},n93:{id:"n93",loc:[-85.637481,41.94226]},n930:{id:"n930",loc:[-85.633146,41.944602]},n931:{id:"n931",loc:[-85.632969,41.944703]},n932:{id:"n932",loc:[-85.633008,41.944745]},n933:{id:"n933",loc:[-85.633088,41.944545]},n934:{id:"n934",loc:[-85.632868,41.944655]},n935:{id:"n935",loc:[-85.632941,41.944718]},n936:{id:"n936",loc:[-85.633028,41.944483]},n937:{id:"n937",loc:[-85.632817,41.944605]},n938:{id:"n938",loc:[-85.632923,41.944373]},n939:{id:"n939",loc:[-85.632692,41.944485]},n94:{id:"n94",loc:[-85.637565,41.94226]},n940:{id:"n940",loc:[-85.632871,41.944316]},n941:{id:"n941",loc:[-85.632655,41.944421]},n942:{id:"n942",loc:[-85.632711,41.944478]},n943:{id:"n943",loc:[-85.632825,41.94426]},n944:{id:"n944",loc:[-85.632606,41.944363]},n945:{id:"n945",loc:[-85.63275,41.94418]},n946:{id:"n946",loc:[-85.632588,41.944256]},n947:{id:"n947",loc:[-85.632611,41.944279]},n948:{id:"n948",loc:[-85.632548,41.944306]},n949:{id:"n949",loc:[-85.632512,41.944406]},n95:{id:"n95",loc:[-85.637188,41.942217]},n950:{id:"n950",loc:[-85.632565,41.944463]},n951:{id:"n951",loc:[-85.632579,41.944456]},n952:{id:"n952",loc:[-85.632634,41.944518]},n953:{id:"n953",loc:[-85.632686,41.944569]},n954:{id:"n954",loc:[-85.632745,41.944537]},n955:{id:"n955",loc:[-85.632659,41.944587]},n956:{id:"n956",loc:[-85.632778,41.944705]},n957:{id:"n957",loc:[-85.632815,41.944301],tags:{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Access Point Employment",office:"employment_agency"}},n958:{id:"n958",loc:[-85.6332,41.944174],tags:{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paisley Emporium",shop:"second_hand"}},n959:{id:"n959",loc:[-85.633578,41.944568],tags:{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lowry's Books",shop:"books"}},n96:{id:"n96",loc:[-85.637189,41.942303]},n960:{id:"n960",loc:[-85.63344,41.944443],tags:{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"restaurant",cuisine:"pizza",name:"Paisano's Bar and Grill"}},n961:{id:"n961",loc:[-85.633009,41.944542],tags:{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"cafe",cuisine:"american",internet_access:"yes",name:"Main Street Cafe"}},n962:{id:"n962",loc:[-85.633674,41.944682],tags:{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Fitness"}},n963:{id:"n963",loc:[-85.633376,41.944868],tags:{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Barbell"}},n964:{id:"n964",loc:[-85.633366,41.944783]},n965:{id:"n965",loc:[-85.633296,41.94482]},n966:{id:"n966",loc:[-85.633214,41.94487]},n967:{id:"n967",loc:[-85.633005,41.944988]},n968:{id:"n968",loc:[-85.633269,41.944816]},n969:{id:"n969",loc:[-85.633215,41.944842]},n97:{id:"n97",loc:[-85.637299,41.942302]},n970:{id:"n970",loc:[-85.633245,41.944871]},n971:{id:"n971",loc:[-85.633296,41.944845]},n972:{id:"n972",loc:[-85.633254,41.944845],tags:{natural:"tree"}},n973:{id:"n973",loc:[-85.633557,41.945515]},n974:{id:"n974",loc:[-85.633279,41.945246]},n975:{id:"n975",loc:[-85.63324,41.945226]},n976:{id:"n976",loc:[-85.6332,41.945213]},n977:{id:"n977",loc:[-85.633133,41.945164]},n978:{id:"n978",loc:[-85.63312,41.945132]},n979:{id:"n979",loc:[-85.633095,41.945081]},n98:{id:"n98",loc:[-85.637299,41.942314]},n980:{id:"n980",loc:[-85.633064,41.945047]},n981:{id:"n981",loc:[-85.632739,41.944742]},n982:{id:"n982",loc:[-85.633281,41.945026]},n983:{id:"n983",loc:[-85.633155,41.944903]},n984:{id:"n984",loc:[-85.633079,41.944829]},n985:{id:"n985",loc:[-85.63304,41.944853]},n986:{id:"n986",loc:[-85.632949,41.944776]},n987:{id:"n987",loc:[-85.632921,41.944725]},n988:{id:"n988",loc:[-85.632859,41.944673]},n989:{id:"n989",loc:[-85.632895,41.94505]},n99:{id:"n99",loc:[-85.637396,41.942313]},n990:{id:"n990",loc:[-85.633336,41.945138]},n991:{id:"n991",loc:[-85.633466,41.945265]},n992:{id:"n992",loc:[-85.633367,41.945327]},n993:{id:"n993",loc:[-85.633163,41.945189]},n994:{id:"n994",loc:[-85.633678,41.945309]},n995:{id:"n995",loc:[-85.633619,41.945261]},n996:{id:"n996",loc:[-85.63355,41.945301]},n997:{id:"n997",loc:[-85.633607,41.945352]},n998:{id:"n998",loc:[-85.633579,41.945327],tags:{entrance:"yes"}},n999:{id:"n999",loc:[-85.633445,41.945404]},r2:{id:"r2",members:[{id:"w225",role:"outer",type:"way"}],tags:{type:"multipolygon",natural:"water",water:"river"}},r5:{id:"r5",members:[{id:"w642",role:"outer",type:"way"}],tags:{admin_level:"8",border_type:"city",boundary:"administrative",name:"Three Rivers",place:"city",type:"boundary"}},w1:{id:"w1",nodes:["n5","n1797"],tags:{highway:"residential",name:"12th Avenue"}},w10:{id:"w10",nodes:["n54","n55","n56","n57","n891","n890","n54"],tags:{building:"yes"}},w100:{id:"w100",nodes:["n451","n915","n452"],tags:{highway:"footway"}},w101:{id:"w101",nodes:["n461","n462","n463","n464","n465","n466"],tags:{barrier:"fence"}},w102:{id:"w102",nodes:["n467","n468","n469","n470","n472","n467"],tags:{amenity:"parking"}},w103:{id:"w103",nodes:["n2597","n2444","n471","n472"],tags:{highway:"footway"}},w104:{id:"w104",nodes:["n473","n474","n325"],tags:{footway:"sidewalk",highway:"footway"}},w105:{id:"w105",nodes:["n475","n324","n325"],tags:{footway:"sidewalk",highway:"footway"}},w106:{id:"w106",nodes:["n886","n452","n476"],tags:{footway:"sidewalk",highway:"footway"}},w107:{id:"w107",nodes:["n485","n4678","n486","n18"],tags:{highway:"service"}},w108:{id:"w108",nodes:["n300","n487","n488","n489","n490"],tags:{highway:"footway"}},w109:{id:"w109",nodes:["n490","n491"],tags:{highway:"footway"}},w11:{id:"w11",nodes:["n58","n63","n59","n315","n60"],tags:{highway:"service"}},w110:{id:"w110",nodes:["n492","n493","n494","n495","n496","n497","n492"],tags:{building:"yes"}},w111:{id:"w111",nodes:["n498","n499","n511"],tags:{highway:"service"}},w112:{id:"w112",nodes:["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],tags:{highway:"service"}},w113:{id:"w113",nodes:["n511","n510"],tags:{covered:"yes",highway:"service"}},w114:{id:"w114",nodes:["n512","n513","n514","n515","n512"],tags:{building:"yes"}},w115:{id:"w115",nodes:["n516","n517","n518","n519","n516"],tags:{building:"yes"}},w116:{id:"w116",nodes:["n520","n521","n522","n523","n520"],tags:{building:"yes"}},w117:{id:"w117",nodes:["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],tags:{building:"yes"}},w118:{id:"w118",nodes:["n536","n537","n538","n539","n536"],tags:{building:"yes"}},w119:{id:"w119",nodes:["n540","n541","n542","n543","n544","n545","n546","n547","n540"],tags:{building:"yes"}},w12:{id:"w12",nodes:["n61","n314","n70","n62","n63"],tags:{highway:"service"}},w120:{id:"w120",nodes:["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],tags:{building:"yes"}},w121:{id:"w121",nodes:["n558","n559","n560","n561","n562","n563","n564","n565","n558"],tags:{building:"yes"}},w122:{id:"w122",nodes:["n566","n567","n568","n569","n566"],tags:{building:"yes"}},w123:{id:"w123",nodes:["n570","n571","n572","n573","n570"],tags:{building:"yes"}},w124:{id:"w124",nodes:["n574","n575","n576","n577","n574"],tags:{building:"yes"}},w125:{id:"w125",nodes:["n578","n579","n580","n581","n578"],tags:{building:"yes"}},w126:{id:"w126",nodes:["n582","n583","n584","n585","n582"],tags:{building:"yes"}},w127:{id:"w127",nodes:["n586","n587","n588","n589","n590","n591","n592","n593","n586"],tags:{building:"yes"}},w128:{id:"w128",nodes:["n594","n595","n596","n597","n598","n599","n600","n601","n594"],tags:{building:"yes"}},w129:{id:"w129",nodes:["n309","n602","n603"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w13:{id:"w13",nodes:["n64","n65","n66","n67","n68","n69","n64"],tags:{amenity:"parking"}},w130:{id:"w130",nodes:["n603","n604"],tags:{footway:"sidewalk",highway:"footway"}},w131:{id:"w131",nodes:["n604","n605","n606"],tags:{footway:"sidewalk",highway:"footway"}},w132:{id:"w132",nodes:["n606","n607"],tags:{footway:"sidewalk",highway:"footway"}},w133:{id:"w133",nodes:["n607","n610","n608","n603"],tags:{footway:"sidewalk",highway:"footway"}},w134:{id:"w134",nodes:["n609","n610","n611"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w135:{id:"w135",nodes:["n244","n245","n246"],tags:{highway:"service"}},w136:{id:"w136",nodes:["n612","n613","n614","n615","n612"],tags:{amenity:"shelter",building:"yes"}},w137:{id:"w137",nodes:["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],tags:{highway:"residential",name:"Foster Street"}},w138:{id:"w138",nodes:["n2779","n625","n626","n627"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w139:{id:"w139",nodes:["n630","n631","n632","n2437"],tags:{highway:"service"}},w14:{id:"w14",nodes:["n71","n72","n73","n74","n71"],tags:{building:"yes"}},w140:{id:"w140",nodes:["n643","n637","n715","n2410"],tags:{highway:"footway",name:"Mural Mall"}},w141:{id:"w141",nodes:["n639","n2516"],tags:{barrier:"wall"}},w142:{id:"w142",nodes:["n640","n641","n645","n642","n660","n643","n644"],tags:{highway:"service"}},w143:{id:"w143",nodes:["n646","n647"],tags:{highway:"service"}},w144:{id:"w144",nodes:["n654","n655","n656"],tags:{barrier:"wall"}},w145:{id:"w145",nodes:["n665","n666","n667"],tags:{barrier:"wall"}},w146:{id:"w146",nodes:["n2727","n662","n2719"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w147:{id:"w147",nodes:["n2725","n674"],tags:{highway:"service",oneway:"yes"}},w148:{id:"w148",nodes:["n2464","n2460","n2454","n684","n2455","n2464"],tags:{building:"yes"}},w149:{id:"w149",nodes:["n2456","n685","n686","n687","n2456"],tags:{building:"yes"}},w15:{id:"w15",nodes:["n75","n76","n77","n78","n75"],tags:{building:"yes"}},w150:{id:"w150",nodes:["n685","n688","n689","n690","n691","n692","n686","n685"],tags:{building:"yes"}},w151:{id:"w151",nodes:["n688","n693","n694","n689","n688"],tags:{building:"yes"}},w152:{id:"w152",nodes:["n693","n695","n702","n696","n697","n694","n693"],tags:{building:"yes"}},w153:{id:"w153",nodes:["n695","n698","n699","n700","n701","n702","n695"],tags:{building:"yes"}},w154:{id:"w154",nodes:["n698","n703","n707","n704","n699","n698"],tags:{building:"yes"}},w155:{id:"w155",nodes:["n703","n705","n706","n707","n703"],tags:{building:"yes"}},w156:{id:"w156",nodes:["n705","n708","n709","n706","n705"],tags:{building:"yes"}},w157:{id:"w157",nodes:["n709","n710","n711","n708","n709"],tags:{building:"yes"}},w158:{id:"w158",nodes:["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],tags:{footway:"sidewalk",highway:"footway"}},w159:{id:"w159",nodes:["n714","n720","n721"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w16:{id:"w16",nodes:["n79","n80","n81","n82","n83","n84","n85","n86","n79"],tags:{building:"yes"}},w160:{id:"w160",nodes:["n729","n721","n722","n964","n723","n724"],tags:{footway:"sidewalk",highway:"footway"}},w161:{id:"w161",nodes:["n713","n726","n722"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w164:{id:"w164",nodes:["n365","n732","n733","n738"],tags:{footway:"sidewalk",highway:"footway"}},w165:{id:"w165",nodes:["n724","n734","n367","n735","n736","n737"],tags:{footway:"sidewalk",highway:"footway"}},w166:{id:"w166",nodes:["n739","n2037","n2038","n2039","n2040","n1623","n2032"],tags:{highway:"footway"}},w167:{id:"w167",nodes:["n150","n751"],tags:{highway:"service"}},w168:{id:"w168",nodes:["n752","n753","n754","n755","n752"],tags:{building:"yes"}},w169:{id:"w169",nodes:["n756","n757","n758","n759","n756"],tags:{building:"yes"}},w17:{id:"w17",nodes:["n87","n88","n89","n90","n87"],tags:{building:"yes"}},w170:{id:"w170",nodes:["n760","n761","n762","n763","n764","n765","n760"],tags:{building:"yes"}},w171:{id:"w171",nodes:["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],tags:{building:"yes"}},w172:{id:"w172",nodes:["n778","n779","n780","n781","n782","n783","n784","n785","n778"],tags:{building:"yes"}},w173:{id:"w173",nodes:["n786","n787","n788","n789","n786"],tags:{building:"yes"}},w174:{id:"w174",nodes:["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],tags:{building:"yes"}},w175:{id:"w175",nodes:["n802","n803","n804","n805","n802"],tags:{building:"yes"}},w176:{id:"w176",nodes:["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],tags:{building:"yes"}},w177:{id:"w177",nodes:["n816","n1140","n817","n818","n819","n820","n821"],tags:{highway:"service"}},w178:{id:"w178",nodes:["n822","n823","n824","n825","n822"],tags:{building:"yes"}},w179:{id:"w179",nodes:["n841","n842","n843","n844","n841"],tags:{building:"yes"}},w18:{id:"w18",nodes:["n91","n92","n93","n94","n91"],tags:{building:"yes"}},w180:{id:"w180",nodes:["n845","n856","n846"],tags:{highway:"service"}},w181:{id:"w181",nodes:["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],tags:{highway:"service",oneway:"yes",service:"drive-through"}},w182:{id:"w182",nodes:["n857","n858"],tags:{highway:"service"}},w183:{id:"w183",nodes:["n859","n860","n861","n862","n859"],tags:{amenity:"parking"}},w184:{id:"w184",nodes:["n863","n864","n867","n866","n865"],tags:{highway:"service"}},w185:{id:"w185",nodes:["n883","n884"],tags:{barrier:"fence"}},w186:{id:"w186",nodes:["n1954","n622","n1955"],tags:{highway:"path",name:"Riverwalk Trail"}},w187:{id:"w187",nodes:["n621","n1954"],tags:{highway:"steps",incline:"up",name:"Riverwalk Trail",surface:"wood"}},w188:{id:"w188",nodes:["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],tags:{highway:"path",name:"Riverwalk Trail",surface:"wood"}},w189:{id:"w189",nodes:["n2273","n2274"],tags:{highway:"steps",incline:"down",name:"Riverwalk Trail",surface:"wood"}},w19:{id:"w19",nodes:["n95","n96","n97","n98","n99","n100","n101","n102","n95"],tags:{building:"yes"}},w190:{id:"w190",nodes:["n821","n894","n900","n903","n901"],tags:{highway:"service"}},w191:{id:"w191",nodes:["n896","n897","n898","n899","n900","n894","n896"],tags:{amenity:"parking"}},w192:{id:"w192",nodes:["n903","n904","n905"],tags:{highway:"service"}},w193:{id:"w193",nodes:["n901","n906","n902"],tags:{highway:"service"}},w194:{id:"w194",nodes:["n912","n913"],tags:{highway:"footway"}},w195:{id:"w195",nodes:["n914","n915"],tags:{highway:"footway"}},w196:{id:"w196",nodes:["n2466","n918","n919","n920","n2466"],tags:{building:"yes"}},w197:{id:"w197",nodes:["n918","n921","n922","n919","n918"],tags:{building:"yes"}},w198:{id:"w198",nodes:["n923","n925","n926","n924","n923"],tags:{building:"yes"}},w199:{id:"w199",nodes:["n925","n927","n932","n928","n929","n926","n925"],tags:{building:"yes"}},w2:{id:"w2",nodes:["n3523","n2182","n2160"],tags:{highway:"service"}},w20:{id:"w20",nodes:["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],tags:{building:"yes"}},w200:{id:"w200",nodes:["n927","n930","n931","n932","n927"],tags:{building:"yes"}},w201:{id:"w201",nodes:["n930","n933","n934","n935","n931","n930"],tags:{building:"yes"}},w202:{id:"w202",nodes:["n933","n936","n937","n934","n933"],tags:{building:"yes"}},w203:{id:"w203",nodes:["n936","n938","n942","n939","n954","n937","n936"],tags:{building:"yes"}},w204:{id:"w204",nodes:["n938","n940","n941","n942","n938"],tags:{building:"yes"}},w205:{id:"w205",nodes:["n940","n943","n944","n941","n940"],tags:{building:"yes"}},w206:{id:"w206",nodes:["n943","n945","n946","n947","n948","n944","n943"],tags:{building:"yes"}},w207:{id:"w207",nodes:["n944","n949","n950","n951","n941","n944"],tags:{building:"yes"}},w208:{id:"w208",nodes:["n941","n951","n952","n939","n942","n941"],tags:{building:"yes"}},w209:{id:"w209",nodes:["n952","n953","n954","n939","n952"],tags:{building:"yes"}},w21:{id:"w21",nodes:["n115","n116","n117","n118","n115"],tags:{building:"yes"}},w210:{id:"w210",nodes:["n953","n955","n956","n934","n937","n954","n953"],tags:{building:"yes"}},w211:{id:"w211",nodes:["n964","n965"],tags:{highway:"footway"}},w212:{id:"w212",nodes:["n966","n983","n967","n989"],tags:{highway:"footway"}},w213:{id:"w213",nodes:["n965","n968","n969","n966","n970","n971","n965"],tags:{highway:"footway"}},w214:{id:"w214",nodes:["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],tags:{footway:"sidewalk",highway:"footway"}},w215:{id:"w215",nodes:["n978","n982","n983","n984","n985","n986","n987","n988","n981"],tags:{highway:"footway"}},w216:{id:"w216",nodes:["n976","n990","n991","n992"],tags:{highway:"footway"}},w217:{id:"w217",nodes:["n998","n999"],tags:{highway:"footway"}},w218:{id:"w218",nodes:["n1019","n3355","n1020"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w22:{id:"w22",nodes:["n119","n120","n121","n122","n119"],tags:{building:"yes"}},w220:{id:"w220",nodes:["n1027","n1028","n1019"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w221:{id:"w221",nodes:["n2080","n1828","n1863","n1829"],tags:{highway:"tertiary",name:"Constantine Street"}},w222:{id:"w222",nodes:["n1029","n1030","n1031"],tags:{highway:"service"}},w223:{id:"w223",nodes:["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],tags:{name:"Rocky River",waterway:"river"}},w224:{id:"w224",nodes:["n3750","n3751","n3752"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w225:{id:"w225",nodes:["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},w226:{id:"w226",nodes:["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w227:{id:"w227",nodes:["n2994","n3012","n3011","n2958"],tags:{highway:"secondary",name:"Main Street"}},w228:{id:"w228",nodes:["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],tags:{highway:"primary",name:"Main Street"}},w229:{id:"w229",nodes:["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],tags:{name:"Conrail Railroad",railway:"rail"}},w23:{id:"w23",nodes:["n123","n124","n125","n126","n123"],tags:{building:"yes"}},w230:{id:"w230",nodes:["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],tags:{name:"Saint Joseph River",waterway:"river"}},w231:{id:"w231",nodes:["n456","n1036","n1037","n1038"],tags:{barrier:"wall"}},w232:{id:"w232",nodes:["n1034","n1039","n1040"],tags:{barrier:"wall"}},w233:{id:"w233",nodes:["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],tags:{access:"private",leisure:"swimming_pool"}},w234:{id:"w234",nodes:["n1047","n1048"],tags:{barrier:"hedge"}},w235:{id:"w235",nodes:["n1049","n1050","n1051","n1052","n1049"],tags:{building:"yes"}},w236:{id:"w236",nodes:["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],tags:{building:"yes"}},w237:{id:"w237",nodes:["n1061","n1062","n1063","n1064","n1065","n1061"],tags:{building:"yes"}},w238:{id:"w238",nodes:["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],tags:{building:"yes"}},w239:{id:"w239",nodes:["n1072","n1073","n1074","n1075","n1072"],tags:{building:"yes"}},w24:{id:"w24",nodes:["n127","n128","n129","n130","n127"],tags:{building:"yes"}},w240:{id:"w240",nodes:["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],tags:{building:"yes"}},w241:{id:"w241",nodes:["n1082","n1083","n1084","n1085","n1082"],tags:{building:"yes"}},w242:{id:"w242",nodes:["n1086","n1087","n1088","n1089","n1086"],tags:{building:"yes"}},w243:{id:"w243",nodes:["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],tags:{building:"yes"}},w244:{id:"w244",nodes:["n1098","n1099","n1100","n1101"],tags:{barrier:"fence"}},w245:{id:"w245",nodes:["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],tags:{highway:"service"}},w246:{id:"w246",nodes:["n1103","n1139","n1104"],tags:{barrier:"fence"}},w247:{id:"w247",nodes:["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],tags:{building:"yes"}},w248:{id:"w248",nodes:["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],tags:{building:"yes"}},w249:{id:"w249",nodes:["n1121","n1122","n1123","n1124","n1121"],tags:{building:"yes"}},w25:{id:"w25",nodes:["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],tags:{building:"yes"}},w250:{id:"w250",nodes:["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],tags:{building:"yes"}},w251:{id:"w251",nodes:["n1137","n1138","n1139"],tags:{barrier:"fence"}},w252:{id:"w252",nodes:["n876","n1140","n1141"],tags:{footway:"sidewalk",highway:"footway"}},w253:{id:"w253",nodes:["n1141","n1142","n1143","n1144","n1145","n1146"],tags:{footway:"sidewalk",highway:"footway"}},w254:{id:"w254",nodes:["n1146","n4743","n1147","n1148"],tags:{footway:"sidewalk",highway:"footway"}},w255:{id:"w255",nodes:["n1148","n1149","n1150","n1151"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w256:{id:"w256",nodes:["n1151","n1153","n1154","n1155"],tags:{footway:"sidewalk",highway:"footway"}},w257:{id:"w257",nodes:["n1155","n1156"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w258:{id:"w258",nodes:["n1157","n1158"],tags:{barrier:"retaining_wall"}},w259:{id:"w259",nodes:["n1156","n1161","n1159","n1160","n719"],tags:{footway:"sidewalk",highway:"footway"}},w26:{id:"w26",nodes:["n143","n608","n144"],tags:{highway:"service"}},w260:{id:"w260",nodes:["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],tags:{highway:"footway"}},w261:{id:"w261",nodes:["n1171","n1172","n1173"],tags:{barrier:"wall"}},w262:{id:"w262",nodes:["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],tags:{natural:"wood"}},w263:{id:"w263",nodes:["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w264:{id:"w264",nodes:["n1186","n1187","n1188","n1189","n1186"],tags:{building:"yes"}},w265:{id:"w265",nodes:["n1190","n1191","n1192","n1193","n1190"],tags:{building:"yes"}},w266:{id:"w266",nodes:["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],tags:{building:"yes"}},w267:{id:"w267",nodes:["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],tags:{building:"house"}},w268:{id:"w268",nodes:["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],tags:{building:"house"}},w269:{id:"w269",nodes:["n1221","n1225","n1222","n1223","n1224","n1221"],tags:{building:"house"}},w27:{id:"w27",nodes:["n145","n147","n146"],tags:{highway:"footway"}},w270:{id:"w270",nodes:["n1225","n1226","n1227","n1229","n1228"],tags:{barrier:"fence"}},w271:{id:"w271",nodes:["n1229","n1230"],tags:{barrier:"fence"}},w272:{id:"w272",nodes:["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],tags:{building:"house"}},w273:{id:"w273",nodes:["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],tags:{building:"house"}},w274:{id:"w274",nodes:["n1247","n1248","n1249","n1250","n1247"],tags:{building:"house"}},w275:{id:"w275",nodes:["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],tags:{building:"house"}},w276:{id:"w276",nodes:["n1257","n1258","n1259","n1260","n1257"],tags:{building:"shed"}},w277:{id:"w277",nodes:["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],tags:{building:"house"}},w278:{id:"w278",nodes:["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],tags:{building:"house"}},w279:{id:"w279",nodes:["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],tags:{building:"house"}},w28:{id:"w28",nodes:["n147","n148"],tags:{highway:"footway"}},w280:{id:"w280",nodes:["n1281","n1282","n1283","n1284"],tags:{barrier:"fence"}},w281:{id:"w281",nodes:["n1285","n1286","n1287","n1288","n1285"],tags:{building:"house"}},w282:{id:"w282",nodes:["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],tags:{building:"house"}},w283:{id:"w283",nodes:["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],tags:{access:"private",leisure:"swimming_pool"}},w284:{id:"w284",nodes:["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],tags:{building:"house"}},w285:{id:"w285",nodes:["n1313","n1314","n1315","n1316","n1313"],tags:{building:"house"}},w286:{id:"w286",nodes:["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],tags:{building:"house"}},w287:{id:"w287",nodes:["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],tags:{building:"yes"}},w288:{id:"w288",nodes:["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],tags:{access:"private",leisure:"swimming_pool"}},w289:{id:"w289",nodes:["n1356","n1331"],tags:{barrier:"fence"}},w29:{id:"w29",nodes:["n149","n874","n150","n151","n897","n898","n875","n152"],tags:{highway:"service",oneway:"yes"}},w290:{id:"w290",nodes:["n1357","n1358","n1359","n1360","n1357"],tags:{building:"shed"}},w291:{id:"w291",nodes:["n1358","n1361","n1362"],tags:{barrier:"fence"}},w292:{id:"w292",nodes:["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],tags:{building:"house"}},w293:{id:"w293",nodes:["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],tags:{leisure:"swimming_pool"}},w294:{id:"w294",nodes:["n1367","n1375","n1376","n1377"],tags:{barrier:"fence"}},w295:{id:"w295",nodes:["n1378","n1379","n1380","n1381","n1378"],tags:{building:"house"}},w296:{id:"w296",nodes:["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],tags:{building:"house"}},w297:{id:"w297",nodes:["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],tags:{building:"house"}},w298:{id:"w298",nodes:["n1394","n1395","n1396","n1397","n1394"],tags:{building:"house"}},w299:{id:"w299",nodes:["n1398","n1399","n1400","n1401","n1398"],tags:{access:"private3",leisure:"swimming_pool"}},w3:{id:"w3",nodes:["n1","n2"],tags:{highway:"track",name:"Water Street"}},w30:{id:"w30",nodes:["n153","n154","n155","n156","n153"],tags:{amenity:"parking"}},w300:{id:"w300",nodes:["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],tags:{building:"house"}},w301:{id:"w301",nodes:["n1414","n1415","n1416","n1417","n1414"],tags:{building:"garage"}},w302:{id:"w302",nodes:["n1406","n1418","n1419","n1403"],tags:{barrier:"fence"}},w303:{id:"w303",nodes:["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],tags:{building:"house"}},w304:{id:"w304",nodes:["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],tags:{access:"private",leisure:"swimming_pool"}},w305:{id:"w305",nodes:["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],tags:{building:"house"}},w306:{id:"w306",nodes:["n1455","n1456","n1457","n1458","n1455"],tags:{building:"shed"}},w307:{id:"w307",nodes:["n1459","n1460","n1461","n1462","n1459"],tags:{building:"shed"}},w308:{id:"w308",nodes:["n1463","n1464"],tags:{barrier:"fence"}},w309:{id:"w309",nodes:["n1465","n1466","n1467","n1468"],tags:{barrier:"fence"}},w31:{id:"w31",nodes:["n157","n605","n158"],tags:{highway:"service"}},w310:{id:"w310",nodes:["n1469","n1481","n1463"],tags:{barrier:"hedge"}},w311:{id:"w311",nodes:["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],tags:{building:"house"}},w312:{id:"w312",nodes:["n1480","n1481"],tags:{barrier:"wall"}},w313:{id:"w313",nodes:["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],tags:{access:"private",leisure:"swimming_pool"}},w314:{id:"w314",nodes:["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],tags:{building:"house"}},w315:{id:"w315",nodes:["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],tags:{building:"house"}},w316:{id:"w316",nodes:["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],tags:{building:"house"}},w317:{id:"w317",nodes:["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],tags:{building:"house"}},w318:{id:"w318",nodes:["n1532","n1533"],tags:{barrier:"fence"}},w319:{id:"w319",nodes:["n1534","n1532","n1535"],tags:{barrier:"fence"}},w32:{id:"w32",nodes:["n159","n160","n161","n162","n159"],tags:{amenity:"parking"}},w320:{id:"w320",nodes:["n1536","n1537","n1538","n1539","n1536"],tags:{building:"shed"}},w321:{id:"w321",nodes:["n1540","n1541","n1542","n1543","n1540"],tags:{building:"shed"}},w322:{id:"w322",nodes:["n1544","n1545","n1546","n1547","n1544"],tags:{building:"shed"}},w323:{id:"w323",nodes:["n1548","n1549","n1550","n1551","n1548"],tags:{building:"house"}},w324:{id:"w324",nodes:["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],tags:{building:"house"}},w325:{id:"w325",nodes:["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],tags:{building:"house"}},w326:{id:"w326",nodes:["n1561","n1568","n1569","n1570"],tags:{barrier:"wall"}},w327:{id:"w327",nodes:["n1571","n1572"],tags:{barrier:"fence"}},w328:{id:"w328",nodes:["n1573","n1574","n1575","n1576","n1573"],tags:{building:"house"}},w329:{id:"w329",nodes:["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],tags:{building:"house"}},w33:{id:"w33",nodes:["n157","n163"],tags:{highway:"service"}},w330:{id:"w330",nodes:["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],tags:{building:"house"}},w331:{id:"w331",nodes:["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],tags:{access:"private",leisure:"swimming_pool"}},w332:{id:"w332",nodes:["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],tags:{building:"house"}},w333:{id:"w333",nodes:["n2018","n1626","n1627","n2017","n2018"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w334:{id:"w334",nodes:["n2","n3","n2764"],tags:{highway:"service",name:"Water Street"}},w335:{id:"w335",nodes:["n3","n1628","n1614"],tags:{highway:"service"}},w336:{id:"w336",nodes:["n3198","n4545","n2747"],tags:{highway:"residential",name:"Morris Avenue"}},w337:{id:"w337",nodes:["n1629","n3504"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w338:{id:"w338",nodes:["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],tags:{highway:"service",service:"parking_aisle"}},w339:{id:"w339",nodes:["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],tags:{highway:"residential",name:"Millard Street"}},w34:{id:"w34",nodes:["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],tags:{amenity:"parking"}},w340:{id:"w340",nodes:["n1824","n1825"],tags:{highway:"service",service:"parking_aisle"}},w341:{id:"w341",nodes:["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],tags:{building:"yes"}},w342:{id:"w342",nodes:["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],tags:{amenity:"parking",fee:"no"}},w343:{id:"w343",nodes:["n1757","n1758","n1759","n1760","n1757"],tags:{building:"yes"}},w344:{id:"w344",nodes:["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],tags:{building:"school"}},w345:{id:"w345",nodes:["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],tags:{building:"yes"}},w346:{id:"w346",nodes:["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],tags:{highway:"residential",name:"Douglas Avenue"}},w347:{id:"w347",nodes:["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],tags:{highway:"primary",name:"Michigan Avenue"}},w348:{id:"w348",nodes:["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],tags:{leisure:"playground"}},w349:{id:"w349",nodes:["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],tags:{highway:"service"}},w35:{id:"w35",nodes:["n168","n167","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w350:{id:"w350",nodes:["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],tags:{amenity:"parking"}},w351:{id:"w351",nodes:["n1717","n1718","n1719","n1720","n1717"],tags:{building:"yes"}},w352:{id:"w352",nodes:["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],tags:{building:"yes"}},w353:{id:"w353",nodes:["n1637","n1636","n1029","n4715","n1630"],tags:{highway:"residential",name:"Lincoln Avenue"}},w354:{id:"w354",nodes:["n1713","n1714","n1715","n1716","n1713"],tags:{building:"yes"}},w355:{id:"w355",nodes:["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],tags:{building:"yes"}},w356:{id:"w356",nodes:["n1631","n4717","n1840","n4745","n1841"],tags:{highway:"residential",name:"Hook Avenue"}},w357:{id:"w357",nodes:["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],tags:{building:"yes"}},w358:{id:"w358",nodes:["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],tags:{building:"yes"}},w359:{id:"w359",nodes:["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],tags:{highway:"residential",name:"South Street"}},w36:{id:"w36",nodes:["n910","n171","n866","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w360:{id:"w360",nodes:["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],tags:{building:"yes"}},w361:{id:"w361",nodes:["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],tags:{highway:"service"}},w362:{id:"w362",nodes:["n1639","n1683","n4710","n1633"],tags:{highway:"residential",name:"South Street",oneway:"yes"}},w363:{id:"w363",nodes:["n1646","n1647","n1648","n1649","n1646"],tags:{leisure:"pitch",pitch:"basketball"}},w364:{id:"w364",nodes:["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],tags:{amenity:"school",name:"Three Rivers Middle School"}},w365:{id:"w365",nodes:["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],tags:{building:"yes"}},w366:{id:"w366",nodes:["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],tags:{amenity:"parking"}},w367:{id:"w367",nodes:["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],tags:{highway:"residential",name:"Grant Avenue"}},w368:{id:"w368",nodes:["n1853","n1687","n1688","n1854","n1853"],tags:{amenity:"library",building:"yes",name:"Three Rivers Public Library"}},w369:{id:"w369",nodes:["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],tags:{amenity:"parking"}},w37:{id:"w37",nodes:["n173","n174","n175","n176","n177","n178","n179","n180","n173"],tags:{building:"yes"}},w370:{id:"w370",nodes:["n1645","n1638","n858","n4718","n1631"],tags:{highway:"residential",name:"Hook Avenue"}},w371:{id:"w371",nodes:["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],tags:{amenity:"school",name:"Three Rivers High School"}},w372:{id:"w372",nodes:["n1697","n1698","n1699","n1700","n1697"],tags:{building:"yes"}},w373:{id:"w373",nodes:["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],tags:{amenity:"parking"}},w374:{id:"w374",nodes:["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],tags:{building:"yes"}},w375:{id:"w375",nodes:["n1822","n1823"],tags:{highway:"service",service:"parking_aisle"}},w376:{id:"w376",nodes:["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],tags:{amenity:"parking"}},w377:{id:"w377",nodes:["n1676","n1675","n1674","n1673"],tags:{highway:"service",oneway:"yes"}},w378:{id:"w378",nodes:["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],tags:{amenity:"school",name:"Andrews Elementary School"}},w379:{id:"w379",nodes:["n1630","n4714","n1847","n4750","n1844"],tags:{highway:"residential",name:"Lincoln Avenue"}},w38:{id:"w38",nodes:["n181","n182","n183","n185","n184","n181"],tags:{building:"yes"}},w380:{id:"w380",nodes:["n1683","n3745","n1686","n1633"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w381:{id:"w381",nodes:["n2022","n2037"],tags:{highway:"footway"}},w382:{id:"w382",nodes:["n1826","n1863"],tags:{highway:"residential"}},w383:{id:"w383",nodes:["n2011","n2012","n739","n2013","n2014","n2029","n2011"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w384:{id:"w384",nodes:["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],tags:{building:"yes"}},w385:{id:"w385",nodes:["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],tags:{natural:"water"}},w386:{id:"w386",nodes:["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],tags:{highway:"service"}},w387:{id:"w387",nodes:["n1846","n1843","n865","n157","n4721","n1831"],tags:{highway:"residential",name:"Andrews Street"}},w388:{id:"w388",nodes:["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],tags:{highway:"footway"}},w389:{id:"w389",nodes:["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],tags:{name:"Rocky River",waterway:"river"}},w39:{id:"w39",nodes:["n185","n186","n187"],tags:{barrier:"fence"}},w390:{id:"w390",nodes:["n2050","n2051","n2052","n2053","n2050"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w391:{id:"w391",nodes:["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],tags:{highway:"residential",name:"Constantine Street"}},w392:{id:"w392",nodes:["n1869","n212","n436","n2281","n2081"],tags:{highway:"primary",name:"Michigan Avenue"}},w393:{id:"w393",nodes:["n1829","n611","n144","n4694","n602","n1832"],tags:{highway:"tertiary",name:"Constantine Street"}},w394:{id:"w394",nodes:["n1997","n1998","n2000","n1999"],tags:{highway:"service",service:"parking_aisle"}},w395:{id:"w395",nodes:["n1835","n1869"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w396:{id:"w396",nodes:["n2000","n2001"],tags:{highway:"service",service:"parking_aisle"}},w397:{id:"w397",nodes:["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],tags:{highway:"residential",name:"Spring Street"}},w398:{id:"w398",nodes:["n2015","n2016","n2017","n2018","n2015"],tags:{building:"yes"}},w399:{id:"w399",nodes:["n2062","n45","n2063","n877","n41","n1852"],tags:{highway:"service"}},w4:{id:"w4",nodes:["n7","n38","n378","n379","n7"],tags:{building:"yes"}},w40:{id:"w40",nodes:["n188","n189","n190","n191","n192","n193","n188"],tags:{building:"house"}},w400:{id:"w400",nodes:["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],tags:{amenity:"parking"}},w401:{id:"w401",nodes:["n1963","n1964"],tags:{bridge:"yes",highway:"footway"}},w402:{id:"w402",nodes:["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",barrier:"fence",name:"Scidmore Park Petting Zoo",tourism:"zoo",zoo:"petting_zoo"}},w403:{id:"w403",nodes:["n1957","n1958","n1959","n481","n1960","n482","n1949"],tags:{highway:"path"}},w404:{id:"w404",nodes:["n2281","n27","n330","n1987","n1988"],tags:{highway:"service"}},w405:{id:"w405",nodes:["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],tags:{highway:"path",name:"Riverwalk Trail"}},w406:{id:"w406",nodes:["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],tags:{highway:"footway"}},w407:{id:"w407",nodes:["n2034","n2036","n2009"],tags:{highway:"footway"}},w408:{id:"w408",nodes:["n1964","n1965","n2002","n1966","n21","n1967","n1969"],tags:{highway:"footway"}},w409:{id:"w409",nodes:["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],tags:{natural:"water"}},w41:{id:"w41",nodes:["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],tags:{building:"house"}},w410:{id:"w410",nodes:["n1868","n2088"],tags:{bridge:"yes",name:"Conrail Railroad",railway:"rail"}},w411:{id:"w411",nodes:["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],tags:{highway:"footway"}},w412:{id:"w412",nodes:["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",leisure:"park",name:"Scidmore Park"}},w413:{id:"w413",nodes:["n1831","n876","n4720","n821","n2089"],tags:{highway:"residential",name:"Andrews Street"}},w414:{id:"w414",nodes:["n2002","n2003","n2004","n2005","n2006","n2007"],tags:{highway:"footway"}},w415:{id:"w415",nodes:["n1979","n1980","n1981","n1982","n1979"],tags:{amenity:"parking"}},w416:{id:"w416",nodes:["n2054","n2055","n2056","n2057","n2054"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w417:{id:"w417",nodes:["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],tags:{leisure:"park",name:"Memory Isle Park"}},w418:{id:"w418",nodes:["n2033","n2034","n2035"],tags:{highway:"footway"}},w419:{id:"w419",nodes:["n1983","n1984","n1985","n1986","n1983"],tags:{amenity:"parking"}},w42:{id:"w42",nodes:["n206","n207","n208","n209","n210","n211","n206"],tags:{building:"house"}},w420:{id:"w420",nodes:["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],tags:{highway:"residential",name:"French Street"}},w421:{id:"w421",nodes:["n2337","n2268"],tags:{highway:"path"}},w422:{id:"w422",nodes:["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],tags:{natural:"water"}},w423:{id:"w423",nodes:["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],tags:{natural:"wetland"}},w424:{id:"w424",nodes:["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],tags:{highway:"residential",name:"Pealer Street"}},w425:{id:"w425",nodes:["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],tags:{highway:"path",name:"Riverwalk Trail"}},w426:{id:"w426",nodes:["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],tags:{building:"yes"}},w427:{id:"w427",nodes:["n2671","n2672","n2673","n2674","n2671"],tags:{building:"yes"}},w428:{id:"w428",nodes:["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],tags:{building:"yes"}},w429:{id:"w429",nodes:["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],tags:{amenity:"parking"}},w43:{id:"w43",nodes:["n1955","n1956"],tags:{footway:"sidewalk",highway:"footway",name:"Riverwalk Trail"}},w430:{id:"w430",nodes:["n2471","n2474","n2484","n2479","n2471"],tags:{building:"yes"}},w431:{id:"w431",nodes:["n2218","n2434","n2436","n2433","n2435","n2210"],tags:{name:"Rocky River",waterway:"river"}},w432:{id:"w432",nodes:["n2782","n2532","n2783","n2784","n2782"],tags:{amenity:"parking"}},w433:{id:"w433",nodes:["n2513","n649","n2520","n2514","n2507","n2513"],tags:{building:"yes"}},w434:{id:"w434",nodes:["n2470","n2468","n2461","n2465","n2470"],tags:{building:"yes"}},w435:{id:"w435",nodes:["n2598","n2599","n648","n649","n2520","n2598"],tags:{building:"yes"}},w436:{id:"w436",nodes:["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],tags:{building:"yes"}},w437:{id:"w437",nodes:["n2503","n2512","n2508","n2499","n2503"],tags:{building:"yes"}},w438:{id:"w438",nodes:["n2440","n2800","n2774","n1"],tags:{highway:"residential",name:"Water Street"}},w439:{id:"w439",nodes:["n2675","n2676","n2677","n2678","n2675"],tags:{building:"yes"}},w44:{id:"w44",nodes:["n213","n214","n215","n216","n213"],tags:{building:"yes"}},w440:{id:"w440",nodes:["n2512","n2503","n2507","n2514","n2512"],tags:{building:"yes"}},w441:{id:"w441",nodes:["n2554","n2717","n674","n2720","n2798"],tags:{highway:"service",oneway:"yes"}},w442:{id:"w442",nodes:["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],tags:{amenity:"parking"}},w443:{id:"w443",nodes:["n2629","n2627","n2628","n2616","n2630","n2629"],tags:{building:"yes"}},w444:{id:"w444",nodes:["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w445:{id:"w445",nodes:["n2572","n2573"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w446:{id:"w446",nodes:["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],tags:{building:"yes"}},w447:{id:"w447",nodes:["n2780","n2777","n628","n624","n2779"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w448:{id:"w448",nodes:["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],tags:{building:"yes"}},w449:{id:"w449",nodes:["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],tags:{amenity:"parking"}},w45:{id:"w45",nodes:["n217","n218","n219","n220","n217"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w450:{id:"w450",nodes:["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],tags:{building:"yes"}},w451:{id:"w451",nodes:["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],tags:{amenity:"parking"}},w452:{id:"w452",nodes:["n2273","n457","n2569","n458","n2570"],tags:{highway:"path",name:"Riverwalk Trail"}},w453:{id:"w453",nodes:["n2447","n2242","n2448","n2527","n2530"],tags:{highway:"service"}},w454:{id:"w454",nodes:["n2560","n333","n2561"],tags:{highway:"service",service:"parking_aisle"}},w455:{id:"w455",nodes:["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],tags:{building:"yes"}},w456:{id:"w456",nodes:["n2425","n2429","n2424"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w457:{id:"w457",nodes:["n2487","n2467","n2472","n2480","n2495","n2487"],tags:{building:"yes"}},w458:{id:"w458",nodes:["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],tags:{building:"yes"}},w459:{id:"w459",nodes:["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],tags:{building:"yes"}},w46:{id:"w46",nodes:["n221","n222","n223","n224","n221"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w460:{id:"w460",nodes:["n2468","n2464","n2455","n2457","n2461","n2468"],tags:{building:"yes"}},w461:{id:"w461",nodes:["n2478","n2473","n683","n682","n2463","n681","n2478"],tags:{building:"yes"}},w462:{id:"w462",nodes:["n2547","n473","n2548","n2549"],tags:{highway:"service",service:"parking_aisle"}},w463:{id:"w463",nodes:["n2573","n2574"],tags:{highway:"path",name:"Riverwalk Trail"}},w464:{id:"w464",nodes:["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],tags:{highway:"service",service:"parking_aisle"}},w465:{id:"w465",nodes:["n2571","n459","n2572"],tags:{highway:"path",name:"Riverwalk Trail"}},w466:{id:"w466",nodes:["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],tags:{highway:"service"}},w467:{id:"w467",nodes:["n2484","n2474","n2477","n2485","n2488","n2484"],tags:{building:"yes"}},w468:{id:"w468",nodes:["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],tags:{building:"yes"}},w469:{id:"w469",nodes:["n2469","n2476","n2481","n2475","n920","n2466","n2469"],tags:{building:"yes"}},w47:{id:"w47",nodes:["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],tags:{highway:"service"}},w470:{id:"w470",nodes:["n2473","n2470","n2465","n2458","n2462","n683","n2473"],tags:{building:"yes"}},w471:{id:"w471",nodes:["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],tags:{building:"yes"}},w472:{id:"w472",nodes:["n2424","n2426","n2427","n2428"],tags:{highway:"residential",name:"Moore Street"}},w473:{id:"w473",nodes:["n2432","n1026","n4741","n2554","n2425"],tags:{highway:"residential",name:"Moore Street"}},w474:{id:"w474",nodes:["n2577","n2576"],tags:{bridge:"yes",highway:"footway"}},w475:{id:"w475",nodes:["n2497","n2505","n2500","n2493","n2497"],tags:{building:"yes"}},w476:{id:"w476",nodes:["n2493","n2500","n2501","n2496","n2490","n2493"],tags:{building:"yes"}},w477:{id:"w477",nodes:["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],tags:{highway:"residential",name:"Railroad Drive"}},w478:{id:"w478",nodes:["n2515","n2511","n2498","n2504","n2509","n2515"],tags:{building:"yes"}},w479:{id:"w479",nodes:["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],tags:{building:"yes"}},w48:{id:"w48",nodes:["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],tags:{building:"yes"}},w480:{id:"w480",nodes:["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],tags:{amenity:"parking"}},w481:{id:"w481",nodes:["n2796","n2657","n2658","n2797","n2796"],tags:{building:"yes"}},w482:{id:"w482",nodes:["n2550","n2551","n442","n2552","n2553","n2550"],tags:{amenity:"parking"}},w483:{id:"w483",nodes:["n2790","n2542"],tags:{highway:"service",service:"parking_aisle"}},w484:{id:"w484",nodes:["n2311","n1102"],tags:{highway:"service"}},w485:{id:"w485",nodes:["n2515","n2509","n2516","n2519","n2515"],tags:{building:"yes"}},w486:{id:"w486",nodes:["n2506","n2502","n2492","n2491","n2494","n2506"],tags:{building:"yes"}},w487:{id:"w487",nodes:["n2667","n2668","n2669","n2670","n2667"],tags:{building:"yes"}},w488:{id:"w488",nodes:["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],tags:{building:"yes"}},w489:{id:"w489",nodes:["n2081","n2430"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w49:{id:"w49",nodes:["n237","n238"],tags:{highway:"footway"}},w490:{id:"w490",nodes:["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],tags:{highway:"residential",name:"Portage Avenue"}},w491:{id:"w491",nodes:["n2578","n2579","n2580","n2581","n2578"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w492:{id:"w492",nodes:["n2556","n2557","n2558","n2559","n2556"],tags:{amenity:"parking"}},w493:{id:"w493",nodes:["n2460","n2456","n687","n2453","n2454","n2460"],tags:{building:"yes"}},w494:{id:"w494",nodes:["n2471","n2479","n2476","n2469","n2471"],tags:{building:"yes"}},w495:{id:"w495",nodes:["n2724","n2725","n673","n672","n671","n2726","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w496:{id:"w496",nodes:["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],tags:{building:"yes"}},w497:{id:"w497",nodes:["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],tags:{highway:"primary",name:"Michigan Avenue"}},w498:{id:"w498",nodes:["n2691","n2692","n634","n633","n2693","n2694"],tags:{highway:"service"}},w499:{id:"w499",nodes:["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],tags:{highway:"residential",name:"West Street"}},w5:{id:"w5",nodes:["n380","n381","n382","n383","n429","n430","n380"],tags:{building:"yes"}},w50:{id:"w50",nodes:["n239","n499","n508","n245","n238","n242","n240"],tags:{footway:"sidewalk",highway:"footway"}},w500:{id:"w500",nodes:["n2428","n1152","n2421","n2324"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w501:{id:"w501",nodes:["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],tags:{building:"yes"}},w502:{id:"w502",nodes:["n2570","n2571"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w503:{id:"w503",nodes:["n2540","n2542","n2787"],tags:{highway:"service"}},w504:{id:"w504",nodes:["n2269","n2582","n2250"],tags:{highway:"path"}},w505:{id:"w505",nodes:["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],tags:{building:"yes"}},w506:{id:"w506",nodes:["n2543","n2544","n2545","n395","n2546","n2543"],tags:{amenity:"parking"}},w507:{id:"w507",nodes:["n2449","n2450","n2451","n2452","n1162","n2449"],tags:{leisure:"pitch",sport:"tennis"}},w508:{id:"w508",nodes:["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],tags:{highway:"service"}},w509:{id:"w509",nodes:["n2499","n2508","n2510","n2505","n2497","n2499"],tags:{building:"yes"}},w51:{id:"w51",nodes:["n241","n242","n243","n244"],tags:{highway:"service",surface:"unpaved"}},w510:{id:"w510",nodes:["n2575","n2577"],tags:{highway:"footway"}},w511:{id:"w511",nodes:["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],tags:{amenity:"parking"}},w512:{id:"w512",nodes:["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],tags:{building:"yes"}},w513:{id:"w513",nodes:["n2720","n2721"],tags:{highway:"service",service:"parking_aisle"}},w514:{id:"w514",nodes:["n2788","n2790","n2789","n989","n2540","n2541"],tags:{highway:"service",service:"parking_aisle"}},w515:{id:"w515",nodes:["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],tags:{highway:"residential",name:"Middle Street"}},w516:{id:"w516",nodes:["n2852","n2805"],tags:{access:"private",highway:"service",name:"Battle Street"}},w517:{id:"w517",nodes:["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w518:{id:"w518",nodes:["n2859","n2808"],tags:{highway:"residential",name:"2nd Avenue"}},w519:{id:"w519",nodes:["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],tags:{building:"yes"}},w52:{id:"w52",nodes:["n247","n248","n249","n250","n247"],tags:{amenity:"parking"}},w520:{id:"w520",nodes:["n2806","n2807","n2803"],tags:{highway:"residential",name:"2nd Avenue"}},w521:{id:"w521",nodes:["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],tags:{building:"yes"}},w522:{id:"w522",nodes:["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],tags:{highway:"residential",name:"Washington Street"}},w523:{id:"w523",nodes:["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],tags:{highway:"residential",name:"5th Avenue"}},w524:{id:"w524",nodes:["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],tags:{building:"yes"}},w525:{id:"w525",nodes:["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],tags:{highway:"residential",name:"Wood Street"}},w526:{id:"w526",nodes:["n2877","n2809","n2813","n2844","n2843"],tags:{highway:"residential",name:"4th Avenue"}},w527:{id:"w527",nodes:["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],tags:{amenity:"parking"}},w528:{id:"w528",nodes:["n2864","n2892","n2893","n2877","n2860","n3840"],tags:{highway:"residential",name:"Garden Street"}},w529:{id:"w529",nodes:["n2868","n2890"],tags:{bridge:"yes",highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w53:{id:"w53",nodes:["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],tags:{building:"yes"}},w530:{id:"w530",nodes:["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],tags:{building:"yes"}},w531:{id:"w531",nodes:["n2958","n2896"],tags:{bridge:"yes",highway:"secondary",name:"Main Street"}},w532:{id:"w532",nodes:["n2896","n394","n364","n2748"],tags:{highway:"secondary",name:"Main Street"}},w533:{id:"w533",nodes:["n2800","n2943","n2940","n2941","n2942","n2943"],tags:{highway:"service",service:"parking_aisle"}},w534:{id:"w534",nodes:["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],tags:{barrier:"fence"}},w535:{id:"w535",nodes:["n2894","n2944","n2774","n2765"],tags:{highway:"residential",name:"5th Avenue"}},w536:{id:"w536",nodes:["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w537:{id:"w537",nodes:["n2895","n738","n2887","n737","n2913"],tags:{highway:"residential",name:"Water Street"}},w538:{id:"w538",nodes:["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],tags:{highway:"residential",name:"River Drive"}},w539:{id:"w539",nodes:["n2882","n2894"],tags:{bridge:"yes",highway:"residential",name:"5th Avenue"}},w54:{id:"w54",nodes:["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],tags:{building:"yes"}},w540:{id:"w540",nodes:["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],tags:{name:"Portage River",waterway:"river"}},w541:{id:"w541",nodes:["n2852","n2851","n3003"],tags:{highway:"residential",name:"1st Avenue"}},w542:{id:"w542",nodes:["n2991","n3004","n2994"],tags:{highway:"residential",name:"River Street"}},w543:{id:"w543",nodes:["n2993","n2989"],tags:{bridge:"yes",highway:"residential",name:"6th Street"}},w544:{id:"w544",nodes:["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],tags:{highway:"residential",name:"6th Street"}},w545:{id:"w545",nodes:["n2989","n2992","n2848"],tags:{highway:"residential",name:"6th Street"}},w546:{id:"w546",nodes:["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],tags:{natural:"wetland"}},w547:{id:"w547",nodes:["n2088","n3013","n3015","n3014","n3017","n3018"],tags:{name:"Conrail Railroad",railway:"rail"}},w548:{id:"w548",nodes:["n3083","n3084","n3085","n3086","n3083"],tags:{building:"yes"}},w549:{id:"w549",nodes:["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],tags:{leisure:"park",name:"Conservation Park"}},w55:{id:"w55",nodes:["n277","n278","n279","n280","n281","n282","n283","n284","n277"],tags:{building:"yes"}},w550:{id:"w550",nodes:["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],tags:{highway:"service"}},w551:{id:"w551",nodes:["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],tags:{highway:"footway"}},w552:{id:"w552",nodes:["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],tags:{building:"yes"}},w553:{id:"w553",nodes:["n3123","n3124","n3129","n3125","n3126","n3123"],tags:{building:"yes"}},w554:{id:"w554",nodes:["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],tags:{building:"yes"}},w555:{id:"w555",nodes:["n3087","n3088","n3089","n3090","n3087"],tags:{building:"yes"}},w556:{id:"w556",nodes:["n3113","n3114","n3115","n3116","n3113"],tags:{building:"yes"}},w557:{id:"w557",nodes:["n3103","n3104","n3105","n3106","n3103"],tags:{building:"yes"}},w558:{id:"w558",nodes:["n3127","n3128","n3129","n3124","n3127"],tags:{building:"yes"}},w559:{id:"w559",nodes:["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],tags:{building:"yes"}},w56:{id:"w56",nodes:["n285","n286","n287","n288","n285"],tags:{amenity:"parking"}},w560:{id:"w560",nodes:["n3091","n3092","n3093","n3094","n3091"],tags:{building:"yes"}},w561:{id:"w561",nodes:["n3155","n3157","n3158","n3159","n3156","n3155"],tags:{building:"yes"}},w562:{id:"w562",nodes:["n3057","n3058","n3059","n3060","n3057"],tags:{building:"yes"}},w563:{id:"w563",nodes:["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],tags:{building:"yes"}},w564:{id:"w564",nodes:["n3134","n3135","n3136","n3131","n3134"],tags:{building:"yes"}},w565:{id:"w565",nodes:["n3143","n3144","n3145","n3146","n3143"],tags:{building:"yes"}},w566:{id:"w566",nodes:["n3095","n3096","n3097","n3098","n3095"],tags:{building:"yes"}},w567:{id:"w567",nodes:["n3130","n3131","n3136","n3132","n3133","n3130"],tags:{building:"yes"}},w568:{id:"w568",nodes:["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],tags:{amenity:"parking"}},w569:{id:"w569",nodes:["n3061","n3062","n3063","n3064","n3061"],tags:{building:"yes"}},w57:{id:"w57",nodes:["n289","n290","n291","n292","n289"],tags:{amenity:"parking"}},w570:{id:"w570",nodes:["n3155","n3156","n3152","n3153","n3155"],tags:{building:"yes"}},w571:{id:"w571",nodes:["n3099","n3100","n3101","n3102","n3099"],tags:{building:"yes"}},w572:{id:"w572",nodes:["n3147","n3148","n3149","n3150","n3147"],tags:{building:"yes"}},w573:{id:"w573",nodes:["n3039","n2284"],tags:{highway:"service"}},w574:{id:"w574",nodes:["n3151","n3152","n3153","n3154","n3151"],tags:{building:"yes"}},w575:{id:"w575",nodes:["n3021","n3022","n3023","n3024","n3021"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w576:{id:"w576",nodes:["n3065","n3066","n3067","n3068","n3065"],tags:{building:"yes"}},w577:{id:"w577",nodes:["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],tags:{highway:"service",name:"Willow Drive",service:"driveway",surface:"unpaved"}},w578:{id:"w578",nodes:["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],tags:{building:"yes"}},w579:{id:"w579",nodes:["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],tags:{highway:"residential",name:"Elm Street"}},w58:{id:"w58",nodes:["n240","n293","n294"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w580:{id:"w580",nodes:["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],tags:{building:"yes"}},w581:{id:"w581",nodes:["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],tags:{highway:"residential",name:"Kelsey Street"}},w582:{id:"w582",nodes:["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],tags:{highway:"residential",name:"Walnut Street"}},w583:{id:"w583",nodes:["n3272","n4469","n4588","n2879","n4564","n2872"],tags:{highway:"residential",name:"10th Avenue"}},w584:{id:"w584",nodes:["n3243","n3242","n3241","n3240","n3243"],tags:{building:"industrial"}},w585:{id:"w585",nodes:["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],tags:{highway:"residential",name:"6th Avenue"}},w586:{id:"w586",nodes:["n3276","n4591","n2853","n4605","n2854"],tags:{highway:"residential",name:"8th Avenue"}},w587:{id:"w587",nodes:["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],tags:{building:"industrial"}},w588:{id:"w588",nodes:["n3277","n4599","n2857","n4598","n4608","n2858"],tags:{highway:"residential",name:"7th Avenue"}},w589:{id:"w589",nodes:["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],tags:{building:"yes"}},w59:{id:"w59",nodes:["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],tags:{footway:"sidewalk",highway:"footway"}},w590:{id:"w590",nodes:["n3278","n4458","n4589","n4604","n2861"],tags:{highway:"residential",name:"9th Avenue"}},w591:{id:"w591",nodes:["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],tags:{building:"industrial"}},w592:{id:"w592",nodes:["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],tags:{natural:"water",water:"pond"}},w593:{id:"w593",nodes:["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],tags:{building:"industrial"}},w594:{id:"w594",nodes:["n3233","n3232","n3231","n3230","n3233"],tags:{building:"yes"}},w595:{id:"w595",nodes:["n3247","n3246","n3245","n3244","n3247"],tags:{building:"industrial"}},w596:{id:"w596",nodes:["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],tags:{highway:"residential",name:"Armitage Street"}},w597:{id:"w597",nodes:["n2193","n2194","n2195","n2197","n2193"],tags:{building:"yes"}},w598:{id:"w598",nodes:["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],tags:{building:"school"}},w6:{id:"w6",nodes:["n879","n880","n881","n882","n879"],tags:{building:"shed"}},w60:{id:"w60",nodes:["n239","n308","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w600:{id:"w600",nodes:["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],tags:{building:"yes"}},w601:{id:"w601",nodes:["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],tags:{building:"yes"}},w602:{id:"w602",nodes:["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],tags:{building:"yes"}},w603:{id:"w603",nodes:["n3353","n3352","n3347","n3280","n2798"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w604:{id:"w604",nodes:["n3753","n3211","n3383"],tags:{highway:"service",service:"alley"}},w605:{id:"w605",nodes:["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],tags:{building:"yes"}},w606:{id:"w606",nodes:["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],tags:{building:"yes"}},w607:{id:"w607",nodes:["n2198","n2207"],tags:{barrier:"wall"}},w608:{id:"w608",nodes:["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],tags:{highway:"residential",name:"East Street"}},w609:{id:"w609",nodes:["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],tags:{highway:"residential",name:"Maple Street"}},w61:{id:"w61",nodes:["n309","n310","n311","n312","n313","n240"],tags:{footway:"sidewalk",highway:"footway"}},w610:{id:"w610",nodes:["n3379","n3380","n3382","n3381","n3379"],tags:{leisure:"park",name:"LaFayette Park"}},w611:{id:"w611",nodes:["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],tags:{highway:"residential",name:"Bennett Street"}},w612:{id:"w612",nodes:["n2751","n3383","n2749","n2798","n2772"],tags:{highway:"residential",name:"Market Street"}},w613:{id:"w613",nodes:["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],tags:{building:"yes"}},w614:{id:"w614",nodes:["n3375","n3406","n3405","n3374","n3375"],tags:{leisure:"playground"}},w615:{id:"w615",nodes:["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],tags:{building:"yes"}},w616:{id:"w616",nodes:["n3376","n3407","n3408","n3377","n3376"],tags:{amenity:"school",name:"Three Rivers Elementary School"}},w617:{id:"w617",nodes:["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],tags:{building:"yes"}},w619:{id:"w619",nodes:["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],tags:{highway:"secondary",name:"Michigan Avenue",ref:"M 60"}},w62:{id:"w62",nodes:["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],tags:{footway:"sidewalk",highway:"footway"}},w620:{id:"w620",nodes:["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],tags:{highway:"residential"}},w621:{id:"w621",nodes:["n3468","n3469","n3470","n3471","n3468"],tags:{building:"yes"}},w622:{id:"w622",nodes:["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],tags:{landuse:"cemetery",name:"Riverside Cemetery"}},w623:{id:"w623",nodes:["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],tags:{building:"yes"}},w624:{id:"w624",nodes:["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],tags:{building:"yes"}},w625:{id:"w625",nodes:["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],tags:{highway:"secondary",name:"Jefferson Street",name_1:"State Highway 60",ref:"M 60"}},w626:{id:"w626",nodes:["n3439","n3423","n2863"],tags:{highway:"unclassified",name:"Michigan Avenue",name_1:"State Highway 60"}},w627:{id:"w627",nodes:["n3500","n3005"],tags:{highway:"service"}},w628:{id:"w628",nodes:["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],tags:{leisure:"park",name:"Marina Park"}},w629:{id:"w629",nodes:["n2208","n2209","n2212","n2214","n2208"],tags:{building:"yes"}},w63:{id:"w63",nodes:["n1955","n316"],tags:{footway:"sidewalk",highway:"footway"}},w630:{id:"w630",nodes:["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],tags:{highway:"residential",name:"Hoffman Street"}},w631:{id:"w631",nodes:["n2215","n2750","n2770","n2771","n2215"],tags:{building:"yes"}},w632:{id:"w632",nodes:["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],tags:{highway:"residential",name:"Cushman Street"}},w633:{id:"w633",nodes:["n2745","n3749","n3507","n4535","n3503"],tags:{highway:"residential",name:"Pine Street"}},w634:{id:"w634",nodes:["n3510","n3511","n3512","n3509","n3510"],tags:{leisure:"park",name:"Bowman Park"}},w636:{id:"w636",nodes:["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],tags:{highway:"residential",name:"Wheeler Street"}},w637:{id:"w637",nodes:["n3550","n4586","n4476","n3472"],tags:{highway:"residential",name:"11th Avenue"}},w638:{id:"w638",nodes:["n3508","n3518"],tags:{bridge:"yes",highway:"residential",name:"Hoffman Street"}},w639:{id:"w639",nodes:["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],tags:{highway:"residential",name:"Hoffman Street"}},w64:{id:"w64",nodes:["n316","n317"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w640:{id:"w640",nodes:["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],tags:{name:"Hoffman Pond",natural:"water",water:"reservoir"}},w641:{id:"w641",nodes:["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],tags:{waterway:"river"}},w642:{id:"w642",nodes:["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],tags:{admin_level:"8",boundary:"administrative"}},w643:{id:"w643",nodes:["n2839","n2873"],tags:{highway:"service",service:"driveway"}},w644:{id:"w644",nodes:["n2873","n2840"],tags:{bridge:"yes",highway:"service",layer:"1",service:"driveway"}},w645:{id:"w645",nodes:["n2840","n2841","n2842","n2845","n2866"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w646:{id:"w646",nodes:["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],tags:{highway:"residential",name:"Flower Street"}},w647:{id:"w647",nodes:["n2874","n2875","n2876","n2954","n2874"],tags:{building:"industrial"}},w648:{id:"w648",nodes:["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],tags:{building:"yes"}},w649:{id:"w649",nodes:["n3197","n4543","n4544","n3198"],tags:{highway:"residential",name:"Morris Avenue",surface:"unpaved"}},w65:{id:"w65",nodes:["n317","n318","n319","n320","n321"],tags:{footway:"sidewalk",highway:"footway"}},w650:{id:"w650",nodes:["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],tags:{highway:"residential",name:"Adams Street"}},w651:{id:"w651",nodes:["n3788","n3785","n3786","n3787","n3788"],tags:{power:"station"}},w652:{id:"w652",nodes:["n2957","n3163","n3241"],tags:{barrier:"wall"}},w653:{id:"w653",nodes:["n3549","n3802","n3803","n3800","n3801"],tags:{highway:"service",surface:"unpaved"}},w654:{id:"w654",nodes:["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],tags:{building:"yes"}},w655:{id:"w655",nodes:["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],tags:{building:"yes"}},w656:{id:"w656",nodes:["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],tags:{building:"yes"}},w657:{id:"w657",nodes:["n3772","n3773","n3774","n3775","n3772"],tags:{building:"yes"}},w658:{id:"w658",nodes:["n3776","n3777","n3784","n3789","n3776"],tags:{building:"yes"}},w659:{id:"w659",nodes:["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],tags:{leisure:"pitch",sport:"baseball"}},w66:{id:"w66",nodes:["n321","n322"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w660:{id:"w660",nodes:["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],tags:{highway:"service"}},w661:{id:"w661",nodes:["n3968","n3969"],tags:{highway:"footway"}},w662:{id:"w662",nodes:["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],tags:{amenity:"parking"}},w663:{id:"w663",nodes:["n3964","n3965"],tags:{highway:"footway"}},w664:{id:"w664",nodes:["n3966","n3967"],tags:{highway:"footway"}},w665:{id:"w665",nodes:["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],tags:{highway:"service",service:"parking_aisle"}},w666:{id:"w666",nodes:["n3895","n3896"],tags:{highway:"service",service:"parking_aisle"}},w667:{id:"w667",nodes:["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],tags:{access:"private",highway:"service",name:"Collins Drive"}},w668:{id:"w668",nodes:["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],tags:{building:"school"}},w669:{id:"w669",nodes:["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],tags:{highway:"service"}},w67:{id:"w67",nodes:["n322","n886","n323","n475"],tags:{footway:"crossing",highway:"footway"}},w670:{id:"w670",nodes:["n3473","n3859","n3860","n3980","n4908","n4865"],tags:{highway:"secondary",name:"Hoffman Street",ref:"M 60"}},w671:{id:"w671",nodes:["n3970","n3806","n3971"],tags:{highway:"footway"}},w672:{id:"w672",nodes:["n3892","n3893","n3894"],tags:{highway:"service",service:"parking_aisle"}},w673:{id:"w673",nodes:["n3945","n3946","n3992","n3990","n3945"],tags:{leisure:"pitch",sport:"tennis"}},w674:{id:"w674",nodes:["n3890","n3893","n3891"],tags:{highway:"service",service:"parking_aisle"}},w675:{id:"w675",nodes:["n3947","n3948","n3994","n3993","n3947"],tags:{leisure:"pitch",sport:"tennis"}},w676:{id:"w676",nodes:["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],tags:{highway:"service"}},w677:{id:"w677",nodes:["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],tags:{highway:"footway"}},w678:{id:"w678",nodes:["n3887","n3888","n3895","n3899"],tags:{highway:"service",service:"parking_aisle"}},w679:{id:"w679",nodes:["n3946","n3947","n3993","n3992","n3946"],tags:{leisure:"pitch",sport:"tennis"}},w68:{id:"w68",nodes:["n294","n1952","n326"],tags:{footway:"sidewalk",highway:"footway"}},w680:{id:"w680",nodes:["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],tags:{leisure:"pitch",sport:"baseball"}},w681:{id:"w681",nodes:["n3990","n3991","n3944","n3945","n3990"],tags:{leisure:"pitch",sport:"tennis"}},w682:{id:"w682",nodes:["n3871","n3872","n3873","n3874","n3871"],tags:{amenity:"parking"}},w683:{id:"w683",nodes:["n3956","n3965","n3957","n3958","n3959"],tags:{footway:"sidewalk",highway:"footway"}},w684:{id:"w684",nodes:["n3790","n3791","n3792","n3793","n3790"],tags:{building:"shed"}},w685:{id:"w685",nodes:["n3794","n3795","n3796","n3797","n3794"],tags:{building:"yes"}},w686:{id:"w686",nodes:["n3798","n3799","n3804","n3805","n3798"],tags:{building:"yes"}},w687:{id:"w687",nodes:["n3806","n3807"],tags:{highway:"footway"}},w688:{id:"w688",nodes:["n3845","n3846","n3847","n3848","n3845"],tags:{leisure:"pitch",sport:"american_football"}},w689:{id:"w689",nodes:["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],tags:{leisure:"track",sport:"running",highway:"footway"}},w69:{id:"w69",nodes:["n326","n327"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w690:{id:"w690",nodes:["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],tags:{building:"yes"}},w691:{id:"w691",nodes:["n4028","n4029","n4030","n4031","n4028"],tags:{building:"yes"}},w692:{id:"w692",nodes:["n4032","n4033","n4034","n4035","n4032"],tags:{building:"yes"}},w693:{id:"w693",nodes:["n4036","n4037","n4038","n4039","n4036"],tags:{building:"yes"}},w694:{id:"w694",nodes:["n4040","n4041","n4042","n4043","n4040"],tags:{building:"yes"}},w695:{id:"w695",nodes:["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],tags:{building:"yes"}},w696:{id:"w696",nodes:["n4050","n4051","n4052","n4053","n4050"],tags:{building:"roof"}},w697:{id:"w697",nodes:["n4054","n4068","n4055","n4056","n4057","n4054"],tags:{building:"yes"}},w698:{id:"w698",nodes:["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],tags:{building:"yes"}},w699:{id:"w699",nodes:["n4064","n4066","n4065"],tags:{barrier:"fence"}},w7:{id:"w7",nodes:["n43","n44","n45"],tags:{highway:"service"}},w70:{id:"w70",nodes:["n327","n328","n27","n329"],tags:{footway:"sidewalk",highway:"footway"}},w700:{id:"w700",nodes:["n4066","n4067","n4068"],tags:{barrier:"fence"}},w701:{id:"w701",nodes:["n4069","n4070","n4071","n4072","n4069"],tags:{building:"shed"}},w702:{id:"w702",nodes:["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],tags:{building:"yes"}},w703:{id:"w703",nodes:["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],tags:{building:"yes"}},w704:{id:"w704",nodes:["n4093","n4094","n4095","n4096"],tags:{barrier:"fence"}},w705:{id:"w705",nodes:["n4097","n4098","n4099","n4100","n4097"],tags:{building:"yes"}},w706:{id:"w706",nodes:["n4098","n4102","n4087"],tags:{barrier:"fence"}},w707:{id:"w707",nodes:["n4101","n4102","n4096","n4170","n4103"],tags:{barrier:"fence"}},w708:{id:"w708",nodes:["n4104","n4105","n4106","n4107","n4104"],tags:{access:"private",leisure:"swimming_pool"}},w709:{id:"w709",nodes:["n4108","n4109","n4110","n4111","n4108"],tags:{building:"yes"}},w71:{id:"w71",nodes:["n329","n331"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w710:{id:"w710",nodes:["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],tags:{building:"yes"}},w711:{id:"w711",nodes:["n4120","n4121","n4122","n4123","n4120"],tags:{building:"yes"}},w712:{id:"w712",nodes:["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],tags:{building:"yes"}},w713:{id:"w713",nodes:["n4130","n4131","n4132","n4133","n4130"],tags:{building:"shed"}},w714:{id:"w714",nodes:["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],tags:{building:"yes"}},w715:{id:"w715",nodes:["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],tags:{building:"yes"}},w716:{id:"w716",nodes:["n4150","n4151","n4152","n4153","n4150"],tags:{building:"yes"}},w717:{id:"w717",nodes:["n4154","n4155","n4156","n4157","n4154"],tags:{building:"yes"}},w718:{id:"w718",nodes:["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],tags:{building:"yes"}},w719:{id:"w719",nodes:["n4166","n4167","n4168","n4169","n4166"],tags:{building:"yes"}},w72:{id:"w72",nodes:["n331","n344","n332","n333","n334"],tags:{footway:"sidewalk",highway:"footway"}},w720:{id:"w720",nodes:["n4170","n4171"],tags:{barrier:"fence"}},w721:{id:"w721",nodes:["n4138","n4103"],tags:{barrier:"fence"}},w722:{id:"w722",nodes:["n4103","n4172"],tags:{barrier:"fence"}},w723:{id:"w723",nodes:["n4173","n4174"],tags:{barrier:"fence"}},w724:{id:"w724",nodes:["n4175","n4176","n4177","n4178","n4175"],tags:{building:"yes"}},w725:{id:"w725",nodes:["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],tags:{building:"yes"}},w726:{id:"w726",nodes:["n4185","n4186","n4187","n4188","n4185"],tags:{building:"yes"}},w727:{id:"w727",nodes:["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],tags:{building:"yes"}},w728:{id:"w728",nodes:["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],tags:{building:"yes"}},w729:{id:"w729",nodes:["n4211","n4212","n4213","n4214","n4211"],tags:{building:"shed"}},w73:{id:"w73",nodes:["n335","n336","n337","n338","n339","n340","n341","n342","n335"],tags:{building:"yes"}},w730:{id:"w730",nodes:["n4215","n4216","n4217","n4218","n4215"],tags:{building:"yes"}},w731:{id:"w731",nodes:["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],tags:{building:"yes"}},w732:{id:"w732",nodes:["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],tags:{building:"yes"}},w733:{id:"w733",nodes:["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],tags:{highway:"service"}},w734:{id:"w734",nodes:["n4240","n4249","n4248"],tags:{highway:"service",service:"parking_aisle"}},w735:{id:"w735",nodes:["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],tags:{amenity:"parking"}},w736:{id:"w736",nodes:["n4259","n4260","n4261","n4262","n4259"],tags:{building:"yes"}},w737:{id:"w737",nodes:["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],tags:{building:"yes"}},w738:{id:"w738",nodes:["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],tags:{building:"yes"}},w739:{id:"w739",nodes:["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],tags:{building:"yes"}},w74:{id:"w74",nodes:["n343","n344","n345"],tags:{highway:"service"}},w740:{id:"w740",nodes:["n4295","n4296","n4297","n4298","n4295"],tags:{building:"yes"}},w741:{id:"w741",nodes:["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],tags:{building:"yes"}},w742:{id:"w742",nodes:["n4311","n4312","n4313","n4314","n4311"],tags:{building:"shed"}},w743:{id:"w743",nodes:["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],tags:{building:"yes"}},w744:{id:"w744",nodes:["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],tags:{building:"yes"}},w745:{id:"w745",nodes:["n4335","n4336","n4337","n4338","n4335"],tags:{building:"shed"}},w746:{id:"w746",nodes:["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],tags:{building:"yes"}},w747:{id:"w747",nodes:["n4345","n4346","n4347","n4348","n4345"],tags:{building:"yes"}},w748:{id:"w748",nodes:["n4349","n4350","n4351","n4352","n4349"],tags:{building:"yes"}},w749:{id:"w749",nodes:["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],tags:{building:"yes"}},w75:{id:"w75",nodes:["n346","n347","n348","n349","n350","n351","n346"],tags:{amenity:"parking"}},w750:{id:"w750",nodes:["n4612","n4359","n4360"],tags:{barrier:"fence"}},w751:{id:"w751",nodes:["n4361","n4362","n4363","n4364","n4361"],tags:{building:"yes"}},w752:{id:"w752",nodes:["n4365","n4366","n4367","n4368","n4365"],tags:{building:"yes"}},w753:{id:"w753",nodes:["n4369","n4370","n4371","n4372","n4375","n4369"],tags:{building:"yes"}},w754:{id:"w754",nodes:["n4373","n4374","n4375"],tags:{barrier:"fence"}},w755:{id:"w755",nodes:["n4376","n4377","n4378","n4379","n4376"],tags:{building:"shed"}},w756:{id:"w756",nodes:["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],tags:{building:"yes"}},w757:{id:"w757",nodes:["n4392","n4393","n4394","n4395","n4392"],tags:{building:"yes"}},w758:{id:"w758",nodes:["n4396","n4397","n4398","n4399","n4396"],tags:{building:"shed"}},w759:{id:"w759",nodes:["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],tags:{building:"yes"}},w76:{id:"w76",nodes:["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w760:{id:"w760",nodes:["n4416","n4417"],tags:{barrier:"fence"}},w761:{id:"w761",nodes:["n4418","n4416","n4419"],tags:{barrier:"fence"}},w762:{id:"w762",nodes:["n4420","n4421"],tags:{barrier:"fence"}},w763:{id:"w763",nodes:["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],tags:{building:"yes"}},w764:{id:"w764",nodes:["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],tags:{building:"yes"}},w765:{id:"w765",nodes:["n4446","n4447","n4448","n4449","n4446"],tags:{building:"yes"}},w766:{id:"w766",nodes:["n4450","n4451","n4452","n4453","n4450"],tags:{building:"yes"}},w767:{id:"w767",nodes:["n4454","n4455","n4456","n4457","n4454"],tags:{building:"yes"}},w768:{id:"w768",nodes:["n4461","n4458","n4460"],tags:{footway:"crossing",highway:"footway"}},w769:{id:"w769",nodes:["n4460","n4462","n4459"],tags:{footway:"sidewalk",highway:"footway"}},w77:{id:"w77",nodes:["n325","n360","n361"],tags:{footway:"crossing",highway:"footway"}},w770:{id:"w770",nodes:["n4462","n4463","n4464"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w771:{id:"w771",nodes:["n4464","n4465","n4466","n4467"],tags:{footway:"sidewalk",highway:"footway"}},w772:{id:"w772",nodes:["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],tags:{footway:"sidewalk",highway:"footway"}},w773:{id:"w773",nodes:["n4467","n4468","n3959"],tags:{footway:"crossing",highway:"footway"}},w774:{id:"w774",nodes:["n4459","n4469","n4470"],tags:{footway:"crossing",highway:"footway"}},w775:{id:"w775",nodes:["n4470","n4471","n4472","n4473","n4474","n4475"],tags:{footway:"sidewalk",highway:"footway"}},w776:{id:"w776",nodes:["n4475","n4476","n4477"],tags:{footway:"crossing",highway:"footway"}},w777:{id:"w777",nodes:["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],tags:{footway:"sidewalk",highway:"footway"}},w778:{id:"w778",nodes:["n4488","n4489","n4490","n4491","n4488"],tags:{building:"yes"}},w779:{id:"w779",nodes:["n4492","n4493","n4494","n4495","n4492"],tags:{building:"yes"}},w78:{id:"w78",nodes:["n361","n362","n369"],tags:{footway:"sidewalk",highway:"footway"}},w780:{id:"w780",nodes:["n4496","n4497","n4498","n4499","n4496"],tags:{access:"private",leisure:"swimming_pool"}},w781:{id:"w781",nodes:["n4508","n4509"],tags:{footway:"sidewalk",highway:"footway"}},w782:{id:"w782",nodes:["n4510","n4511"],tags:{footway:"sidewalk",highway:"footway"}},w783:{id:"w783",nodes:["n4512","n4513"],tags:{footway:"sidewalk",highway:"footway"}},w784:{id:"w784",nodes:["n4513","n4514"],tags:{footway:"sidewalk",highway:"footway"}},w785:{id:"w785",nodes:["n4515","n4516"],tags:{footway:"sidewalk",highway:"footway"}},w786:{id:"w786",nodes:["n4517","n4515"],tags:{footway:"sidewalk",highway:"footway"}},w787:{id:"w787",nodes:["n4518","n4519"],tags:{footway:"sidewalk",highway:"footway"}},w788:{id:"w788",nodes:["n4519","n4520","n4513"],tags:{footway:"crossing",highway:"footway"}},w789:{id:"w789",nodes:["n4515","n4521","n4513"],tags:{footway:"crossing",highway:"footway"}},w79:{id:"w79",nodes:["n362","n363","n334"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w790:{id:"w790",nodes:["n4515","n4522","n4523"],tags:{footway:"crossing",highway:"footway"}},w791:{id:"w791",nodes:["n4523","n4524","n4519"],tags:{footway:"crossing",highway:"footway"}},w792:{id:"w792",nodes:["n4523","n4525"],tags:{footway:"sidewalk",highway:"footway"}},w793:{id:"w793",nodes:["n4525","n4526","n4527"],tags:{footway:"crossing",highway:"footway"}},w794:{id:"w794",nodes:["n4527","n4529"],tags:{footway:"sidewalk",highway:"footway"}},w795:{id:"w795",nodes:["n4529","n4530","n4518"],tags:{footway:"crossing",highway:"footway"}},w796:{id:"w796",nodes:["n4518","n4531"],tags:{footway:"sidewalk",highway:"footway"}},w797:{id:"w797",nodes:["n4531","n4532"],tags:{footway:"sidewalk",highway:"footway"}},w798:{id:"w798",nodes:["n4533","n4534"],tags:{footway:"sidewalk",highway:"footway"}},w799:{id:"w799",nodes:["n4518","n4538","n4539"],tags:{footway:"crossing",highway:"footway"}},w8:{id:"w8",nodes:["n46","n47","n145","n48","n49","n46"],tags:{amenity:"parking"}},w80:{id:"w80",nodes:["n334","n364","n365"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w800:{id:"w800",nodes:["n4539","n4540","n4541"],tags:{footway:"crossing",highway:"footway"}},w801:{id:"w801",nodes:["n4541","n4542","n4529"],tags:{footway:"crossing",highway:"footway"}},w802:{id:"w802",nodes:["n4552","n4553"],tags:{footway:"sidewalk",highway:"footway"}},w803:{id:"w803",nodes:["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],tags:{building:"yes"}},w804:{id:"w804",nodes:["n4562","n4563"],tags:{barrier:"retaining_wall"}},w805:{id:"w805",nodes:["n4568","n4569","n4570","n4571","n4568"],tags:{building:"yes"}},w806:{id:"w806",nodes:["n3473","n4575","n4576","n4581","n4580","n3551"],tags:{highway:"residential",oneway:"yes"}},w807:{id:"w807",nodes:["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],tags:{leisure:"pitch",sport:"baseball"}},w808:{id:"w808",nodes:["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],tags:{highway:"service"}},w809:{id:"w809",nodes:["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],tags:{highway:"service"}},w81:{id:"w81",nodes:["n365","n366","n367"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w810:{id:"w810",nodes:["n4639","n4640","n4641"],tags:{barrier:"fence"}},w811:{id:"w811",nodes:["n4649","n4650","n4651","n4652","n4649"],tags:{building:"yes"}},w812:{id:"w812",nodes:["n4654","n4655"],tags:{barrier:"fence"}},w813:{id:"w813",nodes:["n4656","n4657"],tags:{barrier:"fence"}},w814:{id:"w814",nodes:["n4669","n4670","n4671","n4672","n4669"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w820:{id:"w820",nodes:["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],tags:{natural:"wood"}},w821:{id:"w821",nodes:["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],tags:{natural:"scrub"}},w822:{id:"w822",nodes:["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],tags:{natural:"wood"}},w823:{id:"w823",nodes:["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],tags:{natural:"wood"}},w824:{id:"w824",nodes:["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],tags:{landuse:"recreation_ground"}},w825:{id:"w825",nodes:["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],tags:{landuse:"recreation_ground"}},w826:{id:"w826",nodes:["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],tags:{landuse:"industrial"}},w827:{id:"w827",nodes:["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],tags:{landuse:"industrial"}},w828:{id:"w828",nodes:["n4843","n4844","n4845","n4846","n4843"],tags:{landuse:"farmland"}},w829:{id:"w829",nodes:["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],tags:{aeroway:"aerodrome",name:"Three Rivers Municipal Airport"}},w83:{id:"w83",nodes:["n371","n372","n373","n374","n371"],tags:{building:"yes"}},w830:{id:"w830",nodes:["n4855","n4854","n4857","n4853","n4960"],tags:{barrier:"fence"}},w831:{id:"w831",nodes:["n4860","n4859","n4858","n4852","n4851"],tags:{barrier:"fence"}},w832:{id:"w832",nodes:["n4866","n4878","n4869","n4867"],tags:{aeroway:"runway",ref:"5/23"}},w833:{id:"w833",nodes:["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],tags:{aeroway:"runway",ref:"9/27"}},w834:{id:"w834",nodes:["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],tags:{aeroway:"apron"}},w835:{id:"w835",nodes:["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],tags:{aeroway:"taxiway"}},w836:{id:"w836",nodes:["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],tags:{aeroway:"taxiway"}},w837:{id:"w837",nodes:["n4893","n4894"],tags:{aeroway:"taxiway"}},w838:{id:"w838",nodes:["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],tags:{aeroway:"taxiway"}},w839:{id:"w839",nodes:["n4907","n4908"],tags:{highway:"service"}},w84:{id:"w84",nodes:["n374","n375","n376","n377","n373","n374"],tags:{building:"yes"}},w840:{id:"w840",nodes:["n4909","n4907","n4910"],tags:{highway:"service"}},w841:{id:"w841",nodes:["n4911","n4912","n4913","n4914","n4911"],tags:{building:"yes"}},w842:{id:"w842",nodes:["n4915","n4916","n4917","n4918","n4915"],tags:{aeroway:"hangar",building:"yes"}},w843:{id:"w843",nodes:["n4919","n4920","n4921","n4922","n4919"],tags:{building:"yes"}},w844:{id:"w844",nodes:["n4923","n4924","n4925","n4926","n4923"],tags:{aeroway:"hangar",building:"yes"}},w845:{id:"w845",nodes:["n4927","n4928","n4929","n4930","n4927"],tags:{aeroway:"hangar",building:"yes"}},w846:{id:"w846",nodes:["n4931","n4932","n4933","n4934","n4931"],tags:{aeroway:"hangar",building:"yes"}},w847:{id:"w847",nodes:["n4935","n4936","n4937","n4938","n4935"],tags:{aeroway:"hangar",building:"yes"}},w848:{id:"w848",nodes:["n4939","n4940","n4941","n4942","n4939"],tags:{aeroway:"hangar",building:"yes"}},w849:{id:"w849",nodes:["n4943","n4944","n4945","n4946","n4943"],tags:{aeroway:"hangar",building:"yes"}},w85:{id:"w85",nodes:["n431","n432","n1038","n433","n434","n1040","n431"],tags:{building:"yes"}},w850:{id:"w850",nodes:["n4947","n4948","n4949","n4950","n4947"],tags:{aeroway:"hangar",building:"yes"}},w851:{id:"w851",nodes:["n4951","n4952","n4953","n4954","n4951"],tags:{aeroway:"hangar",building:"yes"}},w852:{id:"w852",nodes:["n4955","n4956","n4957","n4958","n4955"],tags:{aeroway:"hangar",building:"yes"}},w853:{id:"w853",nodes:["n4959","n4864","n4861","n4862","n4863"],tags:{barrier:"fence"}},w854:{id:"w854",nodes:["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],tags:{landuse:"farmland"}},w855:{id:"w855",nodes:["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],tags:{landuse:"farmland"}},w856:{id:"w856",nodes:["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],tags:{natural:"scrub"}},w857:{id:"w857",nodes:["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],tags:{landuse:"farmland"}},w858:{id:"w858",nodes:["n5001","n5003","n5004","n4999","n5000","n5001"],tags:{natural:"scrub"}},w859:{id:"w859",nodes:["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],tags:{landuse:"farmland"}},w86:{id:"w86",nodes:["n384","n385","n386","n387","n384"],tags:{building:"yes"}},w860:{id:"w860",nodes:["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],tags:{landuse:"industrial"}},w87:{id:"w87",nodes:["n387","n388","n389","n386","n387"],tags:{building:"yes"}},w88:{id:"w88",nodes:["n390","n391","n392","n393","n390"],tags:{building:"yes"}},w89:{id:"w89",nodes:["n394","n2895"],tags:{highway:"service"}},w9:{id:"w9",nodes:["n50","n51","n148","n52","n57","n891","n53","n50"],tags:{building:"yes"}},w90:{id:"w90",nodes:["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],tags:{building:"yes"}},w91:{id:"w91",nodes:["n418","n423","n419"],tags:{highway:"service"}},w92:{id:"w92",nodes:["n420","n421","n422","n423","n420"],tags:{amenity:"parking"}},w93:{id:"w93",nodes:["n2282","n1876"],tags:{name:"Rocky River",tunnel:"building_passage",waterway:"river"}},w94:{id:"w94",nodes:["n1876","n885","n1875","n2234"],tags:{name:"Rocky River",waterway:"river"}},w95:{id:"w95",nodes:["n425","n426","n427","n914","n428","n913","n425"],tags:{building:"yes"}},w96:{id:"w96",nodes:["n456","n620","n1034","n1035","n456"],tags:{building:"yes"}},w97:{id:"w97",nodes:["n435","n912","n451","n321"],tags:{highway:"footway"}},w98:{id:"w98",nodes:["n436","n319","n437","n438","n439","n440","n441","n476","n442"],tags:{highway:"service"}},w99:{id:"w99",nodes:["n443","n444","n445","n446","n447","n448","n449","n450","n443"],tags:{amenity:"parking"}},n2934:{id:"n2934",loc:[-85.617051,41.952263]},n2935:{id:"n2935",loc:[-85.61699,41.952276]},n2937:{id:"n2937",loc:[-85.616847,41.952262]},n2938:{id:"n2938",loc:[-85.616577,41.951956]},n2939:{id:"n2939",loc:[-85.61656,41.952044]},n3348:{id:"n3348",loc:[-85.61714,41.9522]},n3349:{id:"n3349",loc:[-85.616517,41.95212]},n3350:{id:"n3350",loc:[-85.616489,41.952033]},n3351:{id:"n3351",loc:[-85.616529,41.951907]},n3354:{id:"n3354",loc:[-85.616488,41.951994]},w599:{tags:{footway:"sidewalk",highway:"footway"},id:"w599",nodes:["n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"]},w618:{tags:{footway:"sidewalk",highway:"footway"},id:"w618",nodes:["n1020","n1021"]},n3355:{id:"n3355",loc:[-85.634489,41.946193]}};
82682
82683         // Tooltips and svg mask used to highlight certain features
82684         function uiCurtain() {
82685
82686             var surface = d3_select(null),
82687                 tooltip = d3_select(null),
82688                 darkness = d3_select(null);
82689
82690             function curtain(selection) {
82691                 surface = selection
82692                     .append('svg')
82693                     .attr('id', 'curtain')
82694                     .style('z-index', 1000)
82695                     .style('pointer-events', 'none')
82696                     .style('position', 'absolute')
82697                     .style('top', 0)
82698                     .style('left', 0);
82699
82700                 darkness = surface.append('path')
82701                     .attr('x', 0)
82702                     .attr('y', 0)
82703                     .attr('class', 'curtain-darkness');
82704
82705                 d3_select(window).on('resize.curtain', resize);
82706
82707                 tooltip = selection.append('div')
82708                     .attr('class', 'tooltip')
82709                     .style('z-index', 1002);
82710
82711                 tooltip
82712                     .append('div')
82713                     .attr('class', 'tooltip-arrow');
82714
82715                 tooltip
82716                     .append('div')
82717                     .attr('class', 'tooltip-inner');
82718
82719                 resize();
82720
82721
82722                 function resize() {
82723                     surface
82724                         .attr('width', window.innerWidth)
82725                         .attr('height', window.innerHeight);
82726                     curtain.cut(darkness.datum());
82727                 }
82728             }
82729
82730
82731             /**
82732              * Reveal cuts the curtain to highlight the given box,
82733              * and shows a tooltip with instructions next to the box.
82734              *
82735              * @param  {String|ClientRect} [box]   box used to cut the curtain
82736              * @param  {String}    [text]          text for a tooltip
82737              * @param  {Object}    [options]
82738              * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
82739              * @param  {integer}   [options.duration]        transition time in milliseconds
82740              * @param  {string}    [options.buttonText]      if set, create a button with this text label
82741              * @param  {function}  [options.buttonCallback]  if set, the callback for the button
82742              * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
82743              */
82744             curtain.reveal = function(box, text, options) {
82745                 if (typeof box === 'string') {
82746                     box = d3_select(box).node();
82747                 }
82748                 if (box && box.getBoundingClientRect) {
82749                     box = copyBox(box.getBoundingClientRect());
82750                 }
82751
82752                 options = options || {};
82753
82754                 var tooltipBox;
82755                 if (options.tooltipBox) {
82756                     tooltipBox = options.tooltipBox;
82757                     if (typeof tooltipBox === 'string') {
82758                         tooltipBox = d3_select(tooltipBox).node();
82759                     }
82760                     if (tooltipBox && tooltipBox.getBoundingClientRect) {
82761                         tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
82762                     }
82763                 } else {
82764                     tooltipBox = box;
82765                 }
82766
82767                 if (tooltipBox && text) {
82768                     // pseudo markdown bold text for the instruction section..
82769                     var parts = text.split('**');
82770                     var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
82771                     if (parts[1]) {
82772                         html += '<span class="instruction">' + parts[1] + '</span>';
82773                     }
82774
82775                     html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
82776                     html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
82777
82778                     if (options.buttonText && options.buttonCallback) {
82779                         html += '<div class="button-section">' +
82780                             '<button href="#" class="button action">' + options.buttonText + '</button></div>';
82781                     }
82782
82783                     var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
82784                     tooltip
82785                         .classed(classes, true)
82786                         .selectAll('.tooltip-inner')
82787                         .html(html);
82788
82789                     if (options.buttonText && options.buttonCallback) {
82790                         var button = tooltip.selectAll('.button-section .button.action');
82791                         button
82792                             .on('click', function() {
82793                                 event.preventDefault();
82794                                 options.buttonCallback();
82795                             });
82796                     }
82797
82798                     var tip = copyBox(tooltip.node().getBoundingClientRect()),
82799                         w = window.innerWidth,
82800                         h = window.innerHeight,
82801                         tooltipWidth = 200,
82802                         tooltipArrow = 5,
82803                         side, pos;
82804
82805
82806                     // hack: this will have bottom placement,
82807                     // so need to reserve extra space for the tooltip illustration.
82808                     if (options.tooltipClass === 'intro-mouse') {
82809                         tip.height += 80;
82810                     }
82811
82812                     // trim box dimensions to just the portion that fits in the window..
82813                     if (tooltipBox.top + tooltipBox.height > h) {
82814                         tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
82815                     }
82816                     if (tooltipBox.left + tooltipBox.width > w) {
82817                         tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
82818                     }
82819
82820                     // determine tooltip placement..
82821
82822                     if (tooltipBox.top + tooltipBox.height < 100) {
82823                         // tooltip below box..
82824                         side = 'bottom';
82825                         pos = [
82826                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82827                             tooltipBox.top + tooltipBox.height
82828                         ];
82829
82830                     } else if (tooltipBox.top > h - 140) {
82831                         // tooltip above box..
82832                         side = 'top';
82833                         pos = [
82834                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82835                             tooltipBox.top - tip.height
82836                         ];
82837
82838                     } else {
82839                         // tooltip to the side of the tooltipBox..
82840                         var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
82841
82842                         if (textDirection === 'rtl') {
82843                             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
82844                                 side = 'right';
82845                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82846
82847                             } else {
82848                                 side = 'left';
82849                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82850                             }
82851
82852                         } else {
82853                             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
82854                                 side = 'left';
82855                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82856                             }
82857                             else {
82858                                 side = 'right';
82859                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82860                             }
82861                         }
82862                     }
82863
82864                     if (options.duration !== 0 || !tooltip.classed(side)) {
82865                         tooltip.call(uiToggle(true));
82866                     }
82867
82868                     tooltip
82869                         .style('top', pos[1] + 'px')
82870                         .style('left', pos[0] + 'px')
82871                         .attr('class', classes + ' ' + side);
82872
82873
82874                     // shift tooltip-inner if it is very close to the top or bottom edge
82875                     // (doesn't affect the placement of the tooltip-arrow)
82876                     var shiftY = 0;
82877                     if (side === 'left' || side === 'right') {
82878                         if (pos[1] < 60) {
82879                             shiftY = 60 - pos[1];
82880                         }
82881                         else if (pos[1] + tip.height > h - 100) {
82882                             shiftY = h - pos[1] - tip.height - 100;
82883                         }
82884                     }
82885                     tooltip.selectAll('.tooltip-inner')
82886                         .style('top', shiftY + 'px');
82887
82888                 } else {
82889                     tooltip
82890                         .classed('in', false)
82891                         .call(uiToggle(false));
82892                 }
82893
82894                 curtain.cut(box, options.duration);
82895
82896                 return tooltip;
82897             };
82898
82899
82900             curtain.cut = function(datum, duration) {
82901                 darkness.datum(datum)
82902                     .interrupt();
82903
82904                 var selection;
82905                 if (duration === 0) {
82906                     selection = darkness;
82907                 } else {
82908                     selection = darkness
82909                         .transition()
82910                         .duration(duration || 600)
82911                         .ease(linear$1);
82912                 }
82913
82914                 selection
82915                     .attr('d', function(d) {
82916                         var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
82917                             window.innerWidth + ',' + window.innerHeight + 'L' +
82918                             window.innerWidth + ',0 Z';
82919
82920                         if (!d) return string;
82921                         return string + 'M' +
82922                             d.left + ',' + d.top + 'L' +
82923                             d.left + ',' + (d.top + d.height) + 'L' +
82924                             (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
82925                             (d.left + d.width) + ',' + (d.top) + 'Z';
82926
82927                     });
82928             };
82929
82930
82931             curtain.remove = function() {
82932                 surface.remove();
82933                 tooltip.remove();
82934                 d3_select(window).on('resize.curtain', null);
82935             };
82936
82937
82938             // ClientRects are immutable, so copy them to an object,
82939             // in case we need to trim the height/width.
82940             function copyBox(src) {
82941                 return {
82942                     top: src.top,
82943                     right: src.right,
82944                     bottom: src.bottom,
82945                     left: src.left,
82946                     width: src.width,
82947                     height: src.height
82948                 };
82949             }
82950
82951
82952             return curtain;
82953         }
82954
82955         function uiIntroWelcome(context, reveal) {
82956             var dispatch$1 = dispatch('done');
82957             var listener = clickListener();
82958
82959             var chapter = {
82960                 title: 'intro.welcome.title'
82961             };
82962
82963
82964             function welcome() {
82965                 context.map().centerZoom([-85.63591, 41.94285], 19);
82966                 reveal('.intro-nav-wrap .chapter-welcome',
82967                     t('intro.welcome.welcome'),
82968                     { buttonText: t('intro.ok'), buttonCallback: practice }
82969                 );
82970             }
82971
82972             function practice() {
82973                 reveal('.intro-nav-wrap .chapter-welcome',
82974                     t('intro.welcome.practice'),
82975                     { buttonText: t('intro.ok'), buttonCallback: words }
82976                 );
82977             }
82978
82979             function words() {
82980                 reveal('.intro-nav-wrap .chapter-welcome',
82981                     t('intro.welcome.words'),
82982                     { buttonText: t('intro.ok'), buttonCallback: mouse }
82983                 );
82984             }
82985
82986
82987             function mouse() {
82988                 reveal('.intro-nav-wrap .chapter-welcome',
82989                     t('intro.welcome.mouse'),
82990                     { buttonText: t('intro.ok'), buttonCallback: leftClick }
82991                 );
82992             }
82993
82994
82995             function leftClick() {
82996                 var counter = 0;
82997                 var times = 5;
82998
82999                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
83000                     t('intro.welcome.leftclick', { num: times }),
83001                     { tooltipClass: 'intro-mouse' }
83002                 );
83003
83004                 tooltip.selectAll('.tooltip-inner')
83005                     .insert('svg', 'span')
83006                     .attr('class', 'tooltip-illustration')
83007                     .append('use')
83008                     .attr('xlink:href', '#iD-walkthrough-mouse');
83009
83010                 tooltip
83011                     .append('div')
83012                     .attr('class', 'counter');
83013
83014                 tooltip.call(listener);
83015
83016                 listener.on('click', function(which) {
83017                     if (which === 'left') {
83018                         d3_select('.curtain-tooltip.intro-mouse .counter')
83019                             .text(String(++counter));
83020
83021                         if (counter === times) {
83022                             window.setTimeout(function() { continueTo(rightClick); }, 1000);
83023                         }
83024                     }
83025                 });
83026
83027                 function continueTo(nextStep) {
83028                     listener.on('click', null);
83029                     tooltip.call(listener.off);
83030                     tooltip.select('.counter').remove();
83031                     nextStep();
83032                 }
83033             }
83034
83035
83036             function rightClick() {
83037                 var counter = 0;
83038                 var times = 5;
83039
83040                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
83041                     t('intro.welcome.rightclick', { num: times }),
83042                     { tooltipClass: 'intro-mouse' }
83043                 );
83044
83045                 tooltip.selectAll('.tooltip-inner')
83046                     .insert('svg', 'span')
83047                     .attr('class', 'tooltip-illustration')
83048                     .append('use')
83049                     .attr('xlink:href', '#iD-walkthrough-mouse');
83050
83051                 tooltip
83052                     .append('div')
83053                     .attr('class', 'counter');
83054
83055                 tooltip.call(listener);
83056
83057                 listener.on('click', function(which) {
83058                     if (which === 'right') {
83059                         d3_select('.curtain-tooltip.intro-mouse .counter')
83060                             .text(String(++counter));
83061
83062                         if (counter === times) {
83063                             window.setTimeout(function() { continueTo(chapters); }, 1000);
83064                         }
83065                     }
83066                 });
83067
83068                 function continueTo(nextStep) {
83069                     listener.on('click', null);
83070                     tooltip.call(listener.off);
83071                     tooltip.select('.counter').remove();
83072                     nextStep();
83073                 }
83074             }
83075
83076
83077             function chapters() {
83078                 dispatch$1.call('done');
83079                 reveal('.intro-nav-wrap .chapter-navigation',
83080                     t('intro.welcome.chapters', { next: t('intro.navigation.title') })
83081                 );
83082             }
83083
83084
83085             chapter.enter = function() {
83086                 welcome();
83087             };
83088
83089
83090             chapter.exit = function() {
83091                 listener.off();
83092                 d3_select('.curtain-tooltip.intro-mouse')
83093                     .selectAll('.counter')
83094                     .remove();
83095             };
83096
83097
83098             chapter.restart = function() {
83099                 chapter.exit();
83100                 chapter.enter();
83101             };
83102
83103
83104             return utilRebind(chapter, dispatch$1, 'on');
83105         }
83106
83107
83108
83109         function clickListener() {
83110             var dispatch$1 = dispatch('click');
83111             var minTime = 120;
83112             var tooltip = d3_select(null);
83113             var down = {};
83114
83115             // `down` keeps track of which buttons/keys are down.
83116             // Setting a property in `down` happens immediately.
83117             // Unsetting a property in `down` is delayed because
83118             //   on Windows a contextmenu event happens after keyup/mouseup
83119
83120             function keydown() {
83121                 if (event.keyCode === 93)  {   // context menu
83122                     event.preventDefault();
83123                     event.stopPropagation();
83124                     down.menu = event.timeStamp;
83125                     tooltip.classed('rightclick', true);
83126                 }
83127             }
83128
83129
83130             function keyup() {
83131                 if (event.keyCode === 93)  {   // context menu
83132                     event.preventDefault();
83133                     event.stopPropagation();
83134                     var endTime = event.timeStamp;
83135                     var startTime = down.menu || endTime;
83136                     var delay = (endTime - startTime < minTime) ? minTime : 0;
83137
83138                     window.setTimeout(function() {
83139                         tooltip.classed('rightclick', false);
83140                         down.menu = undefined;  // delayed, for Windows
83141                     }, delay);
83142
83143                     dispatch$1.call('click', this, 'right');
83144                 }
83145             }
83146
83147
83148             function mousedown() {
83149                 var button = event.button;
83150                 if (button === 0 && !event.ctrlKey) {
83151                     tooltip.classed('leftclick', true);
83152                 } else if (button === 2) {
83153                     tooltip.classed('rightclick', true);
83154                 }
83155                 down[button] = event.timeStamp;
83156             }
83157
83158
83159             function mouseup() {
83160                 var button = event.button;
83161                 var endTime = event.timeStamp;
83162                 var startTime = down[button] || endTime;
83163                 var delay = (endTime - startTime < minTime) ? minTime : 0;
83164
83165                 if (button === 0 && !event.ctrlKey) {
83166                     window.setTimeout(function() {
83167                         tooltip.classed('leftclick', false);
83168                         down[button] = undefined;  // delayed, for Windows
83169                     }, delay);
83170
83171                     dispatch$1.call('click', this, 'left');
83172
83173                 } else if (button === 2) {
83174                     window.setTimeout(function() {
83175                         tooltip.classed('rightclick', false);
83176                         down[button] = undefined;  // delayed, for Windows
83177                     }, delay);
83178
83179                     dispatch$1.call('click', this, 'right');
83180
83181                 } else {
83182                     window.setTimeout(function() {
83183                         down[button] = undefined;  // delayed, for Windows
83184                     }, delay);
83185                 }
83186             }
83187
83188
83189             function contextmenu() {
83190                 event.preventDefault();
83191                 event.stopPropagation();
83192                 if (!down[2] && !down.menu) {
83193                     tooltip.classed('rightclick', true);
83194                     window.setTimeout(function() {
83195                         tooltip.classed('rightclick', false);
83196                     }, minTime);
83197                     dispatch$1.call('click', this, 'right');
83198                 }
83199             }
83200
83201
83202             var behavior = function(selection) {
83203                 tooltip = selection;
83204                 down = {};
83205
83206                 d3_select(window)
83207                     .on('keydown.intro', keydown)
83208                     .on('keyup.intro', keyup)
83209                     .on('mousedown.intro', mousedown)
83210                     .on('mouseup.intro', mouseup)
83211                     .on('contextmenu.intro', contextmenu);
83212             };
83213
83214
83215             behavior.off = function() {
83216                 d3_select(window)
83217                     .on('keydown.intro', null)
83218                     .on('keyup.intro', null)
83219                     .on('mousedown.intro', null)
83220                     .on('mouseup.intro', null)
83221                     .on('contextmenu.intro', null);
83222
83223                 tooltip
83224                     .classed('leftclick', false)
83225                     .classed('rightclick', false);
83226             };
83227
83228             return utilRebind(behavior, dispatch$1, 'on');
83229         }
83230
83231         function uiIntroNavigation(context, reveal) {
83232             var dispatch$1 = dispatch('done');
83233             var timeouts = [];
83234             var hallId = 'n2061';
83235             var townHall = [-85.63591, 41.94285];
83236             var springStreetId = 'w397';
83237             var springStreetEndId = 'n1834';
83238             var springStreet = [-85.63582, 41.94255];
83239             var onewayField = context.presets().field('oneway');
83240             var maxspeedField = context.presets().field('maxspeed');
83241
83242
83243             var chapter = {
83244                 title: 'intro.navigation.title'
83245             };
83246
83247
83248             function timeout(f, t) {
83249                 timeouts.push(window.setTimeout(f, t));
83250             }
83251
83252
83253             function eventCancel() {
83254                 event.stopPropagation();
83255                 event.preventDefault();
83256             }
83257
83258
83259             function isTownHallSelected() {
83260                 var ids = context.selectedIDs();
83261                 return ids.length === 1 && ids[0] === hallId;
83262             }
83263
83264
83265             function dragMap() {
83266                 context.enter(modeBrowse(context));
83267                 context.history().reset('initial');
83268
83269                 var msec = transitionTime(townHall, context.map().center());
83270                 if (msec) { reveal(null, null, { duration: 0 }); }
83271                 context.map().centerZoomEase(townHall, 19, msec);
83272
83273                 timeout(function() {
83274                     var centerStart = context.map().center();
83275
83276                     reveal('#surface', t('intro.navigation.drag'));
83277                     context.map().on('drawn.intro', function() {
83278                         reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
83279                     });
83280
83281                     context.map().on('move.intro', function() {
83282                         var centerNow = context.map().center();
83283                         if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
83284                             context.map().on('move.intro', null);
83285                             timeout(function() { continueTo(zoomMap); }, 3000);
83286                         }
83287                     });
83288
83289                 }, msec + 100);
83290
83291                 function continueTo(nextStep) {
83292                     context.map().on('move.intro drawn.intro', null);
83293                     nextStep();
83294                 }
83295             }
83296
83297
83298             function zoomMap() {
83299                 var zoomStart = context.map().zoom();
83300
83301                 reveal('#surface',
83302                     t('intro.navigation.zoom', {
83303                         plus: icon('#iD-icon-plus', 'pre-text'),
83304                         minus: icon('#iD-icon-minus', 'pre-text')
83305                     })
83306                 );
83307
83308                 context.map().on('drawn.intro', function() {
83309                     reveal('#surface',
83310                         t('intro.navigation.zoom', {
83311                             plus: icon('#iD-icon-plus', 'pre-text'),
83312                             minus: icon('#iD-icon-minus', 'pre-text')
83313                         }), { duration: 0 }
83314                     );
83315                 });
83316
83317                 context.map().on('move.intro', function() {
83318                     if (context.map().zoom() !== zoomStart) {
83319                         context.map().on('move.intro', null);
83320                         timeout(function() { continueTo(features); }, 3000);
83321                     }
83322                 });
83323
83324                 function continueTo(nextStep) {
83325                     context.map().on('move.intro drawn.intro', null);
83326                     nextStep();
83327                 }
83328             }
83329
83330
83331             function features() {
83332                 var onClick = function() { continueTo(pointsLinesAreas); };
83333
83334                 reveal('#surface', t('intro.navigation.features'),
83335                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83336                 );
83337
83338                 context.map().on('drawn.intro', function() {
83339                     reveal('#surface', t('intro.navigation.features'),
83340                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83341                     );
83342                 });
83343
83344                 function continueTo(nextStep) {
83345                     context.map().on('drawn.intro', null);
83346                     nextStep();
83347                 }
83348             }
83349
83350             function pointsLinesAreas() {
83351                 var onClick = function() { continueTo(nodesWays); };
83352
83353                 reveal('#surface', t('intro.navigation.points_lines_areas'),
83354                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83355                 );
83356
83357                 context.map().on('drawn.intro', function() {
83358                     reveal('#surface', t('intro.navigation.points_lines_areas'),
83359                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83360                     );
83361                 });
83362
83363                 function continueTo(nextStep) {
83364                     context.map().on('drawn.intro', null);
83365                     nextStep();
83366                 }
83367             }
83368
83369             function nodesWays() {
83370                 var onClick = function() { continueTo(clickTownHall); };
83371
83372                 reveal('#surface', t('intro.navigation.nodes_ways'),
83373                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83374                 );
83375
83376                 context.map().on('drawn.intro', function() {
83377                     reveal('#surface', t('intro.navigation.nodes_ways'),
83378                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83379                     );
83380                 });
83381
83382                 function continueTo(nextStep) {
83383                     context.map().on('drawn.intro', null);
83384                     nextStep();
83385                 }
83386             }
83387
83388             function clickTownHall() {
83389                 context.enter(modeBrowse(context));
83390                 context.history().reset('initial');
83391
83392                 var entity = context.hasEntity(hallId);
83393                 if (!entity) return;
83394                 reveal(null, null, { duration: 0 });
83395                 context.map().centerZoomEase(entity.loc, 19, 500);
83396
83397                 timeout(function() {
83398                     var entity = context.hasEntity(hallId);
83399                     if (!entity) return;
83400                     var box = pointBox(entity.loc, context);
83401                     reveal(box, t('intro.navigation.click_townhall'));
83402
83403                     context.map().on('move.intro drawn.intro', function() {
83404                         var entity = context.hasEntity(hallId);
83405                         if (!entity) return;
83406                         var box = pointBox(entity.loc, context);
83407                         reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
83408                     });
83409
83410                     context.on('enter.intro', function() {
83411                         if (isTownHallSelected()) continueTo(selectedTownHall);
83412                     });
83413
83414                 }, 550);  // after centerZoomEase
83415
83416                 context.history().on('change.intro', function() {
83417                     if (!context.hasEntity(hallId)) {
83418                         continueTo(clickTownHall);
83419                     }
83420                 });
83421
83422                 function continueTo(nextStep) {
83423                     context.on('enter.intro', null);
83424                     context.map().on('move.intro drawn.intro', null);
83425                     context.history().on('change.intro', null);
83426                     nextStep();
83427                 }
83428             }
83429
83430
83431             function selectedTownHall() {
83432                 if (!isTownHallSelected()) return clickTownHall();
83433
83434                 var entity = context.hasEntity(hallId);
83435                 if (!entity) return clickTownHall();
83436
83437                 var box = pointBox(entity.loc, context);
83438                 var onClick = function() { continueTo(editorTownHall); };
83439
83440                 reveal(box, t('intro.navigation.selected_townhall'),
83441                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83442                 );
83443
83444                 context.map().on('move.intro drawn.intro', function() {
83445                     var entity = context.hasEntity(hallId);
83446                     if (!entity) return;
83447                     var box = pointBox(entity.loc, context);
83448                     reveal(box, t('intro.navigation.selected_townhall'),
83449                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83450                     );
83451                 });
83452
83453                 context.history().on('change.intro', function() {
83454                     if (!context.hasEntity(hallId)) {
83455                         continueTo(clickTownHall);
83456                     }
83457                 });
83458
83459                 function continueTo(nextStep) {
83460                     context.map().on('move.intro drawn.intro', null);
83461                     context.history().on('change.intro', null);
83462                     nextStep();
83463                 }
83464             }
83465
83466
83467             function editorTownHall() {
83468                 if (!isTownHallSelected()) return clickTownHall();
83469
83470                 // disallow scrolling
83471                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83472
83473                 var onClick = function() { continueTo(presetTownHall); };
83474
83475                 reveal('.entity-editor-pane',
83476                     t('intro.navigation.editor_townhall'),
83477                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83478                 );
83479
83480                 context.on('exit.intro', function() {
83481                     continueTo(clickTownHall);
83482                 });
83483
83484                 context.history().on('change.intro', function() {
83485                     if (!context.hasEntity(hallId)) {
83486                         continueTo(clickTownHall);
83487                     }
83488                 });
83489
83490                 function continueTo(nextStep) {
83491                     context.on('exit.intro', null);
83492                     context.history().on('change.intro', null);
83493                     d3_select('.inspector-wrap').on('wheel.intro', null);
83494                     nextStep();
83495                 }
83496             }
83497
83498
83499             function presetTownHall() {
83500                 if (!isTownHallSelected()) return clickTownHall();
83501
83502                 // reset pane, in case user happened to change it..
83503                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83504                 // disallow scrolling
83505                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83506
83507                 // preset match, in case the user happened to change it.
83508                 var entity = context.entity(context.selectedIDs()[0]);
83509                 var preset = context.presets().match(entity, context.graph());
83510
83511                 var onClick = function() { continueTo(fieldsTownHall); };
83512
83513                 context.on('exit.intro', function() {
83514                     continueTo(clickTownHall);
83515                 });
83516
83517                 context.history().on('change.intro', function() {
83518                     if (!context.hasEntity(hallId)) {
83519                         continueTo(clickTownHall);
83520                     }
83521                 });
83522
83523                 reveal('.inspector-body .preset-list-item.inspector-inner',
83524                     t('intro.navigation.preset_townhall', { preset: preset.name() }),
83525                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83526                 );
83527
83528                 function continueTo(nextStep) {
83529                     context.on('exit.intro', null);
83530                     context.history().on('change.intro', null);
83531                     d3_select('.inspector-wrap').on('wheel.intro', null);
83532                     nextStep();
83533                 }
83534             }
83535
83536
83537             function fieldsTownHall() {
83538                 if (!isTownHallSelected()) return clickTownHall();
83539
83540                 // reset pane, in case user happened to change it..
83541                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83542                 // disallow scrolling
83543                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83544
83545                 var onClick = function() { continueTo(closeTownHall); };
83546
83547                 reveal('.inspector-body .preset-editor',
83548                     t('intro.navigation.fields_townhall'),
83549                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83550                 );
83551
83552                 context.on('exit.intro', function() {
83553                     continueTo(clickTownHall);
83554                 });
83555
83556                 context.history().on('change.intro', function() {
83557                     if (!context.hasEntity(hallId)) {
83558                         continueTo(clickTownHall);
83559                     }
83560                 });
83561
83562                 function continueTo(nextStep) {
83563                     context.on('exit.intro', null);
83564                     context.history().on('change.intro', null);
83565                     d3_select('.inspector-wrap').on('wheel.intro', null);
83566                     nextStep();
83567                 }
83568             }
83569
83570
83571             function closeTownHall() {
83572                 if (!isTownHallSelected()) return clickTownHall();
83573
83574                 var selector = '.entity-editor-pane button.preset-close svg use';
83575                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83576
83577                 reveal('.entity-editor-pane',
83578                     t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
83579                 );
83580
83581                 context.on('exit.intro', function() {
83582                     continueTo(searchStreet);
83583                 });
83584
83585                 context.history().on('change.intro', function() {
83586                     // update the close icon in the tooltip if the user edits something.
83587                     var selector = '.entity-editor-pane button.preset-close svg use';
83588                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83589
83590                     reveal('.entity-editor-pane',
83591                         t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
83592                         { duration: 0 }
83593                     );
83594                 });
83595
83596                 function continueTo(nextStep) {
83597                     context.on('exit.intro', null);
83598                     context.history().on('change.intro', null);
83599                     nextStep();
83600                 }
83601             }
83602
83603
83604             function searchStreet() {
83605                 context.enter(modeBrowse(context));
83606                 context.history().reset('initial');  // ensure spring street exists
83607
83608                 var msec = transitionTime(springStreet, context.map().center());
83609                 if (msec) { reveal(null, null, { duration: 0 }); }
83610                 context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
83611
83612                 timeout(function() {
83613                     reveal('.search-header input',
83614                         t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
83615                     );
83616
83617                     d3_select('.search-header input')
83618                         .on('keyup.intro', checkSearchResult);
83619                 }, msec + 100);
83620             }
83621
83622
83623             function checkSearchResult() {
83624                 var first = d3_select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
83625                 var firstName = first.select('.entity-name');
83626                 var name = t('intro.graph.name.spring-street');
83627
83628                 if (!firstName.empty() && firstName.text() === name) {
83629                     reveal(first.node(),
83630                         t('intro.navigation.choose_street', { name: name }),
83631                         { duration: 300 }
83632                     );
83633
83634                     context.on('exit.intro', function() {
83635                         continueTo(selectedStreet);
83636                     });
83637
83638                     d3_select('.search-header input')
83639                         .on('keydown.intro', eventCancel, true)
83640                         .on('keyup.intro', null);
83641                 }
83642
83643                 function continueTo(nextStep) {
83644                     context.on('exit.intro', null);
83645                     d3_select('.search-header input')
83646                         .on('keydown.intro', null)
83647                         .on('keyup.intro', null);
83648                     nextStep();
83649                 }
83650             }
83651
83652
83653             function selectedStreet() {
83654                 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83655                     return searchStreet();
83656                 }
83657
83658                 var onClick = function() { continueTo(editorStreet); };
83659                 var entity = context.entity(springStreetEndId);
83660                 var box = pointBox(entity.loc, context);
83661                 box.height = 500;
83662
83663                 reveal(box,
83664                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83665                     { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
83666                 );
83667
83668                 timeout(function() {
83669                     context.map().on('move.intro drawn.intro', function() {
83670                         var entity = context.hasEntity(springStreetEndId);
83671                         if (!entity) return;
83672                         var box = pointBox(entity.loc, context);
83673                         box.height = 500;
83674                         reveal(box,
83675                             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83676                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83677                         );
83678                     });
83679                 }, 600);  // after reveal.
83680
83681                 context.on('enter.intro', function(mode) {
83682                     if (!context.hasEntity(springStreetId)) {
83683                         return continueTo(searchStreet);
83684                     }
83685                     var ids = context.selectedIDs();
83686                     if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
83687                         // keep Spring Street selected..
83688                         context.enter(modeSelect(context, [springStreetId]));
83689                     }
83690                 });
83691
83692                 context.history().on('change.intro', function() {
83693                     if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83694                         timeout(function() {
83695                             continueTo(searchStreet);
83696                         }, 300);  // after any transition (e.g. if user deleted intersection)
83697                     }
83698                 });
83699
83700                 function continueTo(nextStep) {
83701                     context.map().on('move.intro drawn.intro', null);
83702                     context.on('enter.intro', null);
83703                     context.history().on('change.intro', null);
83704                     nextStep();
83705                 }
83706             }
83707
83708
83709             function editorStreet() {
83710                 var selector = '.entity-editor-pane button.preset-close svg use';
83711                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83712
83713                 reveal('.entity-editor-pane',
83714                     t('intro.navigation.editor_street', {
83715                         button: icon(href, 'pre-text'),
83716                         field1: onewayField.label(),
83717                         field2: maxspeedField.label()
83718                     })
83719                 );
83720
83721                 context.on('exit.intro', function() {
83722                     continueTo(play);
83723                 });
83724
83725                 context.history().on('change.intro', function() {
83726                     // update the close icon in the tooltip if the user edits something.
83727                     var selector = '.entity-editor-pane button.preset-close svg use';
83728                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83729
83730                     reveal('.entity-editor-pane',
83731                         t('intro.navigation.editor_street', {
83732                             button: icon(href, 'pre-text'),
83733                             field1: onewayField.label().toLowerCase(),
83734                             field2: maxspeedField.label().toLowerCase()
83735                         }), { duration: 0 }
83736                     );
83737                 });
83738
83739                 function continueTo(nextStep) {
83740                     context.on('exit.intro', null);
83741                     context.history().on('change.intro', null);
83742                     nextStep();
83743                 }
83744             }
83745
83746
83747             function play() {
83748                 dispatch$1.call('done');
83749                 reveal('#id-container',
83750                     t('intro.navigation.play', { next: t('intro.points.title') }), {
83751                         tooltipBox: '.intro-nav-wrap .chapter-point',
83752                         buttonText: t('intro.ok'),
83753                         buttonCallback: function() { reveal('#id-container'); }
83754                     }
83755                 );
83756             }
83757
83758
83759             chapter.enter = function() {
83760                 dragMap();
83761             };
83762
83763
83764             chapter.exit = function() {
83765                 timeouts.forEach(window.clearTimeout);
83766                 context.on('enter.intro exit.intro', null);
83767                 context.map().on('move.intro drawn.intro', null);
83768                 context.history().on('change.intro', null);
83769                 d3_select('.inspector-wrap').on('wheel.intro', null);
83770                 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
83771             };
83772
83773
83774             chapter.restart = function() {
83775                 chapter.exit();
83776                 chapter.enter();
83777             };
83778
83779
83780             return utilRebind(chapter, dispatch$1, 'on');
83781         }
83782
83783         function uiIntroPoint(context, reveal) {
83784             var dispatch$1 = dispatch('done');
83785             var timeouts = [];
83786             var intersection = [-85.63279, 41.94394];
83787             var building = [-85.632422, 41.944045];
83788             var cafePreset = context.presets().item('amenity/cafe');
83789             var _pointID = null;
83790
83791
83792             var chapter = {
83793                 title: 'intro.points.title'
83794             };
83795
83796
83797             function timeout(f, t) {
83798                 timeouts.push(window.setTimeout(f, t));
83799             }
83800
83801
83802             function revealEditMenu(loc, text, options) {
83803                 var rect = context.surfaceRect();
83804                 var point = context.curtainProjection(loc);
83805                 var pad = 40;
83806                 var width = 250 + (2 * pad);
83807                 var height = 250;
83808                 var startX = rect.left + point[0];
83809                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
83810                 var box = {
83811                     left: left,
83812                     top: point[1] + rect.top - 60,
83813                     width: width,
83814                     height: height
83815                 };
83816                 reveal(box, text, options);
83817             }
83818
83819
83820             function eventCancel() {
83821                 event.stopPropagation();
83822                 event.preventDefault();
83823             }
83824
83825
83826             function addPoint() {
83827                 context.enter(modeBrowse(context));
83828                 context.history().reset('initial');
83829
83830                 var msec = transitionTime(intersection, context.map().center());
83831                 if (msec) { reveal(null, null, { duration: 0 }); }
83832                 context.map().centerZoomEase(intersection, 19, msec);
83833
83834                 timeout(function() {
83835                     var tooltip = reveal('button.add-point',
83836                         t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
83837
83838                     _pointID = null;
83839
83840                     tooltip.selectAll('.tooltip-inner')
83841                         .insert('svg', 'span')
83842                         .attr('class', 'tooltip-illustration')
83843                         .append('use')
83844                         .attr('xlink:href', '#iD-graphic-points');
83845
83846                     context.on('enter.intro', function(mode) {
83847                         if (mode.id !== 'add-point') return;
83848                         continueTo(placePoint);
83849                     });
83850                 }, msec + 100);
83851
83852                 function continueTo(nextStep) {
83853                     context.on('enter.intro', null);
83854                     nextStep();
83855                 }
83856             }
83857
83858
83859             function placePoint() {
83860                 if (context.mode().id !== 'add-point') {
83861                     return chapter.restart();
83862                 }
83863
83864                 var pointBox = pad$2(building, 150, context);
83865                 reveal(pointBox, t('intro.points.place_point'));
83866
83867                 context.map().on('move.intro drawn.intro', function() {
83868                     pointBox = pad$2(building, 150, context);
83869                     reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
83870                 });
83871
83872                 context.on('enter.intro', function(mode) {
83873                     if (mode.id !== 'select') return chapter.restart();
83874                     _pointID = context.mode().selectedIDs()[0];
83875                     continueTo(searchPreset);
83876                 });
83877
83878                 function continueTo(nextStep) {
83879                     context.map().on('move.intro drawn.intro', null);
83880                     context.on('enter.intro', null);
83881                     nextStep();
83882                 }
83883             }
83884
83885
83886             function searchPreset() {
83887                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83888                     return addPoint();
83889                 }
83890
83891                 // disallow scrolling
83892                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83893
83894                 d3_select('.preset-search-input')
83895                     .on('keydown.intro', null)
83896                     .on('keyup.intro', checkPresetSearch);
83897
83898                 reveal('.preset-search-input',
83899                     t('intro.points.search_cafe', { preset: cafePreset.name() })
83900                 );
83901
83902                 context.on('enter.intro', function(mode) {
83903                     if (!_pointID || !context.hasEntity(_pointID)) {
83904                         return continueTo(addPoint);
83905                     }
83906
83907                     var ids = context.selectedIDs();
83908                     if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
83909                         // keep the user's point selected..
83910                         context.enter(modeSelect(context, [_pointID]));
83911
83912                         // disallow scrolling
83913                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83914
83915                         d3_select('.preset-search-input')
83916                             .on('keydown.intro', null)
83917                             .on('keyup.intro', checkPresetSearch);
83918
83919                         reveal('.preset-search-input',
83920                             t('intro.points.search_cafe', { preset: cafePreset.name() })
83921                         );
83922
83923                         context.history().on('change.intro', null);
83924                     }
83925                 });
83926
83927
83928                 function checkPresetSearch() {
83929                     var first = d3_select('.preset-list-item:first-child');
83930
83931                     if (first.classed('preset-amenity-cafe')) {
83932                         d3_select('.preset-search-input')
83933                             .on('keydown.intro', eventCancel, true)
83934                             .on('keyup.intro', null);
83935
83936                         reveal(first.select('.preset-list-button').node(),
83937                             t('intro.points.choose_cafe', { preset: cafePreset.name() }),
83938                             { duration: 300 }
83939                         );
83940
83941                         context.history().on('change.intro', function() {
83942                             continueTo(aboutFeatureEditor);
83943                         });
83944                     }
83945                 }
83946
83947                 function continueTo(nextStep) {
83948                     context.on('enter.intro', null);
83949                     context.history().on('change.intro', null);
83950                     d3_select('.inspector-wrap').on('wheel.intro', null);
83951                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83952                     nextStep();
83953                 }
83954             }
83955
83956
83957             function aboutFeatureEditor() {
83958                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83959                     return addPoint();
83960                 }
83961
83962                 timeout(function() {
83963                     reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
83964                         tooltipClass: 'intro-points-describe',
83965                         buttonText: t('intro.ok'),
83966                         buttonCallback: function() { continueTo(addName); }
83967                     });
83968                 }, 400);
83969
83970                 context.on('exit.intro', function() {
83971                     // if user leaves select mode here, just continue with the tutorial.
83972                     continueTo(reselectPoint);
83973                 });
83974
83975                 function continueTo(nextStep) {
83976                     context.on('exit.intro', null);
83977                     nextStep();
83978                 }
83979             }
83980
83981
83982             function addName() {
83983                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83984                     return addPoint();
83985                 }
83986
83987                 // reset pane, in case user happened to change it..
83988                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83989
83990                 timeout(function() {
83991                     // It's possible for the user to add a name in a previous step..
83992                     // If so, don't tell them to add the name in this step.
83993                     // Give them an OK button instead.
83994                     var entity = context.entity(_pointID);
83995                     if (entity.tags.name) {
83996                         var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
83997                             tooltipClass: 'intro-points-describe',
83998                             buttonText: t('intro.ok'),
83999                             buttonCallback: function() { continueTo(addCloseEditor); }
84000                         });
84001                         tooltip.select('.instruction').style('display', 'none');
84002
84003                     } else {
84004                         reveal('.entity-editor-pane', t('intro.points.add_name'),
84005                             { tooltipClass: 'intro-points-describe' }
84006                         );
84007                     }
84008                 }, 400);
84009
84010                 context.history().on('change.intro', function() {
84011                     continueTo(addCloseEditor);
84012                 });
84013
84014                 context.on('exit.intro', function() {
84015                     // if user leaves select mode here, just continue with the tutorial.
84016                     continueTo(reselectPoint);
84017                 });
84018
84019                 function continueTo(nextStep) {
84020                     context.on('exit.intro', null);
84021                     context.history().on('change.intro', null);
84022                     nextStep();
84023                 }
84024             }
84025
84026
84027             function addCloseEditor() {
84028                 // reset pane, in case user happened to change it..
84029                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84030
84031                 var selector = '.entity-editor-pane button.preset-close svg use';
84032                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
84033
84034                 context.on('exit.intro', function() {
84035                     continueTo(reselectPoint);
84036                 });
84037
84038                 reveal('.entity-editor-pane',
84039                     t('intro.points.add_close', { button: icon(href, 'pre-text') })
84040                 );
84041
84042                 function continueTo(nextStep) {
84043                     context.on('exit.intro', null);
84044                     nextStep();
84045                 }
84046             }
84047
84048
84049             function reselectPoint() {
84050                 if (!_pointID) return chapter.restart();
84051                 var entity = context.hasEntity(_pointID);
84052                 if (!entity) return chapter.restart();
84053
84054                 // make sure it's still a cafe, in case user somehow changed it..
84055                 var oldPreset = context.presets().match(entity, context.graph());
84056                 context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
84057
84058                 context.enter(modeBrowse(context));
84059
84060                 var msec = transitionTime(entity.loc, context.map().center());
84061                 if (msec) { reveal(null, null, { duration: 0 }); }
84062                 context.map().centerEase(entity.loc, msec);
84063
84064                 timeout(function() {
84065                     var box = pointBox(entity.loc, context);
84066                     reveal(box, t('intro.points.reselect'), { duration: 600 });
84067
84068                     timeout(function() {
84069                         context.map().on('move.intro drawn.intro', function() {
84070                             var entity = context.hasEntity(_pointID);
84071                             if (!entity) return chapter.restart();
84072                             var box = pointBox(entity.loc, context);
84073                             reveal(box, t('intro.points.reselect'), { duration: 0 });
84074                         });
84075                     }, 600); // after reveal..
84076
84077                     context.on('enter.intro', function(mode) {
84078                         if (mode.id !== 'select') return;
84079                         continueTo(updatePoint);
84080                     });
84081
84082                 }, msec + 100);
84083
84084                 function continueTo(nextStep) {
84085                     context.map().on('move.intro drawn.intro', null);
84086                     context.on('enter.intro', null);
84087                     nextStep();
84088                 }
84089             }
84090
84091
84092             function updatePoint() {
84093                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
84094                     return continueTo(reselectPoint);
84095                 }
84096
84097                 // reset pane, in case user happened to untag the point..
84098                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84099
84100                 context.on('exit.intro', function() {
84101                     continueTo(reselectPoint);
84102                 });
84103
84104                 context.history().on('change.intro', function() {
84105                     continueTo(updateCloseEditor);
84106                 });
84107
84108                 timeout(function() {
84109                     reveal('.entity-editor-pane', t('intro.points.update'),
84110                         { tooltipClass: 'intro-points-describe' }
84111                     );
84112                 }, 400);
84113
84114                 function continueTo(nextStep) {
84115                     context.on('exit.intro', null);
84116                     context.history().on('change.intro', null);
84117                     nextStep();
84118                 }
84119             }
84120
84121
84122             function updateCloseEditor() {
84123                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
84124                     return continueTo(reselectPoint);
84125                 }
84126
84127                 // reset pane, in case user happened to change it..
84128                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84129
84130                 context.on('exit.intro', function() {
84131                     continueTo(rightClickPoint);
84132                 });
84133
84134                 timeout(function() {
84135                     reveal('.entity-editor-pane',
84136                         t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
84137                     );
84138                 }, 500);
84139
84140                 function continueTo(nextStep) {
84141                     context.on('exit.intro', null);
84142                     nextStep();
84143                 }
84144             }
84145
84146
84147             function rightClickPoint() {
84148                 if (!_pointID) return chapter.restart();
84149                 var entity = context.hasEntity(_pointID);
84150                 if (!entity) return chapter.restart();
84151
84152                 context.enter(modeBrowse(context));
84153
84154                 var box = pointBox(entity.loc, context);
84155                 reveal(box, t('intro.points.rightclick'), { duration: 600 });
84156
84157                 timeout(function() {
84158                     context.map().on('move.intro drawn.intro', function() {
84159                         var entity = context.hasEntity(_pointID);
84160                         if (!entity) return chapter.restart();
84161                         var box = pointBox(entity.loc, context);
84162                         reveal(box, t('intro.points.rightclick'), { duration: 0 });
84163                     });
84164                 }, 600); // after reveal
84165
84166                 context.on('enter.intro', function(mode) {
84167                     if (mode.id !== 'select') return;
84168                     var ids = context.selectedIDs();
84169                     if (ids.length !== 1 || ids[0] !== _pointID) return;
84170
84171                     timeout(function() {
84172                         var node = selectMenuItem('delete').node();
84173                         if (!node) return;
84174                         continueTo(enterDelete);
84175                     }, 300);  // after menu visible
84176                 });
84177
84178                 function continueTo(nextStep) {
84179                     context.on('enter.intro', null);
84180                     context.map().on('move.intro drawn.intro', null);
84181                     nextStep();
84182                 }
84183             }
84184
84185
84186             function enterDelete() {
84187                 if (!_pointID) return chapter.restart();
84188                 var entity = context.hasEntity(_pointID);
84189                 if (!entity) return chapter.restart();
84190
84191                 var node = selectMenuItem('delete').node();
84192                 if (!node) { return continueTo(rightClickPoint); }
84193
84194                 revealEditMenu(entity.loc,
84195                     t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
84196                 );
84197
84198                 timeout(function() {
84199                     context.map().on('move.intro drawn.intro', function() {
84200                         revealEditMenu(entity.loc,
84201                             t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
84202                             { duration: 0}
84203                         );
84204                     });
84205                 }, 300); // after menu visible
84206
84207                 context.on('exit.intro', function() {
84208                     if (!_pointID) return chapter.restart();
84209                     var entity = context.hasEntity(_pointID);
84210                     if (entity) return continueTo(rightClickPoint);  // point still exists
84211                 });
84212
84213                 context.history().on('change.intro', function(changed) {
84214                     if (changed.deleted().length) {
84215                         continueTo(undo);
84216                     }
84217                 });
84218
84219                 function continueTo(nextStep) {
84220                     context.map().on('move.intro drawn.intro', null);
84221                     context.history().on('change.intro', null);
84222                     context.on('exit.intro', null);
84223                     nextStep();
84224                 }
84225             }
84226
84227
84228             function undo() {
84229                 context.history().on('change.intro', function() {
84230                     continueTo(play);
84231                 });
84232
84233                 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
84234                 reveal('#bar button.undo-button',
84235                     t('intro.points.undo', { button: icon(iconName, 'pre-text') })
84236                 );
84237
84238                 function continueTo(nextStep) {
84239                     context.history().on('change.intro', null);
84240                     nextStep();
84241                 }
84242             }
84243
84244
84245             function play() {
84246                 dispatch$1.call('done');
84247                 reveal('#id-container',
84248                     t('intro.points.play', { next: t('intro.areas.title') }), {
84249                         tooltipBox: '.intro-nav-wrap .chapter-area',
84250                         buttonText: t('intro.ok'),
84251                         buttonCallback: function() { reveal('#id-container'); }
84252                     }
84253                 );
84254             }
84255
84256
84257             chapter.enter = function() {
84258                 addPoint();
84259             };
84260
84261
84262             chapter.exit = function() {
84263                 timeouts.forEach(window.clearTimeout);
84264                 context.on('enter.intro exit.intro', null);
84265                 context.map().on('move.intro drawn.intro', null);
84266                 context.history().on('change.intro', null);
84267                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84268                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84269             };
84270
84271
84272             chapter.restart = function() {
84273                 chapter.exit();
84274                 chapter.enter();
84275             };
84276
84277
84278             return utilRebind(chapter, dispatch$1, 'on');
84279         }
84280
84281         function uiIntroArea(context, reveal) {
84282             var dispatch$1 = dispatch('done');
84283             var playground = [-85.63552, 41.94159];
84284             var playgroundPreset = context.presets().item('leisure/playground');
84285             var descriptionField = context.presets().field('description');
84286             var timeouts = [];
84287             var _areaID;
84288
84289
84290             var chapter = {
84291                 title: 'intro.areas.title'
84292             };
84293
84294
84295             function timeout(f, t) {
84296                 timeouts.push(window.setTimeout(f, t));
84297             }
84298
84299
84300             function eventCancel() {
84301                 event.stopPropagation();
84302                 event.preventDefault();
84303             }
84304
84305
84306             function revealPlayground(center, text, options) {
84307                 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
84308                 var box = pad$2(center, padding, context);
84309                 reveal(box, text, options);
84310             }
84311
84312
84313             function addArea() {
84314                 context.enter(modeBrowse(context));
84315                 context.history().reset('initial');
84316                 _areaID = null;
84317
84318                 var msec = transitionTime(playground, context.map().center());
84319                 if (msec) { reveal(null, null, { duration: 0 }); }
84320                 context.map().centerZoomEase(playground, 19, msec);
84321
84322                 timeout(function() {
84323                     var tooltip = reveal('button.add-area',
84324                         t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
84325
84326                     tooltip.selectAll('.tooltip-inner')
84327                         .insert('svg', 'span')
84328                         .attr('class', 'tooltip-illustration')
84329                         .append('use')
84330                         .attr('xlink:href', '#iD-graphic-areas');
84331
84332                     context.on('enter.intro', function(mode) {
84333                         if (mode.id !== 'add-area') return;
84334                         continueTo(startPlayground);
84335                     });
84336                 }, msec + 100);
84337
84338                 function continueTo(nextStep) {
84339                     context.on('enter.intro', null);
84340                     nextStep();
84341                 }
84342             }
84343
84344
84345             function startPlayground() {
84346                 if (context.mode().id !== 'add-area') {
84347                     return chapter.restart();
84348                 }
84349
84350                 _areaID = null;
84351                 context.map().zoomEase(19.5, 500);
84352
84353                 timeout(function() {
84354                     revealPlayground(playground,
84355                         t('intro.areas.start_playground'), { duration: 250 }
84356                     );
84357
84358                     timeout(function() {
84359                         context.map().on('move.intro drawn.intro', function() {
84360                             revealPlayground(playground,
84361                                 t('intro.areas.start_playground'), { duration: 0 }
84362                             );
84363                         });
84364                         context.on('enter.intro', function(mode) {
84365                             if (mode.id !== 'draw-area') return chapter.restart();
84366                             continueTo(continuePlayground);
84367                         });
84368                     }, 250);  // after reveal
84369
84370                 }, 550);  // after easing
84371
84372                 function continueTo(nextStep) {
84373                     context.map().on('move.intro drawn.intro', null);
84374                     context.on('enter.intro', null);
84375                     nextStep();
84376                 }
84377             }
84378
84379
84380             function continuePlayground() {
84381                 if (context.mode().id !== 'draw-area') {
84382                     return chapter.restart();
84383                 }
84384
84385                 _areaID = null;
84386                 revealPlayground(playground,
84387                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84388                     { duration: 250 }
84389                 );
84390
84391                 timeout(function() {
84392                     context.map().on('move.intro drawn.intro', function() {
84393                         revealPlayground(playground,
84394                             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84395                             { duration: 0 }
84396                         );
84397                     });
84398                 }, 250);  // after reveal
84399
84400                 context.on('enter.intro', function(mode) {
84401                     if (mode.id === 'draw-area') {
84402                         var entity = context.hasEntity(context.selectedIDs()[0]);
84403                         if (entity && entity.nodes.length >= 6) {
84404                             return continueTo(finishPlayground);
84405                         } else {
84406                             return;
84407                         }
84408                     } else if (mode.id === 'select') {
84409                         _areaID = context.selectedIDs()[0];
84410                         return continueTo(searchPresets);
84411                     } else {
84412                         return chapter.restart();
84413                     }
84414                 });
84415
84416                 function continueTo(nextStep) {
84417                     context.map().on('move.intro drawn.intro', null);
84418                     context.on('enter.intro', null);
84419                     nextStep();
84420                 }
84421             }
84422
84423
84424             function finishPlayground() {
84425                 if (context.mode().id !== 'draw-area') {
84426                     return chapter.restart();
84427                 }
84428
84429                 _areaID = null;
84430                 revealPlayground(playground,
84431                     t('intro.areas.finish_playground'), { duration: 250 }
84432                 );
84433
84434                 timeout(function() {
84435                     context.map().on('move.intro drawn.intro', function() {
84436                         revealPlayground(playground,
84437                             t('intro.areas.finish_playground'), { duration: 0 }
84438                         );
84439                     });
84440                 }, 250);  // after reveal
84441
84442                 context.on('enter.intro', function(mode) {
84443                     if (mode.id === 'draw-area') {
84444                         return;
84445                     } else if (mode.id === 'select') {
84446                         _areaID = context.selectedIDs()[0];
84447                         return continueTo(searchPresets);
84448                     } else {
84449                         return chapter.restart();
84450                     }
84451                 });
84452
84453                 function continueTo(nextStep) {
84454                     context.map().on('move.intro drawn.intro', null);
84455                     context.on('enter.intro', null);
84456                     nextStep();
84457                 }
84458             }
84459
84460
84461             function searchPresets() {
84462                 if (!_areaID || !context.hasEntity(_areaID)) {
84463                     return addArea();
84464                 }
84465                 var ids = context.selectedIDs();
84466                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84467                     context.enter(modeSelect(context, [_areaID]));
84468                 }
84469
84470                 // disallow scrolling
84471                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84472
84473                 timeout(function() {
84474                     // reset pane, in case user somehow happened to change it..
84475                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84476
84477                     d3_select('.preset-search-input')
84478                         .on('keydown.intro', null)
84479                         .on('keyup.intro', checkPresetSearch);
84480
84481                     reveal('.preset-search-input',
84482                         t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84483                     );
84484                 }, 400);  // after preset list pane visible..
84485
84486                 context.on('enter.intro', function(mode) {
84487                     if (!_areaID || !context.hasEntity(_areaID)) {
84488                         return continueTo(addArea);
84489                     }
84490
84491                     var ids = context.selectedIDs();
84492                     if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
84493                         // keep the user's area selected..
84494                         context.enter(modeSelect(context, [_areaID]));
84495
84496                         // reset pane, in case user somehow happened to change it..
84497                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84498                         // disallow scrolling
84499                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84500
84501                         d3_select('.preset-search-input')
84502                             .on('keydown.intro', null)
84503                             .on('keyup.intro', checkPresetSearch);
84504
84505                         reveal('.preset-search-input',
84506                             t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84507                         );
84508
84509                         context.history().on('change.intro', null);
84510                     }
84511                 });
84512
84513                 function checkPresetSearch() {
84514                     var first = d3_select('.preset-list-item:first-child');
84515
84516                     if (first.classed('preset-leisure-playground')) {
84517                         reveal(first.select('.preset-list-button').node(),
84518                             t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
84519                             { duration: 300 }
84520                         );
84521
84522                         d3_select('.preset-search-input')
84523                             .on('keydown.intro', eventCancel, true)
84524                             .on('keyup.intro', null);
84525
84526                         context.history().on('change.intro', function() {
84527                             continueTo(clickAddField);
84528                         });
84529                     }
84530                 }
84531
84532                 function continueTo(nextStep) {
84533                     d3_select('.inspector-wrap').on('wheel.intro', null);
84534                     context.on('enter.intro', null);
84535                     context.history().on('change.intro', null);
84536                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84537                     nextStep();
84538                 }
84539             }
84540
84541
84542             function clickAddField() {
84543                 if (!_areaID || !context.hasEntity(_areaID)) {
84544                     return addArea();
84545                 }
84546                 var ids = context.selectedIDs();
84547                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84548                     return searchPresets();
84549                 }
84550
84551                 if (!d3_select('.form-field-description').empty()) {
84552                     return continueTo(describePlayground);
84553                 }
84554
84555                 // disallow scrolling
84556                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84557
84558                 timeout(function() {
84559                     // reset pane, in case user somehow happened to change it..
84560                     d3_select('.inspector-wrap .panewrap').style('right', '0%');
84561
84562                     // It's possible for the user to add a description in a previous step..
84563                     // If they did this already, just continue to next step.
84564                     var entity = context.entity(_areaID);
84565                     if (entity.tags.description) {
84566                         return continueTo(play);
84567                     }
84568
84569                     // scroll "Add field" into view
84570                     var box = d3_select('.more-fields').node().getBoundingClientRect();
84571                     if (box.top > 300) {
84572                         var pane = d3_select('.entity-editor-pane .inspector-body');
84573                         var start = pane.node().scrollTop;
84574                         var end = start + (box.top - 300);
84575
84576                         pane
84577                             .transition()
84578                             .duration(250)
84579                             .tween('scroll.inspector', function() {
84580                                 var node = this;
84581                                 var i = d3_interpolateNumber(start, end);
84582                                 return function(t) {
84583                                     node.scrollTop = i(t);
84584                                 };
84585                             });
84586                     }
84587
84588                     timeout(function() {
84589                         reveal('.more-fields .combobox-input',
84590                             t('intro.areas.add_field'),
84591                             { duration: 300 }
84592                         );
84593
84594                         d3_select('.more-fields .combobox-input')
84595                             .on('click.intro', function() {
84596                                 // Watch for the combobox to appear...
84597                                 var watcher;
84598                                 watcher = window.setInterval(function() {
84599                                     if (!d3_select('div.combobox').empty()) {
84600                                         window.clearInterval(watcher);
84601                                         continueTo(chooseDescriptionField);
84602                                     }
84603                                 }, 300);
84604                             });
84605                     }, 300);  // after "Add Field" visible
84606
84607                 }, 400);  // after editor pane visible
84608
84609                 context.on('exit.intro', function() {
84610                     return continueTo(searchPresets);
84611                 });
84612
84613                 function continueTo(nextStep) {
84614                     d3_select('.inspector-wrap').on('wheel.intro', null);
84615                     d3_select('.more-fields .combobox-input').on('click.intro', null);
84616                     context.on('exit.intro', null);
84617                     nextStep();
84618                 }
84619             }
84620
84621
84622             function chooseDescriptionField() {
84623                 if (!_areaID || !context.hasEntity(_areaID)) {
84624                     return addArea();
84625                 }
84626                 var ids = context.selectedIDs();
84627                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84628                     return searchPresets();
84629                 }
84630
84631                 if (!d3_select('.form-field-description').empty()) {
84632                     return continueTo(describePlayground);
84633                 }
84634
84635                 // Make sure combobox is ready..
84636                 if (d3_select('div.combobox').empty()) {
84637                     return continueTo(clickAddField);
84638                 }
84639                 // Watch for the combobox to go away..
84640                 var watcher;
84641                 watcher = window.setInterval(function() {
84642                     if (d3_select('div.combobox').empty()) {
84643                         window.clearInterval(watcher);
84644                         timeout(function() {
84645                             if (d3_select('.form-field-description').empty()) {
84646                                 continueTo(retryChooseDescription);
84647                             } else {
84648                                 continueTo(describePlayground);
84649                             }
84650                         }, 300);  // after description field added.
84651                     }
84652                 }, 300);
84653
84654                 reveal('div.combobox',
84655                     t('intro.areas.choose_field', { field: descriptionField.label() }),
84656                     { duration: 300 }
84657                 );
84658
84659                 context.on('exit.intro', function() {
84660                     return continueTo(searchPresets);
84661                 });
84662
84663                 function continueTo(nextStep) {
84664                     if (watcher) window.clearInterval(watcher);
84665                     context.on('exit.intro', null);
84666                     nextStep();
84667                 }
84668             }
84669
84670
84671             function describePlayground() {
84672                 if (!_areaID || !context.hasEntity(_areaID)) {
84673                     return addArea();
84674                 }
84675                 var ids = context.selectedIDs();
84676                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84677                     return searchPresets();
84678                 }
84679
84680                 // reset pane, in case user happened to change it..
84681                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84682
84683                 if (d3_select('.form-field-description').empty()) {
84684                     return continueTo(retryChooseDescription);
84685                 }
84686
84687                 context.on('exit.intro', function() {
84688                     continueTo(play);
84689                 });
84690
84691                 reveal('.entity-editor-pane',
84692                     t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
84693                     { duration: 300 }
84694                 );
84695
84696                 function continueTo(nextStep) {
84697                     context.on('exit.intro', null);
84698                     nextStep();
84699                 }
84700             }
84701
84702
84703             function retryChooseDescription() {
84704                 if (!_areaID || !context.hasEntity(_areaID)) {
84705                     return addArea();
84706                 }
84707                 var ids = context.selectedIDs();
84708                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84709                     return searchPresets();
84710                 }
84711
84712                 // reset pane, in case user happened to change it..
84713                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84714
84715                 reveal('.entity-editor-pane',
84716                     t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
84717                     buttonText: t('intro.ok'),
84718                     buttonCallback: function() { continueTo(clickAddField); }
84719                 });
84720
84721                 context.on('exit.intro', function() {
84722                     return continueTo(searchPresets);
84723                 });
84724
84725                 function continueTo(nextStep) {
84726                     context.on('exit.intro', null);
84727                     nextStep();
84728                 }
84729             }
84730
84731
84732             function play() {
84733                 dispatch$1.call('done');
84734                 reveal('#id-container',
84735                     t('intro.areas.play', { next: t('intro.lines.title') }), {
84736                         tooltipBox: '.intro-nav-wrap .chapter-line',
84737                         buttonText: t('intro.ok'),
84738                         buttonCallback: function() { reveal('#id-container'); }
84739                     }
84740                 );
84741             }
84742
84743
84744             chapter.enter = function() {
84745                 addArea();
84746             };
84747
84748
84749             chapter.exit = function() {
84750                 timeouts.forEach(window.clearTimeout);
84751                 context.on('enter.intro exit.intro', null);
84752                 context.map().on('move.intro drawn.intro', null);
84753                 context.history().on('change.intro', null);
84754                 d3_select('.inspector-wrap').on('wheel.intro', null);
84755                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84756                 d3_select('.more-fields .combobox-input').on('click.intro', null);
84757             };
84758
84759
84760             chapter.restart = function() {
84761                 chapter.exit();
84762                 chapter.enter();
84763             };
84764
84765
84766             return utilRebind(chapter, dispatch$1, 'on');
84767         }
84768
84769         function uiIntroLine(context, reveal) {
84770             var dispatch$1 = dispatch('done');
84771             var timeouts = [];
84772             var _tulipRoadID = null;
84773             var flowerRoadID = 'w646';
84774             var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
84775             var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
84776             var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
84777             var roadCategory = context.presets().item('category-road_minor');
84778             var residentialPreset = context.presets().item('highway/residential');
84779             var woodRoadID = 'w525';
84780             var woodRoadEndID = 'n2862';
84781             var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
84782             var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
84783             var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
84784             var washingtonStreetID = 'w522';
84785             var twelfthAvenueID = 'w1';
84786             var eleventhAvenueEndID = 'n3550';
84787             var twelfthAvenueEndID = 'n5';
84788             var _washingtonSegmentID = null;
84789             var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
84790             var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
84791             var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
84792             var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
84793
84794
84795             var chapter = {
84796                 title: 'intro.lines.title'
84797             };
84798
84799
84800             function timeout(f, t) {
84801                 timeouts.push(window.setTimeout(f, t));
84802             }
84803
84804
84805             function eventCancel() {
84806                 event.stopPropagation();
84807                 event.preventDefault();
84808             }
84809
84810
84811             function revealEditMenu(loc, text, options) {
84812                 var rect = context.surfaceRect();
84813                 var point = context.curtainProjection(loc);
84814                 var pad = 40;
84815                 var width = 250 + (2 * pad);
84816                 var height = 350;
84817                 var startX = rect.left + point[0];
84818                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
84819                 var box = {
84820                     left: left,
84821                     top: point[1] + rect.top - 60,
84822                     width: width,
84823                     height: height
84824                 };
84825                 reveal(box, text, options);
84826             }
84827
84828
84829             function addLine() {
84830                 context.enter(modeBrowse(context));
84831                 context.history().reset('initial');
84832
84833                 var msec = transitionTime(tulipRoadStart, context.map().center());
84834                 if (msec) { reveal(null, null, { duration: 0 }); }
84835                 context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
84836
84837                 timeout(function() {
84838                     var tooltip = reveal('button.add-line',
84839                         t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
84840
84841                     tooltip.selectAll('.tooltip-inner')
84842                         .insert('svg', 'span')
84843                         .attr('class', 'tooltip-illustration')
84844                         .append('use')
84845                         .attr('xlink:href', '#iD-graphic-lines');
84846
84847                     context.on('enter.intro', function(mode) {
84848                         if (mode.id !== 'add-line') return;
84849                         continueTo(startLine);
84850                     });
84851                 }, msec + 100);
84852
84853                 function continueTo(nextStep) {
84854                     context.on('enter.intro', null);
84855                     nextStep();
84856                 }
84857             }
84858
84859
84860             function startLine() {
84861                 if (context.mode().id !== 'add-line') return chapter.restart();
84862
84863                 _tulipRoadID = null;
84864
84865                 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
84866                 var box = pad$2(tulipRoadStart, padding, context);
84867                 box.height = box.height + 100;
84868                 reveal(box, t('intro.lines.start_line'));
84869
84870                 context.map().on('move.intro drawn.intro', function() {
84871                     padding = 70 * Math.pow(2, context.map().zoom() - 18);
84872                     box = pad$2(tulipRoadStart, padding, context);
84873                     box.height = box.height + 100;
84874                     reveal(box, t('intro.lines.start_line'), { duration: 0 });
84875                 });
84876
84877                 context.on('enter.intro', function(mode) {
84878                     if (mode.id !== 'draw-line') return chapter.restart();
84879                     continueTo(drawLine);
84880                 });
84881
84882                 function continueTo(nextStep) {
84883                     context.map().on('move.intro drawn.intro', null);
84884                     context.on('enter.intro', null);
84885                     nextStep();
84886                 }
84887             }
84888
84889
84890             function drawLine() {
84891                 if (context.mode().id !== 'draw-line') return chapter.restart();
84892
84893                 _tulipRoadID = context.mode().selectedIDs()[0];
84894                 context.map().centerEase(tulipRoadMidpoint, 500);
84895
84896                 timeout(function() {
84897                     var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84898                     var box = pad$2(tulipRoadMidpoint, padding, context);
84899                     box.height = box.height * 2;
84900                     reveal(box,
84901                         t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
84902                     );
84903
84904                     context.map().on('move.intro drawn.intro', function() {
84905                         padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84906                         box = pad$2(tulipRoadMidpoint, padding, context);
84907                         box.height = box.height * 2;
84908                         reveal(box,
84909                             t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
84910                             { duration: 0 }
84911                         );
84912                     });
84913                 }, 550);  // after easing..
84914
84915                 context.history().on('change.intro', function() {
84916                     if (isLineConnected()) {
84917                         continueTo(continueLine);
84918                     }
84919                 });
84920
84921                 context.on('enter.intro', function(mode) {
84922                     if (mode.id === 'draw-line') {
84923                         return;
84924                     } else if (mode.id === 'select') {
84925                         continueTo(retryIntersect);
84926                         return;
84927                     } else {
84928                         return chapter.restart();
84929                     }
84930                 });
84931
84932                 function continueTo(nextStep) {
84933                     context.map().on('move.intro drawn.intro', null);
84934                     context.history().on('change.intro', null);
84935                     context.on('enter.intro', null);
84936                     nextStep();
84937                 }
84938             }
84939
84940
84941             function isLineConnected() {
84942                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84943                 if (!entity) return false;
84944
84945                 var drawNodes = context.graph().childNodes(entity);
84946                 return drawNodes.some(function(node) {
84947                     return context.graph().parentWays(node).some(function(parent) {
84948                         return parent.id === flowerRoadID;
84949                     });
84950                 });
84951             }
84952
84953
84954             function retryIntersect() {
84955                 d3_select(window).on('mousedown.intro', eventCancel, true);
84956
84957                 var box = pad$2(tulipRoadIntersection, 80, context);
84958                 reveal(box,
84959                     t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
84960                 );
84961
84962                 timeout(chapter.restart, 3000);
84963             }
84964
84965
84966             function continueLine() {
84967                 if (context.mode().id !== 'draw-line') return chapter.restart();
84968                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84969                 if (!entity) return chapter.restart();
84970
84971                 context.map().centerEase(tulipRoadIntersection, 500);
84972
84973                 reveal('#surface', t('intro.lines.continue_line'));
84974
84975                 context.on('enter.intro', function(mode) {
84976                     if (mode.id === 'draw-line')
84977                         return;
84978                     else if (mode.id === 'select')
84979                         return continueTo(chooseCategoryRoad);
84980                     else
84981                         return chapter.restart();
84982                 });
84983
84984                 function continueTo(nextStep) {
84985                     context.on('enter.intro', null);
84986                     nextStep();
84987                 }
84988             }
84989
84990
84991             function chooseCategoryRoad() {
84992                 if (context.mode().id !== 'select') return chapter.restart();
84993
84994                 context.on('exit.intro', function() {
84995                     return chapter.restart();
84996                 });
84997
84998                 var button = d3_select('.preset-category-road_minor .preset-list-button');
84999                 if (button.empty()) return chapter.restart();
85000
85001                 // disallow scrolling
85002                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85003
85004                 timeout(function() {
85005                     // reset pane, in case user somehow happened to change it..
85006                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85007
85008                     reveal(button.node(),
85009                         t('intro.lines.choose_category_road', { category: roadCategory.name() })
85010                     );
85011
85012                     button.on('click.intro', function() {
85013                         continueTo(choosePresetResidential);
85014                     });
85015
85016                 }, 400);  // after editor pane visible
85017
85018                 function continueTo(nextStep) {
85019                     d3_select('.inspector-wrap').on('wheel.intro', null);
85020                     d3_select('.preset-list-button').on('click.intro', null);
85021                     context.on('exit.intro', null);
85022                     nextStep();
85023                 }
85024             }
85025
85026
85027             function choosePresetResidential() {
85028                 if (context.mode().id !== 'select') return chapter.restart();
85029
85030                 context.on('exit.intro', function() {
85031                     return chapter.restart();
85032                 });
85033
85034                 var subgrid = d3_select('.preset-category-road_minor .subgrid');
85035                 if (subgrid.empty()) return chapter.restart();
85036
85037                 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
85038                     .on('click.intro', function() {
85039                         continueTo(retryPresetResidential);
85040                     });
85041
85042                 subgrid.selectAll('.preset-highway-residential .preset-list-button')
85043                     .on('click.intro', function() {
85044                         continueTo(nameRoad);
85045                     });
85046
85047                 timeout(function() {
85048                     reveal(subgrid.node(),
85049                         t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
85050                         { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
85051                     );
85052                 }, 300);
85053
85054                 function continueTo(nextStep) {
85055                     d3_select('.preset-list-button').on('click.intro', null);
85056                     context.on('exit.intro', null);
85057                     nextStep();
85058                 }
85059             }
85060
85061
85062             // selected wrong road type
85063             function retryPresetResidential() {
85064                 if (context.mode().id !== 'select') return chapter.restart();
85065
85066                 context.on('exit.intro', function() {
85067                     return chapter.restart();
85068                 });
85069
85070                 // disallow scrolling
85071                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85072
85073                 timeout(function() {
85074                     var button = d3_select('.entity-editor-pane .preset-list-button');
85075
85076                     reveal(button.node(),
85077                         t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
85078                     );
85079
85080                     button.on('click.intro', function() {
85081                         continueTo(chooseCategoryRoad);
85082                     });
85083
85084                 }, 500);
85085
85086                 function continueTo(nextStep) {
85087                     d3_select('.inspector-wrap').on('wheel.intro', null);
85088                     d3_select('.preset-list-button').on('click.intro', null);
85089                     context.on('exit.intro', null);
85090                     nextStep();
85091                 }
85092             }
85093
85094
85095             function nameRoad() {
85096                 context.on('exit.intro', function() {
85097                     continueTo(didNameRoad);
85098                 });
85099
85100                 timeout(function() {
85101                     reveal('.entity-editor-pane',
85102                         t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
85103                         { tooltipClass: 'intro-lines-name_road' }
85104                     );
85105                 }, 500);
85106
85107                 function continueTo(nextStep) {
85108                     context.on('exit.intro', null);
85109                     nextStep();
85110                 }
85111             }
85112
85113
85114             function didNameRoad() {
85115                 context.history().checkpoint('doneAddLine');
85116
85117                 timeout(function() {
85118                     reveal('#surface', t('intro.lines.did_name_road'), {
85119                         buttonText: t('intro.ok'),
85120                         buttonCallback: function() { continueTo(updateLine); }
85121                     });
85122                 }, 500);
85123
85124                 function continueTo(nextStep) {
85125                     nextStep();
85126                 }
85127             }
85128
85129
85130             function updateLine() {
85131                 context.history().reset('doneAddLine');
85132                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85133                     return chapter.restart();
85134                 }
85135
85136                 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
85137                 if (msec) { reveal(null, null, { duration: 0 }); }
85138                 context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
85139
85140                 timeout(function() {
85141                     var padding = 250 * Math.pow(2, context.map().zoom() - 19);
85142                     var box = pad$2(woodRoadDragMidpoint, padding, context);
85143                     var advance = function() { continueTo(addNode); };
85144
85145                     reveal(box, t('intro.lines.update_line'),
85146                         { buttonText: t('intro.ok'), buttonCallback: advance }
85147                     );
85148
85149                     context.map().on('move.intro drawn.intro', function() {
85150                         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
85151                         var box = pad$2(woodRoadDragMidpoint, padding, context);
85152                         reveal(box, t('intro.lines.update_line'),
85153                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85154                         );
85155                     });
85156                 }, msec + 100);
85157
85158                 function continueTo(nextStep) {
85159                     context.map().on('move.intro drawn.intro', null);
85160                     nextStep();
85161                 }
85162             }
85163
85164
85165             function addNode() {
85166                 context.history().reset('doneAddLine');
85167                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85168                     return chapter.restart();
85169                 }
85170
85171                 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
85172                 var box = pad$2(woodRoadAddNode, padding, context);
85173                 reveal(box, t('intro.lines.add_node'));
85174
85175                 context.map().on('move.intro drawn.intro', function() {
85176                     var padding = 40 * Math.pow(2, context.map().zoom() - 19);
85177                     var box = pad$2(woodRoadAddNode, padding, context);
85178                     reveal(box, t('intro.lines.add_node'), { duration: 0 });
85179                 });
85180
85181                 context.history().on('change.intro', function(changed) {
85182                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85183                         return continueTo(updateLine);
85184                     }
85185                     if (changed.created().length === 1) {
85186                         timeout(function() { continueTo(startDragEndpoint); }, 500);
85187                     }
85188                 });
85189
85190                 context.on('enter.intro', function(mode) {
85191                     if (mode.id !== 'select') {
85192                         continueTo(updateLine);
85193                     }
85194                 });
85195
85196                 function continueTo(nextStep) {
85197                     context.map().on('move.intro drawn.intro', null);
85198                     context.history().on('change.intro', null);
85199                     context.on('enter.intro', null);
85200                     nextStep();
85201                 }
85202             }
85203
85204
85205             function startDragEndpoint() {
85206                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85207                     return continueTo(updateLine);
85208                 }
85209                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85210                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85211                 reveal(box, t('intro.lines.start_drag_endpoint'));
85212
85213                 context.map().on('move.intro drawn.intro', function() {
85214                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85215                         return continueTo(updateLine);
85216                     }
85217                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85218                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85219                     reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
85220
85221                     var entity = context.entity(woodRoadEndID);
85222                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
85223                         continueTo(finishDragEndpoint);
85224                     }
85225                 });
85226
85227                 function continueTo(nextStep) {
85228                     context.map().on('move.intro drawn.intro', null);
85229                     nextStep();
85230                 }
85231             }
85232
85233
85234             function finishDragEndpoint() {
85235                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85236                     return continueTo(updateLine);
85237                 }
85238
85239                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85240                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85241                 reveal(box, t('intro.lines.finish_drag_endpoint'));
85242
85243                 context.map().on('move.intro drawn.intro', function() {
85244                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85245                         return continueTo(updateLine);
85246                     }
85247                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85248                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85249                     reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
85250
85251                     var entity = context.entity(woodRoadEndID);
85252                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
85253                         continueTo(startDragEndpoint);
85254                     }
85255                 });
85256
85257                 context.on('enter.intro', function() {
85258                     continueTo(startDragMidpoint);
85259                 });
85260
85261                 function continueTo(nextStep) {
85262                     context.map().on('move.intro drawn.intro', null);
85263                     context.on('enter.intro', null);
85264                     nextStep();
85265                 }
85266             }
85267
85268
85269             function startDragMidpoint() {
85270                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85271                     return continueTo(updateLine);
85272                 }
85273                 if (context.selectedIDs().indexOf(woodRoadID) === -1) {
85274                     context.enter(modeSelect(context, [woodRoadID]));
85275                 }
85276
85277                 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85278                 var box = pad$2(woodRoadDragMidpoint, padding, context);
85279                 reveal(box, t('intro.lines.start_drag_midpoint'));
85280
85281                 context.map().on('move.intro drawn.intro', function() {
85282                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85283                         return continueTo(updateLine);
85284                     }
85285                     var padding = 80 * Math.pow(2, context.map().zoom() - 19);
85286                     var box = pad$2(woodRoadDragMidpoint, padding, context);
85287                     reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
85288                 });
85289
85290                 context.history().on('change.intro', function(changed) {
85291                     if (changed.created().length === 1) {
85292                         continueTo(continueDragMidpoint);
85293                     }
85294                 });
85295
85296                 context.on('enter.intro', function(mode) {
85297                     if (mode.id !== 'select') {
85298                         // keep Wood Road selected so midpoint triangles are drawn..
85299                         context.enter(modeSelect(context, [woodRoadID]));
85300                     }
85301                 });
85302
85303                 function continueTo(nextStep) {
85304                     context.map().on('move.intro drawn.intro', null);
85305                     context.history().on('change.intro', null);
85306                     context.on('enter.intro', null);
85307                     nextStep();
85308                 }
85309             }
85310
85311
85312             function continueDragMidpoint() {
85313                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85314                     return continueTo(updateLine);
85315                 }
85316
85317                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85318                 var box = pad$2(woodRoadDragEndpoint, padding, context);
85319                 box.height += 400;
85320
85321                 var advance = function() {
85322                     context.history().checkpoint('doneUpdateLine');
85323                     continueTo(deleteLines);
85324                 };
85325
85326                 reveal(box, t('intro.lines.continue_drag_midpoint'),
85327                     { buttonText: t('intro.ok'), buttonCallback: advance }
85328                 );
85329
85330                 context.map().on('move.intro drawn.intro', function() {
85331                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
85332                         return continueTo(updateLine);
85333                     }
85334                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
85335                     var box = pad$2(woodRoadDragEndpoint, padding, context);
85336                     box.height += 400;
85337                     reveal(box, t('intro.lines.continue_drag_midpoint'),
85338                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85339                     );
85340                 });
85341
85342                 function continueTo(nextStep) {
85343                     context.map().on('move.intro drawn.intro', null);
85344                     nextStep();
85345                 }
85346             }
85347
85348
85349             function deleteLines() {
85350                 context.history().reset('doneUpdateLine');
85351                 context.enter(modeBrowse(context));
85352
85353                 if (!context.hasEntity(washingtonStreetID) ||
85354                     !context.hasEntity(twelfthAvenueID) ||
85355                     !context.hasEntity(eleventhAvenueEndID)) {
85356                     return chapter.restart();
85357                 }
85358
85359                 var msec = transitionTime(deleteLinesLoc, context.map().center());
85360                 if (msec) { reveal(null, null, { duration: 0 }); }
85361                 context.map().centerZoomEase(deleteLinesLoc, 18, msec);
85362
85363                 timeout(function() {
85364                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85365                     var box = pad$2(deleteLinesLoc, padding, context);
85366                     box.top -= 200;
85367                     box.height += 400;
85368                     var advance = function() { continueTo(rightClickIntersection); };
85369
85370                     reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85371                         { buttonText: t('intro.ok'), buttonCallback: advance }
85372                     );
85373
85374                     context.map().on('move.intro drawn.intro', function() {
85375                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85376                         var box = pad$2(deleteLinesLoc, padding, context);
85377                         box.top -= 200;
85378                         box.height += 400;
85379                         reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85380                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85381                         );
85382                     });
85383
85384                     context.history().on('change.intro', function() {
85385                         timeout(function() {
85386                             continueTo(deleteLines);
85387                         }, 500);  // after any transition (e.g. if user deleted intersection)
85388                     });
85389
85390                 }, msec + 100);
85391
85392                 function continueTo(nextStep) {
85393                     context.map().on('move.intro drawn.intro', null);
85394                     context.history().on('change.intro', null);
85395                     nextStep();
85396                 }
85397             }
85398
85399
85400             function rightClickIntersection() {
85401                 context.history().reset('doneUpdateLine');
85402                 context.enter(modeBrowse(context));
85403
85404                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85405
85406                 timeout(function() {
85407                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85408                     var box = pad$2(eleventhAvenueEnd, padding, context);
85409                     reveal(box, t('intro.lines.rightclick_intersection',
85410                         { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
85411                     );
85412
85413                     context.map().on('move.intro drawn.intro', function() {
85414                         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85415                         var box = pad$2(eleventhAvenueEnd, padding, context);
85416                         reveal(box, t('intro.lines.rightclick_intersection',
85417                             { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
85418                             { duration: 0 }
85419                         );
85420                     });
85421
85422                     context.on('enter.intro', function(mode) {
85423                         if (mode.id !== 'select') return;
85424                         var ids = context.selectedIDs();
85425                         if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
85426
85427                         timeout(function() {
85428                             var node = selectMenuItem('split').node();
85429                             if (!node) return;
85430                             continueTo(splitIntersection);
85431                         }, 300);  // after menu visible
85432                     });
85433
85434                     context.history().on('change.intro', function() {
85435                         timeout(function() {
85436                             continueTo(deleteLines);
85437                         }, 300);  // after any transition (e.g. if user deleted intersection)
85438                     });
85439
85440                 }, 600);
85441
85442                 function continueTo(nextStep) {
85443                     context.map().on('move.intro drawn.intro', null);
85444                     context.on('enter.intro', null);
85445                     context.history().on('change.intro', null);
85446                     nextStep();
85447                 }
85448             }
85449
85450
85451             function splitIntersection() {
85452                 if (!context.hasEntity(washingtonStreetID) ||
85453                     !context.hasEntity(twelfthAvenueID) ||
85454                     !context.hasEntity(eleventhAvenueEndID)) {
85455                     return continueTo(deleteLines);
85456                 }
85457
85458                 var node = selectMenuItem('split').node();
85459                 if (!node) { return continueTo(rightClickIntersection); }
85460
85461                 var wasChanged = false;
85462                 var menuCoords = context.map().mouseCoordinates();
85463                 _washingtonSegmentID = null;
85464
85465                 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85466                     { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
85467                 );
85468
85469                 context.map().on('move.intro drawn.intro', function() {
85470                     var node = selectMenuItem('split').node();
85471                     if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
85472
85473                     revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85474                         { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
85475                         { duration: 0 }
85476                     );
85477                 });
85478
85479                 context.history().on('change.intro', function(changed) {
85480                     wasChanged = true;
85481                     timeout(function() {
85482                         if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
85483                             _washingtonSegmentID = changed.created()[0].id;
85484                             continueTo(didSplit);
85485                         } else {
85486                             _washingtonSegmentID = null;
85487                             continueTo(retrySplit);
85488                         }
85489                     }, 300);  // after any transition (e.g. if user deleted intersection)
85490                 });
85491
85492                 function continueTo(nextStep) {
85493                     context.map().on('move.intro drawn.intro', null);
85494                     context.history().on('change.intro', null);
85495                     nextStep();
85496                 }
85497             }
85498
85499
85500             function retrySplit() {
85501                 context.enter(modeBrowse(context));
85502                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85503                 var advance = function() { continueTo(rightClickIntersection); };
85504
85505                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85506                 var box = pad$2(eleventhAvenueEnd, padding, context);
85507                 reveal(box, t('intro.lines.retry_split'),
85508                     { buttonText: t('intro.ok'), buttonCallback: advance }
85509                 );
85510
85511                 context.map().on('move.intro drawn.intro', function() {
85512                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85513                     var box = pad$2(eleventhAvenueEnd, padding, context);
85514                     reveal(box, t('intro.lines.retry_split'),
85515                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85516                     );
85517                 });
85518
85519                 function continueTo(nextStep) {
85520                     context.map().on('move.intro drawn.intro', null);
85521                     nextStep();
85522                 }
85523             }
85524
85525
85526             function didSplit() {
85527                 if (!_washingtonSegmentID ||
85528                     !context.hasEntity(_washingtonSegmentID) ||
85529                     !context.hasEntity(washingtonStreetID) ||
85530                     !context.hasEntity(twelfthAvenueID) ||
85531                     !context.hasEntity(eleventhAvenueEndID)) {
85532                     return continueTo(rightClickIntersection);
85533                 }
85534
85535                 var ids = context.selectedIDs();
85536                 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
85537                 var street = t('intro.graph.name.washington-street');
85538
85539                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85540                 var box = pad$2(twelfthAvenue, padding, context);
85541                 box.width = box.width / 2;
85542                 reveal(box, t(string, { street1: street, street2: street }),
85543                     { duration: 500 }
85544                 );
85545
85546                 timeout(function() {
85547                     context.map().centerZoomEase(twelfthAvenue, 18, 500);
85548
85549                     context.map().on('move.intro drawn.intro', function() {
85550                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85551                         var box = pad$2(twelfthAvenue, padding, context);
85552                         box.width = box.width / 2;
85553                         reveal(box, t(string, { street1: street, street2: street }),
85554                             { duration: 0 }
85555                         );
85556                     });
85557                 }, 600);  // after initial reveal and curtain cut
85558
85559                 context.on('enter.intro', function() {
85560                     var ids = context.selectedIDs();
85561                     if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
85562                         continueTo(multiSelect);
85563                     }
85564                 });
85565
85566                 context.history().on('change.intro', function() {
85567                     if (!_washingtonSegmentID ||
85568                         !context.hasEntity(_washingtonSegmentID) ||
85569                         !context.hasEntity(washingtonStreetID) ||
85570                         !context.hasEntity(twelfthAvenueID) ||
85571                         !context.hasEntity(eleventhAvenueEndID)) {
85572                         return continueTo(rightClickIntersection);
85573                     }
85574                 });
85575
85576                 function continueTo(nextStep) {
85577                     context.map().on('move.intro drawn.intro', null);
85578                     context.on('enter.intro', null);
85579                     context.history().on('change.intro', null);
85580                     nextStep();
85581                 }
85582             }
85583
85584
85585             function multiSelect() {
85586                 if (!_washingtonSegmentID ||
85587                     !context.hasEntity(_washingtonSegmentID) ||
85588                     !context.hasEntity(washingtonStreetID) ||
85589                     !context.hasEntity(twelfthAvenueID) ||
85590                     !context.hasEntity(eleventhAvenueEndID)) {
85591                     return continueTo(rightClickIntersection);
85592                 }
85593
85594                 var ids = context.selectedIDs();
85595                 var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
85596                 var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
85597
85598                 if (hasWashington && hasTwelfth) {
85599                     return continueTo(multiRightClick);
85600                 } else if (!hasWashington && !hasTwelfth) {
85601                     return continueTo(didSplit);
85602                 }
85603
85604                 context.map().centerZoomEase(twelfthAvenue, 18, 500);
85605
85606                 timeout(function() {
85607                     var selected, other, padding, box;
85608                     if (hasWashington) {
85609                         selected = t('intro.graph.name.washington-street');
85610                         other = t('intro.graph.name.12th-avenue');
85611                         padding = 60 * Math.pow(2, context.map().zoom() - 18);
85612                         box = pad$2(twelfthAvenueEnd, padding, context);
85613                         box.width *= 3;
85614                     } else {
85615                         selected = t('intro.graph.name.12th-avenue');
85616                         other = t('intro.graph.name.washington-street');
85617                         padding = 200 * Math.pow(2, context.map().zoom() - 18);
85618                         box = pad$2(twelfthAvenue, padding, context);
85619                         box.width /= 2;
85620                     }
85621
85622                     reveal(box,
85623                         t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
85624                     );
85625
85626                     context.map().on('move.intro drawn.intro', function() {
85627                         if (hasWashington) {
85628                             selected = t('intro.graph.name.washington-street');
85629                             other = t('intro.graph.name.12th-avenue');
85630                             padding = 60 * Math.pow(2, context.map().zoom() - 18);
85631                             box = pad$2(twelfthAvenueEnd, padding, context);
85632                             box.width *= 3;
85633                         } else {
85634                             selected = t('intro.graph.name.12th-avenue');
85635                             other = t('intro.graph.name.washington-street');
85636                             padding = 200 * Math.pow(2, context.map().zoom() - 18);
85637                             box = pad$2(twelfthAvenue, padding, context);
85638                             box.width /= 2;
85639                         }
85640
85641                         reveal(box,
85642                             t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
85643                             { duration: 0 }
85644                         );
85645                     });
85646
85647                     context.on('enter.intro', function() {
85648                         continueTo(multiSelect);
85649                     });
85650
85651                     context.history().on('change.intro', function() {
85652                         if (!_washingtonSegmentID ||
85653                             !context.hasEntity(_washingtonSegmentID) ||
85654                             !context.hasEntity(washingtonStreetID) ||
85655                             !context.hasEntity(twelfthAvenueID) ||
85656                             !context.hasEntity(eleventhAvenueEndID)) {
85657                             return continueTo(rightClickIntersection);
85658                         }
85659                     });
85660                 }, 600);
85661
85662                 function continueTo(nextStep) {
85663                     context.map().on('move.intro drawn.intro', null);
85664                     context.on('enter.intro', null);
85665                     context.history().on('change.intro', null);
85666                     nextStep();
85667                 }
85668             }
85669
85670
85671             function multiRightClick() {
85672                 if (!_washingtonSegmentID ||
85673                     !context.hasEntity(_washingtonSegmentID) ||
85674                     !context.hasEntity(washingtonStreetID) ||
85675                     !context.hasEntity(twelfthAvenueID) ||
85676                     !context.hasEntity(eleventhAvenueEndID)) {
85677                     return continueTo(rightClickIntersection);
85678                 }
85679
85680                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85681                 var box = pad$2(twelfthAvenue, padding, context);
85682                 reveal(box, t('intro.lines.multi_rightclick'));
85683
85684                 context.map().on('move.intro drawn.intro', function() {
85685                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85686                     var box = pad$2(twelfthAvenue, padding, context);
85687                     reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
85688                 });
85689
85690                 d3_select(window).on('click.intro contextmenu.intro', function() {
85691                     timeout(function() {
85692                         var ids = context.selectedIDs();
85693                         if (ids.length === 2 &&
85694                             ids.indexOf(twelfthAvenueID) !== -1 &&
85695                             ids.indexOf(_washingtonSegmentID) !== -1) {
85696                                 var node = selectMenuItem('delete').node();
85697                                 if (!node) return;
85698                                 continueTo(multiDelete);
85699                         } else if (ids.length === 1 &&
85700                             ids.indexOf(_washingtonSegmentID) !== -1) {
85701                             return continueTo(multiSelect);
85702                         } else {
85703                             return continueTo(didSplit);
85704                         }
85705                     }, 300);  // after edit menu visible
85706                 }, true);
85707
85708                 context.history().on('change.intro', function() {
85709                     if (!_washingtonSegmentID ||
85710                         !context.hasEntity(_washingtonSegmentID) ||
85711                         !context.hasEntity(washingtonStreetID) ||
85712                         !context.hasEntity(twelfthAvenueID) ||
85713                         !context.hasEntity(eleventhAvenueEndID)) {
85714                         return continueTo(rightClickIntersection);
85715                     }
85716                 });
85717
85718                 function continueTo(nextStep) {
85719                     context.map().on('move.intro drawn.intro', null);
85720                     d3_select(window).on('click.intro contextmenu.intro', null, true);
85721                     context.history().on('change.intro', null);
85722                     nextStep();
85723                 }
85724             }
85725
85726
85727             function multiDelete() {
85728                 if (!_washingtonSegmentID ||
85729                     !context.hasEntity(_washingtonSegmentID) ||
85730                     !context.hasEntity(washingtonStreetID) ||
85731                     !context.hasEntity(twelfthAvenueID) ||
85732                     !context.hasEntity(eleventhAvenueEndID)) {
85733                     return continueTo(rightClickIntersection);
85734                 }
85735
85736                 var node = selectMenuItem('delete').node();
85737                 if (!node) return continueTo(multiRightClick);
85738
85739                 var menuCoords = context.map().mouseCoordinates();
85740                 revealEditMenu(menuCoords,
85741                     t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
85742                 );
85743
85744                 context.map().on('move.intro drawn.intro', function() {
85745                     revealEditMenu(menuCoords,
85746                         t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
85747                         { duration: 0 }
85748                     );
85749                 });
85750
85751                 context.on('exit.intro', function() {
85752                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85753                         return continueTo(multiSelect);  // left select mode but roads still exist
85754                     }
85755                 });
85756
85757                 context.history().on('change.intro', function() {
85758                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85759                         continueTo(retryDelete);         // changed something but roads still exist
85760                     } else {
85761                         continueTo(play);
85762                     }
85763                 });
85764
85765                 function continueTo(nextStep) {
85766                     context.map().on('move.intro drawn.intro', null);
85767                     context.on('exit.intro', null);
85768                     context.history().on('change.intro', null);
85769                     nextStep();
85770                 }
85771             }
85772
85773
85774             function retryDelete() {
85775                 context.enter(modeBrowse(context));
85776
85777                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85778                 var box = pad$2(twelfthAvenue, padding, context);
85779                 reveal(box, t('intro.lines.retry_delete'), {
85780                     buttonText: t('intro.ok'),
85781                     buttonCallback: function() { continueTo(multiSelect); }
85782                 });
85783
85784                 function continueTo(nextStep) {
85785                     nextStep();
85786                 }
85787             }
85788
85789
85790             function play() {
85791                 dispatch$1.call('done');
85792                 reveal('#id-container',
85793                     t('intro.lines.play', { next: t('intro.buildings.title') }), {
85794                         tooltipBox: '.intro-nav-wrap .chapter-building',
85795                         buttonText: t('intro.ok'),
85796                         buttonCallback: function() { reveal('#id-container'); }
85797                     }
85798                 );
85799            }
85800
85801
85802             chapter.enter = function() {
85803                 addLine();
85804             };
85805
85806
85807             chapter.exit = function() {
85808                 timeouts.forEach(window.clearTimeout);
85809                 d3_select(window).on('mousedown.intro', null, true);
85810                 context.on('enter.intro exit.intro', null);
85811                 context.map().on('move.intro drawn.intro', null);
85812                 context.history().on('change.intro', null);
85813                 d3_select('.inspector-wrap').on('wheel.intro', null);
85814                 d3_select('.preset-list-button').on('click.intro', null);
85815             };
85816
85817
85818             chapter.restart = function() {
85819                 chapter.exit();
85820                 chapter.enter();
85821             };
85822
85823
85824             return utilRebind(chapter, dispatch$1, 'on');
85825         }
85826
85827         function uiIntroBuilding(context, reveal) {
85828             var dispatch$1 = dispatch('done');
85829             var house = [-85.62815, 41.95638];
85830             var tank = [-85.62732, 41.95347];
85831             var buildingCatetory = context.presets().item('category-building');
85832             var housePreset = context.presets().item('building/house');
85833             var tankPreset = context.presets().item('man_made/storage_tank');
85834             var timeouts = [];
85835             var _houseID = null;
85836             var _tankID = null;
85837
85838
85839             var chapter = {
85840                 title: 'intro.buildings.title'
85841             };
85842
85843
85844             function timeout(f, t) {
85845                 timeouts.push(window.setTimeout(f, t));
85846             }
85847
85848
85849             function eventCancel() {
85850                 event.stopPropagation();
85851                 event.preventDefault();
85852             }
85853
85854
85855             function revealHouse(center, text, options) {
85856                 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
85857                 var box = pad$2(center, padding, context);
85858                 reveal(box, text, options);
85859             }
85860
85861
85862             function revealTank(center, text, options) {
85863                 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
85864                 var box = pad$2(center, padding, context);
85865                 reveal(box, text, options);
85866             }
85867
85868
85869             function revealEditMenu(loc, text, options) {
85870                 var rect = context.surfaceRect();
85871                 var point = context.curtainProjection(loc);
85872                 var pad = 40;
85873                 var width = 250 + (2 * pad);
85874                 var height = 350;
85875                 var startX = rect.left + point[0];
85876                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
85877                 var box = {
85878                     left: left,
85879                     top: point[1] + rect.top - 60,
85880                     width: width,
85881                     height: height
85882                 };
85883                 reveal(box, text, options);
85884             }
85885
85886
85887             function addHouse() {
85888                 context.enter(modeBrowse(context));
85889                 context.history().reset('initial');
85890                 _houseID = null;
85891
85892                 var msec = transitionTime(house, context.map().center());
85893                 if (msec) { reveal(null, null, { duration: 0 }); }
85894                 context.map().centerZoomEase(house, 19, msec);
85895
85896                 timeout(function() {
85897                     var tooltip = reveal('button.add-area',
85898                         t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
85899
85900                     tooltip.selectAll('.tooltip-inner')
85901                         .insert('svg', 'span')
85902                         .attr('class', 'tooltip-illustration')
85903                         .append('use')
85904                         .attr('xlink:href', '#iD-graphic-buildings');
85905
85906                     context.on('enter.intro', function(mode) {
85907                         if (mode.id !== 'add-area') return;
85908                         continueTo(startHouse);
85909                     });
85910                 }, msec + 100);
85911
85912                 function continueTo(nextStep) {
85913                     context.on('enter.intro', null);
85914                     nextStep();
85915                 }
85916             }
85917
85918
85919             function startHouse() {
85920                 if (context.mode().id !== 'add-area') {
85921                     return continueTo(addHouse);
85922                 }
85923
85924                 _houseID = null;
85925                 context.map().zoomEase(20, 500);
85926
85927                 timeout(function() {
85928                     revealHouse(house, t('intro.buildings.start_building'));
85929
85930                     context.map().on('move.intro drawn.intro', function() {
85931                         revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
85932                     });
85933
85934                     context.on('enter.intro', function(mode) {
85935                         if (mode.id !== 'draw-area') return chapter.restart();
85936                         continueTo(continueHouse);
85937                     });
85938
85939                 }, 550);  // after easing
85940
85941                 function continueTo(nextStep) {
85942                     context.map().on('move.intro drawn.intro', null);
85943                     context.on('enter.intro', null);
85944                     nextStep();
85945                 }
85946             }
85947
85948
85949             function continueHouse() {
85950                 if (context.mode().id !== 'draw-area') {
85951                     return continueTo(addHouse);
85952                 }
85953
85954                 _houseID = null;
85955
85956                 revealHouse(house, t('intro.buildings.continue_building'));
85957
85958                 context.map().on('move.intro drawn.intro', function() {
85959                     revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
85960                 });
85961
85962                 context.on('enter.intro', function(mode) {
85963                     if (mode.id === 'draw-area') {
85964                         return;
85965                     } else if (mode.id === 'select') {
85966                         var graph = context.graph();
85967                         var way = context.entity(context.selectedIDs()[0]);
85968                         var nodes = graph.childNodes(way);
85969                         var points = utilArrayUniq(nodes)
85970                             .map(function(n) { return context.projection(n.loc); });
85971
85972                         if (isMostlySquare(points)) {
85973                             _houseID = way.id;
85974                             return continueTo(chooseCategoryBuilding);
85975                         } else {
85976                             return continueTo(retryHouse);
85977                         }
85978
85979                     } else {
85980                         return chapter.restart();
85981                     }
85982                 });
85983
85984                 function continueTo(nextStep) {
85985                     context.map().on('move.intro drawn.intro', null);
85986                     context.on('enter.intro', null);
85987                     nextStep();
85988                 }
85989             }
85990
85991
85992             function retryHouse() {
85993                 var onClick = function() { continueTo(addHouse); };
85994
85995                 revealHouse(house, t('intro.buildings.retry_building'),
85996                     { buttonText: t('intro.ok'), buttonCallback: onClick }
85997                 );
85998
85999                 context.map().on('move.intro drawn.intro', function() {
86000                     revealHouse(house, t('intro.buildings.retry_building'),
86001                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
86002                     );
86003                 });
86004
86005                 function continueTo(nextStep) {
86006                     context.map().on('move.intro drawn.intro', null);
86007                     nextStep();
86008                 }
86009             }
86010
86011
86012             function chooseCategoryBuilding() {
86013                 if (!_houseID || !context.hasEntity(_houseID)) {
86014                     return addHouse();
86015                 }
86016                 var ids = context.selectedIDs();
86017                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
86018                     context.enter(modeSelect(context, [_houseID]));
86019                 }
86020
86021                 // disallow scrolling
86022                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86023
86024                 timeout(function() {
86025                     // reset pane, in case user somehow happened to change it..
86026                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86027
86028                     var button = d3_select('.preset-category-building .preset-list-button');
86029
86030                     reveal(button.node(),
86031                         t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
86032                     );
86033
86034                     button.on('click.intro', function() {
86035                         button.on('click.intro', null);
86036                         continueTo(choosePresetHouse);
86037                     });
86038
86039                 }, 400);  // after preset list pane visible..
86040
86041
86042                 context.on('enter.intro', function(mode) {
86043                     if (!_houseID || !context.hasEntity(_houseID)) {
86044                         return continueTo(addHouse);
86045                     }
86046                     var ids = context.selectedIDs();
86047                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
86048                         return continueTo(chooseCategoryBuilding);
86049                     }
86050                 });
86051
86052                 function continueTo(nextStep) {
86053                     d3_select('.inspector-wrap').on('wheel.intro', null);
86054                     d3_select('.preset-list-button').on('click.intro', null);
86055                     context.on('enter.intro', null);
86056                     nextStep();
86057                 }
86058             }
86059
86060
86061             function choosePresetHouse() {
86062                 if (!_houseID || !context.hasEntity(_houseID)) {
86063                     return addHouse();
86064                 }
86065                 var ids = context.selectedIDs();
86066                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
86067                     context.enter(modeSelect(context, [_houseID]));
86068                 }
86069
86070                 // disallow scrolling
86071                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86072
86073                 timeout(function() {
86074                     // reset pane, in case user somehow happened to change it..
86075                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86076
86077                     var button = d3_select('.preset-building-house .preset-list-button');
86078
86079                     reveal(button.node(),
86080                         t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
86081                         { duration: 300 }
86082                     );
86083
86084                     button.on('click.intro', function() {
86085                         button.on('click.intro', null);
86086                         continueTo(closeEditorHouse);
86087                     });
86088
86089                 }, 400);  // after preset list pane visible..
86090
86091                 context.on('enter.intro', function(mode) {
86092                     if (!_houseID || !context.hasEntity(_houseID)) {
86093                         return continueTo(addHouse);
86094                     }
86095                     var ids = context.selectedIDs();
86096                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
86097                         return continueTo(chooseCategoryBuilding);
86098                     }
86099                 });
86100
86101                 function continueTo(nextStep) {
86102                     d3_select('.inspector-wrap').on('wheel.intro', null);
86103                     d3_select('.preset-list-button').on('click.intro', null);
86104                     context.on('enter.intro', null);
86105                     nextStep();
86106                 }
86107             }
86108
86109
86110             function closeEditorHouse() {
86111                 if (!_houseID || !context.hasEntity(_houseID)) {
86112                     return addHouse();
86113                 }
86114                 var ids = context.selectedIDs();
86115                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
86116                     context.enter(modeSelect(context, [_houseID]));
86117                 }
86118
86119                 context.history().checkpoint('hasHouse');
86120
86121                 context.on('exit.intro', function() {
86122                     continueTo(rightClickHouse);
86123                 });
86124
86125                 timeout(function() {
86126                     reveal('.entity-editor-pane',
86127                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
86128                     );
86129                 }, 500);
86130
86131                 function continueTo(nextStep) {
86132                     context.on('exit.intro', null);
86133                     nextStep();
86134                 }
86135             }
86136
86137
86138             function rightClickHouse() {
86139                 if (!_houseID) return chapter.restart();
86140
86141                 context.enter(modeBrowse(context));
86142                 context.history().reset('hasHouse');
86143                 var zoom = context.map().zoom();
86144                 if (zoom < 20) {
86145                     zoom = 20;
86146                 }
86147                 context.map().centerZoomEase(house, zoom, 500);
86148
86149                 context.on('enter.intro', function(mode) {
86150                     if (mode.id !== 'select') return;
86151                     var ids = context.selectedIDs();
86152                     if (ids.length !== 1 || ids[0] !== _houseID) return;
86153
86154                     timeout(function() {
86155                         var node = selectMenuItem('orthogonalize').node();
86156                         if (!node) return;
86157                         continueTo(clickSquare);
86158                     }, 300);  // after menu visible
86159                 });
86160
86161                 context.map().on('move.intro drawn.intro', function() {
86162                     revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
86163                 });
86164
86165                 context.history().on('change.intro', function() {
86166                     continueTo(rightClickHouse);
86167                 });
86168
86169                 function continueTo(nextStep) {
86170                     context.on('enter.intro', null);
86171                     context.map().on('move.intro drawn.intro', null);
86172                     context.history().on('change.intro', null);
86173                     nextStep();
86174                 }
86175             }
86176
86177
86178             function clickSquare() {
86179                 if (!_houseID) return chapter.restart();
86180                 var entity = context.hasEntity(_houseID);
86181                 if (!entity) return continueTo(rightClickHouse);
86182
86183                 var node = selectMenuItem('orthogonalize').node();
86184                 if (!node) { return continueTo(rightClickHouse); }
86185
86186                 var wasChanged = false;
86187                 var menuCoords = context.map().mouseCoordinates();
86188
86189                 revealEditMenu(menuCoords,
86190                     t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
86191                 );
86192
86193                 context.on('enter.intro', function(mode) {
86194                     if (mode.id === 'browse') {
86195                         continueTo(rightClickHouse);
86196                     } else if (mode.id === 'move' || mode.id === 'rotate') {
86197                         continueTo(retryClickSquare);
86198                     }
86199                 });
86200
86201                 context.map().on('move.intro drawn.intro', function() {
86202                     var node = selectMenuItem('orthogonalize').node();
86203                     if (!wasChanged && !node) { return continueTo(rightClickHouse); }
86204
86205                     revealEditMenu(menuCoords,
86206                         t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
86207                         { duration: 0 }
86208                     );
86209                 });
86210
86211                 context.history().on('change.intro', function() {
86212                     wasChanged = true;
86213                     context.history().on('change.intro', null);
86214
86215                     // Something changed.  Wait for transition to complete and check undo annotation.
86216                     timeout(function() {
86217                         if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
86218                             continueTo(doneSquare);
86219                         } else {
86220                             continueTo(retryClickSquare);
86221                         }
86222                     }, 500);  // after transitioned actions
86223                 });
86224
86225                 function continueTo(nextStep) {
86226                     context.on('enter.intro', null);
86227                     context.map().on('move.intro drawn.intro', null);
86228                     context.history().on('change.intro', null);
86229                     nextStep();
86230                 }
86231             }
86232
86233
86234             function retryClickSquare() {
86235                 context.enter(modeBrowse(context));
86236
86237                 revealHouse(house, t('intro.buildings.retry_square'), {
86238                     buttonText: t('intro.ok'),
86239                     buttonCallback: function() { continueTo(rightClickHouse); }
86240                 });
86241
86242                 function continueTo(nextStep) {
86243                     nextStep();
86244                 }
86245             }
86246
86247
86248             function doneSquare() {
86249                 context.history().checkpoint('doneSquare');
86250
86251                 revealHouse(house, t('intro.buildings.done_square'), {
86252                     buttonText: t('intro.ok'),
86253                     buttonCallback: function() { continueTo(addTank); }
86254                 });
86255
86256                 function continueTo(nextStep) {
86257                     nextStep();
86258                 }
86259             }
86260
86261
86262             function addTank() {
86263                 context.enter(modeBrowse(context));
86264                 context.history().reset('doneSquare');
86265                 _tankID = null;
86266
86267                 var msec = transitionTime(tank, context.map().center());
86268                 if (msec) { reveal(null, null, { duration: 0 }); }
86269                 context.map().centerZoomEase(tank, 19.5, msec);
86270
86271                 timeout(function() {
86272                     reveal('button.add-area',
86273                         t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
86274                     );
86275
86276                     context.on('enter.intro', function(mode) {
86277                         if (mode.id !== 'add-area') return;
86278                         continueTo(startTank);
86279                     });
86280                 }, msec + 100);
86281
86282                 function continueTo(nextStep) {
86283                     context.on('enter.intro', null);
86284                     nextStep();
86285                 }
86286             }
86287
86288
86289             function startTank() {
86290                 if (context.mode().id !== 'add-area') {
86291                     return continueTo(addTank);
86292                 }
86293
86294                 _tankID = null;
86295
86296                 timeout(function() {
86297                     revealTank(tank, t('intro.buildings.start_tank'));
86298
86299                     context.map().on('move.intro drawn.intro', function() {
86300                         revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
86301                     });
86302
86303                     context.on('enter.intro', function(mode) {
86304                         if (mode.id !== 'draw-area') return chapter.restart();
86305                         continueTo(continueTank);
86306                     });
86307
86308                 }, 550);  // after easing
86309
86310                 function continueTo(nextStep) {
86311                     context.map().on('move.intro drawn.intro', null);
86312                     context.on('enter.intro', null);
86313                     nextStep();
86314                 }
86315             }
86316
86317
86318             function continueTank() {
86319                 if (context.mode().id !== 'draw-area') {
86320                     return continueTo(addTank);
86321                 }
86322
86323                 _tankID = null;
86324
86325                 revealTank(tank, t('intro.buildings.continue_tank'));
86326
86327                 context.map().on('move.intro drawn.intro', function() {
86328                     revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
86329                 });
86330
86331                 context.on('enter.intro', function(mode) {
86332                     if (mode.id === 'draw-area') {
86333                         return;
86334                     } else if (mode.id === 'select') {
86335                         _tankID = context.selectedIDs()[0];
86336                         return continueTo(searchPresetTank);
86337                     } else {
86338                         return continueTo(addTank);
86339                     }
86340                 });
86341
86342                 function continueTo(nextStep) {
86343                     context.map().on('move.intro drawn.intro', null);
86344                     context.on('enter.intro', null);
86345                     nextStep();
86346                 }
86347             }
86348
86349
86350             function searchPresetTank() {
86351                 if (!_tankID || !context.hasEntity(_tankID)) {
86352                     return addTank();
86353                 }
86354                 var ids = context.selectedIDs();
86355                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86356                     context.enter(modeSelect(context, [_tankID]));
86357                 }
86358
86359                 // disallow scrolling
86360                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86361
86362                 timeout(function() {
86363                     // reset pane, in case user somehow happened to change it..
86364                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86365
86366                     d3_select('.preset-search-input')
86367                         .on('keydown.intro', null)
86368                         .on('keyup.intro', checkPresetSearch);
86369
86370                     reveal('.preset-search-input',
86371                         t('intro.buildings.search_tank', { preset: tankPreset.name() })
86372                     );
86373                 }, 400);  // after preset list pane visible..
86374
86375                 context.on('enter.intro', function(mode) {
86376                     if (!_tankID || !context.hasEntity(_tankID)) {
86377                         return continueTo(addTank);
86378                     }
86379
86380                     var ids = context.selectedIDs();
86381                     if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
86382                         // keep the user's area selected..
86383                         context.enter(modeSelect(context, [_tankID]));
86384
86385                         // reset pane, in case user somehow happened to change it..
86386                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86387                         // disallow scrolling
86388                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86389
86390                         d3_select('.preset-search-input')
86391                             .on('keydown.intro', null)
86392                             .on('keyup.intro', checkPresetSearch);
86393
86394                         reveal('.preset-search-input',
86395                             t('intro.buildings.search_tank', { preset: tankPreset.name() })
86396                         );
86397
86398                         context.history().on('change.intro', null);
86399                     }
86400                 });
86401
86402                 function checkPresetSearch() {
86403                     var first = d3_select('.preset-list-item:first-child');
86404
86405                     if (first.classed('preset-man_made-storage_tank')) {
86406                         reveal(first.select('.preset-list-button').node(),
86407                             t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
86408                             { duration: 300 }
86409                         );
86410
86411                         d3_select('.preset-search-input')
86412                             .on('keydown.intro', eventCancel, true)
86413                             .on('keyup.intro', null);
86414
86415                         context.history().on('change.intro', function() {
86416                             continueTo(closeEditorTank);
86417                         });
86418                     }
86419                 }
86420
86421                 function continueTo(nextStep) {
86422                     d3_select('.inspector-wrap').on('wheel.intro', null);
86423                     context.on('enter.intro', null);
86424                     context.history().on('change.intro', null);
86425                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86426                     nextStep();
86427                 }
86428             }
86429
86430
86431             function closeEditorTank() {
86432                 if (!_tankID || !context.hasEntity(_tankID)) {
86433                     return addTank();
86434                 }
86435                 var ids = context.selectedIDs();
86436                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86437                     context.enter(modeSelect(context, [_tankID]));
86438                 }
86439
86440                 context.history().checkpoint('hasTank');
86441
86442                 context.on('exit.intro', function() {
86443                     continueTo(rightClickTank);
86444                 });
86445
86446                 timeout(function() {
86447                     reveal('.entity-editor-pane',
86448                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
86449                     );
86450                 }, 500);
86451
86452                 function continueTo(nextStep) {
86453                     context.on('exit.intro', null);
86454                     nextStep();
86455                 }
86456             }
86457
86458
86459             function rightClickTank() {
86460                 if (!_tankID) return continueTo(addTank);
86461
86462                 context.enter(modeBrowse(context));
86463                 context.history().reset('hasTank');
86464                 context.map().centerEase(tank, 500);
86465
86466                 timeout(function() {
86467                     context.on('enter.intro', function(mode) {
86468                         if (mode.id !== 'select') return;
86469                         var ids = context.selectedIDs();
86470                         if (ids.length !== 1 || ids[0] !== _tankID) return;
86471
86472                         timeout(function() {
86473                             var node = selectMenuItem('circularize').node();
86474                             if (!node) return;
86475                             continueTo(clickCircle);
86476                         }, 300);  // after menu visible
86477                     });
86478
86479                     revealTank(tank, t('intro.buildings.rightclick_tank'));
86480
86481                     context.map().on('move.intro drawn.intro', function() {
86482                         revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
86483                     });
86484
86485                     context.history().on('change.intro', function() {
86486                         continueTo(rightClickTank);
86487                     });
86488
86489                 }, 600);
86490
86491                 function continueTo(nextStep) {
86492                     context.on('enter.intro', null);
86493                     context.map().on('move.intro drawn.intro', null);
86494                     context.history().on('change.intro', null);
86495                     nextStep();
86496                 }
86497             }
86498
86499
86500             function clickCircle() {
86501                 if (!_tankID) return chapter.restart();
86502                 var entity = context.hasEntity(_tankID);
86503                 if (!entity) return continueTo(rightClickTank);
86504
86505                 var node = selectMenuItem('circularize').node();
86506                 if (!node) { return continueTo(rightClickTank); }
86507
86508                 var wasChanged = false;
86509                 var menuCoords = context.map().mouseCoordinates();
86510
86511                 revealEditMenu(menuCoords,
86512                     t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
86513                 );
86514
86515                 context.on('enter.intro', function(mode) {
86516                     if (mode.id === 'browse') {
86517                         continueTo(rightClickTank);
86518                     } else if (mode.id === 'move' || mode.id === 'rotate') {
86519                         continueTo(retryClickCircle);
86520                     }
86521                 });
86522
86523                 context.map().on('move.intro drawn.intro', function() {
86524                     var node = selectMenuItem('circularize').node();
86525                     if (!wasChanged && !node) { return continueTo(rightClickTank); }
86526
86527                     revealEditMenu(menuCoords,
86528                         t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
86529                         { duration: 0 }
86530                     );
86531                 });
86532
86533                 context.history().on('change.intro', function() {
86534                     wasChanged = true;
86535                     context.history().on('change.intro', null);
86536
86537                     // Something changed.  Wait for transition to complete and check undo annotation.
86538                     timeout(function() {
86539                         if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
86540                             continueTo(play);
86541                         } else {
86542                             continueTo(retryClickCircle);
86543                         }
86544                     }, 500);  // after transitioned actions
86545                 });
86546
86547                 function continueTo(nextStep) {
86548                     context.on('enter.intro', null);
86549                     context.map().on('move.intro drawn.intro', null);
86550                     context.history().on('change.intro', null);
86551                     nextStep();
86552                 }
86553             }
86554
86555
86556             function retryClickCircle() {
86557                 context.enter(modeBrowse(context));
86558
86559                 revealTank(tank, t('intro.buildings.retry_circle'), {
86560                     buttonText: t('intro.ok'),
86561                     buttonCallback: function() { continueTo(rightClickTank); }
86562                 });
86563
86564                 function continueTo(nextStep) {
86565                     nextStep();
86566                 }
86567             }
86568
86569
86570             function play() {
86571                 dispatch$1.call('done');
86572                 reveal('#id-container',
86573                     t('intro.buildings.play', { next: t('intro.startediting.title') }), {
86574                         tooltipBox: '.intro-nav-wrap .chapter-startEditing',
86575                         buttonText: t('intro.ok'),
86576                         buttonCallback: function() { reveal('#id-container'); }
86577                     }
86578                 );
86579             }
86580
86581
86582             chapter.enter = function() {
86583                 addHouse();
86584             };
86585
86586
86587             chapter.exit = function() {
86588                 timeouts.forEach(window.clearTimeout);
86589                 context.on('enter.intro exit.intro', null);
86590                 context.map().on('move.intro drawn.intro', null);
86591                 context.history().on('change.intro', null);
86592                 d3_select('.inspector-wrap').on('wheel.intro', null);
86593                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86594                 d3_select('.more-fields .combobox-input').on('click.intro', null);
86595             };
86596
86597
86598             chapter.restart = function() {
86599                 chapter.exit();
86600                 chapter.enter();
86601             };
86602
86603
86604             return utilRebind(chapter, dispatch$1, 'on');
86605         }
86606
86607         function uiIntroStartEditing(context, reveal) {
86608             var dispatch$1 = dispatch('done', 'startEditing');
86609             var modalSelection = d3_select(null);
86610
86611
86612             var chapter = {
86613                 title: 'intro.startediting.title'
86614             };
86615
86616             function showHelp() {
86617                 reveal('.map-control.help-control',
86618                     t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
86619                         buttonText: t('intro.ok'),
86620                         buttonCallback: function() { shortcuts(); }
86621                     }
86622                 );
86623             }
86624
86625             function shortcuts() {
86626                 reveal('.map-control.help-control',
86627                     t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
86628                         buttonText: t('intro.ok'),
86629                         buttonCallback: function() { showSave(); }
86630                     }
86631                 );
86632             }
86633
86634             function showSave() {
86635                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86636                 reveal('#bar button.save',
86637                     t('intro.startediting.save'), {
86638                         buttonText: t('intro.ok'),
86639                         buttonCallback: function() { showStart(); }
86640                     }
86641                 );
86642             }
86643
86644             function showStart() {
86645                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86646
86647                 modalSelection = uiModal(context.container());
86648
86649                 modalSelection.select('.modal')
86650                     .attr('class', 'modal-splash modal col6');
86651
86652                 modalSelection.selectAll('.close').remove();
86653
86654                 var startbutton = modalSelection.select('.content')
86655                     .attr('class', 'fillL')
86656                     .append('button')
86657                         .attr('class', 'modal-section huge-modal-button')
86658                         .on('click', function() {
86659                             modalSelection.remove();
86660                         });
86661
86662                     startbutton
86663                         .append('svg')
86664                         .attr('class', 'illustration')
86665                         .append('use')
86666                         .attr('xlink:href', '#iD-logo-walkthrough');
86667
86668                     startbutton
86669                         .append('h2')
86670                         .text(t('intro.startediting.start'));
86671
86672                 dispatch$1.call('startEditing');
86673             }
86674
86675
86676             chapter.enter = function() {
86677                 showHelp();
86678             };
86679
86680
86681             chapter.exit = function() {
86682                 modalSelection.remove();
86683                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86684             };
86685
86686
86687             return utilRebind(chapter, dispatch$1, 'on');
86688         }
86689
86690         var chapterUi = {
86691             welcome: uiIntroWelcome,
86692             navigation: uiIntroNavigation,
86693             point: uiIntroPoint,
86694             area: uiIntroArea,
86695             line: uiIntroLine,
86696             building: uiIntroBuilding,
86697             startEditing: uiIntroStartEditing
86698         };
86699
86700         var chapterFlow = [
86701             'welcome',
86702             'navigation',
86703             'point',
86704             'area',
86705             'line',
86706             'building',
86707             'startEditing'
86708         ];
86709
86710
86711         function uiIntro(context) {
86712             var INTRO_IMAGERY = 'EsriWorldImageryClarity';
86713             var introGraph = {};
86714             var _currChapter;
86715
86716             // create entities for intro graph and localize names
86717             for (var id in dataIntroGraph) {
86718                 introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
86719             }
86720
86721
86722             function intro(selection) {
86723                 context.enter(modeBrowse(context));
86724
86725                 // Save current map state
86726                 var osm = context.connection();
86727                 var history = context.history().toJSON();
86728                 var hash = window.location.hash;
86729                 var center = context.map().center();
86730                 var zoom = context.map().zoom();
86731                 var background = context.background().baseLayerSource();
86732                 var overlays = context.background().overlayLayerSources();
86733                 var opacity = d3_selectAll('#map .layer-background').style('opacity');
86734                 var caches = osm && osm.caches();
86735                 var baseEntities = context.history().graph().base().entities;
86736                 var countryCode = services$1.geocoder.countryCode;
86737
86738                 // Show sidebar and disable the sidebar resizing button
86739                 // (this needs to be before `context.inIntro(true)`)
86740                 context.ui().sidebar.expand();
86741                 d3_selectAll('button.sidebar-toggle').classed('disabled', true);
86742
86743                 // Block saving
86744                 context.inIntro(true);
86745
86746                 // Load semi-real data used in intro
86747                 if (osm) { osm.toggle(false).reset(); }
86748                 context.history().reset();
86749                 context.history().merge(Object.values(coreGraph().load(introGraph).entities));
86750                 context.history().checkpoint('initial');
86751
86752                 // Setup imagery
86753                 var imagery = context.background().findSource(INTRO_IMAGERY);
86754                 if (imagery) {
86755                     context.background().baseLayerSource(imagery);
86756                 } else {
86757                     context.background().bing();
86758                 }
86759                 overlays.forEach(function(d) {
86760                     context.background().toggleOverlayLayer(d);
86761                 });
86762
86763                 // Setup data layers (only OSM)
86764                 var layers = context.layers();
86765                 layers.all().forEach(function(item) {
86766                     // if the layer has the function `enabled`
86767                     if (typeof item.layer.enabled === 'function') {
86768                         item.layer.enabled(item.id === 'osm');
86769                     }
86770                 });
86771
86772                 // Mock geocoder
86773                 services$1.geocoder.countryCode = function(location, callback) {
86774                     callback(null, t('intro.graph.countrycode'));
86775                 };
86776
86777
86778                 d3_selectAll('#map .layer-background').style('opacity', 1);
86779
86780                 var curtain = uiCurtain();
86781                 selection.call(curtain);
86782
86783                 // Store that the user started the walkthrough..
86784                 context.storage('walkthrough_started', 'yes');
86785
86786                 // Restore previous walkthrough progress..
86787                 var storedProgress = context.storage('walkthrough_progress') || '';
86788                 var progress = storedProgress.split(';').filter(Boolean);
86789
86790                 var chapters = chapterFlow.map(function(chapter, i) {
86791                     var s = chapterUi[chapter](context, curtain.reveal)
86792                         .on('done', function() {
86793                             context.presets().init();  // clear away "recent" presets
86794
86795                             buttons.filter(function(d) {
86796                                 return d.title === s.title;
86797                             }).classed('finished', true);
86798
86799                             if (i < chapterFlow.length - 1) {
86800                                 var next = chapterFlow[i + 1];
86801                                 d3_select('button.chapter-' + next)
86802                                     .classed('next', true);
86803                             }
86804
86805                             // Store walkthrough progress..
86806                             progress.push(chapter);
86807                             context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86808                         });
86809                     return s;
86810                 });
86811
86812                 chapters[chapters.length - 1].on('startEditing', function() {
86813                     // Store walkthrough progress..
86814                     progress.push('startEditing');
86815                     context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86816
86817                     // Store if walkthrough is completed..
86818                     var incomplete = utilArrayDifference(chapterFlow, progress);
86819                     if (!incomplete.length) {
86820                         context.storage('walkthrough_completed', 'yes');
86821                     }
86822
86823                     curtain.remove();
86824                     navwrap.remove();
86825                     d3_selectAll('#map .layer-background').style('opacity', opacity);
86826                     d3_selectAll('button.sidebar-toggle').classed('disabled', false);
86827                     if (osm) { osm.toggle(true).reset().caches(caches); }
86828                     context.history().reset().merge(Object.values(baseEntities));
86829                     context.background().baseLayerSource(background);
86830                     overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
86831                     if (history) { context.history().fromJSON(history, false); }
86832                     context.map().centerZoom(center, zoom);
86833                     window.location.replace(hash);
86834                     services$1.geocoder.countryCode = countryCode;
86835                     context.inIntro(false);
86836                 });
86837
86838                 var navwrap = selection
86839                     .append('div')
86840                     .attr('class', 'intro-nav-wrap fillD');
86841
86842                 navwrap
86843                     .append('svg')
86844                     .attr('class', 'intro-nav-wrap-logo')
86845                     .append('use')
86846                     .attr('xlink:href', '#iD-logo-walkthrough');
86847
86848                 var buttonwrap = navwrap
86849                     .append('div')
86850                     .attr('class', 'joined')
86851                     .selectAll('button.chapter');
86852
86853                 var buttons = buttonwrap
86854                     .data(chapters)
86855                     .enter()
86856                     .append('button')
86857                     .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
86858                     .on('click', enterChapter);
86859
86860                 buttons
86861                     .append('span')
86862                     .text(function(d) { return t(d.title); });
86863
86864                 buttons
86865                     .append('span')
86866                     .attr('class', 'status')
86867                     .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86868
86869                 enterChapter(chapters[0]);
86870
86871
86872                 function enterChapter(newChapter) {
86873                     if (_currChapter) { _currChapter.exit(); }
86874                     context.enter(modeBrowse(context));
86875
86876                     _currChapter = newChapter;
86877                     _currChapter.enter();
86878
86879                     buttons
86880                         .classed('next', false)
86881                         .classed('active', function(d) {
86882                             return d.title === _currChapter.title;
86883                         });
86884                 }
86885             }
86886
86887
86888             return intro;
86889         }
86890
86891         function uiShortcuts(context) {
86892             var detected = utilDetect();
86893             var _activeTab = 0;
86894             var _modalSelection;
86895             var _selection = d3_select(null);
86896
86897
86898             context.keybinding()
86899                 .on([t('shortcuts.toggle.key'), '?'], function () {
86900                     if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
86901                         if (_modalSelection) {
86902                             _modalSelection.close();
86903                             _modalSelection = null;
86904                         }
86905                     } else {
86906                         _modalSelection = uiModal(_selection);
86907                         shortcutsModal(_modalSelection);
86908                     }
86909                 });
86910
86911
86912             function shortcutsModal(_modalSelection) {
86913                 _modalSelection.select('.modal')
86914                     .classed('modal-shortcuts', true);
86915
86916                 var shortcutsModal = _modalSelection.select('.content');
86917
86918                 shortcutsModal
86919                     .append('div')
86920                     .attr('class', 'modal-section')
86921                     .append('h3')
86922                     .text(t('shortcuts.title'));
86923
86924                 shortcutsModal
86925                     .call(render);
86926             }
86927
86928
86929             function render(selection) {
86930                 var wrapper = selection
86931                     .selectAll('.wrapper')
86932                     .data([0]);
86933
86934                 var wrapperEnter = wrapper
86935                     .enter()
86936                     .append('div')
86937                     .attr('class', 'wrapper modal-section');
86938
86939                 var tabsBar = wrapperEnter
86940                     .append('div')
86941                     .attr('class', 'tabs-bar');
86942
86943                 var shortcutsList = wrapperEnter
86944                     .append('div')
86945                     .attr('class', 'shortcuts-list');
86946
86947                 wrapper = wrapper.merge(wrapperEnter);
86948
86949                 var tabs = tabsBar
86950                     .selectAll('.tab')
86951                     .data(dataShortcuts);
86952
86953                 var tabsEnter = tabs
86954                     .enter()
86955                     .append('div')
86956                     .attr('class', 'tab')
86957                     .on('click', function (d, i) {
86958                         _activeTab = i;
86959                         render(selection);
86960                     });
86961
86962                 tabsEnter
86963                     .append('span')
86964                     .text(function (d) { return t(d.text); });
86965
86966                 tabs = tabs
86967                     .merge(tabsEnter);
86968
86969                 // Update
86970                 wrapper.selectAll('.tab')
86971                     .classed('active', function (d, i) {
86972                         return i === _activeTab;
86973                     });
86974
86975
86976                 var shortcuts = shortcutsList
86977                     .selectAll('.shortcut-tab')
86978                     .data(dataShortcuts);
86979
86980                 var shortcutsEnter = shortcuts
86981                     .enter()
86982                     .append('div')
86983                     .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
86984
86985                 var columnsEnter = shortcutsEnter
86986                     .selectAll('.shortcut-column')
86987                     .data(function (d) { return d.columns; })
86988                     .enter()
86989                     .append('table')
86990                     .attr('class', 'shortcut-column');
86991
86992                 var rowsEnter = columnsEnter
86993                     .selectAll('.shortcut-row')
86994                     .data(function (d) { return d.rows; })
86995                     .enter()
86996                     .append('tr')
86997                     .attr('class', 'shortcut-row');
86998
86999
87000                 var sectionRows = rowsEnter
87001                     .filter(function (d) { return !d.shortcuts; });
87002
87003                 sectionRows
87004                     .append('td');
87005
87006                 sectionRows
87007                     .append('td')
87008                     .attr('class', 'shortcut-section')
87009                     .append('h3')
87010                     .text(function (d) { return t(d.text); });
87011
87012
87013                 var shortcutRows = rowsEnter
87014                     .filter(function (d) { return d.shortcuts; });
87015
87016                 var shortcutKeys = shortcutRows
87017                     .append('td')
87018                     .attr('class', 'shortcut-keys');
87019
87020                 var modifierKeys = shortcutKeys
87021                     .filter(function (d) { return d.modifiers; });
87022
87023                 modifierKeys
87024                     .selectAll('kbd.modifier')
87025                     .data(function (d) {
87026                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
87027                             return ['⌘'];
87028                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
87029                             return [];
87030                         } else {
87031                             return d.modifiers;
87032                         }
87033                     })
87034                     .enter()
87035                     .each(function () {
87036                         var selection = d3_select(this);
87037
87038                         selection
87039                             .append('kbd')
87040                             .attr('class', 'modifier')
87041                             .text(function (d) { return uiCmd.display(d); });
87042
87043                         selection
87044                             .append('span')
87045                             .text('+');
87046                     });
87047
87048
87049                 shortcutKeys
87050                     .selectAll('kbd.shortcut')
87051                     .data(function (d) {
87052                         var arr = d.shortcuts;
87053                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
87054                             arr = ['Y'];
87055                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
87056                             arr = ['F11'];
87057                         }
87058
87059                         // replace translations
87060                         arr = arr.map(function(s) {
87061                             return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
87062                         });
87063
87064                         return utilArrayUniq(arr).map(function(s) {
87065                             return {
87066                                 shortcut: s,
87067                                 separator: d.separator,
87068                                 suffix: d.suffix
87069                             };
87070                         });
87071                     })
87072                     .enter()
87073                     .each(function (d, i, nodes) {
87074                         var selection = d3_select(this);
87075                         var click = d.shortcut.toLowerCase().match(/(.*).click/);
87076
87077                         if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
87078                             selection
87079                                 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
87080                         } else {
87081                             selection
87082                                 .append('kbd')
87083                                 .attr('class', 'shortcut')
87084                                 .text(function (d) { return d.shortcut; });
87085                         }
87086
87087                         if (i < nodes.length - 1) {
87088                             selection
87089                                 .append('span')
87090                                 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
87091                         } else if (i === nodes.length - 1 && d.suffix) {
87092                             selection
87093                                 .append('span')
87094                                 .text(d.suffix);
87095                         }
87096                     });
87097
87098
87099                 shortcutKeys
87100                     .filter(function(d) { return d.gesture; })
87101                     .each(function () {
87102                         var selection = d3_select(this);
87103
87104                         selection
87105                             .append('span')
87106                             .text('+');
87107
87108                         selection
87109                             .append('span')
87110                             .attr('class', 'gesture')
87111                             .text(function (d) { return t(d.gesture); });
87112                     });
87113
87114
87115                 shortcutRows
87116                     .append('td')
87117                     .attr('class', 'shortcut-desc')
87118                     .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
87119
87120
87121                 shortcuts = shortcuts
87122                     .merge(shortcutsEnter);
87123
87124                 // Update
87125                 wrapper.selectAll('.shortcut-tab')
87126                     .style('display', function (d, i) {
87127                         return i === _activeTab ? 'flex' : 'none';
87128                     });
87129             }
87130
87131
87132             return function(selection, show) {
87133                 _selection = selection;
87134                 if (show) {
87135                     _modalSelection = uiModal(selection);
87136                     shortcutsModal(_modalSelection);
87137                 }
87138             };
87139         }
87140
87141         function uiHelp(context) {
87142             var key = t('help.key');
87143
87144             var _pane = d3_select(null), _toggleButton = d3_select(null);
87145
87146             var docKeys = [
87147                 ['help', [
87148                     'welcome',
87149                     'open_data_h',
87150                     'open_data',
87151                     'before_start_h',
87152                     'before_start',
87153                     'open_source_h',
87154                     'open_source',
87155                     'open_source_help'
87156                 ]],
87157                 ['overview', [
87158                     'navigation_h',
87159                     'navigation_drag',
87160                     'navigation_zoom',
87161                     'features_h',
87162                     'features',
87163                     'nodes_ways'
87164                 ]],
87165                 ['editing', [
87166                     'select_h',
87167                     'select_left_click',
87168                     'select_right_click',
87169                     'multiselect_h',
87170                     'multiselect_shift_click',
87171                     'multiselect_lasso',
87172                     'undo_redo_h',
87173                     'undo_redo',
87174                     'save_h',
87175                     'save',
87176                     'save_validation',
87177                     'upload_h',
87178                     'upload',
87179                     'backups_h',
87180                     'backups',
87181                     'keyboard_h',
87182                     'keyboard'
87183                 ]],
87184                 ['feature_editor', [
87185                     'intro',
87186                     'definitions',
87187                     'type_h',
87188                     'type',
87189                     'type_picker',
87190                     'fields_h',
87191                     'fields_all_fields',
87192                     'fields_example',
87193                     'fields_add_field',
87194                     'tags_h',
87195                     'tags_all_tags',
87196                     'tags_resources'
87197                 ]],
87198                 ['points', [
87199                     'intro',
87200                     'add_point_h',
87201                     'add_point',
87202                     'add_point_finish',
87203                     'move_point_h',
87204                     'move_point',
87205                     'delete_point_h',
87206                     'delete_point',
87207                     'delete_point_command'
87208                 ]],
87209                 ['lines', [
87210                     'intro',
87211                     'add_line_h',
87212                     'add_line',
87213                     'add_line_draw',
87214                     'add_line_finish',
87215                     'modify_line_h',
87216                     'modify_line_dragnode',
87217                     'modify_line_addnode',
87218                     'connect_line_h',
87219                     'connect_line',
87220                     'connect_line_display',
87221                     'connect_line_drag',
87222                     'connect_line_tag',
87223                     'disconnect_line_h',
87224                     'disconnect_line_command',
87225                     'move_line_h',
87226                     'move_line_command',
87227                     'move_line_connected',
87228                     'delete_line_h',
87229                     'delete_line',
87230                     'delete_line_command'
87231                 ]],
87232                 ['areas', [
87233                     'intro',
87234                     'point_or_area_h',
87235                     'point_or_area',
87236                     'add_area_h',
87237                     'add_area_command',
87238                     'add_area_draw',
87239                     'add_area_finish',
87240                     'square_area_h',
87241                     'square_area_command',
87242                     'modify_area_h',
87243                     'modify_area_dragnode',
87244                     'modify_area_addnode',
87245                     'delete_area_h',
87246                     'delete_area',
87247                     'delete_area_command'
87248                 ]],
87249                 ['relations', [
87250                     'intro',
87251                     'edit_relation_h',
87252                     'edit_relation',
87253                     'edit_relation_add',
87254                     'edit_relation_delete',
87255                     'maintain_relation_h',
87256                     'maintain_relation',
87257                     'relation_types_h',
87258                     'multipolygon_h',
87259                     'multipolygon',
87260                     'multipolygon_create',
87261                     'multipolygon_merge',
87262                     'turn_restriction_h',
87263                     'turn_restriction',
87264                     'turn_restriction_field',
87265                     'turn_restriction_editing',
87266                     'route_h',
87267                     'route',
87268                     'route_add',
87269                     'boundary_h',
87270                     'boundary',
87271                     'boundary_add'
87272                 ]],
87273                 ['notes', [
87274                     'intro',
87275                     'add_note_h',
87276                     'add_note',
87277                     'move_note',
87278                     'update_note_h',
87279                     'update_note',
87280                     'save_note_h',
87281                     'save_note'
87282                 ]],
87283
87284                 ['imagery', [
87285                     'intro',
87286                     'sources_h',
87287                     'choosing',
87288                     'sources',
87289                     'offsets_h',
87290                     'offset',
87291                     'offset_change'
87292                 ]],
87293                 ['streetlevel', [
87294                     'intro',
87295                     'using_h',
87296                     'using',
87297                     'photos',
87298                     'viewer'
87299                 ]],
87300                 ['gps', [
87301                     'intro',
87302                     'survey',
87303                     'using_h',
87304                     'using',
87305                     'tracing',
87306                     'upload'
87307                 ]],
87308                 ['qa', [
87309                     'intro',
87310                     'tools_h',
87311                     'tools',
87312                     'issues_h',
87313                     'issues'
87314                 ]]
87315             ];
87316
87317             var headings = {
87318                 'help.help.open_data_h': 3,
87319                 'help.help.before_start_h': 3,
87320                 'help.help.open_source_h': 3,
87321                 'help.overview.navigation_h': 3,
87322                 'help.overview.features_h': 3,
87323                 'help.editing.select_h': 3,
87324                 'help.editing.multiselect_h': 3,
87325                 'help.editing.undo_redo_h': 3,
87326                 'help.editing.save_h': 3,
87327                 'help.editing.upload_h': 3,
87328                 'help.editing.backups_h': 3,
87329                 'help.editing.keyboard_h': 3,
87330                 'help.feature_editor.type_h': 3,
87331                 'help.feature_editor.fields_h': 3,
87332                 'help.feature_editor.tags_h': 3,
87333                 'help.points.add_point_h': 3,
87334                 'help.points.move_point_h': 3,
87335                 'help.points.delete_point_h': 3,
87336                 'help.lines.add_line_h': 3,
87337                 'help.lines.modify_line_h': 3,
87338                 'help.lines.connect_line_h': 3,
87339                 'help.lines.disconnect_line_h': 3,
87340                 'help.lines.move_line_h': 3,
87341                 'help.lines.delete_line_h': 3,
87342                 'help.areas.point_or_area_h': 3,
87343                 'help.areas.add_area_h': 3,
87344                 'help.areas.square_area_h': 3,
87345                 'help.areas.modify_area_h': 3,
87346                 'help.areas.delete_area_h': 3,
87347                 'help.relations.edit_relation_h': 3,
87348                 'help.relations.maintain_relation_h': 3,
87349                 'help.relations.relation_types_h': 2,
87350                 'help.relations.multipolygon_h': 3,
87351                 'help.relations.turn_restriction_h': 3,
87352                 'help.relations.route_h': 3,
87353                 'help.relations.boundary_h': 3,
87354                 'help.notes.add_note_h': 3,
87355                 'help.notes.update_note_h': 3,
87356                 'help.notes.save_note_h': 3,
87357                 'help.imagery.sources_h': 3,
87358                 'help.imagery.offsets_h': 3,
87359                 'help.streetlevel.using_h': 3,
87360                 'help.gps.using_h': 3,
87361                 'help.qa.tools_h': 3,
87362                 'help.qa.issues_h': 3
87363             };
87364
87365             var replacements = {
87366                 point: icon('#iD-icon-point', 'pre-text'),
87367                 line: icon('#iD-icon-line', 'pre-text'),
87368                 area: icon('#iD-icon-area', 'pre-text'),
87369                 note: icon('#iD-icon-note', 'pre-text add-note'),
87370                 plus: icon('#iD-icon-plus', 'pre-text'),
87371                 minus: icon('#iD-icon-minus', 'pre-text'),
87372                 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
87373                 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
87374                 layers: icon('#iD-icon-layers', 'pre-text'),
87375                 data: icon('#iD-icon-data', 'pre-text'),
87376                 inspect: icon('#iD-icon-inspect', 'pre-text'),
87377                 move: icon('#iD-operation-move', 'pre-text'),
87378                 merge: icon('#iD-operation-merge', 'pre-text'),
87379                 delete: icon('#iD-operation-delete', 'pre-text'),
87380                 close: icon('#iD-icon-close', 'pre-text'),
87381                 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
87382                 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
87383                 save: icon('#iD-icon-save', 'pre-text'),
87384                 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
87385                 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
87386                 shift: uiCmd.display('⇧'),
87387                 alt: uiCmd.display('⌥'),
87388                 return: uiCmd.display('↵'),
87389                 version: context.version
87390             };
87391
87392             // For each section, squash all the texts into a single markdown document
87393             var docs = docKeys.map(function(key) {
87394                 var helpkey = 'help.' + key[0];
87395                 var text = key[1].reduce(function(all, part) {
87396                     var subkey = helpkey + '.' + part;
87397                     var depth = headings[subkey];                              // is this subkey a heading?
87398                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
87399                     return all + hhh + t(subkey, replacements) + '\n\n';
87400                 }, '');
87401
87402                 return {
87403                     title: t(helpkey + '.title'),
87404                     html: marked(text.trim())
87405                 };
87406             });
87407
87408             var paneTooltip = tooltip()
87409                 .placement((textDirection === 'rtl') ? 'right' : 'left')
87410                 .html(true)
87411                 .title(uiTooltipHtml(t('help.title'), key));
87412
87413             function hidePane() {
87414                 context.ui().togglePanes();
87415             }
87416
87417             uiHelp.togglePane = function() {
87418                 if (event) event.preventDefault();
87419                 paneTooltip.hide(_toggleButton);
87420                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
87421             };
87422
87423             uiHelp.renderToggleButton = function(selection) {
87424
87425                 _toggleButton = selection.append('button')
87426                     .attr('tabindex', -1)
87427                     .on('click', uiHelp.togglePane)
87428                     .call(svgIcon('#iD-icon-help', 'light'))
87429                     .call(paneTooltip);
87430             };
87431
87432
87433             uiHelp.renderPane = function(selection) {
87434
87435                 function clickHelp(d, i) {
87436                     var rtl = (textDirection === 'rtl');
87437                     content.property('scrollTop', 0);
87438                     doctitle.html(d.title);
87439
87440                     body.html(d.html);
87441                     body.selectAll('a')
87442                         .attr('target', '_blank');
87443                     menuItems.classed('selected', function(m) {
87444                         return m.title === d.title;
87445                     });
87446
87447                     nav.html('');
87448                     if (rtl) {
87449                         nav.call(drawNext).call(drawPrevious);
87450                     } else {
87451                         nav.call(drawPrevious).call(drawNext);
87452                     }
87453
87454
87455                     function drawNext(selection) {
87456                         if (i < docs.length - 1) {
87457                             var nextLink = selection
87458                                 .append('a')
87459                                 .attr('class', 'next')
87460                                 .on('click', function() {
87461                                     clickHelp(docs[i + 1], i + 1);
87462                                 });
87463
87464                             nextLink
87465                                 .append('span')
87466                                 .text(docs[i + 1].title)
87467                                 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
87468                         }
87469                     }
87470
87471
87472                     function drawPrevious(selection) {
87473                         if (i > 0) {
87474                             var prevLink = selection
87475                                 .append('a')
87476                                 .attr('class', 'previous')
87477                                 .on('click', function() {
87478                                     clickHelp(docs[i - 1], i - 1);
87479                                 });
87480
87481                             prevLink
87482                                 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
87483                                 .append('span')
87484                                 .text(docs[i - 1].title);
87485                         }
87486                     }
87487                 }
87488
87489
87490                 function clickWalkthrough() {
87491                     if (context.inIntro()) return;
87492                     context.container().call(uiIntro(context));
87493                     context.ui().togglePanes();
87494                 }
87495
87496
87497                 function clickShortcuts() {
87498                     context.container().call(uiShortcuts(context), true);
87499                 }
87500
87501
87502                 _pane = selection.append('div')
87503                     .attr('class', 'help-wrap map-pane fillL hide')
87504                     .attr('pane', 'help');
87505
87506                 var heading = _pane
87507                     .append('div')
87508                     .attr('class', 'pane-heading');
87509
87510                 var doctitle = heading
87511                     .append('h2')
87512                     .text(t('help.title'));
87513
87514                 heading
87515                     .append('button')
87516                     .on('click', hidePane)
87517                     .call(svgIcon('#iD-icon-close'));
87518
87519
87520                 var content = _pane
87521                     .append('div')
87522                     .attr('class', 'pane-content');
87523
87524                 var toc = content
87525                     .append('ul')
87526                     .attr('class', 'toc');
87527
87528                 var menuItems = toc.selectAll('li')
87529                     .data(docs)
87530                     .enter()
87531                     .append('li')
87532                     .append('a')
87533                     .html(function(d) { return d.title; })
87534                     .on('click', clickHelp);
87535
87536                 var shortcuts = toc
87537                     .append('li')
87538                     .attr('class', 'shortcuts')
87539                     .call(tooltip()
87540                         .html(true)
87541                         .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
87542                         .placement('top')
87543                     )
87544                     .append('a')
87545                     .on('click', clickShortcuts);
87546
87547                 shortcuts
87548                     .append('div')
87549                     .text(t('shortcuts.title'));
87550
87551                 var walkthrough = toc
87552                     .append('li')
87553                     .attr('class', 'walkthrough')
87554                     .append('a')
87555                     .on('click', clickWalkthrough);
87556
87557                 walkthrough
87558                     .append('svg')
87559                     .attr('class', 'logo logo-walkthrough')
87560                     .append('use')
87561                     .attr('xlink:href', '#iD-logo-walkthrough');
87562
87563                 walkthrough
87564                     .append('div')
87565                     .text(t('splash.walkthrough'));
87566
87567
87568                 var helpContent = content
87569                     .append('div')
87570                     .attr('class', 'left-content');
87571
87572                 var body = helpContent
87573                     .append('div')
87574                     .attr('class', 'body');
87575
87576                 var nav = helpContent
87577                     .append('div')
87578                     .attr('class', 'nav');
87579
87580                 clickHelp(docs[0], 0);
87581
87582                 context.keybinding()
87583                     .on(key, uiHelp.togglePane);
87584
87585             };
87586
87587             return uiHelp;
87588         }
87589
87590         function uiPanelBackground(context) {
87591             var background = context.background();
87592             var currSourceName = null;
87593             var metadata = {};
87594             var metadataKeys = [
87595                 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
87596             ];
87597
87598             var debouncedRedraw = debounce(redraw, 250);
87599
87600             function redraw(selection) {
87601                 var source = background.baseLayerSource();
87602                 var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
87603
87604                 if (currSourceName !== source.name()) {
87605                     currSourceName = source.name();
87606                     metadata = {};
87607                 }
87608
87609                 selection.html('');
87610
87611                 var list = selection
87612                     .append('ul')
87613                     .attr('class', 'background-info');
87614
87615                 list
87616                     .append('li')
87617                     .text(currSourceName);
87618
87619                 metadataKeys.forEach(function(k) {
87620                     // DigitalGlobe vintage is available in raster layers for now.
87621                     if (isDG && k === 'vintage') return;
87622
87623                     list
87624                         .append('li')
87625                         .attr('class', 'background-info-list-' + k)
87626                         .classed('hide', !metadata[k])
87627                         .text(t('info_panels.background.' + k) + ':')
87628                         .append('span')
87629                         .attr('class', 'background-info-span-' + k)
87630                         .text(metadata[k]);
87631                 });
87632
87633                 debouncedGetMetadata(selection);
87634
87635                 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
87636
87637                 selection
87638                     .append('a')
87639                     .text(t('info_panels.background.' + toggleTiles))
87640                     .attr('href', '#')
87641                     .attr('class', 'button button-toggle-tiles')
87642                     .on('click', function() {
87643                         event.preventDefault();
87644                         context.setDebug('tile', !context.getDebug('tile'));
87645                         selection.call(redraw);
87646                     });
87647
87648                 if (isDG) {
87649                     var key = source.id + '-vintage';
87650                     var sourceVintage = context.background().findSource(key);
87651                     var showsVintage = context.background().showsLayer(sourceVintage);
87652                     var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
87653                     selection
87654                         .append('a')
87655                         .text(t('info_panels.background.' + toggleVintage))
87656                         .attr('href', '#')
87657                         .attr('class', 'button button-toggle-vintage')
87658                         .on('click', function() {
87659                             event.preventDefault();
87660                             context.background().toggleOverlayLayer(sourceVintage);
87661                             selection.call(redraw);
87662                         });
87663                 }
87664
87665                 // disable if necessary
87666                 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
87667                     if (source.id !== layerId) {
87668                         var key = layerId + '-vintage';
87669                         var sourceVintage = context.background().findSource(key);
87670                         if (context.background().showsLayer(sourceVintage)) {
87671                             context.background().toggleOverlayLayer(sourceVintage);
87672                         }
87673                     }
87674                 });
87675             }
87676
87677
87678             var debouncedGetMetadata = debounce(getMetadata, 250);
87679
87680             function getMetadata(selection) {
87681                 var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
87682                 if (tile.empty()) return;
87683
87684                 var sourceName = currSourceName;
87685                 var d = tile.datum();
87686                 var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
87687                 var center = context.map().center();
87688
87689                 // update zoom
87690                 metadata.zoom = String(zoom);
87691                 selection.selectAll('.background-info-list-zoom')
87692                     .classed('hide', false)
87693                     .selectAll('.background-info-span-zoom')
87694                     .text(metadata.zoom);
87695
87696                 if (!d || !d.length >= 3) return;
87697
87698                 background.baseLayerSource().getMetadata(center, d, function(err, result) {
87699                     if (err || currSourceName !== sourceName) return;
87700
87701                     // update vintage
87702                     var vintage = result.vintage;
87703                     metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
87704                     selection.selectAll('.background-info-list-vintage')
87705                         .classed('hide', false)
87706                         .selectAll('.background-info-span-vintage')
87707                         .text(metadata.vintage);
87708
87709                     // update other metdata
87710                     metadataKeys.forEach(function(k) {
87711                         if (k === 'zoom' || k === 'vintage') return;  // done already
87712                         var val = result[k];
87713                         metadata[k] = val;
87714                         selection.selectAll('.background-info-list-' + k)
87715                             .classed('hide', !val)
87716                             .selectAll('.background-info-span-' + k)
87717                             .text(val);
87718                     });
87719                 });
87720             }
87721
87722
87723             var panel = function(selection) {
87724                 selection.call(redraw);
87725
87726                 context.map()
87727                     .on('drawn.info-background', function() {
87728                         selection.call(debouncedRedraw);
87729                     })
87730                     .on('move.info-background', function() {
87731                         selection.call(debouncedGetMetadata);
87732                     });
87733
87734             };
87735
87736             panel.off = function() {
87737                 context.map()
87738                     .on('drawn.info-background', null)
87739                     .on('move.info-background', null);
87740             };
87741
87742             panel.id = 'background';
87743             panel.title = t('info_panels.background.title');
87744             panel.key = t('info_panels.background.key');
87745
87746
87747             return panel;
87748         }
87749
87750         function uiPanelHistory(context) {
87751             var osm;
87752
87753             function displayTimestamp(timestamp) {
87754                 if (!timestamp) return t('info_panels.history.unknown');
87755                 var detected = utilDetect();
87756                 var options = {
87757                     day: 'numeric', month: 'short', year: 'numeric',
87758                     hour: 'numeric', minute: 'numeric', second: 'numeric'
87759                 };
87760                 var d = new Date(timestamp);
87761                 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
87762                 return d.toLocaleString(detected.locale, options);
87763             }
87764
87765
87766             function displayUser(selection, userName) {
87767                 if (!userName) {
87768                     selection
87769                         .append('span')
87770                         .text(t('info_panels.history.unknown'));
87771                     return;
87772                 }
87773
87774                 selection
87775                     .append('span')
87776                     .attr('class', 'user-name')
87777                     .text(userName);
87778
87779                 var links = selection
87780                     .append('div')
87781                     .attr('class', 'links');
87782
87783                 if (osm) {
87784                     links
87785                         .append('a')
87786                         .attr('class', 'user-osm-link')
87787                         .attr('href', osm.userURL(userName))
87788                         .attr('target', '_blank')
87789                         .attr('tabindex', -1)
87790                         .text('OSM');
87791                 }
87792
87793                 links
87794                     .append('a')
87795                     .attr('class', 'user-hdyc-link')
87796                     .attr('href', 'https://hdyc.neis-one.org/?' + userName)
87797                     .attr('target', '_blank')
87798                     .attr('tabindex', -1)
87799                     .text('HDYC');
87800             }
87801
87802
87803             function displayChangeset(selection, changeset) {
87804                 if (!changeset) {
87805                     selection
87806                         .append('span')
87807                         .text(t('info_panels.history.unknown'));
87808                     return;
87809                 }
87810
87811                 selection
87812                     .append('span')
87813                     .attr('class', 'changeset-id')
87814                     .text(changeset);
87815
87816                 var links = selection
87817                     .append('div')
87818                     .attr('class', 'links');
87819
87820                 if (osm) {
87821                     links
87822                         .append('a')
87823                         .attr('class', 'changeset-osm-link')
87824                         .attr('href', osm.changesetURL(changeset))
87825                         .attr('target', '_blank')
87826                         .attr('tabindex', -1)
87827                         .text('OSM');
87828                 }
87829
87830                 links
87831                     .append('a')
87832                     .attr('class', 'changeset-osmcha-link')
87833                     .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
87834                     .attr('target', '_blank')
87835                     .attr('tabindex', -1)
87836                     .text('OSMCha');
87837             }
87838
87839
87840             function redraw(selection) {
87841                 var selectedNoteID = context.selectedNoteID();
87842                 osm = context.connection();
87843
87844                 var selected, note, entity;
87845                 if (selectedNoteID && osm) {       // selected 1 note
87846                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87847                     note = osm.getNote(selectedNoteID);
87848                 } else {                           // selected 1..n entities
87849                     selected = context.selectedIDs()
87850                         .filter(function(e) { return context.hasEntity(e); });
87851                     if (selected.length) {
87852                         entity = context.entity(selected[0]);
87853                     }
87854                 }
87855
87856                 var singular = selected.length === 1 ? selected[0] : null;
87857
87858                 selection.html('');
87859
87860                 selection
87861                     .append('h4')
87862                     .attr('class', 'history-heading')
87863                     .text(singular || t('info_panels.history.selected', { n: selected.length }));
87864
87865                 if (!singular) return;
87866
87867                 if (entity) {
87868                     selection.call(redrawEntity, entity);
87869                 } else if (note) {
87870                     selection.call(redrawNote, note);
87871                 }
87872             }
87873
87874
87875             function redrawNote(selection, note) {
87876                 if (!note || note.isNew()) {
87877                     selection
87878                         .append('div')
87879                         .text(t('info_panels.history.note_no_history'));
87880                     return;
87881                 }
87882
87883                 var list = selection
87884                     .append('ul');
87885
87886                 list
87887                     .append('li')
87888                     .text(t('info_panels.history.note_comments') + ':')
87889                     .append('span')
87890                     .text(note.comments.length);
87891
87892                 if (note.comments.length) {
87893                     list
87894                         .append('li')
87895                         .text(t('info_panels.history.note_created_date') + ':')
87896                         .append('span')
87897                         .text(displayTimestamp(note.comments[0].date));
87898
87899                     list
87900                         .append('li')
87901                         .text(t('info_panels.history.note_created_user') + ':')
87902                         .call(displayUser, note.comments[0].user);
87903                 }
87904
87905                 if (osm) {
87906                     selection
87907                         .append('a')
87908                         .attr('class', 'view-history-on-osm')
87909                         .attr('target', '_blank')
87910                         .attr('tabindex', -1)
87911                         .attr('href', osm.noteURL(note))
87912                         .call(svgIcon('#iD-icon-out-link', 'inline'))
87913                         .append('span')
87914                         .text(t('info_panels.history.note_link_text'));
87915                 }
87916             }
87917
87918
87919             function redrawEntity(selection, entity) {
87920                 if (!entity || entity.isNew()) {
87921                     selection
87922                         .append('div')
87923                         .text(t('info_panels.history.no_history'));
87924                     return;
87925                 }
87926
87927                 var links = selection
87928                     .append('div')
87929                     .attr('class', 'links');
87930
87931                 if (osm) {
87932                     links
87933                         .append('a')
87934                         .attr('class', 'view-history-on-osm')
87935                         .attr('href', osm.historyURL(entity))
87936                         .attr('target', '_blank')
87937                         .attr('tabindex', -1)
87938                         .attr('title', t('info_panels.history.link_text'))
87939                         .text('OSM');
87940                 }
87941                 links
87942                     .append('a')
87943                     .attr('class', 'pewu-history-viewer-link')
87944                     .attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId())
87945                     .attr('target', '_blank')
87946                     .attr('tabindex', -1)
87947                     .text('PeWu');
87948
87949                 var list = selection
87950                     .append('ul');
87951
87952                 list
87953                     .append('li')
87954                     .text(t('info_panels.history.version') + ':')
87955                     .append('span')
87956                     .text(entity.version);
87957
87958                 list
87959                     .append('li')
87960                     .text(t('info_panels.history.last_edit') + ':')
87961                     .append('span')
87962                     .text(displayTimestamp(entity.timestamp));
87963
87964                 list
87965                     .append('li')
87966                     .text(t('info_panels.history.edited_by') + ':')
87967                     .call(displayUser, entity.user);
87968
87969                 list
87970                     .append('li')
87971                     .text(t('info_panels.history.changeset') + ':')
87972                     .call(displayChangeset, entity.changeset);
87973             }
87974
87975
87976             var panel = function(selection) {
87977                 selection.call(redraw);
87978
87979                 context.map()
87980                     .on('drawn.info-history', function() {
87981                         selection.call(redraw);
87982                     });
87983
87984                 context
87985                     .on('enter.info-history', function() {
87986                         selection.call(redraw);
87987                     });
87988             };
87989
87990             panel.off = function() {
87991                 context.map().on('drawn.info-history', null);
87992                 context.on('enter.info-history', null);
87993             };
87994
87995             panel.id = 'history';
87996             panel.title = t('info_panels.history.title');
87997             panel.key = t('info_panels.history.key');
87998
87999
88000             return panel;
88001         }
88002
88003         var OSM_PRECISION = 7;
88004         var locale$2 = utilDetect().locale;
88005
88006         /**
88007          * Returns a localized representation of the given length measurement.
88008          *
88009          * @param {Number} m area in meters
88010          * @param {Boolean} isImperial true for U.S. customary units; false for metric
88011          */
88012         function displayLength(m, isImperial) {
88013             var d = m * (isImperial ? 3.28084 : 1);
88014             var unit;
88015
88016             if (isImperial) {
88017                 if (d >= 5280) {
88018                     d /= 5280;
88019                     unit = 'miles';
88020                 } else {
88021                     unit = 'feet';
88022                 }
88023             } else {
88024                 if (d >= 1000) {
88025                     d /= 1000;
88026                     unit = 'kilometers';
88027                 } else {
88028                     unit = 'meters';
88029                 }
88030             }
88031
88032             return t('units.' + unit, {
88033                 quantity: d.toLocaleString(locale$2, {
88034                     maximumSignificantDigits: 4
88035                 })
88036             });
88037         }
88038
88039         /**
88040          * Returns a localized representation of the given area measurement.
88041          *
88042          * @param {Number} m2 area in square meters
88043          * @param {Boolean} isImperial true for U.S. customary units; false for metric
88044          */
88045         function displayArea(m2, isImperial) {
88046             var d = m2 * (isImperial ? 10.7639111056 : 1);
88047             var d1, d2, area;
88048             var unit1 = '';
88049             var unit2 = '';
88050
88051             if (isImperial) {
88052                 if (d >= 6969600) { // > 0.25mi² show mi²
88053                     d1 = d / 27878400;
88054                     unit1 = 'square_miles';
88055                 } else {
88056                     d1 = d;
88057                     unit1 = 'square_feet';
88058                 }
88059
88060                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
88061                     d2 = d / 43560;
88062                     unit2 = 'acres';
88063                 }
88064
88065             } else {
88066                 if (d >= 250000) { // > 0.25km² show km²
88067                     d1 = d / 1000000;
88068                     unit1 = 'square_kilometers';
88069                 } else {
88070                     d1 = d;
88071                     unit1 = 'square_meters';
88072                 }
88073
88074                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
88075                     d2 = d / 10000;
88076                     unit2 = 'hectares';
88077                 }
88078             }
88079
88080             area = t('units.' + unit1, {
88081                 quantity: d1.toLocaleString(locale$2, {
88082                     maximumSignificantDigits: 4
88083                 })
88084             });
88085
88086             if (d2) {
88087                 return t('units.area_pair', {
88088                     area1: area,
88089                     area2: t('units.' + unit2, {
88090                         quantity: d2.toLocaleString(locale$2, {
88091                             maximumSignificantDigits: 2
88092                         })
88093                     })
88094                 });
88095             } else {
88096                 return area;
88097             }
88098         }
88099
88100         function wrap(x, min, max) {
88101             var d = max - min;
88102             return ((x - min) % d + d) % d + min;
88103         }
88104
88105         function clamp$1(x, min, max) {
88106             return Math.max(min, Math.min(x, max));
88107         }
88108
88109         function displayCoordinate(deg, pos, neg) {
88110             var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
88111             var sec = (min - Math.floor(min)) * 60;
88112             var displayDegrees = t('units.arcdegrees', {
88113                 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
88114             });
88115             var displayCoordinate;
88116
88117             if (Math.floor(sec) > 0) {
88118                 displayCoordinate = displayDegrees +
88119                     t('units.arcminutes', {
88120                         quantity: Math.floor(min).toLocaleString(locale$2)
88121                     }) +
88122                     t('units.arcseconds', {
88123                         quantity: Math.round(sec).toLocaleString(locale$2)
88124                     });
88125             } else if (Math.floor(min) > 0) {
88126                 displayCoordinate = displayDegrees +
88127                     t('units.arcminutes', {
88128                         quantity: Math.round(min).toLocaleString(locale$2)
88129                     });
88130             } else {
88131                 displayCoordinate = t('units.arcdegrees', {
88132                     quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
88133                 });
88134             }
88135
88136             if (deg === 0) {
88137                 return displayCoordinate;
88138             } else {
88139                 return t('units.coordinate', {
88140                     coordinate: displayCoordinate,
88141                     direction: t('units.' + (deg > 0 ? pos : neg))
88142                 });
88143             }
88144         }
88145
88146         /**
88147          * Returns given coordinate pair in degree-minute-second format.
88148          *
88149          * @param {Array<Number>} coord longitude and latitude
88150          */
88151         function dmsCoordinatePair(coord) {
88152             return t('units.coordinate_pair', {
88153                 latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
88154                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
88155             });
88156         }
88157
88158         /**
88159          * Returns the given coordinate pair in decimal format.
88160          * note: unlocalized to avoid comma ambiguity - see #4765
88161          *
88162          * @param {Array<Number>} coord longitude and latitude
88163          */
88164         function decimalCoordinatePair(coord) {
88165             return t('units.coordinate_pair', {
88166                 latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
88167                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
88168             });
88169         }
88170
88171         function uiPanelLocation(context) {
88172             var currLocation = '';
88173
88174
88175             function redraw(selection) {
88176                 selection.html('');
88177
88178                 var list = selection
88179                     .append('ul');
88180
88181                 // Mouse coordinates
88182                 var coord = context.map().mouseCoordinates();
88183                 if (coord.some(isNaN)) {
88184                     coord = context.map().center();
88185                 }
88186
88187                 list
88188                     .append('li')
88189                     .text(dmsCoordinatePair(coord))
88190                     .append('li')
88191                     .text(decimalCoordinatePair(coord));
88192
88193                 // Location Info
88194                 selection
88195                     .append('div')
88196                     .attr('class', 'location-info')
88197                     .text(currLocation || ' ');
88198
88199                 debouncedGetLocation(selection, coord);
88200             }
88201
88202
88203             var debouncedGetLocation = debounce(getLocation, 250);
88204             function getLocation(selection, coord) {
88205                 if (!services$1.geocoder) {
88206                     currLocation = t('info_panels.location.unknown_location');
88207                     selection.selectAll('.location-info')
88208                         .text(currLocation);
88209                 } else {
88210                     services$1.geocoder.reverse(coord, function(err, result) {
88211                         currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
88212                         selection.selectAll('.location-info')
88213                             .text(currLocation);
88214                     });
88215                 }
88216             }
88217
88218
88219             var panel = function(selection) {
88220                 selection.call(redraw);
88221
88222                 context.surface()
88223                     .on('mousemove.info-location', function() {
88224                         selection.call(redraw);
88225                     });
88226             };
88227
88228             panel.off = function() {
88229                 context.surface()
88230                     .on('mousemove.info-location', null);
88231             };
88232
88233             panel.id = 'location';
88234             panel.title = t('info_panels.location.title');
88235             panel.key = t('info_panels.location.key');
88236
88237
88238             return panel;
88239         }
88240
88241         function uiPanelMeasurement(context) {
88242             var locale = utilDetect().locale;
88243             var isImperial = (locale.toLowerCase() === 'en-us');
88244
88245
88246             function radiansToMeters(r) {
88247                 // using WGS84 authalic radius (6371007.1809 m)
88248                 return r * 6371007.1809;
88249             }
88250
88251             function steradiansToSqmeters(r) {
88252                 // http://gis.stackexchange.com/a/124857/40446
88253                 return r / (4 * Math.PI) * 510065621724000;
88254             }
88255
88256
88257             function toLineString(feature) {
88258                 if (feature.type === 'LineString') return feature;
88259
88260                 var result = { type: 'LineString', coordinates: [] };
88261                 if (feature.type === 'Polygon') {
88262                     result.coordinates = feature.coordinates[0];
88263                 } else if (feature.type === 'MultiPolygon') {
88264                     result.coordinates = feature.coordinates[0][0];
88265                 }
88266
88267                 return result;
88268             }
88269
88270
88271             function nodeCount(feature) {
88272               if (feature.type === 'LineString') return feature.coordinates.length;
88273               if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
88274             }
88275
88276
88277             function redraw(selection) {
88278                 var resolver = context.graph();
88279                 var selectedNoteID = context.selectedNoteID();
88280                 var osm = services$1.osm;
88281
88282                 var selected, center, entity, note, geometry;
88283
88284                 if (selectedNoteID && osm) {       // selected 1 note
88285                     selected = [ t('note.note') + ' ' + selectedNoteID ];
88286                     note = osm.getNote(selectedNoteID);
88287                     center = note.loc;
88288                     geometry = 'note';
88289
88290                 } else {                           // selected 1..n entities
88291                     var extent = geoExtent();
88292                     selected = context.selectedIDs()
88293                         .filter(function(e) { return context.hasEntity(e); });
88294                     if (selected.length) {
88295                         for (var i = 0; i < selected.length; i++) {
88296                             entity = context.entity(selected[i]);
88297                             extent._extend(entity.extent(resolver));
88298                         }
88299                         center = extent.center();
88300                         geometry = entity.geometry(resolver);
88301                     }
88302                 }
88303
88304                 var singular = selected.length === 1 ? selected[0] : null;
88305
88306                 selection.html('');
88307
88308                 selection
88309                     .append('h4')
88310                     .attr('class', 'measurement-heading')
88311                     .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
88312
88313                 if (!selected.length) return;
88314
88315
88316                 var list = selection
88317                     .append('ul');
88318                 var coordItem;
88319
88320                 // multiple selected features, just display extent center..
88321                 if (!singular) {
88322                     coordItem = list
88323                         .append('li')
88324                         .text(t('info_panels.measurement.center') + ':');
88325                     coordItem.append('span')
88326                         .text(dmsCoordinatePair(center));
88327                     coordItem.append('span')
88328                         .text(decimalCoordinatePair(center));
88329                     return;
88330                 }
88331
88332                 // single selected feature, display details..
88333                 if (geometry === 'line' || geometry === 'area') {
88334                     var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
88335                     var feature = entity.asGeoJSON(resolver);
88336                     var length = radiansToMeters(d3_geoLength(toLineString(feature)));
88337                     var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
88338                     var centroid = d3_geoCentroid(feature);
88339
88340                     list
88341                         .append('li')
88342                         .text(t('info_panels.measurement.geometry') + ':')
88343                         .append('span')
88344                         .text(
88345                             closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
88346                         );
88347
88348                     if (entity.type !== 'relation') {
88349                         list
88350                             .append('li')
88351                             .text(t('info_panels.measurement.node_count') + ':')
88352                             .append('span')
88353                             .text(nodeCount(feature).toLocaleString(locale));
88354                     }
88355
88356                     if (closed) {
88357                         var area = steradiansToSqmeters(entity.area(resolver));
88358                         list
88359                             .append('li')
88360                             .text(t('info_panels.measurement.area') + ':')
88361                             .append('span')
88362                             .text(displayArea(area, isImperial));
88363                     }
88364
88365
88366                     list
88367                         .append('li')
88368                         .text(lengthLabel + ':')
88369                         .append('span')
88370                         .text(displayLength(length, isImperial));
88371
88372                     coordItem = list
88373                         .append('li')
88374                         .text(t('info_panels.measurement.centroid') + ':');
88375                     coordItem.append('span')
88376                         .text(dmsCoordinatePair(centroid));
88377                     coordItem.append('span')
88378                         .text(decimalCoordinatePair(centroid));
88379
88380                     var toggle  = isImperial ? 'imperial' : 'metric';
88381
88382                     selection
88383                         .append('a')
88384                         .text(t('info_panels.measurement.' + toggle))
88385                         .attr('href', '#')
88386                         .attr('class', 'button button-toggle-units')
88387                         .on('click', function() {
88388                             event.preventDefault();
88389                             isImperial = !isImperial;
88390                             selection.call(redraw);
88391                         });
88392
88393                 } else {
88394                     var centerLabel = t('info_panels.measurement.' +
88395                         (note || entity.type === 'node' ? 'location' : 'center'));
88396
88397                     list
88398                         .append('li')
88399                         .text(t('info_panels.measurement.geometry') + ':')
88400                         .append('span')
88401                         .text(t('geometry.' + geometry));
88402
88403                     coordItem = list
88404                         .append('li')
88405                         .text(centerLabel + ':');
88406                     coordItem.append('span')
88407                         .text(dmsCoordinatePair(center));
88408                     coordItem.append('span')
88409                         .text(decimalCoordinatePair(center));
88410                 }
88411             }
88412
88413
88414             var panel = function(selection) {
88415                 selection.call(redraw);
88416
88417                 context.map()
88418                     .on('drawn.info-measurement', function() {
88419                         selection.call(redraw);
88420                     });
88421
88422                 context
88423                     .on('enter.info-measurement', function() {
88424                         selection.call(redraw);
88425                     });
88426             };
88427
88428             panel.off = function() {
88429                 context.map().on('drawn.info-measurement', null);
88430                 context.on('enter.info-measurement', null);
88431             };
88432
88433             panel.id = 'measurement';
88434             panel.title = t('info_panels.measurement.title');
88435             panel.key = t('info_panels.measurement.key');
88436
88437
88438             return panel;
88439         }
88440
88441         var uiInfoPanels = {
88442             background: uiPanelBackground,
88443             history: uiPanelHistory,
88444             location: uiPanelLocation,
88445             measurement: uiPanelMeasurement,
88446         };
88447
88448         function uiInfo(context) {
88449             var ids = Object.keys(uiInfoPanels);
88450             var wasActive = ['measurement'];
88451             var panels = {};
88452             var active = {};
88453
88454             // create panels
88455             ids.forEach(function(k) {
88456                 if (!panels[k]) {
88457                     panels[k] = uiInfoPanels[k](context);
88458                     active[k] = false;
88459                 }
88460             });
88461
88462
88463             function info(selection) {
88464
88465                 function redraw() {
88466                     var activeids = ids.filter(function(k) { return active[k]; }).sort();
88467
88468                     var containers = infoPanels.selectAll('.panel-container')
88469                         .data(activeids, function(k) { return k; });
88470
88471                     containers.exit()
88472                         .style('opacity', 1)
88473                         .transition()
88474                         .duration(200)
88475                         .style('opacity', 0)
88476                         .on('end', function(d) {
88477                             d3_select(this)
88478                                 .call(panels[d].off)
88479                                 .remove();
88480                         });
88481
88482                     var enter = containers.enter()
88483                         .append('div')
88484                         .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
88485
88486                     enter
88487                         .style('opacity', 0)
88488                         .transition()
88489                         .duration(200)
88490                         .style('opacity', 1);
88491
88492                     var title = enter
88493                         .append('div')
88494                         .attr('class', 'panel-title fillD2');
88495
88496                     title
88497                         .append('h3')
88498                         .text(function(d) { return panels[d].title; });
88499
88500                     title
88501                         .append('button')
88502                         .attr('class', 'close')
88503                         .on('click', function (d) { toggle(d); })
88504                         .call(svgIcon('#iD-icon-close'));
88505
88506                     enter
88507                         .append('div')
88508                         .attr('class', function(d) { return 'panel-content panel-content-' + d; });
88509
88510
88511                     // redraw the panels
88512                     infoPanels.selectAll('.panel-content')
88513                         .each(function(d) {
88514                             d3_select(this).call(panels[d]);
88515                         });
88516                 }
88517
88518
88519                 function toggle(which) {
88520                     if (event) {
88521                         event.stopImmediatePropagation();
88522                         event.preventDefault();
88523                     }
88524
88525                     var activeids = ids.filter(function(k) { return active[k]; });
88526
88527                     if (which) {  // toggle one
88528                         active[which] = !active[which];
88529                         if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
88530                             wasActive = [which];
88531                         }
88532                     } else {      // toggle all
88533                         if (activeids.length) {
88534                             wasActive = activeids;
88535                             activeids.forEach(function(k) { active[k] = false; });
88536                         } else {
88537                             wasActive.forEach(function(k) { active[k] = true; });
88538                         }
88539                     }
88540
88541                     redraw();
88542                 }
88543
88544
88545                 var infoPanels = selection.selectAll('.info-panels')
88546                     .data([0]);
88547
88548                 infoPanels = infoPanels.enter()
88549                     .append('div')
88550                     .attr('class', 'info-panels')
88551                     .merge(infoPanels);
88552
88553                 redraw();
88554
88555                 context.keybinding()
88556                     .on(uiCmd('⌘' + t('info_panels.key')), toggle);
88557
88558                 ids.forEach(function(k) {
88559                     var key = t('info_panels.' + k + '.key', { default: null });
88560                     if (!key) return;
88561                     context.keybinding()
88562                         .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
88563                 });
88564             }
88565
88566             return info;
88567         }
88568
88569         function uiIssues(context) {
88570             var key = t('issues.key');
88571
88572             var MINSQUARE = 0;
88573             var MAXSQUARE = 20;
88574             var DEFAULTSQUARE = 5;  // see also unsquare_way.js
88575
88576             var _errorsSelection = d3_select(null);
88577             var _warningsSelection = d3_select(null);
88578             var _rulesList = d3_select(null);
88579             var _pane = d3_select(null);
88580             var _toggleButton = d3_select(null);
88581
88582             var _errors = [];
88583             var _warnings = [];
88584             var _options = {
88585                 what: context.storage('validate-what') || 'edited',    // 'all', 'edited'
88586                 where: context.storage('validate-where') || 'all'  // 'all', 'visible'
88587             };
88588
88589             // listeners
88590             context.validator().on('validated.uiIssues',
88591                 function() { window.requestIdleCallback(update); }
88592             );
88593             context.map().on('move.uiIssues',
88594                 debounce(function() { window.requestIdleCallback(update); }, 1000)
88595             );
88596
88597
88598             function addNotificationBadge(selection) {
88599                 var d = 10;
88600                 selection.selectAll('svg.notification-badge')
88601                     .data([0])
88602                     .enter()
88603                     .append('svg')
88604                     .attr('viewbox', '0 0 ' + d + ' ' + d)
88605                     .attr('class', 'notification-badge hide')
88606                     .append('circle')
88607                     .attr('cx', d / 2)
88608                     .attr('cy', d / 2)
88609                     .attr('r', (d / 2) - 1)
88610                     .attr('fill', 'currentColor');
88611             }
88612
88613
88614             function renderErrorsList(selection) {
88615                 _errorsSelection = selection
88616                     .call(drawIssuesList, 'errors', _errors);
88617             }
88618
88619
88620             function renderWarningsList(selection) {
88621                 _warningsSelection = selection
88622                     .call(drawIssuesList, 'warnings', _warnings);
88623             }
88624
88625
88626             function drawIssuesList(selection, which, issues) {
88627                 var list = selection.selectAll('.issues-list')
88628                     .data([0]);
88629
88630                 list = list.enter()
88631                     .append('ul')
88632                     .attr('class', 'layer-list issues-list ' + which + '-list')
88633                     .merge(list);
88634
88635
88636                 var items = list.selectAll('li')
88637                     .data(issues, function(d) { return d.id; });
88638
88639                 // Exit
88640                 items.exit()
88641                     .remove();
88642
88643                 // Enter
88644                 var itemsEnter = items.enter()
88645                     .append('li')
88646                     .attr('class', function (d) { return 'issue severity-' + d.severity; })
88647                     .on('click', function(d) {
88648                         context.validator().focusIssue(d);
88649                     })
88650                     .on('mouseover', function(d) {
88651                         utilHighlightEntities(d.entityIds, true, context);
88652                     })
88653                     .on('mouseout', function(d) {
88654                         utilHighlightEntities(d.entityIds, false, context);
88655                     });
88656
88657
88658                 var labelsEnter = itemsEnter
88659                     .append('div')
88660                     .attr('class', 'issue-label');
88661
88662                 var textEnter = labelsEnter
88663                     .append('span')
88664                     .attr('class', 'issue-text');
88665
88666                 textEnter
88667                     .append('span')
88668                     .attr('class', 'issue-icon')
88669                     .each(function(d) {
88670                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
88671                         d3_select(this)
88672                             .call(svgIcon(iconName));
88673                     });
88674
88675                 textEnter
88676                     .append('span')
88677                     .attr('class', 'issue-message');
88678
88679                 /*
88680                 labelsEnter
88681                     .append('span')
88682                     .attr('class', 'issue-autofix')
88683                     .each(function(d) {
88684                         if (!d.autoFix) return;
88685
88686                         d3_select(this)
88687                             .append('button')
88688                             .attr('title', t('issues.fix_one.title'))
88689                             .datum(d.autoFix)  // set button datum to the autofix
88690                             .attr('class', 'autofix action')
88691                             .on('click', function(d) {
88692                                 d3_event.preventDefault();
88693                                 d3_event.stopPropagation();
88694
88695                                 var issuesEntityIDs = d.issue.entityIds;
88696                                 utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
88697
88698                                 context.perform.apply(context, d.autoArgs);
88699                                 context.validator().validate();
88700                             })
88701                             .call(svgIcon('#iD-icon-wrench'));
88702                     });
88703                 */
88704
88705                 // Update
88706                 items = items
88707                     .merge(itemsEnter)
88708                     .order();
88709
88710                 items.selectAll('.issue-message')
88711                     .text(function(d) {
88712                         return d.message(context);
88713                     });
88714
88715                 /*
88716                 // autofix
88717                 var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
88718
88719                 var autoFixAll = selection.selectAll('.autofix-all')
88720                     .data(canAutoFix.length ? [0] : []);
88721
88722                 // exit
88723                 autoFixAll.exit()
88724                     .remove();
88725
88726                 // enter
88727                 var autoFixAllEnter = autoFixAll.enter()
88728                     .insert('div', '.issues-list')
88729                     .attr('class', 'autofix-all');
88730
88731                 var linkEnter = autoFixAllEnter
88732                     .append('a')
88733                     .attr('class', 'autofix-all-link')
88734                     .attr('href', '#');
88735
88736                 linkEnter
88737                     .append('span')
88738                     .attr('class', 'autofix-all-link-text')
88739                     .text(t('issues.fix_all.title'));
88740
88741                 linkEnter
88742                     .append('span')
88743                     .attr('class', 'autofix-all-link-icon')
88744                     .call(svgIcon('#iD-icon-wrench'));
88745
88746                 if (which === 'warnings') {
88747                     renderIgnoredIssuesReset(selection);
88748                 }
88749
88750                 // update
88751                 autoFixAll = autoFixAll
88752                     .merge(autoFixAllEnter);
88753
88754                 autoFixAll.selectAll('.autofix-all-link')
88755                     .on('click', function() {
88756                         context.pauseChangeDispatch();
88757                         context.perform(actionNoop());
88758                         canAutoFix.forEach(function(issue) {
88759                             var args = issue.autoFix.autoArgs.slice();  // copy
88760                             if (typeof args[args.length - 1] !== 'function') {
88761                                 args.pop();
88762                             }
88763                             args.push(t('issues.fix_all.annotation'));
88764                             context.replace.apply(context, args);
88765                         });
88766                         context.resumeChangeDispatch();
88767                         context.validator().validate();
88768                     });
88769                 */
88770             }
88771
88772
88773             function updateOptionValue(d, val) {
88774                 if (!val && event && event.target) {
88775                     val = event.target.value;
88776                 }
88777
88778                 _options[d] = val;
88779                 context.storage('validate-' + d, val);
88780                 update();
88781             }
88782
88783
88784             function renderIssuesOptions(selection) {
88785                 var container = selection.selectAll('.issues-options-container')
88786                     .data([0]);
88787
88788                 container = container.enter()
88789                     .append('div')
88790                     .attr('class', 'issues-options-container')
88791                     .merge(container);
88792
88793                 var data = [
88794                     { key: 'what', values: ['edited', 'all'] },
88795                     { key: 'where', values: ['visible', 'all'] }
88796                 ];
88797
88798                 var options = container.selectAll('.issues-option')
88799                     .data(data, function(d) { return d.key; });
88800
88801                 var optionsEnter = options.enter()
88802                     .append('div')
88803                     .attr('class', function(d) { return 'issues-option issues-option-' + d.key; });
88804
88805                 optionsEnter
88806                     .append('div')
88807                     .attr('class', 'issues-option-title')
88808                     .text(function(d) { return t('issues.options.' + d.key + '.title'); });
88809
88810                 var valuesEnter = optionsEnter.selectAll('label')
88811                     .data(function(d) {
88812                         return d.values.map(function(val) { return { value: val, key: d.key }; });
88813                     })
88814                     .enter()
88815                     .append('label');
88816
88817                 valuesEnter
88818                     .append('input')
88819                     .attr('type', 'radio')
88820                     .attr('name', function(d) { return 'issues-option-' + d.key; })
88821                     .attr('value', function(d) { return d.value; })
88822                     .property('checked', function(d) { return _options[d.key] === d.value; })
88823                     .on('change', function(d) { updateOptionValue(d.key, d.value); });
88824
88825                 valuesEnter
88826                     .append('span')
88827                     .text(function(d) { return t('issues.options.' + d.key + '.' + d.value); });
88828             }
88829
88830
88831             function renderNoIssuesBox(selection) {
88832
88833                 var box = selection.append('div')
88834                     .attr('class', 'box');
88835
88836                 box
88837                     .append('div')
88838                     .call(svgIcon('#iD-icon-apply', 'pre-text'));
88839
88840                 var noIssuesMessage = box
88841                     .append('span');
88842
88843                 noIssuesMessage
88844                     .append('strong')
88845                     .attr('class', 'message');
88846
88847                 noIssuesMessage
88848                     .append('br');
88849
88850                 noIssuesMessage
88851                     .append('span')
88852                     .attr('class', 'details');
88853             }
88854
88855             function renderIgnoredIssuesReset(selection) {
88856
88857                 var ignoredIssues = context.validator()
88858                     .getIssues(Object.assign({ includeIgnored: 'only' }, _options));
88859
88860                 var resetIgnored = selection.selectAll('.reset-ignored')
88861                     .data(ignoredIssues.length ? [0] : []);
88862
88863                 // exit
88864                 resetIgnored.exit()
88865                     .remove();
88866
88867                 // enter
88868                 var resetIgnoredEnter = resetIgnored.enter()
88869                     .append('div')
88870                     .attr('class', 'reset-ignored section-footer');
88871
88872                 resetIgnoredEnter
88873                     .append('a')
88874                     .attr('href', '#');
88875
88876                 // update
88877                 resetIgnored = resetIgnored
88878                     .merge(resetIgnoredEnter);
88879
88880                 resetIgnored.select('a')
88881                     .text(t('issues.reset_ignored', { count: ignoredIssues.length.toString() }));
88882
88883                 resetIgnored.on('click', function() {
88884                         context.validator().resetIgnoredIssues();
88885                     });
88886             }
88887
88888
88889             function renderRulesList(selection) {
88890                 var container = selection.selectAll('.issues-rulelist-container')
88891                     .data([0]);
88892
88893                 var containerEnter = container.enter()
88894                     .append('div')
88895                     .attr('class', 'issues-rulelist-container');
88896
88897                 containerEnter
88898                     .append('ul')
88899                     .attr('class', 'layer-list issue-rules-list');
88900
88901                 var ruleLinks = containerEnter
88902                     .append('div')
88903                     .attr('class', 'issue-rules-links section-footer');
88904
88905                 ruleLinks
88906                     .append('a')
88907                     .attr('class', 'issue-rules-link')
88908                     .attr('href', '#')
88909                     .text(t('issues.enable_all'))
88910                     .on('click', function() {
88911                         context.validator().disableRules([]);
88912                     });
88913
88914                 ruleLinks
88915                     .append('a')
88916                     .attr('class', 'issue-rules-link')
88917                     .attr('href', '#')
88918                     .text(t('issues.disable_all'))
88919                     .on('click', function() {
88920                         var keys = context.validator().getRuleKeys();
88921                         context.validator().disableRules(keys);
88922                     });
88923
88924
88925                 // Update
88926                 container = container
88927                     .merge(containerEnter);
88928
88929                 _rulesList = container.selectAll('.issue-rules-list');
88930
88931                 updateRulesList();
88932             }
88933
88934
88935             function updateRulesList() {
88936                 var ruleKeys = context.validator().getRuleKeys();
88937                 _rulesList
88938                     .call(drawListItems, ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
88939             }
88940
88941
88942             function isRuleEnabled(d) {
88943                 return context.validator().isRuleEnabled(d);
88944             }
88945
88946
88947             function toggleRule(d) {
88948                 context.validator().toggleRule(d);
88949             }
88950
88951             function setNoIssuesText() {
88952
88953                 function checkForHiddenIssues(cases) {
88954                     for (var type in cases) {
88955                         var opts = cases[type];
88956                         var hiddenIssues = context.validator().getIssues(opts);
88957                         if (hiddenIssues.length) {
88958                             _pane.select('.issues-none .details')
88959                                 .text(t(
88960                                     'issues.no_issues.hidden_issues.' + type,
88961                                     { count: hiddenIssues.length.toString() }
88962                                 ));
88963                             return;
88964                         }
88965                     }
88966                     _pane.select('.issues-none .details')
88967                         .text(t('issues.no_issues.hidden_issues.none'));
88968                 }
88969
88970                 var messageType;
88971
88972                 if (_options.what === 'edited' && _options.where === 'visible') {
88973
88974                     messageType = 'edits_in_view';
88975
88976                     checkForHiddenIssues({
88977                         elsewhere: { what: 'edited', where: 'all' },
88978                         other_features: { what: 'all', where: 'visible' },
88979                         disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
88980                         other_features_elsewhere: { what: 'all', where: 'all' },
88981                         disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88982                         ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
88983                         ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
88984                     });
88985
88986                 } else if (_options.what === 'edited' && _options.where === 'all') {
88987
88988                     messageType = 'edits';
88989
88990                     checkForHiddenIssues({
88991                         other_features: { what: 'all', where: 'all' },
88992                         disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88993                         ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
88994                     });
88995
88996                 } else if (_options.what === 'all' && _options.where === 'visible') {
88997
88998                     messageType = 'everything_in_view';
88999
89000                     checkForHiddenIssues({
89001                         elsewhere: { what: 'all', where: 'all' },
89002                         disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
89003                         disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
89004                         ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
89005                         ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
89006                     });
89007                 } else if (_options.what === 'all' && _options.where === 'all') {
89008
89009                     messageType = 'everything';
89010
89011                     checkForHiddenIssues({
89012                         disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
89013                         ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
89014                     });
89015                 }
89016
89017                 _pane.select('.issues-none .message')
89018                     .text(t('issues.no_issues.message.' + messageType));
89019
89020             }
89021
89022
89023             function update() {
89024                 var issuesBySeverity = context.validator().getIssuesBySeverity(_options);
89025
89026                 // sort issues by distance away from the center of the map
89027                 var center = context.map().center();
89028                 var graph = context.graph();
89029                 _errors = issuesBySeverity.error.map(withDistance).sort(byDistance);
89030                 _warnings = issuesBySeverity.warning.map(withDistance).sort(byDistance);
89031
89032                 // cut off at 1000
89033                 var errorCount = _errors.length > 1000 ? '1000+' : String(_errors.length);
89034                 var warningCount = _warnings.length > 1000 ? '1000+' : String(_warnings.length);
89035                 _errors = _errors.slice(0, 1000);
89036                 _warnings = _warnings.slice(0, 1000);
89037
89038
89039                 _toggleButton.selectAll('.notification-badge')
89040                     .classed('error', (_errors.length > 0))
89041                     .classed('warning', (_errors.length === 0 && _warnings.length > 0))
89042                     .classed('hide', (_errors.length === 0 && _warnings.length === 0));
89043
89044
89045                 _pane.selectAll('.issues-errors')
89046                     .classed('hide', _errors.length === 0);
89047
89048                 if (_errors.length > 0) {
89049                     _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text')
89050                         .text(t('issues.errors.list_title', { count: errorCount }));
89051                     if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
89052                         _errorsSelection
89053                             .call(drawIssuesList, 'errors', _errors);
89054                     }
89055                 }
89056
89057                 _pane.selectAll('.issues-warnings')
89058                     .classed('hide', _warnings.length === 0);
89059
89060                 if (_warnings.length > 0) {
89061                     _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text')
89062                         .text(t('issues.warnings.list_title', { count: warningCount }));
89063                     if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
89064                         _warningsSelection
89065                             .call(drawIssuesList, 'warnings', _warnings);
89066                     }
89067                 }
89068
89069                 var hasIssues = _warnings.length > 0 || _errors.length > 0;
89070
89071                 var issuesNone = _pane.select('.issues-none');
89072                 issuesNone.classed('hide', hasIssues);
89073                 if (!hasIssues) {
89074                     renderIgnoredIssuesReset(issuesNone);
89075                     setNoIssuesText();
89076                 }
89077
89078                 if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
89079                     updateRulesList();
89080                 }
89081
89082
89083                 function byDistance(a, b) {
89084                     return a.dist - b.dist;
89085                 }
89086
89087                 function withDistance(issue) {
89088                     var extent = issue.extent(graph);
89089                     var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
89090                     return Object.assign(issue, { dist: dist });
89091                 }
89092             }
89093
89094
89095             function drawListItems(selection, data, type, name, change, active) {
89096                 var items = selection.selectAll('li')
89097                     .data(data);
89098
89099                 // Exit
89100                 items.exit()
89101                     .remove();
89102
89103                 // Enter
89104                 var enter = items.enter()
89105                     .append('li');
89106
89107                 if (name === 'rule') {
89108                     enter
89109                         .call(tooltip()
89110                             .title(function(d) { return t('issues.' + d + '.tip'); })
89111                             .placement('top')
89112                         );
89113                 }
89114
89115                 var label = enter
89116                     .append('label');
89117
89118                 label
89119                     .append('input')
89120                     .attr('type', type)
89121                     .attr('name', name)
89122                     .on('change', change);
89123
89124                 label
89125                     .append('span')
89126                     .html(function(d) {
89127                         var params = {};
89128                         if (d === 'unsquare_way') {
89129                             params.val = '<span class="square-degrees"></span>';
89130                         }
89131                         return t('issues.' + d + '.title', params);
89132                     });
89133
89134                 // Update
89135                 items = items
89136                     .merge(enter);
89137
89138                 items
89139                     .classed('active', active)
89140                     .selectAll('input')
89141                     .property('checked', active)
89142                     .property('indeterminate', false);
89143
89144
89145                 // user-configurable square threshold
89146                 var degStr = context.storage('validate-square-degrees');
89147                 if (degStr === null) {
89148                     degStr = '' + DEFAULTSQUARE;
89149                 }
89150
89151                 var span = items.selectAll('.square-degrees');
89152                 var input = span.selectAll('.square-degrees-input')
89153                     .data([0]);
89154
89155                 // enter / update
89156                 input.enter()
89157                     .append('input')
89158                     .attr('type', 'number')
89159                     .attr('min', '' + MINSQUARE)
89160                     .attr('max', '' + MAXSQUARE)
89161                     .attr('step', '0.5')
89162                     .attr('class', 'square-degrees-input')
89163                     .call(utilNoAuto)
89164                     .on('input', function() {
89165                         this.style.width = (this.value.length + 2.5) + 'ch';   // resize
89166                     })
89167                     .on('click', function () {
89168                         event.preventDefault();
89169                         event.stopPropagation();
89170                         this.select();
89171                     })
89172                     .on('keyup', function () {
89173                         if (event.keyCode === 13) { // enter
89174                             this.blur();
89175                             this.select();
89176                         }
89177                     })
89178                     .on('blur', changeSquare)
89179                     .merge(input)
89180                     .property('value', degStr)
89181                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
89182             }
89183
89184
89185             function changeSquare() {
89186                 var input = d3_select(this);
89187                 var degStr = utilGetSetValue(input).trim();
89188                 var degNum = parseFloat(degStr, 10);
89189
89190                 if (!isFinite(degNum)) {
89191                     degNum = DEFAULTSQUARE;
89192                 } else if (degNum > MAXSQUARE) {
89193                     degNum = MAXSQUARE;
89194                 } else if (degNum < MINSQUARE) {
89195                     degNum = MINSQUARE;
89196                 }
89197
89198                 degNum = Math.round(degNum * 10 ) / 10;   // round to 1 decimal
89199                 degStr = '' + degNum;
89200
89201                 input
89202                     .property('value', degStr)
89203                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
89204
89205                 context.storage('validate-square-degrees', degStr);
89206                 context.validator().changeSquareThreshold(degNum);
89207             }
89208
89209
89210             function hidePane() {
89211                 context.ui().togglePanes();
89212             }
89213
89214
89215
89216             var paneTooltip = tooltip()
89217                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89218                 .html(true)
89219                 .title(uiTooltipHtml(t('issues.title'), key));
89220
89221
89222
89223             uiIssues.togglePane = function() {
89224                 if (event) event.preventDefault();
89225                 paneTooltip.hide(_toggleButton);
89226                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89227             };
89228
89229
89230             uiIssues.renderToggleButton = function(selection) {
89231                 _toggleButton = selection
89232                     .append('button')
89233                     .attr('tabindex', -1)
89234                     .on('click', uiIssues.togglePane)
89235                     .call(svgIcon('#iD-icon-alert', 'light'))
89236                     .call(addNotificationBadge)
89237                     .call(paneTooltip);
89238             };
89239
89240
89241             uiIssues.renderPane = function(selection) {
89242                 _pane = selection
89243                     .append('div')
89244                     .attr('class', 'fillL map-pane issues-pane hide')
89245                     .attr('pane', 'map-issues');
89246
89247                 var heading = _pane
89248                     .append('div')
89249                     .attr('class', 'pane-heading');
89250
89251                 heading
89252                     .append('h2')
89253                     .text(t('issues.title'));
89254
89255                 heading
89256                     .append('button')
89257                     .on('click', hidePane)
89258                     .call(svgIcon('#iD-icon-close'));
89259
89260                 var content = _pane
89261                     .append('div')
89262                     .attr('class', 'pane-content');
89263
89264                 content
89265                     .append('div')
89266                     .attr('class', 'issues-options')
89267                     .call(renderIssuesOptions);
89268
89269                 content
89270                     .append('div')
89271                     .attr('class', 'issues-none')
89272                     .call(renderNoIssuesBox);
89273
89274                 // errors
89275                 content
89276                     .append('div')
89277                     .attr('class', 'issues-errors')
89278                     .call(uiDisclosure(context, 'issues_errors', true)
89279                         .content(renderErrorsList)
89280                     );
89281
89282                 // warnings
89283                 content
89284                     .append('div')
89285                     .attr('class', 'issues-warnings')
89286                     .call(uiDisclosure(context, 'issues_warnings', true)
89287                         .content(renderWarningsList)
89288                     );
89289
89290                 // rules
89291                 content
89292                     .append('div')
89293                     .attr('class', 'issues-rules')
89294                     .call(uiDisclosure(context, 'issues_rules', false)
89295                         .title(t('issues.rules.title'))
89296                         .content(renderRulesList)
89297                     );
89298
89299                 // update();
89300
89301                 context.keybinding()
89302                     .on(key, uiIssues.togglePane);
89303             };
89304
89305             return uiIssues;
89306         }
89307
89308         function uiSettingsCustomData(context) {
89309             var dispatch$1 = dispatch('change');
89310
89311             function render(selection) {
89312                 var dataLayer = context.layers().layer('data');
89313
89314                 // keep separate copies of original and current settings
89315                 var _origSettings = {
89316                     fileList: (dataLayer && dataLayer.fileList()) || null,
89317                     url: context.storage('settings-custom-data-url')
89318                 };
89319                 var _currSettings = {
89320                     fileList: (dataLayer && dataLayer.fileList()) || null,
89321                     url: context.storage('settings-custom-data-url')
89322                 };
89323
89324                 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
89325                 var modal = uiConfirm(selection).okButton();
89326
89327                 modal
89328                     .classed('settings-modal settings-custom-data', true);
89329
89330                 modal.select('.modal-section.header')
89331                     .append('h3')
89332                     .text(t('settings.custom_data.header'));
89333
89334
89335                 var textSection = modal.select('.modal-section.message-text');
89336
89337                 textSection
89338                     .append('pre')
89339                     .attr('class', 'instructions-file')
89340                     .text(t('settings.custom_data.file.instructions'));
89341
89342                 textSection
89343                     .append('input')
89344                     .attr('class', 'field-file')
89345                     .attr('type', 'file')
89346                     .property('files', _currSettings.fileList)  // works for all except IE11
89347                     .on('change', function() {
89348                         var files = event.target.files;
89349                         if (files && files.length) {
89350                             _currSettings.url = '';
89351                             textSection.select('.field-url').property('value', '');
89352                             _currSettings.fileList = files;
89353                         } else {
89354                             _currSettings.fileList = null;
89355                         }
89356                     });
89357
89358                 textSection
89359                     .append('h4')
89360                     .text(t('settings.custom_data.or'));
89361
89362                 textSection
89363                     .append('pre')
89364                     .attr('class', 'instructions-url')
89365                     .text(t('settings.custom_data.url.instructions'));
89366
89367                 textSection
89368                     .append('textarea')
89369                     .attr('class', 'field-url')
89370                     .attr('placeholder', t('settings.custom_data.url.placeholder'))
89371                     .call(utilNoAuto)
89372                     .property('value', _currSettings.url);
89373
89374
89375                 // insert a cancel button
89376                 var buttonSection = modal.select('.modal-section.buttons');
89377
89378                 buttonSection
89379                     .insert('button', '.ok-button')
89380                     .attr('class', 'button cancel-button secondary-action')
89381                     .text(t('confirm.cancel'));
89382
89383
89384                 buttonSection.select('.cancel-button')
89385                     .on('click.cancel', clickCancel);
89386
89387                 buttonSection.select('.ok-button')
89388                     .attr('disabled', isSaveDisabled)
89389                     .on('click.save', clickSave);
89390
89391
89392                 function isSaveDisabled() {
89393                     return null;
89394                 }
89395
89396
89397                 // restore the original url
89398                 function clickCancel() {
89399                     textSection.select('.field-url').property('value', _origSettings.url);
89400                     context.storage('settings-custom-data-url', _origSettings.url);
89401                     this.blur();
89402                     modal.close();
89403                 }
89404
89405                 // accept the current url
89406                 function clickSave() {
89407                     _currSettings.url = textSection.select('.field-url').property('value').trim();
89408
89409                     // one or the other but not both
89410                     if (_currSettings.url) { _currSettings.fileList = null; }
89411                     if (_currSettings.fileList) { _currSettings.url = ''; }
89412
89413                     context.storage('settings-custom-data-url', _currSettings.url);
89414                     this.blur();
89415                     modal.close();
89416                     dispatch$1.call('change', this, _currSettings);
89417                 }
89418             }
89419
89420             return utilRebind(render, dispatch$1, 'on');
89421         }
89422
89423         function uiMapData(context) {
89424             var key = t('map_data.key');
89425             var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key'));
89426             var features = context.features().keys();
89427             var layers = context.layers();
89428             var fills = ['wireframe', 'partial', 'full'];
89429
89430             var settingsCustomData = uiSettingsCustomData(context)
89431                 .on('change', customChanged);
89432
89433             var _pane = d3_select(null), _toggleButton = d3_select(null);
89434
89435             var _fillSelected = context.storage('area-fill') || 'partial';
89436             var _dataLayerContainer = d3_select(null);
89437             var _photoOverlayContainer = d3_select(null);
89438             var _fillList = d3_select(null);
89439             var _featureList = d3_select(null);
89440             var _QAList = d3_select(null);
89441
89442
89443             function showsFeature(d) {
89444                 return context.features().enabled(d);
89445             }
89446
89447
89448             function autoHiddenFeature(d) {
89449                 if (d.type === 'kr_error') return context.errors().autoHidden(d);
89450                 return context.features().autoHidden(d);
89451             }
89452
89453
89454             function clickFeature(d) {
89455                 context.features().toggle(d);
89456                 update();
89457             }
89458
89459
89460             function showsQA(d) {
89461                 var QAKeys = [d];
89462                 var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
89463                 var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
89464
89465                 function layerSupported(d) {
89466                     return d.layer && d.layer.supported();
89467                 }
89468                 function layerEnabled(d) {
89469                     return layerSupported(d) && d.layer.enabled();
89470                 }
89471
89472                 return layerEnabled(data[0]);
89473             }
89474
89475
89476             function showsFill(d) {
89477                 return _fillSelected === d;
89478             }
89479
89480
89481             function setFill(d) {
89482                 fills.forEach(function(opt) {
89483                     context.surface().classed('fill-' + opt, Boolean(opt === d));
89484                 });
89485
89486                 _fillSelected = d;
89487                 context.storage('area-fill', d);
89488                 if (d !== 'wireframe') {
89489                     context.storage('area-fill-toggle', d);
89490                 }
89491                 update();
89492             }
89493
89494
89495             function showsLayer(which) {
89496                 var layer = layers.layer(which);
89497                 if (layer) {
89498                     return layer.enabled();
89499                 }
89500                 return false;
89501             }
89502
89503
89504             function setLayer(which, enabled) {
89505                 // Don't allow layer changes while drawing - #6584
89506                 var mode = context.mode();
89507                 if (mode && /^draw/.test(mode.id)) return;
89508
89509                 var layer = layers.layer(which);
89510                 if (layer) {
89511                     layer.enabled(enabled);
89512
89513                     if (!enabled && (which === 'osm' || which === 'notes')) {
89514                         context.enter(modeBrowse(context));
89515                     }
89516
89517                     update();
89518                 }
89519             }
89520
89521
89522             function toggleLayer(which) {
89523                 setLayer(which, !showsLayer(which));
89524             }
89525
89526
89527             function drawPhotoItems(selection) {
89528                 var photoKeys = context.photos().overlayLayerIDs();
89529                 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
89530                 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
89531
89532                 function layerSupported(d) {
89533                     return d.layer && d.layer.supported();
89534                 }
89535                 function layerEnabled(d) {
89536                     return layerSupported(d) && d.layer.enabled();
89537                 }
89538
89539                 var ul = selection
89540                     .selectAll('.layer-list-photos')
89541                     .data([0]);
89542
89543                 ul = ul.enter()
89544                     .append('ul')
89545                     .attr('class', 'layer-list layer-list-photos')
89546                     .merge(ul);
89547
89548                 var li = ul.selectAll('.list-item-photos')
89549                     .data(data);
89550
89551                 li.exit()
89552                     .remove();
89553
89554                 var liEnter = li.enter()
89555                     .append('li')
89556                     .attr('class', function(d) {
89557                         var classes = 'list-item-photos list-item-' + d.id;
89558                         if (d.id === 'mapillary-signs') {
89559                             classes += ' indented';
89560                         }
89561                         return classes;
89562                     });
89563
89564                 var labelEnter = liEnter
89565                     .append('label')
89566                     .each(function(d) {
89567                         var titleID;
89568                         if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
89569                         else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
89570                         else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
89571                         else titleID = d.id.replace('-', '_') + '.tooltip';
89572                         d3_select(this)
89573                             .call(tooltip()
89574                                 .title(t(titleID))
89575                                 .placement('top')
89576                             );
89577                     });
89578
89579                 labelEnter
89580                     .append('input')
89581                     .attr('type', 'checkbox')
89582                     .on('change', function(d) { toggleLayer(d.id); });
89583
89584                 labelEnter
89585                     .append('span')
89586                     .text(function(d) {
89587                         var id = d.id;
89588                         if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
89589                         return t(id.replace('-', '_') + '.title');
89590                     });
89591
89592
89593                 // Update
89594                 li
89595                     .merge(liEnter)
89596                     .classed('active', layerEnabled)
89597                     .selectAll('input')
89598                     .property('checked', layerEnabled);
89599             }
89600
89601             function drawPhotoTypeItems(selection) {
89602                 var data = context.photos().allPhotoTypes();
89603
89604                 function typeEnabled(d) {
89605                     return context.photos().showsPhotoType(d);
89606                 }
89607
89608                 var ul = selection
89609                     .selectAll('.layer-list-photo-types')
89610                     .data(context.photos().shouldFilterByPhotoType() ? [0] : []);
89611
89612                 ul.exit()
89613                     .remove();
89614
89615                 ul = ul.enter()
89616                     .append('ul')
89617                     .attr('class', 'layer-list layer-list-photo-types')
89618                     .merge(ul);
89619
89620                 var li = ul.selectAll('.list-item-photo-types')
89621                     .data(data);
89622
89623                 li.exit()
89624                     .remove();
89625
89626                 var liEnter = li.enter()
89627                     .append('li')
89628                     .attr('class', function(d) {
89629                         return 'list-item-photo-types list-item-' + d;
89630                     });
89631
89632                 var labelEnter = liEnter
89633                     .append('label')
89634                     .each(function(d) {
89635                         d3_select(this)
89636                             .call(tooltip()
89637                                 .title(t('photo_overlays.photo_type.' + d + '.tooltip'))
89638                                 .placement('top')
89639                             );
89640                     });
89641
89642                 labelEnter
89643                     .append('input')
89644                     .attr('type', 'checkbox')
89645                     .on('change', function(d) {
89646                         context.photos().togglePhotoType(d);
89647                         update();
89648                     });
89649
89650                 labelEnter
89651                     .append('span')
89652                     .text(function(d) {
89653                         return t('photo_overlays.photo_type.' + d + '.title');
89654                     });
89655
89656
89657                 // Update
89658                 li
89659                     .merge(liEnter)
89660                     .classed('active', typeEnabled)
89661                     .selectAll('input')
89662                     .property('checked', typeEnabled);
89663             }
89664
89665
89666             function drawOsmItems(selection) {
89667                 var osmKeys = ['osm', 'notes'];
89668                 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
89669
89670                 var ul = selection
89671                     .selectAll('.layer-list-osm')
89672                     .data([0]);
89673
89674                 ul = ul.enter()
89675                     .append('ul')
89676                     .attr('class', 'layer-list layer-list-osm')
89677                     .merge(ul);
89678
89679                 var li = ul.selectAll('.list-item')
89680                     .data(osmLayers);
89681
89682                 li.exit()
89683                     .remove();
89684
89685                 var liEnter = li.enter()
89686                     .append('li')
89687                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89688
89689                 var labelEnter = liEnter
89690                     .append('label')
89691                     .each(function(d) {
89692                         if (d.id === 'osm') {
89693                             d3_select(this)
89694                                 .call(tooltip()
89695                                     .html(true)
89696                                     .title(uiTooltipHtml(t('map_data.layers.' + d.id + '.tooltip'), osmDataToggleKey))
89697                                     .placement('bottom')
89698                                 );
89699                         } else {
89700                             d3_select(this)
89701                                 .call(tooltip()
89702                                     .title(t('map_data.layers.' + d.id + '.tooltip'))
89703                                     .placement('bottom')
89704                                 );
89705                         }
89706                     });
89707
89708                 labelEnter
89709                     .append('input')
89710                     .attr('type', 'checkbox')
89711                     .on('change', function(d) { toggleLayer(d.id); });
89712
89713                 labelEnter
89714                     .append('span')
89715                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89716
89717
89718                 // Update
89719                 li
89720                     .merge(liEnter)
89721                     .classed('active', function (d) { return d.layer.enabled(); })
89722                     .selectAll('input')
89723                     .property('checked', function (d) { return d.layer.enabled(); });
89724             }
89725
89726
89727             function drawQAItems(selection) {
89728                 var qaKeys = ['keepRight', 'improveOSM'];
89729                 var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
89730
89731                 var ul = selection
89732                     .selectAll('.layer-list-qa')
89733                     .data([0]);
89734
89735                 ul = ul.enter()
89736                     .append('ul')
89737                     .attr('class', 'layer-list layer-list-qa')
89738                     .merge(ul);
89739
89740                 var li = ul.selectAll('.list-item')
89741                     .data(qaLayers);
89742
89743                 li.exit()
89744                     .remove();
89745
89746                 var liEnter = li.enter()
89747                     .append('li')
89748                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89749
89750                 var labelEnter = liEnter
89751                     .append('label')
89752                     .each(function(d) {
89753                         d3_select(this)
89754                             .call(tooltip()
89755                                 .title(t('map_data.layers.' + d.id + '.tooltip'))
89756                                 .placement('bottom')
89757                             );
89758                     });
89759
89760                 labelEnter
89761                     .append('input')
89762                     .attr('type', 'checkbox')
89763                     .on('change', function(d) { toggleLayer(d.id); });
89764
89765                 labelEnter
89766                     .append('span')
89767                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89768
89769
89770                 // Update
89771                 li
89772                     .merge(liEnter)
89773                     .classed('active', function (d) { return d.layer.enabled(); })
89774                     .selectAll('input')
89775                     .property('checked', function (d) { return d.layer.enabled(); });
89776             }
89777
89778
89779             // Beta feature - sample vector layers to support Detroit Mapping Challenge
89780             // https://github.com/osmus/detroit-mapping-challenge
89781             function drawVectorItems(selection) {
89782                 var dataLayer = layers.layer('data');
89783                 var vtData = [
89784                     {
89785                         name: 'Detroit Neighborhoods/Parks',
89786                         src: 'neighborhoods-parks',
89787                         tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
89788                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89789                     }, {
89790                         name: 'Detroit Composite POIs',
89791                         src: 'composite-poi',
89792                         tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
89793                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89794                     }, {
89795                         name: 'Detroit All-The-Places POIs',
89796                         src: 'alltheplaces-poi',
89797                         tooltip: 'Public domain business location data created by web scrapers.',
89798                         template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
89799                     }
89800                 ];
89801
89802                 // Only show this if the map is around Detroit..
89803                 var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
89804                 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
89805
89806                 var container = selection.selectAll('.vectortile-container')
89807                     .data(showVectorItems ? [0] : []);
89808
89809                 container.exit()
89810                     .remove();
89811
89812                 var containerEnter = container.enter()
89813                     .append('div')
89814                     .attr('class', 'vectortile-container');
89815
89816                 containerEnter
89817                     .append('h4')
89818                     .attr('class', 'vectortile-header')
89819                     .text('Detroit Vector Tiles (Beta)');
89820
89821                 containerEnter
89822                     .append('ul')
89823                     .attr('class', 'layer-list layer-list-vectortile');
89824
89825                 containerEnter
89826                     .append('div')
89827                     .attr('class', 'vectortile-footer')
89828                     .append('a')
89829                     .attr('target', '_blank')
89830                     .attr('tabindex', -1)
89831                     .call(svgIcon('#iD-icon-out-link', 'inline'))
89832                     .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
89833                     .append('span')
89834                     .text('About these layers');
89835
89836                 container = container
89837                     .merge(containerEnter);
89838
89839
89840                 var ul = container.selectAll('.layer-list-vectortile');
89841
89842                 var li = ul.selectAll('.list-item')
89843                     .data(vtData);
89844
89845                 li.exit()
89846                     .remove();
89847
89848                 var liEnter = li.enter()
89849                     .append('li')
89850                     .attr('class', function(d) { return 'list-item list-item-' + d.src; });
89851
89852                 var labelEnter = liEnter
89853                     .append('label')
89854                     .each(function(d) {
89855                         d3_select(this).call(
89856                             tooltip().title(d.tooltip).placement('top')
89857                         );
89858                     });
89859
89860                 labelEnter
89861                     .append('input')
89862                     .attr('type', 'radio')
89863                     .attr('name', 'vectortile')
89864                     .on('change', selectVTLayer);
89865
89866                 labelEnter
89867                     .append('span')
89868                     .text(function(d) { return d.name; });
89869
89870                 // Update
89871                 li
89872                     .merge(liEnter)
89873                     .classed('active', isVTLayerSelected)
89874                     .selectAll('input')
89875                     .property('checked', isVTLayerSelected);
89876
89877
89878                 function isVTLayerSelected(d) {
89879                     return dataLayer && dataLayer.template() === d.template;
89880                 }
89881
89882                 function selectVTLayer(d) {
89883                     context.storage('settings-custom-data-url', d.template);
89884                     if (dataLayer) {
89885                         dataLayer.template(d.template, d.src);
89886                         dataLayer.enabled(true);
89887                     }
89888                 }
89889             }
89890
89891
89892             function drawCustomDataItems(selection) {
89893                 var dataLayer = layers.layer('data');
89894                 var hasData = dataLayer && dataLayer.hasData();
89895                 var showsData = hasData && dataLayer.enabled();
89896
89897                 var ul = selection
89898                     .selectAll('.layer-list-data')
89899                     .data(dataLayer ? [0] : []);
89900
89901                 // Exit
89902                 ul.exit()
89903                     .remove();
89904
89905                 // Enter
89906                 var ulEnter = ul.enter()
89907                     .append('ul')
89908                     .attr('class', 'layer-list layer-list-data');
89909
89910                 var liEnter = ulEnter
89911                     .append('li')
89912                     .attr('class', 'list-item-data');
89913
89914                 liEnter
89915                     .append('button')
89916                     .call(tooltip()
89917                         .title(t('settings.custom_data.tooltip'))
89918                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89919                     )
89920                     .on('click', editCustom)
89921                     .call(svgIcon('#iD-icon-more'));
89922
89923                 liEnter
89924                     .append('button')
89925                     .call(tooltip()
89926                         .title(t('map_data.layers.custom.zoom'))
89927                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89928                     )
89929                     .on('click', function() {
89930                         event.preventDefault();
89931                         event.stopPropagation();
89932                         dataLayer.fitZoom();
89933                     })
89934                     .call(svgIcon('#iD-icon-search'));
89935
89936                 var labelEnter = liEnter
89937                     .append('label')
89938                     .call(tooltip()
89939                         .title(t('map_data.layers.custom.tooltip'))
89940                         .placement('top')
89941                     );
89942
89943                 labelEnter
89944                     .append('input')
89945                     .attr('type', 'checkbox')
89946                     .on('change', function() { toggleLayer('data'); });
89947
89948                 labelEnter
89949                     .append('span')
89950                     .text(t('map_data.layers.custom.title'));
89951
89952                 // Update
89953                 ul = ul
89954                     .merge(ulEnter);
89955
89956                 ul.selectAll('.list-item-data')
89957                     .classed('active', showsData)
89958                     .selectAll('label')
89959                     .classed('deemphasize', !hasData)
89960                     .selectAll('input')
89961                     .property('disabled', !hasData)
89962                     .property('checked', showsData);
89963             }
89964
89965
89966             function editCustom() {
89967                 event.preventDefault();
89968                 context.container()
89969                     .call(settingsCustomData);
89970             }
89971
89972
89973             function customChanged(d) {
89974                 var dataLayer = layers.layer('data');
89975
89976                 if (d && d.url) {
89977                     dataLayer.url(d.url);
89978                 } else if (d && d.fileList) {
89979                     dataLayer.fileList(d.fileList);
89980                 }
89981             }
89982
89983
89984             function drawListItems(selection, data, type, name, change, active) {
89985                 var items = selection.selectAll('li')
89986                     .data(data);
89987
89988                 // Exit
89989                 items.exit()
89990                     .remove();
89991
89992                 // Enter
89993                 var enter = items.enter()
89994                     .append('li')
89995                     .call(tooltip()
89996                         .html(true)
89997                         .title(function(d) {
89998                             var tip = t(name + '.' + d + '.tooltip');
89999                             var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
90000                             if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
90001                                 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
90002                                 tip += '<div>' + msg + '</div>';
90003                             }
90004                             return uiTooltipHtml(tip, key);
90005                         })
90006                         .placement('top')
90007                     );
90008
90009                 var label = enter
90010                     .append('label');
90011
90012                 label
90013                     .append('input')
90014                     .attr('type', type)
90015                     .attr('name', name)
90016                     .on('change', change);
90017
90018                 label
90019                     .append('span')
90020                     .text(function(d) { return t(name + '.' + d + '.description'); });
90021
90022                 // Update
90023                 items = items
90024                     .merge(enter);
90025
90026                 items
90027                     .classed('active', active)
90028                     .selectAll('input')
90029                     .property('checked', active)
90030                     .property('indeterminate', function(d) {
90031                         return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
90032                     });
90033             }
90034
90035
90036             function renderDataLayers(selection) {
90037                 var container = selection.selectAll('.data-layer-container')
90038                     .data([0]);
90039
90040                 _dataLayerContainer = container.enter()
90041                     .append('div')
90042                     .attr('class', 'data-layer-container')
90043                     .merge(container);
90044
90045                 updateDataLayers();
90046             }
90047
90048             function renderPhotoOverlays(selection) {
90049                 var container = selection.selectAll('.photo-overlay-container')
90050                     .data([0]);
90051
90052                 _photoOverlayContainer = container.enter()
90053                     .append('div')
90054                     .attr('class', 'photo-overlay-container')
90055                     .merge(container);
90056
90057                 updatePhotoOverlays();
90058             }
90059
90060
90061             function renderFillList(selection) {
90062                 var container = selection.selectAll('.layer-fill-list')
90063                     .data([0]);
90064
90065                 _fillList = container.enter()
90066                     .append('ul')
90067                     .attr('class', 'layer-list layer-fill-list')
90068                     .merge(container);
90069
90070                 updateFillList();
90071             }
90072
90073
90074             function renderFeatureList(selection) {
90075                 var container = selection.selectAll('.layer-feature-list-container')
90076                     .data([0]);
90077
90078                 var containerEnter = container.enter()
90079                     .append('div')
90080                     .attr('class', 'layer-feature-list-container');
90081
90082                 containerEnter
90083                     .append('ul')
90084                     .attr('class', 'layer-list layer-feature-list');
90085
90086                 var footer = containerEnter
90087                     .append('div')
90088                     .attr('class', 'feature-list-links section-footer');
90089
90090                 footer
90091                     .append('a')
90092                     .attr('class', 'feature-list-link')
90093                     .attr('href', '#')
90094                     .text(t('issues.enable_all'))
90095                     .on('click', function() {
90096                         context.features().enableAll();
90097                     });
90098
90099                 footer
90100                     .append('a')
90101                     .attr('class', 'feature-list-link')
90102                     .attr('href', '#')
90103                     .text(t('issues.disable_all'))
90104                     .on('click', function() {
90105                         context.features().disableAll();
90106                     });
90107
90108                 // Update
90109                 container = container
90110                     .merge(containerEnter);
90111
90112                 _featureList = container.selectAll('.layer-feature-list');
90113
90114                 updateFeatureList();
90115             }
90116
90117             function updatePhotoOverlays() {
90118                 _photoOverlayContainer
90119                     .call(drawPhotoItems)
90120                     .call(drawPhotoTypeItems);
90121             }
90122
90123             function updateDataLayers() {
90124                 _dataLayerContainer
90125                     .call(drawOsmItems)
90126                     .call(drawQAItems)
90127                     .call(drawCustomDataItems)
90128                     .call(drawVectorItems);      // Beta - Detroit mapping challenge
90129             }
90130
90131             function updateFillList() {
90132                 _fillList
90133                     .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
90134             }
90135
90136             function updateFeatureList() {
90137                 _featureList
90138                     .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
90139             }
90140
90141             function update() {
90142
90143                 if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
90144                     updateDataLayers();
90145                 }
90146                 if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) {
90147                     updatePhotoOverlays();
90148                 }
90149                 if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
90150                     updateFillList();
90151                 }
90152                 if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
90153                     updateFeatureList();
90154                 }
90155
90156                 _QAList
90157                     .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
90158             }
90159
90160
90161             function toggleWireframe() {
90162                 if (event) {
90163                     event.preventDefault();
90164                     event.stopPropagation();
90165                 }
90166
90167                 if (_fillSelected === 'wireframe') {
90168                     _fillSelected = context.storage('area-fill-toggle') || 'partial';
90169                 } else {
90170                     _fillSelected = 'wireframe';
90171                 }
90172
90173                 setFill(_fillSelected);
90174                 context.map().pan([0,0]);  // trigger a redraw
90175             }
90176
90177             var paneTooltip = tooltip()
90178                 .placement((textDirection === 'rtl') ? 'right' : 'left')
90179                 .html(true)
90180                 .title(uiTooltipHtml(t('map_data.description'), key));
90181
90182             function hidePane() {
90183                 context.ui().togglePanes();
90184             }
90185
90186             uiMapData.togglePane = function() {
90187                 if (event) event.preventDefault();
90188                 paneTooltip.hide(_toggleButton);
90189                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
90190             };
90191
90192             uiMapData.renderToggleButton = function(selection) {
90193
90194                 _toggleButton = selection
90195                     .append('button')
90196                     .attr('tabindex', -1)
90197                     .on('click', uiMapData.togglePane)
90198                     .call(svgIcon('#iD-icon-data', 'light'))
90199                     .call(paneTooltip);
90200             };
90201
90202
90203             uiMapData.renderPane = function(selection) {
90204
90205                 _pane = selection
90206                     .append('div')
90207                     .attr('class', 'fillL map-pane map-data-pane hide')
90208                     .attr('pane', 'map-data');
90209
90210                 var heading = _pane
90211                     .append('div')
90212                     .attr('class', 'pane-heading');
90213
90214                 heading
90215                     .append('h2')
90216                     .text(t('map_data.title'));
90217
90218                 heading
90219                     .append('button')
90220                     .on('click', hidePane)
90221                     .call(svgIcon('#iD-icon-close'));
90222
90223
90224                 var content = _pane
90225                     .append('div')
90226                     .attr('class', 'pane-content');
90227
90228
90229                 // data layers
90230                 content
90231                     .append('div')
90232                     .attr('class', 'map-data-data-layers')
90233                     .call(uiDisclosure(context, 'data_layers', true)
90234                         .title(t('map_data.data_layers'))
90235                         .content(renderDataLayers)
90236                     );
90237
90238                 // photo overlays
90239                 content
90240                     .append('div')
90241                     .attr('class', 'map-data-photo-overlays')
90242                     .call(uiDisclosure(context, 'photo_overlays', false)
90243                         .title(t('photo_overlays.title'))
90244                         .content(renderPhotoOverlays)
90245                     );
90246
90247                 // area fills
90248                 content
90249                     .append('div')
90250                     .attr('class', 'map-data-area-fills')
90251                     .call(uiDisclosure(context, 'fill_area', false)
90252                         .title(t('map_data.fill_area'))
90253                         .content(renderFillList)
90254                     );
90255
90256                 // feature filters
90257                 content
90258                     .append('div')
90259                     .attr('class', 'map-data-feature-filters')
90260                     .call(uiDisclosure(context, 'map_features', false)
90261                         .title(t('map_data.map_features'))
90262                         .content(renderFeatureList)
90263                     );
90264
90265
90266                 // add listeners
90267                 context.features()
90268                     .on('change.map_data-update', update);
90269
90270                 update();
90271                 setFill(_fillSelected);
90272
90273                 context.keybinding()
90274                     .on(key, uiMapData.togglePane)
90275                     .on(t('area_fill.wireframe.key'), toggleWireframe)
90276                     .on(osmDataToggleKey, function() {
90277                         event.preventDefault();
90278                         event.stopPropagation();
90279                         toggleLayer('osm');
90280                     });
90281             };
90282
90283             return uiMapData;
90284         }
90285
90286         function uiNotice(context) {
90287
90288             return function(selection) {
90289                 var div = selection
90290                     .append('div')
90291                     .attr('class', 'notice');
90292
90293                 var button = div
90294                     .append('button')
90295                     .attr('class', 'zoom-to notice fillD')
90296                     .on('click', function() {
90297                         context.map().zoomEase(context.minEditableZoom());
90298                     })
90299                     .on('wheel', function() {   // let wheel events pass through #4482
90300                         var e2 = new WheelEvent(event.type, event);
90301                         context.surface().node().dispatchEvent(e2);
90302                     });
90303
90304                 button
90305                     .call(svgIcon('#iD-icon-plus', 'pre-text'))
90306                     .append('span')
90307                     .attr('class', 'label')
90308                     .text(t('zoom_in_edit'));
90309
90310
90311                 function disableTooHigh() {
90312                     var canEdit = context.map().zoom() >= context.minEditableZoom();
90313                     div.style('display', canEdit ? 'none' : 'block');
90314                 }
90315
90316                 context.map()
90317                     .on('move.notice', debounce(disableTooHigh, 500));
90318
90319                 disableTooHigh();
90320             };
90321         }
90322
90323         function uiPhotoviewer(context) {
90324
90325             var dispatch$1 = dispatch('resize');
90326
90327             function photoviewer(selection) {
90328                 selection
90329                     .append('button')
90330                     .attr('class', 'thumb-hide')
90331                     .on('click', function () {
90332                         if (services$1.streetside) { services$1.streetside.hideViewer(); }
90333                         if (services$1.mapillary) { services$1.mapillary.hideViewer(); }
90334                         if (services$1.openstreetcam) { services$1.openstreetcam.hideViewer(); }
90335                     })
90336                     .append('div')
90337                     .call(svgIcon('#iD-icon-close'));
90338
90339                 selection
90340                     .append('button')
90341                     .attr('class', 'resize-handle-xy')
90342                     .on(
90343                         'mousedown',
90344                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
90345                     );
90346
90347                 selection
90348                     .append('button')
90349                     .attr('class', 'resize-handle-x')
90350                     .on(
90351                         'mousedown',
90352                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
90353                     );
90354
90355                 selection
90356                     .append('button')
90357                     .attr('class', 'resize-handle-y')
90358                     .on(
90359                         'mousedown',
90360                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
90361                     );
90362
90363                 services$1.streetside.loadViewer(context);
90364                 services$1.mapillary.loadViewer(context);
90365                 services$1.openstreetcam.loadViewer(context);
90366
90367                 function buildResizeListener(target, eventName, dispatch, options) {
90368                     var resizeOnX = !!options.resizeOnX;
90369                     var resizeOnY = !!options.resizeOnY;
90370                     var minHeight = options.minHeight || 240;
90371                     var minWidth = options.minWidth || 320;
90372                     var startX;
90373                     var startY;
90374                     var startWidth;
90375                     var startHeight;
90376
90377                     function startResize() {
90378                         var mapSize = context.map().dimensions();
90379
90380                         if (resizeOnX) {
90381                             var maxWidth = mapSize[0];
90382                             var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
90383                             target.style('width', newWidth + 'px');
90384                         }
90385
90386                         if (resizeOnY) {
90387                             var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
90388                             var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
90389                             target.style('height', newHeight + 'px');
90390                         }
90391
90392                         dispatch.call(eventName, target, utilGetDimensions(target, true));
90393                     }
90394
90395                     function clamp(num, min, max) {
90396                         return Math.max(min, Math.min(num, max));
90397                     }
90398
90399                     function stopResize() {
90400                         d3_select(window)
90401                             .on('.' + eventName, null);
90402                     }
90403
90404                     return function initResize() {
90405                         startX = event.clientX;
90406                         startY = event.clientY;
90407                         startWidth = target.node().getBoundingClientRect().width;
90408                         startHeight = target.node().getBoundingClientRect().height;
90409
90410                         d3_select(window)
90411                             .on('mousemove.' + eventName, startResize, false)
90412                             .on('mouseup.' + eventName, stopResize, false);
90413                     };
90414                 }
90415             }
90416
90417             photoviewer.onMapResize = function() {
90418                 var photoviewer = d3_select('#photoviewer');
90419                 var content = d3_select('#content');
90420                 var mapDimensions = utilGetDimensions(content, true);
90421                 // shrink photo viewer if it is too big
90422                 // (-90 preserves space at top and bottom of map used by menus)
90423                 var photoDimensions = utilGetDimensions(photoviewer, true);
90424                 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
90425                     var setPhotoDimensions = [
90426                         Math.min(photoDimensions[0], mapDimensions[0]),
90427                         Math.min(photoDimensions[1], mapDimensions[1] - 90),
90428                     ];
90429
90430                     photoviewer
90431                         .style('width', setPhotoDimensions[0] + 'px')
90432                         .style('height', setPhotoDimensions[1] + 'px');
90433
90434                     dispatch$1.call('resize', photoviewer, setPhotoDimensions);
90435                 }
90436             };
90437
90438             return utilRebind(photoviewer, dispatch$1, 'on');
90439         }
90440
90441         function uiRestore(context) {
90442
90443             return function(selection) {
90444                 if (!context.history().lock() || !context.history().restorableChanges())
90445                     return;
90446
90447                 var modalSelection = uiModal(selection, true);
90448
90449                 modalSelection.select('.modal')
90450                     .attr('class', 'modal fillL');
90451
90452                 var introModal = modalSelection.select('.content');
90453
90454                 introModal
90455                     .append('div')
90456                     .attr('class', 'modal-section')
90457                     .append('h3')
90458                     .text(t('restore.heading'));
90459
90460                 introModal
90461                     .append('div')
90462                     .attr('class','modal-section')
90463                     .append('p')
90464                     .text(t('restore.description'));
90465
90466                 var buttonWrap = introModal
90467                     .append('div')
90468                     .attr('class', 'modal-actions');
90469
90470                 var restore = buttonWrap
90471                     .append('button')
90472                     .attr('class', 'restore')
90473                     .on('click', function() {
90474                         context.history().restore();
90475                         modalSelection.remove();
90476                     });
90477
90478                 restore
90479                     .append('svg')
90480                     .attr('class', 'logo logo-restore')
90481                     .append('use')
90482                     .attr('xlink:href', '#iD-logo-restore');
90483
90484                 restore
90485                     .append('div')
90486                     .text(t('restore.restore'));
90487
90488                 var reset = buttonWrap
90489                     .append('button')
90490                     .attr('class', 'reset')
90491                     .on('click', function() {
90492                         context.history().clearSaved();
90493                         modalSelection.remove();
90494                     });
90495
90496                 reset
90497                     .append('svg')
90498                     .attr('class', 'logo logo-reset')
90499                     .append('use')
90500                     .attr('xlink:href', '#iD-logo-reset');
90501
90502                 reset
90503                     .append('div')
90504                     .text(t('restore.reset'));
90505
90506                 restore.node().focus();
90507             };
90508         }
90509
90510         function uiScale(context) {
90511             var projection = context.projection,
90512                 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
90513                 maxLength = 180,
90514                 tickHeight = 8;
90515
90516
90517             function scaleDefs(loc1, loc2) {
90518                 var lat = (loc2[1] + loc1[1]) / 2,
90519                     conversion = (isImperial ? 3.28084 : 1),
90520                     dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
90521                     scale = { dist: 0, px: 0, text: '' },
90522                     buckets, i, val, dLon;
90523
90524                 if (isImperial) {
90525                     buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
90526                 } else {
90527                     buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
90528                 }
90529
90530                 // determine a user-friendly endpoint for the scale
90531                 for (i = 0; i < buckets.length; i++) {
90532                     val = buckets[i];
90533                     if (dist >= val) {
90534                         scale.dist = Math.floor(dist / val) * val;
90535                         break;
90536                     } else {
90537                         scale.dist = +dist.toFixed(2);
90538                     }
90539                 }
90540
90541                 dLon = geoMetersToLon(scale.dist / conversion, lat);
90542                 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
90543
90544                 scale.text = displayLength(scale.dist / conversion, isImperial);
90545
90546                 return scale;
90547             }
90548
90549
90550             function update(selection) {
90551                 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
90552                 var dims = context.map().dimensions(),
90553                     loc1 = projection.invert([0, dims[1]]),
90554                     loc2 = projection.invert([maxLength, dims[1]]),
90555                     scale = scaleDefs(loc1, loc2);
90556
90557                 selection.select('#scale-path')
90558                     .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
90559
90560                 selection.select('#scale-textgroup')
90561                     .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
90562
90563                 selection.select('#scale-text')
90564                     .text(scale.text);
90565             }
90566
90567
90568             return function(selection) {
90569                 function switchUnits() {
90570                     isImperial = !isImperial;
90571                     selection.call(update);
90572                 }
90573
90574                 var scalegroup = selection.append('svg')
90575                     .attr('id', 'scale')
90576                     .on('click', switchUnits)
90577                     .append('g')
90578                     .attr('transform', 'translate(10,11)');
90579
90580                 scalegroup
90581                     .append('path')
90582                     .attr('id', 'scale-path');
90583
90584                 scalegroup
90585                     .append('g')
90586                     .attr('id', 'scale-textgroup')
90587                     .append('text')
90588                     .attr('id', 'scale-text');
90589
90590                 selection.call(update);
90591
90592                 context.map().on('move.scale', function() {
90593                     update(selection);
90594                 });
90595             };
90596         }
90597
90598         var pair_1 = pair$1;
90599
90600         function search(x, dims, r) {
90601           if (!dims) dims = 'NSEW';
90602           if (typeof x !== 'string') return { val: null, regex: r };
90603
90604           r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
90605
90606           var m = r.exec(x);
90607           if (!m) return { val: null, regex: r };
90608
90609           var dim = m[1] || m[5];
90610           if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
90611
90612           return {
90613             val: (((m[2]) ? parseFloat(m[2]) : 0) +
90614                   ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
90615                   ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
90616                   ((dim === 'S' || dim === 'W') ? -1 : 1),
90617             regex: r,
90618             raw: m[0],
90619             dim: dim
90620           };
90621         }
90622
90623         function pair$1(x, dims) {
90624           x = x.trim();
90625           var one = search(x, dims);
90626           if (one.val === null) return null;
90627           var two = search(x, dims, one.regex);
90628           if (two.val === null) return null;
90629           // null if one/two are not contiguous.
90630           if (one.raw + two.raw !== x) return null;
90631           if (one.dim) {
90632             return swapdim(one.val, two.val, one.dim);
90633           } else {
90634             return [one.val, two.val];
90635           }
90636         }
90637
90638         function swapdim(a, b, dim) {
90639           if (dim === 'N' || dim === 'S') return [a, b];
90640           if (dim === 'W' || dim === 'E') return [b, a];
90641         }
90642
90643         function uiFeatureList(context) {
90644             var _geocodeResults;
90645
90646
90647             function featureList(selection) {
90648                 var header = selection
90649                     .append('div')
90650                     .attr('class', 'header fillL cf');
90651
90652                 header
90653                     .append('h3')
90654                     .text(t('inspector.feature_list'));
90655
90656                 var searchWrap = selection
90657                     .append('div')
90658                     .attr('class', 'search-header');
90659
90660                 var search = searchWrap
90661                     .append('input')
90662                     .attr('placeholder', t('inspector.search'))
90663                     .attr('type', 'search')
90664                     .call(utilNoAuto)
90665                     .on('keypress', keypress)
90666                     .on('keydown', keydown)
90667                     .on('input', inputevent);
90668
90669                 searchWrap
90670                     .call(svgIcon('#iD-icon-search', 'pre-text'));
90671
90672                 var listWrap = selection
90673                     .append('div')
90674                     .attr('class', 'inspector-body');
90675
90676                 var list = listWrap
90677                     .append('div')
90678                     .attr('class', 'feature-list cf');
90679
90680                 context
90681                     .on('exit.feature-list', clearSearch);
90682                 context.map()
90683                     .on('drawn.feature-list', mapDrawn);
90684
90685                 context.keybinding()
90686                     .on(uiCmd('⌘F'), focusSearch);
90687
90688
90689                 function focusSearch() {
90690                     var mode = context.mode() && context.mode().id;
90691                     if (mode !== 'browse') return;
90692
90693                     event.preventDefault();
90694                     search.node().focus();
90695                 }
90696
90697
90698                 function keydown() {
90699                     if (event.keyCode === 27) {  // escape
90700                         search.node().blur();
90701                     }
90702                 }
90703
90704
90705                 function keypress() {
90706                     var q = search.property('value'),
90707                         items = list.selectAll('.feature-list-item');
90708                     if (event.keyCode === 13 && q.length && items.size()) {  // return
90709                         click(items.datum());
90710                     }
90711                 }
90712
90713
90714                 function inputevent() {
90715                     _geocodeResults = undefined;
90716                     drawList();
90717                 }
90718
90719
90720                 function clearSearch() {
90721                     search.property('value', '');
90722                     drawList();
90723                 }
90724
90725
90726                 function mapDrawn(e) {
90727                     if (e.full) {
90728                         drawList();
90729                     }
90730                 }
90731
90732
90733                 function features() {
90734                     var entities = {};
90735                     var result = [];
90736                     var graph = context.graph();
90737                     var q = search.property('value').toLowerCase();
90738
90739                     if (!q) return result;
90740
90741                     var idMatch = q.match(/^([nwr])([0-9]+)$/);
90742
90743                     if (idMatch) {
90744                         result.push({
90745                             id: idMatch[0],
90746                             geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
90747                             type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
90748                             name: idMatch[2]
90749                         });
90750                     }
90751
90752                     var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
90753
90754                     if (locationMatch) {
90755                         var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
90756                         result.push({
90757                             id: -1,
90758                             geometry: 'point',
90759                             type: t('inspector.location'),
90760                             name: dmsCoordinatePair([loc[1], loc[0]]),
90761                             location: loc
90762                         });
90763                     }
90764
90765                     function addEntity(entity) {
90766                         if (entity.id in entities || result.length > 200)
90767                             return;
90768
90769                         entities[entity.id] = true;
90770
90771                         var name = utilDisplayName(entity) || '';
90772                         if (name.toLowerCase().indexOf(q) >= 0) {
90773                             var matched = context.presets().match(entity, graph);
90774                             var type = (matched && matched.name()) || utilDisplayType(entity.id);
90775
90776                             result.push({
90777                                 id: entity.id,
90778                                 entity: entity,
90779                                 geometry: context.geometry(entity.id),
90780                                 type: type,
90781                                 name: name
90782                             });
90783                         }
90784
90785                         graph.parentRelations(entity).forEach(function(parent) {
90786                             addEntity(parent);
90787                         });
90788                     }
90789
90790                     var visible = context.surface().selectAll('.point, .line, .area').nodes();
90791                     for (var i = 0; i < visible.length && result.length <= 200; i++) {
90792                         var datum = visible[i].__data__;
90793                         var entity = datum && datum.properties && datum.properties.entity;
90794                         if (entity) { addEntity(entity); }
90795                     }
90796
90797                     (_geocodeResults || []).forEach(function(d) {
90798                         if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
90799
90800                             // Make a temporary osmEntity so we can preset match
90801                             // and better localize the search result - #4725
90802                             var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
90803                             var tags = {};
90804                             tags[d.class] = d.type;
90805
90806                             var attrs = { id: id, type: d.osm_type, tags: tags };
90807                             if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
90808                                 attrs.nodes = ['a','a'];  // so that geometry area is possible
90809                             }
90810
90811                             var tempEntity = osmEntity(attrs);
90812                             var tempGraph = coreGraph([tempEntity]);
90813                             var matched = context.presets().match(tempEntity, tempGraph);
90814                             var type = (matched && matched.name()) || utilDisplayType(id);
90815
90816                             result.push({
90817                                 id: tempEntity.id,
90818                                 geometry: tempEntity.geometry(tempGraph),
90819                                 type: type,
90820                                 name: d.display_name,
90821                                 extent: new geoExtent(
90822                                     [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
90823                                     [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
90824                             });
90825                         }
90826                     });
90827
90828                     return result;
90829                 }
90830
90831
90832                 function drawList() {
90833                     var value = search.property('value');
90834                     var results = features();
90835
90836                     list.classed('filtered', value.length);
90837
90838                     var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
90839
90840                     var resultsIndicator = list.selectAll('.no-results-item')
90841                         .data([0])
90842                         .enter()
90843                         .append('button')
90844                         .property('disabled', true)
90845                         .attr('class', 'no-results-item')
90846                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
90847
90848                     resultsIndicator.append('span')
90849                         .attr('class', 'entity-name');
90850
90851                     list.selectAll('.no-results-item .entity-name')
90852                         .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
90853
90854                     if (services$1.geocoder) {
90855                       list.selectAll('.geocode-item')
90856                           .data([0])
90857                           .enter()
90858                           .append('button')
90859                           .attr('class', 'geocode-item')
90860                           .on('click', geocoderSearch)
90861                           .append('div')
90862                           .attr('class', 'label')
90863                           .append('span')
90864                           .attr('class', 'entity-name')
90865                           .text(t('geocoder.search'));
90866                     }
90867
90868                     list.selectAll('.no-results-item')
90869                         .style('display', (value.length && !results.length) ? 'block' : 'none');
90870
90871                     list.selectAll('.geocode-item')
90872                         .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
90873
90874                     list.selectAll('.feature-list-item')
90875                         .data([-1])
90876                         .remove();
90877
90878                     var items = list.selectAll('.feature-list-item')
90879                         .data(results, function(d) { return d.id; });
90880
90881                     var enter = items.enter()
90882                         .insert('button', '.geocode-item')
90883                         .attr('class', 'feature-list-item')
90884                         .on('mouseover', mouseover)
90885                         .on('mouseout', mouseout)
90886                         .on('click', click);
90887
90888                     var label = enter
90889                         .append('div')
90890                         .attr('class', 'label');
90891
90892                     label
90893                         .each(function(d) {
90894                             d3_select(this)
90895                                 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
90896                         });
90897
90898                     label
90899                         .append('span')
90900                         .attr('class', 'entity-type')
90901                         .text(function(d) { return d.type; });
90902
90903                     label
90904                         .append('span')
90905                         .attr('class', 'entity-name')
90906                         .text(function(d) { return d.name; });
90907
90908                     enter
90909                         .style('opacity', 0)
90910                         .transition()
90911                         .style('opacity', 1);
90912
90913                     items.order();
90914
90915                     items.exit()
90916                         .remove();
90917                 }
90918
90919
90920                 function mouseover(d) {
90921                     if (d.id === -1) return;
90922
90923                     context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
90924                         .classed('hover', true);
90925                 }
90926
90927
90928                 function mouseout() {
90929                     context.surface().selectAll('.hover')
90930                         .classed('hover', false);
90931                 }
90932
90933
90934                 function click(d) {
90935                     event.preventDefault();
90936                     if (d.location) {
90937                         context.map().centerZoomEase([d.location[1], d.location[0]], 19);
90938                     }
90939                     else if (d.entity) {
90940                         if (d.entity.type === 'node') {
90941                             context.map().center(d.entity.loc);
90942                         } else if (d.entity.type === 'way') {
90943                             var center = context.projection(context.map().center());
90944                             var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
90945                             context.map().center(edge.loc);
90946                         }
90947                         context.enter(modeSelect(context, [d.entity.id]));
90948                     } else {
90949                         context.zoomToEntity(d.id);
90950                     }
90951                 }
90952
90953
90954                 function geocoderSearch() {
90955                     services$1.geocoder.search(search.property('value'), function (err, resp) {
90956                         _geocodeResults = resp || [];
90957                         drawList();
90958                     });
90959                 }
90960             }
90961
90962
90963             return featureList;
90964         }
90965
90966         function uiPresetFavoriteButton(preset, geom, context, klass) {
90967
90968             geom = context.presets().fallback(geom).id;
90969
90970             var presetFavorite = {};
90971
90972             var _button = d3_select(null);
90973
90974
90975             presetFavorite.button = function(selection) {
90976
90977                 _button = selection.selectAll('.preset-favorite-button')
90978                     .data( []);
90979
90980                 _button.exit().remove();
90981
90982                 _button = _button.enter()
90983                     .insert('button', '.tag-reference-button')
90984                     .attr('class', 'preset-favorite-button ' + klass)
90985                     .attr('title', t('icons.favorite'))
90986                     .attr('tabindex', -1)
90987                     .call(svgIcon('#iD-icon-favorite'))
90988                     .merge(_button);
90989
90990                 _button
90991                     .on('click', function () {
90992                         event.stopPropagation();
90993                         event.preventDefault();
90994
90995                         context.presets().toggleFavorite(preset, geom);
90996
90997                         update();
90998                     });
90999
91000                 update();
91001             };
91002
91003             function update() {
91004                 _button
91005                     .classed('active', context.presets().favoriteMatching(preset, geom));
91006             }
91007
91008             context.presets().on('favoritePreset.button-' + preset.id.replace(/[^a-zA-Z\d:]/g, '-') + '-' + geom, update);
91009
91010             return presetFavorite;
91011         }
91012
91013         function uiPresetIcon(context) {
91014             var preset, geometry, sizeClass = 'medium';
91015
91016             function isSmall() {
91017                 return sizeClass === 'small';
91018             }
91019
91020
91021             function presetIcon(selection) {
91022                 selection.each(render);
91023             }
91024
91025
91026             function getIcon(p, geom) {
91027                 if (isSmall() && p.isFallback && p.isFallback())
91028                     return 'iD-icon-' + p.id;
91029                 else if (p.icon)
91030                     return p.icon;
91031                 else if (geom === 'line')
91032                     return 'iD-other-line';
91033                 else if (geom === 'vertex')
91034                     return p.isFallback() ? '' : 'temaki-vertex';
91035                 else if (isSmall() && geom === 'point')
91036                     return '';
91037                 else
91038                     return 'maki-marker-stroked';
91039             }
91040
91041             function renderPointBorder(enter) {
91042                 var w = 40, h = 40;
91043                 enter = enter
91044                     .append('svg')
91045                     .attr('class', 'preset-icon-fill preset-icon-point-border')
91046                     .attr('width', w)
91047                     .attr('height', h)
91048                     .attr('viewBox', '0 0 ' + w + ' ' + h);
91049
91050                 enter.append('path')
91051                     .attr('transform', 'translate(11.5, 8)')
91052                     .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
91053             }
91054
91055             function renderCircleFill(fillEnter) {
91056                 var w = 60, h = 60, d = 40;
91057                 fillEnter = fillEnter
91058                     .append('svg')
91059                     .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
91060                     .attr('width', w)
91061                     .attr('height', h)
91062                     .attr('viewBox', '0 0 ' + w + ' ' + h);
91063
91064                 fillEnter.append('circle')
91065                     .attr('cx', w/2)
91066                     .attr('cy', h/2)
91067                     .attr('r', d/2);
91068             }
91069
91070             function renderSquareFill(fillEnter) {
91071                 var d = isSmall() ? 40 : 60;
91072                 var w = d, h = d, l = d*2/3, c1 = (w-l)/2, c2 = c1 + l;
91073                 fillEnter = fillEnter
91074                     .append('svg')
91075                     .attr('class', 'preset-icon-fill preset-icon-fill-area')
91076                     .attr('width', w)
91077                     .attr('height', h)
91078                     .attr('viewBox', '0 0 ' + w + ' ' + h);
91079
91080                 var data = 'M' + c1 + ' ' + c1 + ' L' + c1 + ' ' + c2 + ' L' + c2 + ' ' + c2 + ' L' + c2 + ' ' + c1 + ' Z';
91081
91082                 fillEnter.append('path')
91083                     .attr('d', data)
91084                     .attr('class', 'line area fill');
91085
91086                 fillEnter.append('path')
91087                     .attr('d', data)
91088                     .attr('class', 'line area stroke');
91089
91090                 var r = 2.5;
91091                 var coordinates = [c1, c2];
91092                 for (var xIndex in coordinates) {
91093                     for (var yIndex in coordinates) {
91094                         fillEnter.append('circle')
91095                             .attr('class', 'vertex')
91096                             .attr('cx', coordinates[xIndex])
91097                             .attr('cy', coordinates[yIndex])
91098                             .attr('r', r);
91099                     }
91100                 }
91101
91102                 if (!isSmall()) {
91103                     var midCoordinates = [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]];
91104                     for (var index in midCoordinates) {
91105                         var loc = midCoordinates[index];
91106                         fillEnter.append('circle')
91107                             .attr('class', 'midpoint')
91108                             .attr('cx', loc[0])
91109                             .attr('cy', loc[1])
91110                             .attr('r', 1.25);
91111                     }
91112                 }
91113
91114             }
91115
91116             function renderLine(lineEnter) {
91117                 var d = isSmall() ? 40 : 60;
91118                 // draw the line parametrically
91119                 var w = d, h = d, y = Math.round(d*0.72), l = Math.round(d*0.6), r = 2.5;
91120                 var x1 = (w - l)/2, x2 = x1 + l;
91121
91122                 lineEnter = lineEnter
91123                     .append('svg')
91124                     .attr('class', 'preset-icon-line')
91125                     .attr('width', w)
91126                     .attr('height', h)
91127                     .attr('viewBox', '0 0 ' + w + ' ' + h);
91128
91129                 ['casing', 'stroke'].forEach(function(klass) {
91130                     lineEnter.append('path')
91131                         .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
91132                         .attr('class', 'line ' + klass);
91133                 });
91134
91135                 [[x1 - 1, y], [x2 + 1, y]].forEach(function(loc) {
91136                     lineEnter.append('circle')
91137                         .attr('class', 'vertex')
91138                         .attr('cx', loc[0])
91139                         .attr('cy', loc[1])
91140                         .attr('r', r);
91141                 });
91142             }
91143
91144             function renderRoute(routeEnter) {
91145                 var d = isSmall() ? 40 : 60;
91146                 // draw the route parametrically
91147                 var w = d,
91148                     h = d,
91149                     y1 = Math.round(d*0.80),
91150                     y2 = Math.round(d*0.68),
91151                     l = Math.round(d*0.6),
91152                     r = 2;
91153                 var x1 = (w - l)/2, x2 = x1 + l/3, x3 = x2 + l/3, x4 = x3 + l/3;
91154
91155                 routeEnter = routeEnter
91156                     .append('svg')
91157                     .attr('class', 'preset-icon-route')
91158                     .attr('width', w)
91159                     .attr('height', h)
91160                     .attr('viewBox', '0 0 ' + w + ' ' + h);
91161
91162                 ['casing', 'stroke'].forEach(function(klass) {
91163                     routeEnter.append('path')
91164                         .attr('d', 'M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2)
91165                         .attr('class', 'segment0 line ' + klass);
91166                     routeEnter.append('path')
91167                         .attr('d', 'M' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y1)
91168                         .attr('class', 'segment1 line ' + klass);
91169                     routeEnter.append('path')
91170                         .attr('d', 'M' + x3 + ' ' + y1 + ' L' + x4 + ' ' + y2)
91171                         .attr('class', 'segment2 line ' + klass);
91172                 });
91173
91174                 [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function(loc) {
91175                     routeEnter.append('circle')
91176                         .attr('class', 'vertex')
91177                         .attr('cx', loc[0])
91178                         .attr('cy', loc[1])
91179                         .attr('r', r);
91180                 });
91181             }
91182
91183             var routeSegements = {
91184                 bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
91185                 bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
91186                 detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
91187                 ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
91188                 foot: ['highway/footway', 'highway/footway', 'highway/footway'],
91189                 hiking: ['highway/path', 'highway/path', 'highway/path'],
91190                 horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
91191                 light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
91192                 monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
91193                 pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
91194                 piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
91195                 power: ['power/line', 'power/line', 'power/line'],
91196                 road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
91197                 subway: ['railway/subway', 'railway/subway', 'railway/subway'],
91198                 train: ['railway/rail', 'railway/rail', 'railway/rail'],
91199                 tram: ['railway/tram', 'railway/tram', 'railway/tram'],
91200                 waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
91201             };
91202
91203             function render() {
91204
91205                 var p = preset.apply(this, arguments);
91206                 var isFallback = isSmall() && p.isFallback && p.isFallback();
91207                 var geom = geometry ? geometry.apply(this, arguments) : null;
91208                 if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegements[p.tags.route]) || p.tags.type === 'waterway')) {
91209                     geom = 'route';
91210                 }
91211                 var imageURL = p.imageURL;
91212                 var picon = imageURL ? null : getIcon(p, geom);
91213                 var isMaki = picon && /^maki-/.test(picon);
91214                 var isTemaki = picon && /^temaki-/.test(picon);
91215                 var isFa = picon && /^fa[srb]-/.test(picon);
91216                 var isTnp = picon && /^tnp-/.test(picon);
91217                 var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
91218                 var isCategory = !p.setTags;
91219                 var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
91220                 var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
91221                 var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
91222                 var drawArea = picon && geom === 'area' && !isFallback;
91223                 var drawRoute = picon && geom === 'route';
91224                 var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
91225
91226                 var tags = !isCategory ? p.setTags({}, geom) : {};
91227                 for (var k in tags) {
91228                     if (tags[k] === '*') {
91229                         tags[k] = 'yes';
91230                     }
91231                 }
91232                 var tagClasses = svgTagClasses().getClassesString(tags, '');
91233
91234                 var selection = d3_select(this);
91235
91236                 var container = selection.selectAll('.preset-icon-container')
91237                     .data([0]);
91238
91239                 container = container.enter()
91240                     .append('div')
91241                     .attr('class', 'preset-icon-container ' + sizeClass)
91242                     .merge(container);
91243
91244                 container.classed('fallback', isFallback);
91245
91246                 var imageIcon = container.selectAll('img.image-icon')
91247                     .data(imageURL ? [0] : []);
91248
91249                 imageIcon.exit()
91250                     .remove();
91251
91252                 imageIcon = imageIcon.enter()
91253                     .append('img')
91254                     .attr('class', 'image-icon')
91255                     .merge(imageIcon);
91256
91257                 imageIcon
91258                     .attr('src', imageURL);
91259
91260                 var pointBorder = container.selectAll('.preset-icon-point-border')
91261                     .data(drawPoint ? [0] : []);
91262
91263                 pointBorder.exit()
91264                     .remove();
91265
91266                 var pointBorderEnter = pointBorder.enter();
91267                 renderPointBorder(pointBorderEnter);
91268                 pointBorder = pointBorderEnter.merge(pointBorder);
91269
91270
91271                 var vertexFill = container.selectAll('.preset-icon-fill-vertex')
91272                     .data(drawVertex ? [0] : []);
91273
91274                 vertexFill.exit()
91275                     .remove();
91276
91277                 var vertexFillEnter = vertexFill.enter();
91278                 renderCircleFill(vertexFillEnter);
91279                 vertexFill = vertexFillEnter.merge(vertexFill);
91280
91281
91282                 var fill = container.selectAll('.preset-icon-fill-area')
91283                     .data(drawArea ? [0] : []);
91284
91285                 fill.exit()
91286                     .remove();
91287
91288                 var fillEnter = fill.enter();
91289                 renderSquareFill(fillEnter);
91290                 fill = fillEnter.merge(fill);
91291
91292                 fill.selectAll('path.stroke')
91293                     .attr('class', 'area stroke ' + tagClasses);
91294                 fill.selectAll('path.fill')
91295                     .attr('class', 'area fill ' + tagClasses);
91296
91297
91298                 var line = container.selectAll('.preset-icon-line')
91299                     .data(drawLine ? [0] : []);
91300
91301                 line.exit()
91302                     .remove();
91303
91304                 var lineEnter = line.enter();
91305                 renderLine(lineEnter);
91306
91307                 line = lineEnter.merge(line);
91308
91309                 line.selectAll('path.stroke')
91310                     .attr('class', 'line stroke ' + tagClasses);
91311                 line.selectAll('path.casing')
91312                     .attr('class', 'line casing ' + tagClasses);
91313
91314                 var route = container.selectAll('.preset-icon-route')
91315                     .data(drawRoute ? [0] : []);
91316
91317                 route.exit()
91318                     .remove();
91319
91320                 var routeEnter = route.enter();
91321                 renderRoute(routeEnter);
91322
91323                 route = routeEnter.merge(route);
91324
91325                 if (drawRoute) {
91326                     var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
91327                     var segmentPresetIDs = routeSegements[routeType];
91328                     for (var segmentIndex in segmentPresetIDs) {
91329                         var segmentPreset = context.presets().item(segmentPresetIDs[segmentIndex]);
91330                         var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
91331                         route.selectAll('path.stroke.segment' + segmentIndex)
91332                             .attr('class', 'segment' + segmentIndex + ' line stroke ' + segmentTagClasses);
91333                         route.selectAll('path.casing.segment' + segmentIndex)
91334                             .attr('class', 'segment' + segmentIndex + ' line casing ' + segmentTagClasses);
91335                     }
91336
91337                 }
91338
91339
91340                 var icon = container.selectAll('.preset-icon')
91341                     .data(picon ? [0] : []);
91342
91343                 icon.exit()
91344                     .remove();
91345
91346                 icon = icon.enter()
91347                     .append('div')
91348                     .attr('class', 'preset-icon')
91349                     .call(svgIcon(''))
91350                     .merge(icon);
91351
91352                 icon
91353                     .attr('class', 'preset-icon ' + (geom ? geom + '-geom' : ''))
91354                     .classed('framed', isFramed)
91355                     .classed('preset-icon-iD', isiDIcon);
91356
91357                 icon.selectAll('svg')
91358                     .attr('class', function() {
91359                         return 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line'  ? '' : tagClasses);
91360                     });
91361
91362                 icon.selectAll('use')
91363                     .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
91364
91365             }
91366
91367
91368             presetIcon.preset = function(val) {
91369                 if (!arguments.length) return preset;
91370                 preset = utilFunctor(val);
91371                 return presetIcon;
91372             };
91373
91374
91375             presetIcon.geometry = function(val) {
91376                 if (!arguments.length) return geometry;
91377                 geometry = utilFunctor(val);
91378                 return presetIcon;
91379             };
91380
91381
91382             presetIcon.sizeClass = function(val) {
91383                 if (!arguments.length) return sizeClass;
91384                 sizeClass = val;
91385                 return presetIcon;
91386             };
91387
91388             return presetIcon;
91389         }
91390
91391         function uiRawMemberEditor(context) {
91392             var taginfo = services$1.taginfo;
91393             var _entityID;
91394             var _contentSelection = d3_select(null);
91395             var _maxMembers = 1000;
91396
91397             function downloadMember(d) {
91398                 event.preventDefault();
91399
91400                 // display the loading indicator
91401                 d3_select(this.parentNode).classed('tag-reference-loading', true);
91402                 context.loadEntity(d.id, function() {
91403                     updateDisclosureContent(_contentSelection);
91404                 });
91405             }
91406
91407             function zoomToMember(d) {
91408                 event.preventDefault();
91409
91410                 var entity = context.entity(d.id);
91411                 context.map().zoomTo(entity);
91412
91413                 // highlight the feature in case it wasn't previously on-screen
91414                 utilHighlightEntities([d.id], true, context);
91415             }
91416
91417
91418             function selectMember(d) {
91419                 event.preventDefault();
91420
91421                 // remove the hover-highlight styling
91422                 utilHighlightEntities([d.id], false, context);
91423
91424                 var entity = context.entity(d.id);
91425                 var mapExtent = context.map().extent();
91426                 if (!entity.intersects(mapExtent, context.graph())) {
91427                     // zoom to the entity if its extent is not visible now
91428                     context.map().zoomToEase(entity);
91429                 }
91430
91431                 context.enter(modeSelect(context, [d.id]));
91432             }
91433
91434
91435             function changeRole(d) {
91436                 var oldRole = d.role;
91437                 var newRole = d3_select(this).property('value');
91438
91439                 if (oldRole !== newRole) {
91440                     var member = { id: d.id, type: d.type, role: newRole };
91441                     context.perform(
91442                         actionChangeMember(d.relation.id, member, d.index),
91443                         t('operations.change_role.annotation')
91444                     );
91445                 }
91446             }
91447
91448
91449             function deleteMember(d) {
91450
91451                 // remove the hover-highlight styling
91452                 utilHighlightEntities([d.id], false, context);
91453
91454                 context.perform(
91455                     actionDeleteMember(d.relation.id, d.index),
91456                     t('operations.delete_member.annotation')
91457                 );
91458
91459                 if (!context.hasEntity(d.relation.id)) {
91460                     context.enter(modeBrowse(context));
91461                 }
91462             }
91463
91464             function updateDisclosureContent(selection) {
91465                 _contentSelection = selection;
91466
91467                 var memberships = [];
91468                 var entity = context.entity(_entityID);
91469                 entity.members.slice(0, _maxMembers).forEach(function(member, index) {
91470                     memberships.push({
91471                         index: index,
91472                         id: member.id,
91473                         type: member.type,
91474                         role: member.role,
91475                         relation: entity,
91476                         member: context.hasEntity(member.id)
91477                     });
91478                 });
91479
91480                 var list = selection.selectAll('.member-list')
91481                     .data([0]);
91482
91483                 list = list.enter()
91484                     .append('ul')
91485                     .attr('class', 'member-list')
91486                     .merge(list);
91487
91488
91489                 var items = list.selectAll('li')
91490                     .data(memberships, function(d) {
91491                         return osmEntity.key(d.relation) + ',' + d.index + ',' +
91492                             (d.member ? osmEntity.key(d.member) : 'incomplete');
91493                     });
91494
91495                 items.exit()
91496                     .each(unbind)
91497                     .remove();
91498
91499                 var itemsEnter = items.enter()
91500                     .append('li')
91501                     .attr('class', 'member-row form-field')
91502                     .classed('member-incomplete', function(d) { return !d.member; });
91503
91504                 itemsEnter
91505                     .each(function(d) {
91506                         var item = d3_select(this);
91507
91508                         var label = item
91509                             .append('label')
91510                             .attr('class', 'field-label');
91511
91512                         if (d.member) {
91513                             // highlight the member feature in the map while hovering on the list item
91514                             item
91515                                 .on('mouseover', function() {
91516                                     utilHighlightEntities([d.id], true, context);
91517                                 })
91518                                 .on('mouseout', function() {
91519                                     utilHighlightEntities([d.id], false, context);
91520                                 });
91521
91522                             var labelLink = label
91523                                 .append('span')
91524                                 .attr('class', 'label-text')
91525                                 .append('a')
91526                                 .attr('href', '#')
91527                                 .on('click', selectMember);
91528
91529                             labelLink
91530                                 .append('span')
91531                                 .attr('class', 'member-entity-type')
91532                                 .text(function(d) {
91533                                     var matched = context.presets().match(d.member, context.graph());
91534                                     return (matched && matched.name()) || utilDisplayType(d.member.id);
91535                                 });
91536
91537                             labelLink
91538                                 .append('span')
91539                                 .attr('class', 'member-entity-name')
91540                                 .text(function(d) { return utilDisplayName(d.member); });
91541
91542                             label
91543                                 .append('button')
91544                                 .attr('class', 'member-zoom')
91545                                 .attr('title', t('icons.zoom_to'))
91546                                 .attr('tabindex', -1)
91547                                 .call(svgIcon('#iD-icon-geolocate'))
91548                                 .on('click', zoomToMember);
91549
91550                         } else {
91551                             var labelText = label
91552                                 .append('span')
91553                                 .attr('class', 'label-text');
91554
91555                             labelText
91556                                 .append('span')
91557                                 .attr('class', 'member-entity-type')
91558                                 .text(t('inspector.' + d.type, { id: d.id }));
91559
91560                             labelText
91561                                 .append('span')
91562                                 .attr('class', 'member-entity-name')
91563                                 .text(t('inspector.incomplete', { id: d.id }));
91564
91565                             label
91566                                 .append('button')
91567                                 .attr('class', 'member-download')
91568                                 .attr('title', t('icons.download'))
91569                                 .attr('tabindex', -1)
91570                                 .call(svgIcon('#iD-icon-load'))
91571                                 .on('click', downloadMember);
91572                         }
91573                     });
91574
91575                 var wrapEnter = itemsEnter
91576                     .append('div')
91577                     .attr('class', 'form-field-input-wrap form-field-input-member');
91578
91579                 wrapEnter
91580                     .append('input')
91581                     .attr('class', 'member-role')
91582                     .property('type', 'text')
91583                     .attr('maxlength', 255)
91584                     .attr('placeholder', t('inspector.role'))
91585                     .call(utilNoAuto);
91586
91587                 wrapEnter
91588                     .append('button')
91589                     .attr('tabindex', -1)
91590                     .attr('title', t('icons.remove'))
91591                     .attr('class', 'remove form-field-button member-delete')
91592                     .call(svgIcon('#iD-operation-delete'));
91593
91594                 if (taginfo) {
91595                     wrapEnter.each(bindTypeahead);
91596                 }
91597
91598                 var dragOrigin, targetIndex;
91599
91600                 itemsEnter.call(d3_drag()
91601                     .on('start', function() {
91602                         dragOrigin = {
91603                             x: event.x,
91604                             y: event.y
91605                         };
91606                         targetIndex = null;
91607                     })
91608                     .on('drag', function(d, index) {
91609                         var x = event.x - dragOrigin.x,
91610                             y = event.y - dragOrigin.y;
91611
91612                         if (!d3_select(this).classed('dragging') &&
91613                             // don't display drag until dragging beyond a distance threshold
91614                             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
91615
91616                         d3_select(this)
91617                             .classed('dragging', true);
91618
91619                         targetIndex = null;
91620
91621                         selection.selectAll('li.member-row')
91622                             .style('transform', function(d2, index2) {
91623                                 var node = d3_select(this).node();
91624                                 if (index === index2) {
91625                                     return 'translate(' + x + 'px, ' + y + 'px)';
91626                                 } else if (index2 > index && event.y > node.offsetTop - node.offsetHeight) {
91627                                     if (targetIndex === null || index2 > targetIndex) {
91628                                         targetIndex = index2;
91629                                     }
91630                                     return 'translateY(-100%)';
91631                                 } else if (index2 < index && event.y < node.offsetTop) {
91632                                     if (targetIndex === null || index2 < targetIndex) {
91633                                         targetIndex = index2;
91634                                     }
91635                                     return 'translateY(100%)';
91636                                 }
91637                                 return null;
91638                             });
91639                     })
91640                     .on('end', function(d, index) {
91641
91642                         if (!d3_select(this).classed('dragging')) {
91643                             return;
91644                         }
91645
91646                         d3_select(this)
91647                             .classed('dragging', false);
91648
91649                         selection.selectAll('li.member-row')
91650                             .style('transform', null);
91651
91652                         if (targetIndex !== null) {
91653                             // dragged to a new position, reorder
91654                             context.perform(
91655                                 actionMoveMember(d.relation.id, index, targetIndex),
91656                                 t('operations.reorder_members.annotation')
91657                             );
91658                         }
91659                     })
91660                 );
91661
91662
91663                 // update
91664                 items = items
91665                     .merge(itemsEnter);
91666
91667                 items.select('input.member-role')
91668                     .property('value', function(d) { return d.role; })
91669                     .on('blur', changeRole)
91670                     .on('change', changeRole);
91671
91672                 items.select('button.member-delete')
91673                     .on('click', deleteMember);
91674
91675
91676
91677                 function bindTypeahead(d) {
91678                     var row = d3_select(this);
91679                     var role = row.selectAll('input.member-role');
91680                     var origValue = role.property('value');
91681
91682                     function sort(value, data) {
91683                         var sameletter = [];
91684                         var other = [];
91685                         for (var i = 0; i < data.length; i++) {
91686                             if (data[i].value.substring(0, value.length) === value) {
91687                                 sameletter.push(data[i]);
91688                             } else {
91689                                 other.push(data[i]);
91690                             }
91691                         }
91692                         return sameletter.concat(other);
91693                     }
91694
91695                     role.call(uiCombobox(context, 'member-role')
91696                         .fetcher(function(role, callback) {
91697                             // The `geometry` param is used in the `taginfo.js` interface for
91698                             // filtering results, as a key into the `tag_members_fractions`
91699                             // object.  If we don't know the geometry because the member is
91700                             // not yet downloaded, it's ok to guess based on type.
91701                             var geometry;
91702                             if (d.member) {
91703                                 geometry = context.geometry(d.member.id);
91704                             } else if (d.type === 'relation') {
91705                                 geometry = 'relation';
91706                             } else if (d.type === 'way') {
91707                                 geometry = 'line';
91708                             } else {
91709                                 geometry = 'point';
91710                             }
91711
91712                             var rtype = entity.tags.type;
91713                             taginfo.roles({
91714                                 debounce: true,
91715                                 rtype: rtype || '',
91716                                 geometry: geometry,
91717                                 query: role
91718                             }, function(err, data) {
91719                                 if (!err) callback(sort(role, data));
91720                             });
91721                         })
91722                         .on('cancel', function() {
91723                             role.property('value', origValue);
91724                         })
91725                     );
91726                 }
91727
91728
91729                 function unbind() {
91730                     var row = d3_select(this);
91731
91732                     row.selectAll('input.member-role')
91733                         .call(uiCombobox.off);
91734                 }
91735             }
91736
91737             function rawMemberEditor(selection) {
91738                 var entity = context.entity(_entityID);
91739
91740                 var gt = entity.members.length > _maxMembers ? '>' : '';
91741                 selection.call(uiDisclosure(context, 'raw_member_editor', true)
91742                     .title(t('inspector.all_members') + ' (' + gt + entity.members.slice(0, _maxMembers).length + ')')
91743                     .expanded(true)
91744                     .updatePreference(false)
91745                     .on('toggled', function(expanded) {
91746                         if (expanded) {
91747                             selection.node().parentNode.scrollTop += 200;
91748                         }
91749                     })
91750                     .content(updateDisclosureContent)
91751                 );
91752             }
91753
91754             rawMemberEditor.entityID = function(val) {
91755                 if (!arguments.length) return _entityID;
91756                 _entityID = val;
91757                 return rawMemberEditor;
91758             };
91759
91760
91761             return rawMemberEditor;
91762         }
91763
91764         function uiRawMembershipEditor(context) {
91765             var taginfo = services$1.taginfo;
91766             var nearbyCombo = uiCombobox(context, 'parent-relation')
91767                 .minItems(1)
91768                 .fetcher(fetchNearbyRelations);
91769             var _inChange = false;
91770             var _entityID;
91771             var _showBlank;
91772
91773
91774             function selectRelation(d) {
91775                 event.preventDefault();
91776
91777                 // remove the hover-highlight styling
91778                 utilHighlightEntities([d.relation.id], false, context);
91779
91780                 context.enter(modeSelect(context, [d.relation.id]));
91781             }
91782
91783
91784             function changeRole(d) {
91785                 if (d === 0) return;    // called on newrow (shoudn't happen)
91786                 if (_inChange) return;  // avoid accidental recursive call #5731
91787
91788                 var oldRole = d.member.role;
91789                 var newRole = d3_select(this).property('value');
91790
91791                 if (oldRole !== newRole) {
91792                     _inChange = true;
91793                     context.perform(
91794                         actionChangeMember(d.relation.id, Object.assign({}, d.member, { role: newRole }), d.index),
91795                         t('operations.change_role.annotation')
91796                     );
91797                 }
91798                 _inChange = false;
91799             }
91800
91801
91802             function addMembership(d, role) {
91803                 this.blur();           // avoid keeping focus on the button
91804                 _showBlank = false;
91805
91806                 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
91807
91808                 if (d.relation) {
91809                     context.perform(
91810                         actionAddMember(d.relation.id, member),
91811                         t('operations.add_member.annotation')
91812                     );
91813
91814                 } else {
91815                     var relation = osmRelation();
91816                     context.perform(
91817                         actionAddEntity(relation),
91818                         actionAddMember(relation.id, member),
91819                         t('operations.add.annotation.relation')
91820                     );
91821
91822                     context.enter(modeSelect(context, [relation.id]).newFeature(true));
91823                 }
91824             }
91825
91826
91827             function deleteMembership(d) {
91828                 this.blur();           // avoid keeping focus on the button
91829                 if (d === 0) return;   // called on newrow (shoudn't happen)
91830
91831                 // remove the hover-highlight styling
91832                 utilHighlightEntities([d.relation.id], false, context);
91833
91834                 context.perform(
91835                     actionDeleteMember(d.relation.id, d.index),
91836                     t('operations.delete_member.annotation')
91837                 );
91838             }
91839
91840
91841             function fetchNearbyRelations(q, callback) {
91842                 var newRelation = { relation: null, value: t('inspector.new_relation') };
91843                 var result = [];
91844                 var graph = context.graph();
91845
91846                 context.intersects(context.extent()).forEach(function(entity) {
91847                     if (entity.type !== 'relation' || entity.id === _entityID) return;
91848
91849                     var matched = context.presets().match(entity, graph);
91850                     var presetName = (matched && matched.name()) || t('inspector.relation');
91851                     var entityName = utilDisplayName(entity) || '';
91852
91853                     var value = presetName + ' ' + entityName;
91854                     if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
91855
91856                     result.push({ relation: entity, value: value });
91857                 });
91858
91859                 result.sort(function(a, b) {
91860                     return osmRelation.creationOrder(a.relation, b.relation);
91861                 });
91862
91863                 // Dedupe identical names by appending relation id - see #2891
91864                 var dupeGroups = Object.values(utilArrayGroupBy(result, 'value'))
91865                     .filter(function(v) { return v.length > 1; });
91866
91867                 dupeGroups.forEach(function(group) {
91868                     group.forEach(function(obj) {
91869                         obj.value += ' ' + obj.relation.id;
91870                     });
91871                 });
91872
91873                 result.forEach(function(obj) {
91874                     obj.title = obj.value;
91875                 });
91876
91877                 result.unshift(newRelation);
91878                 callback(result);
91879             }
91880
91881
91882             function rawMembershipEditor(selection) {
91883                 var entity = context.entity(_entityID);
91884                 var parents = context.graph().parentRelations(entity);
91885                 var memberships = [];
91886
91887                 parents.slice(0, 1000).forEach(function(relation) {
91888                     relation.members.forEach(function(member, index) {
91889                         if (member.id === entity.id) {
91890                             memberships.push({ relation: relation, member: member, index: index });
91891                         }
91892                     });
91893                 });
91894
91895                 var gt = parents.length > 1000 ? '>' : '';
91896                 selection.call(uiDisclosure(context, 'raw_membership_editor', true)
91897                     .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
91898                     .expanded(true)
91899                     .updatePreference(false)
91900                     .on('toggled', function(expanded) {
91901                         if (expanded) { selection.node().parentNode.scrollTop += 200; }
91902                     })
91903                     .content(content)
91904                 );
91905
91906
91907                 function content(selection) {
91908                     var list = selection.selectAll('.member-list')
91909                         .data([0]);
91910
91911                     list = list.enter()
91912                         .append('ul')
91913                         .attr('class', 'member-list')
91914                         .merge(list);
91915
91916
91917                     var items = list.selectAll('li.member-row-normal')
91918                         .data(memberships, function(d) {
91919                             return osmEntity.key(d.relation) + ',' + d.index;
91920                         });
91921
91922                     items.exit()
91923                         .each(unbind)
91924                         .remove();
91925
91926                     // Enter
91927                     var itemsEnter = items.enter()
91928                         .append('li')
91929                         .attr('class', 'member-row member-row-normal form-field');
91930
91931                     // highlight the relation in the map while hovering on the list item
91932                     itemsEnter.on('mouseover', function(d) {
91933                             utilHighlightEntities([d.relation.id], true, context);
91934                         })
91935                         .on('mouseout', function(d) {
91936                             utilHighlightEntities([d.relation.id], false, context);
91937                         });
91938
91939                     var labelEnter = itemsEnter
91940                         .append('label')
91941                         .attr('class', 'field-label')
91942                         .append('span')
91943                         .attr('class', 'label-text')
91944                         .append('a')
91945                         .attr('href', '#')
91946                         .on('click', selectRelation);
91947
91948                     labelEnter
91949                         .append('span')
91950                         .attr('class', 'member-entity-type')
91951                         .text(function(d) {
91952                             var matched = context.presets().match(d.relation, context.graph());
91953                             return (matched && matched.name()) || t('inspector.relation');
91954                         });
91955
91956                     labelEnter
91957                         .append('span')
91958                         .attr('class', 'member-entity-name')
91959                         .text(function(d) { return utilDisplayName(d.relation); });
91960
91961                     var wrapEnter = itemsEnter
91962                         .append('div')
91963                         .attr('class', 'form-field-input-wrap form-field-input-member');
91964
91965                     wrapEnter
91966                         .append('input')
91967                         .attr('class', 'member-role')
91968                         .property('type', 'text')
91969                         .attr('maxlength', 255)
91970                         .attr('placeholder', t('inspector.role'))
91971                         .call(utilNoAuto)
91972                         .property('value', function(d) { return d.member.role; })
91973                         .on('blur', changeRole)
91974                         .on('change', changeRole);
91975
91976                     wrapEnter
91977                         .append('button')
91978                         .attr('tabindex', -1)
91979                         .attr('class', 'remove form-field-button member-delete')
91980                         .call(svgIcon('#iD-operation-delete'))
91981                         .on('click', deleteMembership);
91982
91983                     if (taginfo) {
91984                         wrapEnter.each(bindTypeahead);
91985                     }
91986
91987
91988                     var newMembership = list.selectAll('.member-row-new')
91989                         .data(_showBlank ? [0] : []);
91990
91991                     // Exit
91992                     newMembership.exit()
91993                         .remove();
91994
91995                     // Enter
91996                     var newMembershipEnter = newMembership.enter()
91997                         .append('li')
91998                         .attr('class', 'member-row member-row-new form-field');
91999
92000                     newMembershipEnter
92001                         .append('label')
92002                         .attr('class', 'field-label')
92003                         .append('input')
92004                         .attr('placeholder', t('inspector.choose_relation'))
92005                         .attr('type', 'text')
92006                         .attr('class', 'member-entity-input')
92007                         .call(utilNoAuto);
92008
92009                     var newWrapEnter = newMembershipEnter
92010                         .append('div')
92011                         .attr('class', 'form-field-input-wrap form-field-input-member');
92012
92013                     newWrapEnter
92014                         .append('input')
92015                         .attr('class', 'member-role')
92016                         .property('type', 'text')
92017                         .attr('maxlength', 255)
92018                         .attr('placeholder', t('inspector.role'))
92019                         .call(utilNoAuto);
92020
92021                     newWrapEnter
92022                         .append('button')
92023                         .attr('tabindex', -1)
92024                         .attr('class', 'remove form-field-button member-delete')
92025                         .call(svgIcon('#iD-operation-delete'))
92026                         .on('click', function() {
92027                             list.selectAll('.member-row-new')
92028                                 .remove();
92029                         });
92030
92031                     // Update
92032                     newMembership = newMembership
92033                         .merge(newMembershipEnter);
92034
92035                     newMembership.selectAll('.member-entity-input')
92036                         .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
92037                         .call(nearbyCombo
92038                             .on('accept', acceptEntity)
92039                             .on('cancel', cancelEntity)
92040                         );
92041
92042
92043                     // Container for the Add button
92044                     var addRow = selection.selectAll('.add-row')
92045                         .data([0]);
92046
92047                     // enter
92048                     var addRowEnter = addRow.enter()
92049                         .append('div')
92050                         .attr('class', 'add-row');
92051
92052                     var addRelationButton = addRowEnter
92053                         .append('button')
92054                         .attr('class', 'add-relation');
92055
92056                     addRelationButton
92057                         .call(svgIcon('#iD-icon-plus', 'light'));
92058                     addRelationButton
92059                         .call(tooltip().title(t('inspector.add_to_relation')).placement(textDirection === 'ltr' ? 'right' : 'left'));
92060
92061                     addRowEnter
92062                         .append('div')
92063                         .attr('class', 'space-value');   // preserve space
92064
92065                     addRowEnter
92066                         .append('div')
92067                         .attr('class', 'space-buttons');  // preserve space
92068
92069                     // update
92070                     addRow = addRow
92071                         .merge(addRowEnter);
92072
92073                     addRow.select('.add-relation')
92074                         .on('click', function() {
92075                             _showBlank = true;
92076                             content(selection);
92077                             list.selectAll('.member-entity-input').node().focus();
92078                         });
92079
92080
92081                     function acceptEntity(d) {
92082                         if (!d) {
92083                             cancelEntity();
92084                             return;
92085                         }
92086                         var role = list.selectAll('.member-row-new .member-role').property('value');
92087                         addMembership(d, role);
92088                     }
92089
92090
92091                     function cancelEntity() {
92092                         var input = newMembership.selectAll('.member-entity-input');
92093                         input.property('value', '');
92094                     }
92095
92096
92097                     function bindTypeahead(d) {
92098                         var row = d3_select(this);
92099                         var role = row.selectAll('input.member-role');
92100                         var origValue = role.property('value');
92101
92102                         function sort(value, data) {
92103                             var sameletter = [];
92104                             var other = [];
92105                             for (var i = 0; i < data.length; i++) {
92106                                 if (data[i].value.substring(0, value.length) === value) {
92107                                     sameletter.push(data[i]);
92108                                 } else {
92109                                     other.push(data[i]);
92110                                 }
92111                             }
92112                             return sameletter.concat(other);
92113                         }
92114
92115                         role.call(uiCombobox(context, 'member-role')
92116                             .fetcher(function(role, callback) {
92117                                 var rtype = d.relation.tags.type;
92118                                 taginfo.roles({
92119                                     debounce: true,
92120                                     rtype: rtype || '',
92121                                     geometry: context.geometry(_entityID),
92122                                     query: role
92123                                 }, function(err, data) {
92124                                     if (!err) callback(sort(role, data));
92125                                 });
92126                             })
92127                             .on('cancel', function() {
92128                                 role.property('value', origValue);
92129                             })
92130                         );
92131                     }
92132
92133
92134                     function unbind() {
92135                         var row = d3_select(this);
92136
92137                         row.selectAll('input.member-role')
92138                             .call(uiCombobox.off);
92139                     }
92140                 }
92141             }
92142
92143
92144             rawMembershipEditor.entityID = function(val) {
92145                 if (!arguments.length) return _entityID;
92146                 _entityID = val;
92147                 _showBlank = false;
92148                 return rawMembershipEditor;
92149             };
92150
92151
92152             return rawMembershipEditor;
92153         }
92154
92155         // This currently only works with the 'restrictions' field
92156         // It borrows some code from uiHelp
92157
92158         function uiFieldHelp(context, fieldName) {
92159             var fieldHelp = {};
92160             var _inspector = d3_select(null);
92161             var _wrap = d3_select(null);
92162             var _body = d3_select(null);
92163
92164             var fieldHelpKeys = {
92165                 restrictions: [
92166                     ['about',[
92167                         'about',
92168                         'from_via_to',
92169                         'maxdist',
92170                         'maxvia'
92171                     ]],
92172                     ['inspecting',[
92173                         'about',
92174                         'from_shadow',
92175                         'allow_shadow',
92176                         'restrict_shadow',
92177                         'only_shadow',
92178                         'restricted',
92179                         'only'
92180                     ]],
92181                     ['modifying',[
92182                         'about',
92183                         'indicators',
92184                         'allow_turn',
92185                         'restrict_turn',
92186                         'only_turn'
92187                     ]],
92188                     ['tips',[
92189                         'simple',
92190                         'simple_example',
92191                         'indirect',
92192                         'indirect_example',
92193                         'indirect_noedit'
92194                     ]]
92195                 ]
92196             };
92197
92198             var fieldHelpHeadings = {};
92199
92200             var replacements = {
92201                 distField: t('restriction.controls.distance'),
92202                 viaField: t('restriction.controls.via'),
92203                 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
92204                 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
92205                 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
92206                 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
92207                 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
92208                 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
92209                 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
92210             };
92211
92212
92213             // For each section, squash all the texts into a single markdown document
92214             var docs = fieldHelpKeys[fieldName].map(function(key) {
92215                 var helpkey = 'help.field.' + fieldName + '.' + key[0];
92216                 var text = key[1].reduce(function(all, part) {
92217                     var subkey = helpkey + '.' + part;
92218                     var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
92219                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
92220                     return all + hhh + t(subkey, replacements) + '\n\n';
92221                 }, '');
92222
92223                 return {
92224                     key: helpkey,
92225                     title: t(helpkey + '.title'),
92226                     html: marked(text.trim())
92227                 };
92228             });
92229
92230
92231             function show() {
92232                 updatePosition();
92233
92234                 _body
92235                     .classed('hide', false)
92236                     .style('opacity', '0')
92237                     .transition()
92238                     .duration(200)
92239                     .style('opacity', '1');
92240             }
92241
92242
92243             function hide() {
92244                 _body
92245                     .classed('hide', true)
92246                     .transition()
92247                     .duration(200)
92248                     .style('opacity', '0')
92249                     .on('end', function () {
92250                         _body.classed('hide', true);
92251                     });
92252             }
92253
92254
92255             function clickHelp(index) {
92256                 var d = docs[index];
92257                 var tkeys = fieldHelpKeys[fieldName][index][1];
92258
92259                 _body.selectAll('.field-help-nav-item')
92260                     .classed('active', function(d, i) { return i === index; });
92261
92262                 var content = _body.selectAll('.field-help-content')
92263                     .html(d.html);
92264
92265                 // class the paragraphs so we can find and style them
92266                 content.selectAll('p')
92267                     .attr('class', function(d, i) { return tkeys[i]; });
92268
92269                 // insert special content for certain help sections
92270                 if (d.key === 'help.field.restrictions.inspecting') {
92271                     content
92272                         .insert('img', 'p.from_shadow')
92273                         .attr('class', 'field-help-image cf')
92274                         .attr('src', context.imagePath('tr_inspect.gif'));
92275
92276                 } else if (d.key === 'help.field.restrictions.modifying') {
92277                     content
92278                         .insert('img', 'p.allow_turn')
92279                         .attr('class', 'field-help-image cf')
92280                         .attr('src', context.imagePath('tr_modify.gif'));
92281                 }
92282             }
92283
92284
92285             fieldHelp.button = function(selection) {
92286                 if (_body.empty()) return;
92287
92288                 var button = selection.selectAll('.field-help-button')
92289                     .data([0]);
92290
92291                 // enter/update
92292                 button.enter()
92293                     .append('button')
92294                     .attr('class', 'field-help-button')
92295                     .attr('tabindex', -1)
92296                     .call(svgIcon('#iD-icon-help'))
92297                     .merge(button)
92298                     .on('click', function () {
92299                         event.stopPropagation();
92300                         event.preventDefault();
92301                         if (_body.classed('hide')) {
92302                             show();
92303                         } else {
92304                             hide();
92305                         }
92306                     });
92307             };
92308
92309
92310             function updatePosition() {
92311                 var wrap = _wrap.node();
92312                 var inspector = _inspector.node();
92313                 var wRect = wrap.getBoundingClientRect();
92314                 var iRect = inspector.getBoundingClientRect();
92315
92316                 _body
92317                     .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
92318             }
92319
92320
92321             fieldHelp.body = function(selection) {
92322                 // This control expects the field to have a form-field-input-wrap div
92323                 _wrap = selection.selectAll('.form-field-input-wrap');
92324                 if (_wrap.empty()) return;
92325
92326                 // absolute position relative to the inspector, so it "floats" above the fields
92327                 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
92328                 if (_inspector.empty()) return;
92329
92330                 _body = _inspector.selectAll('.field-help-body')
92331                     .data([0]);
92332
92333                 var enter = _body.enter()
92334                     .append('div')
92335                     .attr('class', 'field-help-body hide');   // initially hidden
92336
92337                 var titleEnter = enter
92338                     .append('div')
92339                     .attr('class', 'field-help-title cf');
92340
92341                 titleEnter
92342                     .append('h2')
92343                     .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
92344                     .text(t('help.field.' + fieldName + '.title'));
92345
92346                 titleEnter
92347                     .append('button')
92348                     .attr('class', 'fr close')
92349                     .on('click', function() {
92350                         event.stopPropagation();
92351                         event.preventDefault();
92352                         hide();
92353                     })
92354                     .call(svgIcon('#iD-icon-close'));
92355
92356                 var navEnter = enter
92357                     .append('div')
92358                     .attr('class', 'field-help-nav cf');
92359
92360                 var titles = docs.map(function(d) { return d.title; });
92361                 navEnter.selectAll('.field-help-nav-item')
92362                     .data(titles)
92363                     .enter()
92364                     .append('div')
92365                     .attr('class', 'field-help-nav-item')
92366                     .text(function(d) { return d; })
92367                     .on('click', function(d, i) {
92368                         event.stopPropagation();
92369                         event.preventDefault();
92370                         clickHelp(i);
92371                     });
92372
92373                 enter
92374                     .append('div')
92375                     .attr('class', 'field-help-content');
92376
92377                 _body = _body
92378                     .merge(enter);
92379
92380                 clickHelp(0);
92381             };
92382
92383
92384             return fieldHelp;
92385         }
92386
92387         function uiFieldCheck(field, context) {
92388             var dispatch$1 = dispatch('change');
92389             var options = field.strings && field.strings.options;
92390             var values = [];
92391             var texts = [];
92392
92393             var input = d3_select(null);
92394             var text = d3_select(null);
92395             var label = d3_select(null);
92396             var reverser = d3_select(null);
92397
92398             var _impliedYes;
92399             var _entityID;
92400             var _value;
92401
92402
92403             if (options) {
92404                 for (var k in options) {
92405                     values.push(k === 'undefined' ? undefined : k);
92406                     texts.push(field.t('options.' + k, { 'default': options[k] }));
92407                 }
92408             } else {
92409                 values = [undefined, 'yes'];
92410                 texts = [t('inspector.unknown'), t('inspector.check.yes')];
92411                 if (field.type !== 'defaultCheck') {
92412                     values.push('no');
92413                     texts.push(t('inspector.check.no'));
92414                 }
92415             }
92416
92417
92418             // Checks tags to see whether an undefined value is "Assumed to be Yes"
92419             function checkImpliedYes() {
92420                 _impliedYes = (field.id === 'oneway_yes');
92421
92422                 // hack: pretend `oneway` field is a `oneway_yes` field
92423                 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
92424                 if (field.id === 'oneway') {
92425                     var entity = context.entity(_entityID);
92426                     for (var key in entity.tags) {
92427                         if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
92428                             _impliedYes = true;
92429                             texts[0] = t('presets.fields.oneway_yes.options.undefined');
92430                             break;
92431                         }
92432                     }
92433                 }
92434             }
92435
92436
92437             function reverserHidden() {
92438                 if (!d3_select('div.inspector-hover').empty()) return true;
92439                 return !(_value === 'yes' || (_impliedYes && !_value));
92440             }
92441
92442
92443             function reverserSetText(selection) {
92444                 var entity = context.hasEntity(_entityID);
92445                 if (reverserHidden() || !entity) return selection;
92446
92447                 var first = entity.first();
92448                 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
92449                 var pseudoDirection = first < last;
92450                 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
92451
92452                 selection.selectAll('.reverser-span')
92453                     .text(t('inspector.check.reverser'))
92454                     .call(svgIcon(icon, 'inline'));
92455
92456                 return selection;
92457             }
92458
92459
92460             var check = function(selection) {
92461                 checkImpliedYes();
92462
92463                 label = selection.selectAll('.form-field-input-wrap')
92464                     .data([0]);
92465
92466                 var enter = label.enter()
92467                     .append('label')
92468                     .attr('class', 'form-field-input-wrap form-field-input-check');
92469
92470                 enter
92471                     .append('input')
92472                     .property('indeterminate', field.type !== 'defaultCheck')
92473                     .attr('type', 'checkbox')
92474                     .attr('id', 'preset-input-' + field.safeid);
92475
92476                 enter
92477                     .append('span')
92478                     .text(texts[0])
92479                     .attr('class', 'value');
92480
92481                 if (field.type === 'onewayCheck') {
92482                     enter
92483                         .append('a')
92484                         .attr('id', 'preset-input-' + field.safeid + '-reverser')
92485                         .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
92486                         .attr('href', '#')
92487                         .append('span')
92488                         .attr('class', 'reverser-span');
92489                 }
92490
92491                 label = label.merge(enter);
92492                 input = label.selectAll('input');
92493                 text = label.selectAll('span.value');
92494
92495                 input
92496                     .on('click', function() {
92497                         event.stopPropagation();
92498                         var t = {};
92499                         t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
92500
92501                         // Don't cycle through `alternating` or `reversible` states - #4970
92502                         // (They are supported as translated strings, but should not toggle with clicks)
92503                         if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
92504                             t[field.key] = values[0];
92505                         }
92506
92507                         dispatch$1.call('change', this, t);
92508                     });
92509
92510                 if (field.type === 'onewayCheck') {
92511                     reverser = label.selectAll('.reverser');
92512
92513                     reverser
92514                         .call(reverserSetText)
92515                         .on('click', function() {
92516                             event.preventDefault();
92517                             event.stopPropagation();
92518                             context.perform(
92519                                 actionReverse(_entityID),
92520                                 t('operations.reverse.annotation')
92521                             );
92522                             d3_select(this)
92523                                 .call(reverserSetText);
92524                         });
92525                 }
92526             };
92527
92528
92529             check.entity = function(_) {
92530                 if (!arguments.length) return context.hasEntity(_entityID);
92531                 _entityID = _.id;
92532                 return check;
92533             };
92534
92535
92536             check.tags = function(tags) {
92537
92538                 function isChecked(val) {
92539                     return val !== 'no' && val !== '' && val !== undefined && val !== null;
92540                 }
92541
92542                 function textFor(val) {
92543                     if (val === '') val = undefined;
92544                     var index = values.indexOf(val);
92545                     return (index !== -1 ? texts[index] : ('"' + val + '"'));
92546                 }
92547
92548                 checkImpliedYes();
92549                 _value = tags[field.key] && tags[field.key].toLowerCase();
92550
92551                 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
92552                     _value = 'yes';
92553                 }
92554
92555                 input
92556                     .property('indeterminate', field.type !== 'defaultCheck' && !_value)
92557                     .property('checked', isChecked(_value));
92558
92559                 text
92560                     .text(textFor(_value));
92561
92562                 label
92563                     .classed('set', !!_value);
92564
92565                 if (field.type === 'onewayCheck') {
92566                     reverser
92567                         .classed('hide', reverserHidden())
92568                         .call(reverserSetText);
92569                 }
92570             };
92571
92572
92573             check.focus = function() {
92574                 input.node().focus();
92575             };
92576
92577             return utilRebind(check, dispatch$1, 'on');
92578         }
92579
92580         function uiFieldCombo(field, context) {
92581             var dispatch$1 = dispatch('change');
92582             var nominatim = services$1.geocoder;
92583             var taginfo = services$1.taginfo;
92584             var isMulti = (field.type === 'multiCombo');
92585             var isNetwork = (field.type === 'networkCombo');
92586             var isSemi = (field.type === 'semiCombo');
92587             var optstrings = field.strings && field.strings.options;
92588             var optarray = field.options;
92589             var snake_case = (field.snake_case || (field.snake_case === undefined));
92590             var caseSensitive = field.caseSensitive;
92591             var combobox = uiCombobox(context, 'combo-' + field.safeid)
92592                 .caseSensitive(caseSensitive)
92593                 .minItems(isMulti || isSemi ? 1 : 2);
92594             var container = d3_select(null);
92595             var inputWrap = d3_select(null);
92596             var input = d3_select(null);
92597             var _comboData = [];
92598             var _multiData = [];
92599             var _entity;
92600             var _country;
92601
92602             // ensure multiCombo field.key ends with a ':'
92603             if (isMulti && /[^:]$/.test(field.key)) {
92604                 field.key += ':';
92605             }
92606
92607
92608             function snake(s) {
92609                 return s.replace(/\s+/g, '_');
92610             }
92611
92612             function unsnake(s) {
92613                 return s.replace(/_+/g, ' ');
92614             }
92615
92616             function clean(s) {
92617                 return s.split(';')
92618                     .map(function(s) { return s.trim(); })
92619                     .join(';');
92620             }
92621
92622
92623             // returns the tag value for a display value
92624             // (for multiCombo, dval should be the key suffix, not the entire key)
92625             function tagValue(dval) {
92626                 dval = clean(dval || '');
92627
92628                 if (optstrings) {
92629                     var found = _comboData.find(function(o) {
92630                         return o.key && clean(o.value) === dval;
92631                     });
92632                     if (found) {
92633                         return found.key;
92634                     }
92635                 }
92636
92637                 if (field.type === 'typeCombo' && !dval) {
92638                     return 'yes';
92639                 }
92640
92641                 return (snake_case ? snake(dval) : dval) || undefined;
92642             }
92643
92644
92645             // returns the display value for a tag value
92646             // (for multiCombo, tval should be the key suffix, not the entire key)
92647             function displayValue(tval) {
92648                 tval = tval || '';
92649
92650                 if (optstrings) {
92651                     var found = _comboData.find(function(o) {
92652                         return o.key === tval && o.value;
92653                     });
92654                     if (found) {
92655                         return found.value;
92656                     }
92657                 }
92658
92659                 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
92660                     return '';
92661                 }
92662
92663                 return snake_case ? unsnake(tval) : tval;
92664             }
92665
92666
92667             // Compute the difference between arrays of objects by `value` property
92668             //
92669             // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
92670             // > [{value:1}, {value:3}]
92671             //
92672             function objectDifference(a, b) {
92673                 return a.filter(function(d1) {
92674                     return !b.some(function(d2) { return d1.value === d2.value; });
92675                 });
92676             }
92677
92678
92679             function initCombo(selection, attachTo) {
92680                 if (optstrings) {
92681                     selection.attr('readonly', 'readonly');
92682                     selection.call(combobox, attachTo);
92683                     setStaticValues(setPlaceholder);
92684
92685                 } else if (optarray) {
92686                     selection.call(combobox, attachTo);
92687                     setStaticValues(setPlaceholder);
92688
92689                 } else if (taginfo) {
92690                     selection.call(combobox.fetcher(setTaginfoValues), attachTo);
92691                     setTaginfoValues('', setPlaceholder);
92692                 }
92693             }
92694
92695
92696             function setStaticValues(callback) {
92697                 if (!(optstrings || optarray)) return;
92698
92699                 if (optstrings) {
92700                     _comboData = Object.keys(optstrings).map(function(k) {
92701                         var v = field.t('options.' + k, { 'default': optstrings[k] });
92702                         return {
92703                             key: k,
92704                             value: v,
92705                             title: v
92706                         };
92707                     });
92708
92709                 } else if (optarray) {
92710                     _comboData = optarray.map(function(k) {
92711                         var v = snake_case ? unsnake(k) : k;
92712                         return {
92713                             key: k,
92714                             value: v,
92715                             title: v
92716                         };
92717                     });
92718                 }
92719
92720                 combobox.data(objectDifference(_comboData, _multiData));
92721                 if (callback) callback(_comboData);
92722             }
92723
92724
92725             function setTaginfoValues(q, callback) {
92726                 var fn = isMulti ? 'multikeys' : 'values';
92727                 var query = (isMulti ? field.key : '') + q;
92728                 var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
92729                 if (hasCountryPrefix) {
92730                     query = _country + ':';
92731                 }
92732
92733                 var params = {
92734                     debounce: (q !== ''),
92735                     key: field.key,
92736                     query: query
92737                 };
92738
92739                 if (_entity) {
92740                     params.geometry = context.geometry(_entity.id);
92741                 }
92742
92743                 taginfo[fn](params, function(err, data) {
92744                     if (err) return;
92745
92746                     var deprecatedValues = osmEntity.deprecatedTagValuesByKey()[field.key];
92747                     if (deprecatedValues) {
92748                         // don't suggest deprecated tag values
92749                         data = data.filter(function(d) {
92750                             return deprecatedValues.indexOf(d.value) === -1;
92751                         });
92752                     }
92753
92754                     if (hasCountryPrefix) {
92755                         data = data.filter(function(d) {
92756                             return d.value.toLowerCase().indexOf(_country + ':') === 0;
92757                         });
92758                     }
92759
92760                     // hide the caret if there are no suggestions
92761                     container.classed('empty-combobox', data.length === 0);
92762
92763                     _comboData = data.map(function(d) {
92764                         var k = d.value;
92765                         if (isMulti) k = k.replace(field.key, '');
92766                         var v = snake_case ? unsnake(k) : k;
92767                         return {
92768                             key: k,
92769                             value: v,
92770                             title: isMulti ? v : d.title
92771                         };
92772                     });
92773
92774                     _comboData = objectDifference(_comboData, _multiData);
92775                     if (callback) callback(_comboData);
92776                 });
92777             }
92778
92779
92780             function setPlaceholder(values) {
92781                 var ph;
92782
92783                 if (isMulti || isSemi) {
92784                     ph = field.placeholder() || t('inspector.add');
92785                 } else {
92786                     var vals = values
92787                         .map(function(d) { return d.value; })
92788                         .filter(function(s) { return s.length < 20; });
92789
92790                     var placeholders = vals.length > 1 ? vals : values.map(function(d) { return d.key; });
92791                     ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
92792                 }
92793
92794                 if (!/(…|\.\.\.)$/.test(ph)) {
92795                     ph += '…';
92796                 }
92797
92798                 container.selectAll('input')
92799                     .attr('placeholder', ph);
92800             }
92801
92802
92803             function change() {
92804                 var t = {};
92805                 var val;
92806
92807                 if (isMulti || isSemi) {
92808                     val = tagValue(utilGetSetValue(input).replace(/,/g, ';')) || '';
92809                     container.classed('active', false);
92810                     utilGetSetValue(input, '');
92811
92812                     var vals = val.split(';').filter(Boolean);
92813                     if (!vals.length) return;
92814
92815                     if (isMulti) {
92816                         utilArrayUniq(vals).forEach(function(v) {
92817                             var key = field.key + v;
92818                             if (_entity) {
92819                                 // don't set a multicombo value to 'yes' if it already has a non-'no' value
92820                                 // e.g. `language:de=main`
92821                                 var old = _entity.tags[key] || '';
92822                                 if (old && old.toLowerCase() !== 'no') return;
92823                             }
92824                             field.keys.push(key);
92825                             t[key] = 'yes';
92826                         });
92827
92828                     } else if (isSemi) {
92829                         var arr = _multiData.map(function(d) { return d.key; });
92830                         arr = arr.concat(vals);
92831                         t[field.key] = utilArrayUniq(arr).filter(Boolean).join(';');
92832                     }
92833
92834                     window.setTimeout(function() { input.node().focus(); }, 10);
92835
92836                 } else {
92837                     val = tagValue(utilGetSetValue(input));
92838                     t[field.key] = val;
92839                 }
92840
92841                 dispatch$1.call('change', this, t);
92842             }
92843
92844
92845             function removeMultikey(d) {
92846                 event.stopPropagation();
92847                 var t = {};
92848                 if (isMulti) {
92849                     t[d.key] = undefined;
92850                 } else if (isSemi) {
92851                     var arr = _multiData.map(function(md) {
92852                         return md.key === d.key ? null : md.key;
92853                     }).filter(Boolean);
92854
92855                     arr = utilArrayUniq(arr);
92856                     t[field.key] = arr.length ? arr.join(';') : undefined;
92857                 }
92858                 dispatch$1.call('change', this, t);
92859             }
92860
92861
92862             function combo(selection) {
92863                 container = selection.selectAll('.form-field-input-wrap')
92864                     .data([0]);
92865
92866                 var type = (isMulti || isSemi) ? 'multicombo': 'combo';
92867                 container = container.enter()
92868                     .append('div')
92869                     .attr('class', 'form-field-input-wrap form-field-input-' + type)
92870                     .merge(container);
92871
92872                 if (isMulti || isSemi) {
92873                     container = container.selectAll('.chiplist')
92874                         .data([0]);
92875
92876                     var listClass = 'chiplist';
92877
92878                     // Use a separate line for each value in the Destinations field
92879                     // to mimic highway exit signs
92880                     if (field.id === 'destination_oneway') {
92881                         listClass += ' full-line-chips';
92882                     }
92883
92884                     container = container.enter()
92885                         .append('ul')
92886                         .attr('class', listClass)
92887                         .on('click', function() {
92888                             window.setTimeout(function() { input.node().focus(); }, 10);
92889                         })
92890                         .merge(container);
92891
92892
92893                     inputWrap = container.selectAll('.input-wrap')
92894                         .data([0]);
92895
92896                     inputWrap = inputWrap.enter()
92897                         .append('li')
92898                         .attr('class', 'input-wrap')
92899                         .merge(inputWrap);
92900
92901                     input = inputWrap.selectAll('input')
92902                         .data([0]);
92903                 } else {
92904                     input = container.selectAll('input')
92905                         .data([0]);
92906                 }
92907
92908                 input = input.enter()
92909                     .append('input')
92910                     .attr('type', 'text')
92911                     .attr('id', 'preset-input-' + field.safeid)
92912                     .call(utilNoAuto)
92913                     .call(initCombo, selection)
92914                     .merge(input);
92915
92916                 if (isNetwork && nominatim && _entity) {
92917                     var center = _entity.extent(context.graph()).center();
92918                     nominatim.countryCode(center, function (err, code) {
92919                         _country = code;
92920                     });
92921                 }
92922
92923                 input
92924                     .on('change', change)
92925                     .on('blur', change);
92926
92927                 input
92928                     .on('keydown.field', function() {
92929                         switch (event.keyCode) {
92930                             case 13: // ↩ Return
92931                                 input.node().blur(); // blurring also enters the value
92932                                 event.stopPropagation();
92933                                 break;
92934                         }
92935                     });
92936
92937                 if (isMulti || isSemi) {
92938                     combobox
92939                         .on('accept', function() {
92940                             input.node().blur();
92941                             input.node().focus();
92942                         });
92943
92944                     input
92945                         .on('focus', function() { container.classed('active', true); });
92946                 }
92947             }
92948
92949
92950             combo.tags = function(tags) {
92951                 if (isMulti || isSemi) {
92952                     _multiData = [];
92953
92954                     if (isMulti) {
92955                         // Build _multiData array containing keys already set..
92956                         for (var k in tags) {
92957                             if (k.indexOf(field.key) !== 0) continue;
92958                             var v = (tags[k] || '').toLowerCase();
92959                             if (v === '' || v === 'no') continue;
92960
92961                             var suffix = k.substring(field.key.length);
92962                             _multiData.push({
92963                                 key: k,
92964                                 value: displayValue(suffix)
92965                             });
92966                         }
92967
92968                         // Set keys for form-field modified (needed for undo and reset buttons)..
92969                         field.keys = _multiData.map(function(d) { return d.key; });
92970
92971                     } else if (isSemi) {
92972                         var arr = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
92973                         _multiData = arr.map(function(k) {
92974                             return {
92975                                 key: k,
92976                                 value: displayValue(k)
92977                             };
92978                         });
92979                     }
92980
92981                     // Exclude existing multikeys from combo options..
92982                     var available = objectDifference(_comboData, _multiData);
92983                     combobox.data(available);
92984
92985                     // Hide 'Add' button if this field uses fixed set of
92986                     // translateable optstrings and they're all currently used..
92987                     container.selectAll('.combobox-input, .combobox-caret')
92988                         .classed('hide', optstrings && !available.length);
92989
92990
92991                     // Render chips
92992                     var chips = container.selectAll('.chips')
92993                         .data(_multiData);
92994
92995                     chips.exit()
92996                         .remove();
92997
92998                     var enter = chips.enter()
92999                         .insert('li', '.input-wrap')
93000                         .attr('class', 'chips');
93001
93002                     enter.append('span');
93003                     enter.append('a');
93004
93005                     chips = chips.merge(enter);
93006
93007                     chips.select('span')
93008                         .text(function(d) { return d.value; });
93009
93010                     chips.select('a')
93011                         .on('click', removeMultikey)
93012                         .attr('class', 'remove')
93013                         .text('×');
93014
93015                 } else {
93016                     utilGetSetValue(input, displayValue(tags[field.key]));
93017                 }
93018             };
93019
93020
93021             combo.focus = function() {
93022                 input.node().focus();
93023             };
93024
93025
93026             combo.entity = function(val) {
93027                 if (!arguments.length) return _entity;
93028                 _entity = val;
93029                 return combo;
93030             };
93031
93032
93033             return utilRebind(combo, dispatch$1, 'on');
93034         }
93035
93036         function uiFieldText(field, context) {
93037             var dispatch$1 = dispatch('change');
93038             var nominatim = services$1.geocoder;
93039             var input = d3_select(null);
93040             var _entity;
93041
93042             function i(selection) {
93043                 var preset = _entity && context.presets().match(_entity, context.graph());
93044                 var isLocked = preset && preset.suggestion && field.id === 'brand';
93045                 field.locked(isLocked);
93046
93047                 var wrap = selection.selectAll('.form-field-input-wrap')
93048                     .data([0]);
93049
93050                 wrap = wrap.enter()
93051                     .append('div')
93052                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93053                     .merge(wrap);
93054
93055                 var fieldID = 'preset-input-' + field.safeid;
93056
93057                 input = wrap.selectAll('input')
93058                     .data([0]);
93059
93060                 input = input.enter()
93061                     .append('input')
93062                     .attr('type', field.type)
93063                     .attr('id', fieldID)
93064                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
93065                     .classed(field.type, true)
93066                     .call(utilNoAuto)
93067                     .merge(input);
93068
93069                 input
93070                     .classed('disabled', !!isLocked)
93071                     .attr('readonly', isLocked || null)
93072                     .on('input', change(true))
93073                     .on('blur', change())
93074                     .on('change', change());
93075
93076
93077                 if (field.type === 'tel' && nominatim && _entity) {
93078                     var center = _entity.extent(context.graph()).center();
93079                     nominatim.countryCode(center, function (err, countryCode) {
93080                         if (err || !dataPhoneFormats[countryCode]) return;
93081                         wrap.selectAll('#' + fieldID)
93082                             .attr('placeholder', dataPhoneFormats[countryCode]);
93083                     });
93084
93085                 } else if (field.type === 'number') {
93086                     var rtl = (textDirection === 'rtl');
93087
93088                     input.attr('type', 'text');
93089
93090                     var buttons = wrap.selectAll('.increment, .decrement')
93091                         .data(rtl ? [1, -1] : [-1, 1]);
93092
93093                     buttons.enter()
93094                         .append('button')
93095                         .attr('tabindex', -1)
93096                         .attr('class', function(d) {
93097                             var which = (d === 1 ? 'increment' : 'decrement');
93098                             return 'form-field-button ' + which;
93099                         })
93100                         .merge(buttons)
93101                         .on('click', function(d) {
93102                             event.preventDefault();
93103                             var raw_vals = input.node().value || '0';
93104                             var vals = raw_vals.split(';');
93105                             vals = vals.map(function(v) {
93106                                 var num = parseFloat(v.trim(), 10);
93107                                 return isFinite(num) ? clamped(num + d) : v.trim();
93108                             });
93109                             input.node().value = vals.join(';');
93110                             change()();
93111                         });
93112                 }
93113             }
93114
93115
93116             // clamp number to min/max
93117             function clamped(num) {
93118                 if (field.minValue !== undefined) {
93119                     num = Math.max(num, field.minValue);
93120                 }
93121                 if (field.maxValue !== undefined) {
93122                     num = Math.min(num, field.maxValue);
93123                 }
93124                 return num;
93125             }
93126
93127
93128             function change(onInput) {
93129                 return function() {
93130                     var t = {};
93131                     var val = utilGetSetValue(input).trim() || undefined;
93132
93133                     if (!onInput) {
93134                         if (field.type === 'number' && val !== undefined) {
93135                             var vals = val.split(';');
93136                             vals = vals.map(function(v) {
93137                                 var num = parseFloat(v.trim(), 10);
93138                                 return isFinite(num) ? clamped(num) : v.trim();
93139                             });
93140                             val = vals.join(';');
93141                         }
93142                         utilGetSetValue(input, val || '');
93143                     }
93144                     t[field.key] = val;
93145                     dispatch$1.call('change', this, t, onInput);
93146                 };
93147             }
93148
93149
93150             i.entity = function(val) {
93151                 if (!arguments.length) return _entity;
93152                 _entity = val;
93153                 return i;
93154             };
93155
93156
93157             i.tags = function(tags) {
93158                 utilGetSetValue(input, tags[field.key] || '');
93159             };
93160
93161
93162             i.focus = function() {
93163                 var node = input.node();
93164                 if (node) node.focus();
93165             };
93166
93167             return utilRebind(i, dispatch$1, 'on');
93168         }
93169
93170         function uiFieldAccess(field, context) {
93171             var dispatch$1 = dispatch('change');
93172             var items = d3_select(null);
93173
93174             function access(selection) {
93175                 var wrap = selection.selectAll('.form-field-input-wrap')
93176                     .data([0]);
93177
93178                 wrap = wrap.enter()
93179                     .append('div')
93180                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93181                     .merge(wrap);
93182
93183                 var list = wrap.selectAll('ul')
93184                     .data([0]);
93185
93186                 list = list.enter()
93187                     .append('ul')
93188                     .attr('class', 'rows')
93189                     .merge(list);
93190
93191
93192                 items = list.selectAll('li')
93193                     .data(field.keys);
93194
93195                 // Enter
93196                 var enter = items.enter()
93197                     .append('li')
93198                     .attr('class', function(d) { return 'labeled-input preset-access-' + d; });
93199
93200                 enter
93201                     .append('span')
93202                     .attr('class', 'label preset-label-access')
93203                     .attr('for', function(d) { return 'preset-input-access-' + d; })
93204                     .text(function(d) { return field.t('types.' + d); });
93205
93206                 enter
93207                     .append('div')
93208                     .attr('class', 'preset-input-access-wrap')
93209                     .append('input')
93210                     .attr('type', 'text')
93211                     .attr('class', function(d) { return 'preset-input-access preset-input-access-' + d; })
93212                     .call(utilNoAuto)
93213                     .each(function(d) {
93214                         d3_select(this)
93215                             .call(uiCombobox(context, 'access-' + d)
93216                                 .data(access.options(d))
93217                             );
93218                     });
93219
93220
93221                 // Update
93222                 items = items.merge(enter);
93223
93224                 wrap.selectAll('.preset-input-access')
93225                     .on('change', change)
93226                     .on('blur', change);
93227             }
93228
93229
93230             function change(d) {
93231                 var tag = {};
93232                 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
93233                 dispatch$1.call('change', this, tag);
93234             }
93235
93236
93237             access.options = function(type) {
93238                 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
93239
93240                 if (type !== 'access') {
93241                     options.unshift('yes');
93242                     options.push('designated');
93243
93244                     if (type === 'bicycle') {
93245                         options.push('dismount');
93246                     }
93247                 }
93248
93249                 return options.map(function(option) {
93250                     return {
93251                         title: field.t('options.' + option + '.description'),
93252                         value: option
93253                     };
93254                 });
93255             };
93256
93257
93258             var placeholders = {
93259                 footway: {
93260                     foot: 'designated',
93261                     motor_vehicle: 'no'
93262                 },
93263                 steps: {
93264                     foot: 'yes',
93265                     motor_vehicle: 'no',
93266                     bicycle: 'no',
93267                     horse: 'no'
93268                 },
93269                 pedestrian: {
93270                     foot: 'yes',
93271                     motor_vehicle: 'no'
93272                 },
93273                 cycleway: {
93274                     motor_vehicle: 'no',
93275                     bicycle: 'designated'
93276                 },
93277                 bridleway: {
93278                     motor_vehicle: 'no',
93279                     horse: 'designated'
93280                 },
93281                 path: {
93282                     foot: 'yes',
93283                     motor_vehicle: 'no',
93284                     bicycle: 'yes',
93285                     horse: 'yes'
93286                 },
93287                 motorway: {
93288                     foot: 'no',
93289                     motor_vehicle: 'yes',
93290                     bicycle: 'no',
93291                     horse: 'no'
93292                 },
93293                 trunk: {
93294                     motor_vehicle: 'yes'
93295                 },
93296                 primary: {
93297                     foot: 'yes',
93298                     motor_vehicle: 'yes',
93299                     bicycle: 'yes',
93300                     horse: 'yes'
93301                 },
93302                 secondary: {
93303                     foot: 'yes',
93304                     motor_vehicle: 'yes',
93305                     bicycle: 'yes',
93306                     horse: 'yes'
93307                 },
93308                 tertiary: {
93309                     foot: 'yes',
93310                     motor_vehicle: 'yes',
93311                     bicycle: 'yes',
93312                     horse: 'yes'
93313                 },
93314                 residential: {
93315                     foot: 'yes',
93316                     motor_vehicle: 'yes',
93317                     bicycle: 'yes',
93318                     horse: 'yes'
93319                 },
93320                 unclassified: {
93321                     foot: 'yes',
93322                     motor_vehicle: 'yes',
93323                     bicycle: 'yes',
93324                     horse: 'yes'
93325                 },
93326                 service: {
93327                     foot: 'yes',
93328                     motor_vehicle: 'yes',
93329                     bicycle: 'yes',
93330                     horse: 'yes'
93331                 },
93332                 motorway_link: {
93333                     foot: 'no',
93334                     motor_vehicle: 'yes',
93335                     bicycle: 'no',
93336                     horse: 'no'
93337                 },
93338                 trunk_link: {
93339                     motor_vehicle: 'yes'
93340                 },
93341                 primary_link: {
93342                     foot: 'yes',
93343                     motor_vehicle: 'yes',
93344                     bicycle: 'yes',
93345                     horse: 'yes'
93346                 },
93347                 secondary_link: {
93348                     foot: 'yes',
93349                     motor_vehicle: 'yes',
93350                     bicycle: 'yes',
93351                     horse: 'yes'
93352                 },
93353                 tertiary_link: {
93354                     foot: 'yes',
93355                     motor_vehicle: 'yes',
93356                     bicycle: 'yes',
93357                     horse: 'yes'
93358                 }
93359             };
93360
93361
93362             access.tags = function(tags) {
93363                 utilGetSetValue(items.selectAll('.preset-input-access'),
93364                     function(d) { return tags[d] || ''; })
93365                     .attr('placeholder', function() {
93366                         return tags.access ? tags.access : field.placeholder();
93367                     });
93368
93369                 items.selectAll('.preset-input-access-access')
93370                     .attr('placeholder', 'yes');
93371
93372                 var which = tags.highway;
93373                 if (!placeholders[which]) return;
93374
93375                 var keys = Object.keys(placeholders[which]);
93376                 keys.forEach(function(k) {
93377                     var v = placeholders[which][k];
93378                     items.selectAll('.preset-input-access-' + k)
93379                         .attr('placeholder', tags.access || v);
93380                 });
93381             };
93382
93383
93384             access.focus = function() {
93385                 items.selectAll('.preset-input-access')
93386                     .node().focus();
93387             };
93388
93389
93390             return utilRebind(access, dispatch$1, 'on');
93391         }
93392
93393         function uiFieldAddress(field, context) {
93394             var dispatch$1 = dispatch('init', 'change');
93395             var nominatim = services$1.geocoder;
93396             var wrap = d3_select(null);
93397             var _isInitialized = false;
93398             var _entity;
93399
93400             function getNearStreets() {
93401                 var extent = _entity.extent(context.graph());
93402                 var l = extent.center();
93403                 var box = geoExtent(l).padByMeters(200);
93404
93405                 var streets = context.intersects(box)
93406                     .filter(isAddressable)
93407                     .map(function(d) {
93408                         var loc = context.projection([
93409                             (extent[0][0] + extent[1][0]) / 2,
93410                             (extent[0][1] + extent[1][1]) / 2
93411                         ]);
93412                         var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
93413
93414                         return {
93415                             title: d.tags.name,
93416                             value: d.tags.name,
93417                             dist: choice.distance
93418                         };
93419                     })
93420                     .sort(function(a, b) {
93421                         return a.dist - b.dist;
93422                     });
93423
93424                 return utilArrayUniqBy(streets, 'value');
93425
93426                 function isAddressable(d) {
93427                     return d.tags.highway && d.tags.name && d.type === 'way';
93428                 }
93429             }
93430
93431
93432             function getNearCities() {
93433                 var extent = _entity.extent(context.graph());
93434                 var l = extent.center();
93435                 var box = geoExtent(l).padByMeters(200);
93436
93437                 var cities = context.intersects(box)
93438                     .filter(isAddressable)
93439                     .map(function(d) {
93440                         return {
93441                             title: d.tags['addr:city'] || d.tags.name,
93442                             value: d.tags['addr:city'] || d.tags.name,
93443                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93444                         };
93445                     })
93446                     .sort(function(a, b) {
93447                         return a.dist - b.dist;
93448                     });
93449
93450                 return utilArrayUniqBy(cities, 'value');
93451
93452
93453                 function isAddressable(d) {
93454                     if (d.tags.name) {
93455                         if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
93456                             return true;
93457                         if (d.tags.border_type === 'city')
93458                             return true;
93459                         if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
93460                             return true;
93461                     }
93462
93463                     if (d.tags['addr:city'])
93464                         return true;
93465
93466                     return false;
93467                 }
93468             }
93469
93470             function getNearValues(key) {
93471                 var extent = _entity.extent(context.graph());
93472                 var l = extent.center();
93473                 var box = geoExtent(l).padByMeters(200);
93474
93475                 var results = context.intersects(box)
93476                     .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
93477                     .map(function(d) {
93478                         return {
93479                             title: d.tags[key],
93480                             value: d.tags[key],
93481                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93482                         };
93483                     })
93484                     .sort(function(a, b) {
93485                         return a.dist - b.dist;
93486                     });
93487
93488                 return utilArrayUniqBy(results, 'value');
93489             }
93490
93491
93492             function countryCallback(err, countryCode) {
93493                 if (err) return;
93494                 countryCode = countryCode.toLowerCase();
93495
93496                 var addressFormat;
93497                 for (var i = 0; i < dataAddressFormats.length; i++) {
93498                     var format = dataAddressFormats[i];
93499                     if (!format.countryCodes) {
93500                         addressFormat = format;   // choose the default format, keep going
93501                     } else if (format.countryCodes.indexOf(countryCode) !== -1) {
93502                         addressFormat = format;   // choose the country format, stop here
93503                         break;
93504                     }
93505                 }
93506
93507                 var dropdowns = addressFormat.dropdowns || [
93508                     'city', 'county', 'country', 'district', 'hamlet',
93509                     'neighbourhood', 'place', 'postcode', 'province',
93510                     'quarter', 'state', 'street', 'subdistrict', 'suburb'
93511                 ];
93512
93513                 var widths = addressFormat.widths || {
93514                     housenumber: 1/3, street: 2/3,
93515                     city: 2/3, state: 1/4, postcode: 1/3
93516                 };
93517
93518                 function row(r) {
93519                     // Normalize widths.
93520                     var total = r.reduce(function(sum, key) {
93521                         return sum + (widths[key] || 0.5);
93522                     }, 0);
93523
93524                     return r.map(function(key) {
93525                         return {
93526                             id: key,
93527                             width: (widths[key] || 0.5) / total
93528                         };
93529                     });
93530                 }
93531
93532                 wrap.selectAll('.addr-row')
93533                     .data(addressFormat.format)
93534                     .enter()
93535                     .append('div')
93536                     .attr('class', 'addr-row')
93537                     .selectAll('input')
93538                     .data(row)
93539                     .enter()
93540                     .append('input')
93541                     .property('type', 'text')
93542                     .attr('placeholder', function (d) {
93543                         var localkey = d.id + '!' + countryCode;
93544                         var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
93545                         return field.t('placeholders.' + tkey);
93546                     })
93547                     .attr('class', function (d) { return 'addr-' + d.id; })
93548                     .call(utilNoAuto)
93549                     .each(addDropdown)
93550                     .style('width', function (d) { return d.width * 100 + '%'; });
93551
93552
93553                 function addDropdown(d) {
93554                     if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
93555
93556                     var nearValues = (d.id === 'street') ? getNearStreets
93557                         : (d.id === 'city') ? getNearCities
93558                         : getNearValues;
93559
93560                     d3_select(this)
93561                         .call(uiCombobox(context, 'address-' + d.id)
93562                             .minItems(1)
93563                             .caseSensitive(true)
93564                             .fetcher(function(value, callback) {
93565                                 callback(nearValues('addr:' + d.id));
93566                             })
93567                         );
93568                 }
93569
93570                 wrap.selectAll('input')
93571                     .on('blur', change())
93572                     .on('change', change());
93573
93574                 wrap.selectAll('input:not(.combobox-input)')
93575                     .on('input', change(true));
93576
93577                 dispatch$1.call('init');
93578                 _isInitialized = true;
93579             }
93580
93581
93582             function address(selection) {
93583                 _isInitialized = false;
93584
93585                 wrap = selection.selectAll('.form-field-input-wrap')
93586                     .data([0]);
93587
93588                 wrap = wrap.enter()
93589                     .append('div')
93590                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93591                     .merge(wrap);
93592
93593                 if (nominatim && _entity) {
93594                     var center = _entity.extent(context.graph()).center();
93595                     nominatim.countryCode(center, countryCallback);
93596                 }
93597             }
93598
93599
93600             function change(onInput) {
93601                 return function() {
93602                     var tags = {};
93603
93604                     wrap.selectAll('input')
93605                         .each(function (field) {
93606                             tags['addr:' + field.id] = this.value || undefined;
93607                         });
93608
93609                     dispatch$1.call('change', this, tags, onInput);
93610                 };
93611             }
93612
93613
93614             function updateTags(tags) {
93615                 utilGetSetValue(wrap.selectAll('input'), function (field) {
93616                     return tags['addr:' + field.id] || '';
93617                 });
93618             }
93619
93620
93621             address.entity = function(val) {
93622                 if (!arguments.length) return _entity;
93623                 _entity = val;
93624                 return address;
93625             };
93626
93627
93628             address.tags = function(tags) {
93629                 if (_isInitialized) {
93630                     updateTags(tags);
93631                 } else {
93632                     dispatch$1.on('init', function () {
93633                         dispatch$1.on('init', null);
93634                         updateTags(tags);
93635                     });
93636                 }
93637             };
93638
93639
93640             address.focus = function() {
93641                 var node = wrap.selectAll('input').node();
93642                 if (node) node.focus();
93643             };
93644
93645
93646             return utilRebind(address, dispatch$1, 'on');
93647         }
93648
93649         function uiFieldCycleway(field, context) {
93650             var dispatch$1 = dispatch('change');
93651             var items = d3_select(null);
93652             var wrap = d3_select(null);
93653
93654             function cycleway(selection) {
93655
93656                 function stripcolon(s) {
93657                     return s.replace(':', '');
93658                 }
93659
93660
93661                 wrap = selection.selectAll('.form-field-input-wrap')
93662                     .data([0]);
93663
93664                 wrap = wrap.enter()
93665                     .append('div')
93666                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93667                     .merge(wrap);
93668
93669
93670                 var div = wrap.selectAll('ul')
93671                     .data([0]);
93672
93673                 div = div.enter()
93674                     .append('ul')
93675                     .attr('class', 'rows')
93676                     .merge(div);
93677
93678                 var keys = ['cycleway:left', 'cycleway:right'];
93679
93680                 items = div.selectAll('li')
93681                     .data(keys);
93682
93683                 var enter = items.enter()
93684                     .append('li')
93685                     .attr('class', function(d) { return 'labeled-input preset-cycleway-' + stripcolon(d); });
93686
93687                 enter
93688                     .append('span')
93689                     .attr('class', 'label preset-label-cycleway')
93690                     .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
93691                     .text(function(d) { return field.t('types.' + d); });
93692
93693                 enter
93694                     .append('div')
93695                     .attr('class', 'preset-input-cycleway-wrap')
93696                     .append('input')
93697                     .attr('type', 'text')
93698                     .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
93699                     .call(utilNoAuto)
93700                     .each(function(d) {
93701                         d3_select(this)
93702                             .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
93703                                 .data(cycleway.options(d))
93704                             );
93705                     });
93706
93707
93708                 // Update
93709                 wrap.selectAll('.preset-input-cycleway')
93710                     .on('change', change)
93711                     .on('blur', change);
93712             }
93713
93714
93715             function change() {
93716                 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft'));
93717                 var right = utilGetSetValue(d3_select('.preset-input-cyclewayright'));
93718                 var tag = {};
93719
93720                 if (left === 'none' || left === '') { left = undefined; }
93721                 if (right === 'none' || right === '') { right = undefined; }
93722
93723                 // Always set both left and right as changing one can affect the other
93724                 tag = {
93725                     cycleway: undefined,
93726                     'cycleway:left': left,
93727                     'cycleway:right': right
93728                 };
93729
93730                 // If the left and right tags match, use the cycleway tag to tag both
93731                 // sides the same way
93732                 if (left === right) {
93733                     tag = {
93734                         cycleway: left,
93735                         'cycleway:left': undefined,
93736                         'cycleway:right': undefined
93737                     };
93738                 }
93739
93740                 dispatch$1.call('change', this, tag);
93741             }
93742
93743
93744             cycleway.options = function() {
93745                 return Object.keys(field.strings.options).map(function(option) {
93746                     return {
93747                         title: field.t('options.' + option + '.description'),
93748                         value: option
93749                     };
93750                 });
93751             };
93752
93753
93754             cycleway.tags = function(tags) {
93755                 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
93756                         // If cycleway is set, always return that
93757                         if (tags.cycleway) {
93758                             return tags.cycleway;
93759                         }
93760                         return tags[d] || '';
93761                     })
93762                     .attr('placeholder', field.placeholder());
93763             };
93764
93765
93766             cycleway.focus = function() {
93767                 var node = wrap.selectAll('input').node();
93768                 if (node) node.focus();
93769             };
93770
93771
93772             return utilRebind(cycleway, dispatch$1, 'on');
93773         }
93774
93775         function uiFieldLanes(field, context) {
93776             var dispatch$1 = dispatch('change');
93777             var LANE_WIDTH = 40;
93778             var LANE_HEIGHT = 200;
93779             var _entityID;
93780
93781             function lanes(selection) {
93782                 var lanesData = context.entity(_entityID).lanes();
93783
93784                 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
93785                     selection.call(lanes.off);
93786                     return;
93787                 }
93788
93789                 var wrap = selection.selectAll('.form-field-input-wrap')
93790                     .data([0]);
93791
93792                 wrap = wrap.enter()
93793                     .append('div')
93794                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93795                     .merge(wrap);
93796
93797                 var surface =  wrap.selectAll('.surface')
93798                     .data([0]);
93799
93800                 var d = utilGetDimensions(wrap);
93801                 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
93802
93803                 surface = surface.enter()
93804                     .append('svg')
93805                     .attr('width', d[0])
93806                     .attr('height', 300)
93807                     .attr('class', 'surface')
93808                     .merge(surface);
93809
93810
93811                 var lanesSelection = surface.selectAll('.lanes')
93812                     .data([0]);
93813
93814                 lanesSelection = lanesSelection.enter()
93815                     .append('g')
93816                     .attr('class', 'lanes')
93817                     .merge(lanesSelection);
93818
93819                 lanesSelection
93820                     .attr('transform', function () {
93821                         return 'translate(' + (freeSpace / 2) + ', 0)';
93822                     });
93823
93824
93825                 var lane = lanesSelection.selectAll('.lane')
93826                    .data(lanesData.lanes);
93827
93828                 lane.exit()
93829                     .remove();
93830
93831                 var enter = lane.enter()
93832                     .append('g')
93833                     .attr('class', 'lane');
93834
93835                 enter
93836                     .append('g')
93837                     .append('rect')
93838                     .attr('y', 50)
93839                     .attr('width', LANE_WIDTH)
93840                     .attr('height', LANE_HEIGHT);
93841
93842                 enter
93843                     .append('g')
93844                     .attr('class', 'forward')
93845                     .append('text')
93846                     .attr('y', 40)
93847                     .attr('x', 14)
93848                     .text('▲');
93849
93850                 enter
93851                     .append('g')
93852                     .attr('class', 'bothways')
93853                     .append('text')
93854                     .attr('y', 40)
93855                     .attr('x', 14)
93856                     .text('▲▼');
93857
93858                 enter
93859                     .append('g')
93860                     .attr('class', 'backward')
93861                     .append('text')
93862                     .attr('y', 40)
93863                     .attr('x', 14)
93864                     .text('▼');
93865
93866
93867                 lane = lane
93868                     .merge(enter);
93869
93870                 lane
93871                     .attr('transform', function(d) {
93872                         return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
93873                     });
93874
93875                 lane.select('.forward')
93876                     .style('visibility', function(d) {
93877                         return d.direction === 'forward' ? 'visible' : 'hidden';
93878                     });
93879
93880                 lane.select('.bothways')
93881                     .style('visibility', function(d) {
93882                         return d.direction === 'bothways' ? 'visible' : 'hidden';
93883                     });
93884
93885                 lane.select('.backward')
93886                     .style('visibility', function(d) {
93887                         return d.direction === 'backward' ? 'visible' : 'hidden';
93888                     });
93889             }
93890
93891
93892             lanes.entity = function(val) {
93893                 if (!_entityID || _entityID !== val.id) {
93894                     _entityID = val.id;
93895                 }
93896             };
93897
93898             lanes.tags = function() {};
93899             lanes.focus = function() {};
93900             lanes.off = function() {};
93901
93902             return utilRebind(lanes, dispatch$1, 'on');
93903         }
93904
93905         function uiFieldLocalized(field, context) {
93906             var dispatch$1 = dispatch('change', 'input');
93907             var wikipedia = services$1.wikipedia;
93908             var input = d3_select(null);
93909             var localizedInputs = d3_select(null);
93910
93911             var allSuggestions = context.presets().collection.filter(function(p) {
93912                 return p.suggestion === true;
93913             });
93914
93915             // reuse these combos
93916             var langCombo = uiCombobox(context, 'localized-lang')
93917                 .fetcher(fetchLanguages)
93918                 .minItems(0);
93919
93920             var brandCombo = uiCombobox(context, 'localized-brand')
93921                 .canAutocomplete(false)
93922                 .minItems(1);
93923
93924             var _selection = d3_select(null);
93925             var _multilingual = [];
93926             var _buttonTip = tooltip()
93927                 .title(t('translate.translate'))
93928                 .placement('left');
93929             var _wikiTitles;
93930             var _entity;
93931
93932
93933             function calcLocked() {
93934                 if (!_entity) {    // the original entity
93935                     field.locked(false);
93936                     return;
93937                 }
93938
93939                 var latest = context.hasEntity(_entity.id);
93940                 if (!latest) {    // get current entity, possibly edited
93941                     field.locked(false);
93942                     return;
93943                 }
93944
93945                 var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
93946                 var hasWikidata = latest.tags.wikidata;
93947                 var preset = context.presets().match(latest, context.graph());
93948                 var isSuggestion = preset && preset.suggestion;
93949                 var showsBrand = preset && preset.fields
93950                     .filter(function(d) { return d.id === 'brand'; }).length;
93951
93952                 var isLocked = !!(field.id === 'name' && hasOriginalName &&
93953                     (hasWikidata || (isSuggestion && !showsBrand)));
93954
93955                 field.locked(isLocked);
93956             }
93957
93958
93959             function calcMultilingual(tags) {
93960                 _multilingual = [];
93961                 for (var k in tags) {
93962                     var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
93963                     if (m && m[1] === field.key && m[2]) {
93964                         _multilingual.push({ lang: m[2], value: tags[k] });
93965                     }
93966                 }
93967                 _multilingual.reverse();
93968             }
93969
93970
93971             function localized(selection) {
93972                 _selection = selection;
93973                 calcLocked();
93974                 var isLocked = field.locked();
93975                 var entity = _entity && context.hasEntity(_entity.id);  // get latest
93976                 var preset = entity && context.presets().match(entity, context.graph());
93977
93978                 var wrap = selection.selectAll('.form-field-input-wrap')
93979                     .data([0]);
93980
93981                 // enter/update
93982                 wrap = wrap.enter()
93983                     .append('div')
93984                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93985                     .merge(wrap);
93986
93987                 input = wrap.selectAll('.localized-main')
93988                     .data([0]);
93989
93990                 // enter/update
93991                 input = input.enter()
93992                     .append('input')
93993                     .attr('type', 'text')
93994                     .attr('id', 'preset-input-' + field.safeid)
93995                     .attr('class', 'localized-main')
93996                     .attr('placeholder', field.placeholder())
93997                     .call(utilNoAuto)
93998                     .merge(input);
93999
94000                 if (preset && field.id === 'name') {
94001                     var pTag = preset.id.split('/', 2);
94002                     var pKey = pTag[0];
94003                     var pValue = pTag[1];
94004
94005                     if (!preset.suggestion) {
94006                         // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
94007                         // This code attempts to determine if the matched preset is the
94008                         // kind of preset that even can benefit from name suggestions..
94009                         // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
94010                         // - false = churches, parks, hospitals, etc. (things not in the index)
94011                         var isFallback = preset.isFallback();
94012                         var goodSuggestions = allSuggestions.filter(function(s) {
94013                             if (isFallback) return true;
94014                             var sTag = s.id.split('/', 2);
94015                             var sKey = sTag[0];
94016                             var sValue = sTag[1];
94017                             return pKey === sKey && (!pValue || pValue === sValue);
94018                         });
94019
94020                         // Show the suggestions.. If the user picks one, change the tags..
94021                         if (allSuggestions.length && goodSuggestions.length) {
94022                             input
94023                                 .on('blur.localized', checkBrandOnBlur)
94024                                 .call(brandCombo
94025                                     .fetcher(fetchBrandNames(preset, allSuggestions))
94026                                     .on('accept', acceptBrand)
94027                                     .on('cancel', cancelBrand)
94028                                 );
94029                         }
94030                     }
94031                 }
94032
94033                 input
94034                     .classed('disabled', !!isLocked)
94035                     .attr('readonly', isLocked || null)
94036                     .on('input', change(true))
94037                     .on('blur', change())
94038                     .on('change', change());
94039
94040
94041                 var translateButton = wrap.selectAll('.localized-add')
94042                     .data([0]);
94043
94044                 translateButton = translateButton.enter()
94045                     .append('button')
94046                     .attr('class', 'localized-add form-field-button')
94047                     .attr('tabindex', -1)
94048                     .call(svgIcon('#iD-icon-plus'))
94049                     .merge(translateButton);
94050
94051                 translateButton
94052                     .classed('disabled', !!isLocked)
94053                     .call(isLocked ? _buttonTip.destroy : _buttonTip)
94054                     .on('click', addNew);
94055
94056
94057                 if (entity && !_multilingual.length) {
94058                     calcMultilingual(entity.tags);
94059                 }
94060
94061                 localizedInputs = selection.selectAll('.localized-multilingual')
94062                     .data([0]);
94063
94064                 localizedInputs = localizedInputs.enter()
94065                     .append('div')
94066                     .attr('class', 'localized-multilingual')
94067                     .merge(localizedInputs);
94068
94069                 localizedInputs
94070                     .call(renderMultilingual);
94071
94072                 localizedInputs.selectAll('button, input')
94073                     .classed('disabled', !!isLocked)
94074                     .attr('readonly', isLocked || null);
94075
94076
94077
94078                 // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
94079                 // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
94080                 // So compare the current field value against the suggestions one last time.
94081                 function checkBrandOnBlur() {
94082                     var latest = context.hasEntity(_entity.id);
94083                     if (!latest) return;   // deleting the entity blurred the field?
94084
94085                     var preset = context.presets().match(latest, context.graph());
94086                     if (preset && preset.suggestion) return;   // already accepted
94087
94088                     // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
94089                     var name = utilGetSetValue(input).trim();
94090                     var matched = allSuggestions.filter(function(s) { return name === s.name(); });
94091
94092                     if (matched.length === 1) {
94093                         acceptBrand({ suggestion: matched[0] });
94094                     } else {
94095                         cancelBrand();
94096                     }
94097                 }
94098
94099
94100                 function acceptBrand(d) {
94101                     if (!d) {
94102                         cancelBrand();
94103                         return;
94104                     }
94105
94106                     var entity = context.entity(_entity.id);  // get latest
94107                     var tags = entity.tags;
94108                     var geometry = entity.geometry(context.graph());
94109                     var removed = preset.unsetTags(tags, geometry);
94110                     for (var k in tags) {
94111                         tags[k] = removed[k];  // set removed tags to `undefined`
94112                     }
94113                     tags = d.suggestion.setTags(tags, geometry);
94114                     utilGetSetValue(input, tags.name);
94115                     dispatch$1.call('change', this, tags);
94116                 }
94117
94118
94119                 // user hit escape, clean whatever preset name appears after the last ' – '
94120                 function cancelBrand() {
94121                     var name = utilGetSetValue(input);
94122                     var clean = cleanName(name);
94123                     if (clean !== name) {
94124                         utilGetSetValue(input, clean);
94125                         dispatch$1.call('change', this, { name: clean });
94126                     }
94127                 }
94128
94129                 // Remove whatever is after the last ' – '
94130                 // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
94131                 function cleanName(name) {
94132                     var parts = name.split(' – ');
94133                     if (parts.length > 1) {
94134                         parts.pop();
94135                         name = parts.join(' – ');
94136                     }
94137                     return name;
94138                 }
94139
94140
94141                 function fetchBrandNames(preset, suggestions) {
94142                     var pTag = preset.id.split('/', 2);
94143                     var pKey = pTag[0];
94144                     var pValue = pTag[1];
94145
94146                     return function(value, callback) {
94147                         var results = [];
94148                         if (value && value.length > 2) {
94149                             for (var i = 0; i < suggestions.length; i++) {
94150                                 var s = suggestions[i];
94151                                 var sTag = s.id.split('/', 2);
94152                                 var sKey = sTag[0];
94153                                 var sValue = sTag[1];
94154                                 var name = s.name();
94155                                 var dist = utilEditDistance(value, name.substring(0, value.length));
94156                                 var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
94157
94158                                 if (dist < 1 || (matchesPreset && dist < 3)) {
94159                                     var obj = {
94160                                         title: name,
94161                                         value: name,
94162                                         suggestion: s,
94163                                         dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
94164                                     };
94165                                     results.push(obj);
94166                                 }
94167                             }
94168                             results.sort(function(a, b) { return a.dist - b.dist; });
94169                         }
94170                         results = results.slice(0, 10);
94171                         callback(results);
94172                     };
94173                 }
94174
94175
94176                 function addNew() {
94177                     event.preventDefault();
94178                     if (field.locked()) return;
94179
94180                     var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
94181                     var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
94182                     var isLangEn = defaultLang.indexOf('en') > -1;
94183                     if (isLangEn || langExists) {
94184                         defaultLang = '';
94185                     }
94186                     _multilingual.push({ lang: defaultLang, value: '' });
94187
94188                     localizedInputs
94189                         .call(renderMultilingual);
94190                 }
94191
94192
94193                 function change(onInput) {
94194                     return function() {
94195                         if (field.locked()) {
94196                             event.preventDefault();
94197                             return;
94198                         }
94199                         var t = {};
94200                         t[field.key] = utilGetSetValue(d3_select(this)) || undefined;
94201                         dispatch$1.call('change', this, t, onInput);
94202                     };
94203                 }
94204             }
94205
94206
94207             function key(lang) {
94208                 return field.key + ':' + lang;
94209             }
94210
94211
94212             function changeLang(d) {
94213                 var lang = utilGetSetValue(d3_select(this));
94214                 var t = {};
94215                 var language = wikipedia$2.find(function(d) {
94216                     return d[0].toLowerCase() === lang.toLowerCase() ||
94217                         d[1].toLowerCase() === lang.toLowerCase();
94218                 });
94219
94220                 if (language) lang = language[2];
94221
94222                 if (d.lang && d.lang !== lang) {
94223                     t[key(d.lang)] = undefined;
94224                 }
94225
94226                 var value = utilGetSetValue(d3_select(this.parentNode)
94227                     .selectAll('.localized-value'));
94228
94229                 if (lang && value) {
94230                     t[key(lang)] = value;
94231                 } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
94232                     t[key(lang)] = _wikiTitles[d.lang];
94233                 }
94234
94235                 d.lang = lang;
94236                 dispatch$1.call('change', this, t);
94237             }
94238
94239
94240             function changeValue(d) {
94241                 if (!d.lang) return;
94242                 var t = {};
94243                 t[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
94244                 dispatch$1.call('change', this, t);
94245             }
94246
94247
94248             function fetchLanguages(value, cb) {
94249                 var v = value.toLowerCase();
94250
94251                 cb(wikipedia$2.filter(function(d) {
94252                     return d[0].toLowerCase().indexOf(v) >= 0 ||
94253                     d[1].toLowerCase().indexOf(v) >= 0 ||
94254                     d[2].toLowerCase().indexOf(v) >= 0;
94255                 }).map(function(d) {
94256                     return { value: d[1] };
94257                 }));
94258             }
94259
94260
94261             function renderMultilingual(selection) {
94262                 var wraps = selection.selectAll('div.entry')
94263                     .data(_multilingual, function(d) { return d.lang; });
94264
94265                 wraps.exit()
94266                     .transition()
94267                     .duration(200)
94268                     .style('max-height', '0px')
94269                     .style('opacity', '0')
94270                     .style('top', '-10px')
94271                     .remove();
94272
94273                 var innerWrap = wraps.enter()
94274                     .insert('div', ':first-child');
94275
94276                 innerWrap
94277                     .attr('class', 'entry')
94278                     .each(function() {
94279                         var wrap = d3_select(this);
94280
94281                         var label = wrap
94282                             .append('label')
94283                             .attr('class', 'field-label');
94284
94285                         var text = label
94286                             .append('span')
94287                             .attr('class', 'label-text');
94288
94289                         text
94290                             .append('span')
94291                             .attr('class', 'label-textvalue')
94292                             .text(t('translate.localized_translation_label'));
94293
94294                         text
94295                             .append('span')
94296                             .attr('class', 'label-textannotation');
94297
94298                         label
94299                             .append('button')
94300                             .attr('class', 'remove-icon-multilingual')
94301                             .on('click', function(d){
94302                                 if (field.locked()) return;
94303                                 event.preventDefault();
94304                                 var t = {};
94305                                 t[key(d.lang)] = undefined;
94306                                 dispatch$1.call('change', this, t);
94307                                 d3_select(this.parentNode.parentNode.parentNode)
94308                                     .style('top', '0')
94309                                     .style('max-height', '240px')
94310                                     .transition()
94311                                     .style('opacity', '0')
94312                                     .style('max-height', '0px')
94313                                     .remove();
94314                             })
94315                             .call(svgIcon('#iD-operation-delete'));
94316
94317                         wrap
94318                             .append('input')
94319                             .attr('class', 'localized-lang')
94320                             .attr('type', 'text')
94321                             .attr('placeholder', t('translate.localized_translation_language'))
94322                             .on('blur', changeLang)
94323                             .on('change', changeLang)
94324                             .call(langCombo);
94325
94326                         wrap
94327                             .append('input')
94328                             .attr('type', 'text')
94329                             .attr('placeholder', t('translate.localized_translation_name'))
94330                             .attr('class', 'localized-value')
94331                             .on('blur', changeValue)
94332                             .on('change', changeValue);
94333                     });
94334
94335                 innerWrap
94336                     .style('margin-top', '0px')
94337                     .style('max-height', '0px')
94338                     .style('opacity', '0')
94339                     .transition()
94340                     .duration(200)
94341                     .style('margin-top', '10px')
94342                     .style('max-height', '240px')
94343                     .style('opacity', '1')
94344                     .on('end', function() {
94345                         d3_select(this)
94346                             .style('max-height', '')
94347                             .style('overflow', 'visible');
94348                     });
94349
94350
94351                 var entry = selection.selectAll('.entry');
94352
94353                 utilGetSetValue(entry.select('.localized-lang'), function(d) {
94354                     var lang = wikipedia$2.find(function(lang) { return lang[2] === d.lang; });
94355                     return lang ? lang[1] : d.lang;
94356                 });
94357
94358                 utilGetSetValue(entry.select('.localized-value'),
94359                     function(d) { return d.value; });
94360             }
94361
94362
94363             localized.tags = function(tags) {
94364                 // Fetch translations from wikipedia
94365                 if (tags.wikipedia && !_wikiTitles) {
94366                     _wikiTitles = {};
94367                     var wm = tags.wikipedia.match(/([^:]+):(.+)/);
94368                     if (wm && wm[0] && wm[1]) {
94369                         wikipedia.translations(wm[1], wm[2], function(err, d) {
94370                             if (err || !d) return;
94371                             _wikiTitles = d;
94372                         });
94373                     }
94374                 }
94375
94376                 utilGetSetValue(input, tags[field.key] || '');
94377
94378                 calcMultilingual(tags);
94379
94380                 _selection
94381                     .call(localized);
94382             };
94383
94384
94385             localized.focus = function() {
94386                 input.node().focus();
94387             };
94388
94389
94390             localized.entity = function(val) {
94391                 if (!arguments.length) return _entity;
94392                 _entity = val;
94393                 _multilingual = [];
94394                 return localized;
94395             };
94396
94397             return utilRebind(localized, dispatch$1, 'on');
94398         }
94399
94400         function uiFieldMaxspeed(field, context) {
94401             var dispatch$1 = dispatch('change');
94402             var unitInput = d3_select(null);
94403             var input = d3_select(null);
94404             var _entity;
94405             var _isImperial;
94406
94407             var speedCombo = uiCombobox(context, 'maxspeed');
94408             var unitCombo = uiCombobox(context, 'maxspeed-unit')
94409                     .data(['km/h', 'mph'].map(comboValues));
94410
94411             var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
94412             var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
94413
94414
94415             function maxspeed(selection) {
94416
94417                 var wrap = selection.selectAll('.form-field-input-wrap')
94418                     .data([0]);
94419
94420                 wrap = wrap.enter()
94421                     .append('div')
94422                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94423                     .merge(wrap);
94424
94425
94426                 input = wrap.selectAll('#preset-input-' + field.safeid)
94427                     .data([0]);
94428
94429                 input = input.enter()
94430                     .append('input')
94431                     .attr('type', 'text')
94432                     .attr('id', 'preset-input-' + field.safeid)
94433                     .attr('placeholder', field.placeholder())
94434                     .call(utilNoAuto)
94435                     .call(speedCombo)
94436                     .merge(input);
94437
94438                 input
94439                     .on('change', change)
94440                     .on('blur', change);
94441
94442                 var loc;
94443                 if (_entity.type === 'node') {
94444                     loc = _entity.loc;
94445                 } else {
94446                     var childNodes = context.graph().childNodes(context.entity(_entity.id));
94447                     loc = childNodes[~~(childNodes.length/2)].loc;
94448                 }
94449
94450                 _isImperial = dataMPH.features.some(function(f) {
94451                     return f.geometry.coordinates.some(function(d) {
94452                         return geoPointInPolygon(loc, d);
94453                     });
94454                 });
94455
94456                 unitInput = wrap.selectAll('input.maxspeed-unit')
94457                     .data([0]);
94458
94459                 unitInput = unitInput.enter()
94460                     .append('input')
94461                     .attr('type', 'text')
94462                     .attr('class', 'maxspeed-unit')
94463                     .call(unitCombo)
94464                     .merge(unitInput);
94465
94466                 unitInput
94467                     .on('blur', changeUnits)
94468                     .on('change', changeUnits);
94469
94470
94471                 function changeUnits() {
94472                     _isImperial = utilGetSetValue(unitInput) === 'mph';
94473                     utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94474                     setSuggestions();
94475                     change();
94476                 }
94477             }
94478
94479
94480             function setSuggestions() {
94481                 speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
94482                 utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94483             }
94484
94485
94486             function comboValues(d) {
94487                 return {
94488                     value: d.toString(),
94489                     title: d.toString()
94490                 };
94491             }
94492
94493
94494             function change() {
94495                 var tag = {};
94496                 var value = utilGetSetValue(input);
94497
94498                 if (!value) {
94499                     tag[field.key] = undefined;
94500                 } else if (isNaN(value) || !_isImperial) {
94501                     tag[field.key] = value;
94502                 } else {
94503                     tag[field.key] = value + ' mph';
94504                 }
94505
94506                 dispatch$1.call('change', this, tag);
94507             }
94508
94509
94510             maxspeed.tags = function(tags) {
94511                 var value = tags[field.key];
94512
94513                 if (value && value.indexOf('mph') >= 0) {
94514                     value = parseInt(value, 10);
94515                     _isImperial = true;
94516                 } else if (value) {
94517                     _isImperial = false;
94518                 }
94519
94520                 setSuggestions();
94521                 utilGetSetValue(input, value || '');
94522             };
94523
94524
94525             maxspeed.focus = function() {
94526                 input.node().focus();
94527             };
94528
94529
94530             maxspeed.entity = function(val) {
94531                 _entity = val;
94532             };
94533
94534
94535             return utilRebind(maxspeed, dispatch$1, 'on');
94536         }
94537
94538         function uiFieldRadio(field, context) {
94539             var dispatch$1 = dispatch('change');
94540             var placeholder = d3_select(null);
94541             var wrap = d3_select(null);
94542             var labels = d3_select(null);
94543             var radios = d3_select(null);
94544             var radioData = (field.options || field.keys).slice();  // shallow copy
94545             var typeField;
94546             var layerField;
94547             var _oldType = {};
94548             var _entity;
94549
94550
94551             function selectedKey() {
94552                 var node = wrap.selectAll('.form-field-input-radio label.active input');
94553                 return !node.empty() && node.datum();
94554             }
94555
94556
94557             function radio(selection) {
94558                 selection.classed('preset-radio', true);
94559
94560                 wrap = selection.selectAll('.form-field-input-wrap')
94561                     .data([0]);
94562
94563                 var enter = wrap.enter()
94564                     .append('div')
94565                     .attr('class', 'form-field-input-wrap form-field-input-radio');
94566
94567                 enter
94568                     .append('span')
94569                     .attr('class', 'placeholder');
94570
94571                 wrap = wrap
94572                     .merge(enter);
94573
94574
94575                 placeholder = wrap.selectAll('.placeholder');
94576
94577                 labels = wrap.selectAll('label')
94578                     .data(radioData);
94579
94580                 enter = labels.enter()
94581                     .append('label');
94582
94583                 enter
94584                     .append('input')
94585                     .attr('type', 'radio')
94586                     .attr('name', field.id)
94587                     .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
94588                     .attr('checked', false);
94589
94590                 enter
94591                     .append('span')
94592                     .text(function(d) { return field.t('options.' + d, { 'default': d }); });
94593
94594                 labels = labels
94595                     .merge(enter);
94596
94597                 radios = labels.selectAll('input')
94598                     .on('change', changeRadio);
94599
94600             }
94601
94602
94603             function structureExtras(selection, tags) {
94604                 var selected = selectedKey();
94605                 var type = context.presets().field(selected);
94606                 var layer = context.presets().field('layer');
94607                 var showLayer = (selected === 'bridge' || selected === 'tunnel');
94608
94609
94610                 var extrasWrap = selection.selectAll('.structure-extras-wrap')
94611                     .data(selected ? [0] : []);
94612
94613                 extrasWrap.exit()
94614                     .remove();
94615
94616                 extrasWrap = extrasWrap.enter()
94617                     .append('div')
94618                     .attr('class', 'structure-extras-wrap')
94619                     .merge(extrasWrap);
94620
94621                 var list = extrasWrap.selectAll('ul')
94622                     .data([0]);
94623
94624                 list = list.enter()
94625                     .append('ul')
94626                     .attr('class', 'rows')
94627                     .merge(list);
94628
94629
94630                 // Type
94631                 if (type) {
94632                     if (!typeField || typeField.id !== selected) {
94633                         typeField = uiField(context, type, _entity, { wrap: false })
94634                             .on('change', changeType);
94635                     }
94636                     typeField.tags(tags);
94637                 } else {
94638                     typeField = null;
94639                 }
94640
94641                 var typeItem = list.selectAll('.structure-type-item')
94642                     .data(typeField ? [typeField] : [], function(d) { return d.id; });
94643
94644                 // Exit
94645                 typeItem.exit()
94646                     .remove();
94647
94648                 // Enter
94649                 var typeEnter = typeItem.enter()
94650                     .insert('li', ':first-child')
94651                     .attr('class', 'labeled-input structure-type-item');
94652
94653                 typeEnter
94654                     .append('span')
94655                     .attr('class', 'label structure-label-type')
94656                     .attr('for', 'preset-input-' + selected)
94657                     .text(t('inspector.radio.structure.type'));
94658
94659                 typeEnter
94660                     .append('div')
94661                     .attr('class', 'structure-input-type-wrap');
94662
94663                 // Update
94664                 typeItem = typeItem
94665                     .merge(typeEnter);
94666
94667                 if (typeField) {
94668                     typeItem.selectAll('.structure-input-type-wrap')
94669                         .call(typeField.render);
94670                 }
94671
94672
94673                 // Layer
94674                 if (layer && showLayer) {
94675                     if (!layerField) {
94676                         layerField = uiField(context, layer, _entity, { wrap: false })
94677                             .on('change', changeLayer);
94678                     }
94679                     layerField.tags(tags);
94680                     field.keys = utilArrayUnion(field.keys, ['layer']);
94681                 } else {
94682                     layerField = null;
94683                     field.keys = field.keys.filter(function(k) { return k !== 'layer'; });
94684                 }
94685
94686                 var layerItem = list.selectAll('.structure-layer-item')
94687                     .data(layerField ? [layerField] : []);
94688
94689                 // Exit
94690                 layerItem.exit()
94691                     .remove();
94692
94693                 // Enter
94694                 var layerEnter = layerItem.enter()
94695                     .append('li')
94696                     .attr('class', 'labeled-input structure-layer-item');
94697
94698                 layerEnter
94699                     .append('span')
94700                     .attr('class', 'label structure-label-layer')
94701                     .attr('for', 'preset-input-layer')
94702                     .text(t('inspector.radio.structure.layer'));
94703
94704                 layerEnter
94705                     .append('div')
94706                     .attr('class', 'structure-input-layer-wrap');
94707
94708                 // Update
94709                 layerItem = layerItem
94710                     .merge(layerEnter);
94711
94712                 if (layerField) {
94713                     layerItem.selectAll('.structure-input-layer-wrap')
94714                         .call(layerField.render);
94715                 }
94716             }
94717
94718
94719             function changeType(t, onInput) {
94720                 var key = selectedKey();
94721                 if (!key) return;
94722
94723                 var val = t[key];
94724                 if (val !== 'no') {
94725                     _oldType[key] = val;
94726                 }
94727
94728                 if (field.type === 'structureRadio') {
94729                     // remove layer if it should not be set
94730                     if (val === 'no' ||
94731                         (key !== 'bridge' && key !== 'tunnel') ||
94732                         (key === 'tunnel' && val === 'building_passage')) {
94733                         t.layer = undefined;
94734                     }
94735                     // add layer if it should be set
94736                     if (t.layer === undefined) {
94737                         if (key === 'bridge' && val !== 'no') {
94738                             t.layer = '1';
94739                         }
94740                         if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
94741                             t.layer = '-1';
94742                         }
94743                     }
94744                  }
94745
94746                 dispatch$1.call('change', this, t, onInput);
94747             }
94748
94749
94750             function changeLayer(t, onInput) {
94751                 if (t.layer === '0') {
94752                     t.layer = undefined;
94753                 }
94754                 dispatch$1.call('change', this, t, onInput);
94755             }
94756
94757
94758             function changeRadio() {
94759                 var t = {};
94760                 var activeKey;
94761
94762                 if (field.key) {
94763                     t[field.key] = undefined;
94764                 }
94765
94766                 radios.each(function(d) {
94767                     var active = d3_select(this).property('checked');
94768                     if (active) activeKey = d;
94769
94770                     if (field.key) {
94771                         if (active) t[field.key] = d;
94772                     } else {
94773                         var val = _oldType[activeKey] || 'yes';
94774                         t[d] = active ? val : undefined;
94775                     }
94776                 });
94777
94778                 if (field.type === 'structureRadio') {
94779                     if (activeKey === 'bridge') {
94780                         t.layer = '1';
94781                     } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
94782                         t.layer = '-1';
94783                     } else {
94784                         t.layer = undefined;
94785                     }
94786                 }
94787
94788                 dispatch$1.call('change', this, t);
94789             }
94790
94791
94792             radio.tags = function(tags) {
94793                 function checked(d) {
94794                     if (field.key) {
94795                         return tags[field.key] === d;
94796                     } else {
94797                         return !!(tags[d] && tags[d].toLowerCase() !== 'no');
94798                     }
94799                 }
94800
94801                 labels.classed('active', checked);
94802                 radios.property('checked', checked);
94803
94804                 var selection = radios.filter(function() { return this.checked; });
94805
94806                 if (selection.empty()) {
94807                     placeholder.text(t('inspector.none'));
94808                 } else {
94809                     placeholder.text(selection.attr('value'));
94810                     _oldType[selection.datum()] = tags[selection.datum()];
94811                 }
94812
94813                 if (field.type === 'structureRadio') {
94814                     // For waterways without a tunnel tag, set 'culvert' as
94815                     // the _oldType to default to if the user picks 'tunnel'
94816                     if (!!tags.waterway && !_oldType.tunnel) {
94817                         _oldType.tunnel = 'culvert';
94818                     }
94819
94820                     wrap.call(structureExtras, tags);
94821                 }
94822             };
94823
94824
94825             radio.focus = function() {
94826                 radios.node().focus();
94827             };
94828
94829
94830             radio.entity = function(val) {
94831                 if (!arguments.length) return _entity;
94832                 _entity = val;
94833                 _oldType = {};
94834                 return radio;
94835             };
94836
94837
94838             return utilRebind(radio, dispatch$1, 'on');
94839         }
94840
94841         function uiFieldRestrictions(field, context) {
94842             var dispatch$1 = dispatch('change');
94843             var breathe = behaviorBreathe();
94844             var storedViaWay = context.storage('turn-restriction-via-way');
94845             var storedDistance = context.storage('turn-restriction-distance');
94846
94847             var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
94848             var _maxDistance = storedDistance ? (+storedDistance) : 30;
94849             var _initialized = false;
94850             var _parent = d3_select(null);       // the entire field
94851             var _container = d3_select(null);    // just the map
94852             var _oldTurns;
94853             var _graph;
94854             var _vertexID;
94855             var _intersection;
94856             var _fromWayID;
94857
94858             var _lastXPos;
94859
94860
94861             function restrictions(selection) {
94862                 _parent = selection;
94863
94864                 // try to reuse the intersection, but always rebuild it if the graph has changed
94865                 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
94866                     _graph = context.graph();
94867                     _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
94868                 }
94869
94870                 // It's possible for there to be no actual intersection here.
94871                 // for example, a vertex of two `highway=path`
94872                 // In this case, hide the field.
94873                 var isOK = (
94874                     _intersection &&
94875                     _intersection.vertices.length &&           // has vertices
94876                     _intersection.vertices                     // has the vertex that the user selected
94877                         .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
94878                     _intersection.ways.length > 2 &&           // has more than 2 ways
94879                     _intersection.ways                         // has more than 1 TO way
94880                         .filter(function(way) { return way.__to; }).length > 1
94881                 );
94882
94883                 // Also hide in the case where
94884                 d3_select(selection.node().parentNode).classed('hide', !isOK);
94885
94886                 // if form field is hidden or has detached from dom, clean up.
94887                 if (!isOK ||
94888                     !d3_select('.inspector-wrap.inspector-hidden').empty() ||
94889                     !selection.node().parentNode ||
94890                     !selection.node().parentNode.parentNode) {
94891                     selection.call(restrictions.off);
94892                     return;
94893                 }
94894
94895
94896                 var wrap = selection.selectAll('.form-field-input-wrap')
94897                     .data([0]);
94898
94899                 wrap = wrap.enter()
94900                     .append('div')
94901                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94902                     .merge(wrap);
94903
94904                 var container = wrap.selectAll('.restriction-container')
94905                     .data([0]);
94906
94907                 // enter
94908                 var containerEnter = container.enter()
94909                     .append('div')
94910                     .attr('class', 'restriction-container');
94911
94912                 containerEnter
94913                     .append('div')
94914                     .attr('class', 'restriction-help');
94915
94916                 // update
94917                 _container = containerEnter
94918                     .merge(container)
94919                     .call(renderViewer);
94920
94921                 var controls = wrap.selectAll('.restriction-controls')
94922                     .data([0]);
94923
94924                 // enter/update
94925                 controls.enter()
94926                     .append('div')
94927                     .attr('class', 'restriction-controls-container')
94928                     .append('div')
94929                     .attr('class', 'restriction-controls')
94930                     .merge(controls)
94931                     .call(renderControls);
94932             }
94933
94934
94935             function renderControls(selection) {
94936                 var distControl = selection.selectAll('.restriction-distance')
94937                     .data([0]);
94938
94939                 distControl.exit()
94940                     .remove();
94941
94942                 var distControlEnter = distControl.enter()
94943                     .append('div')
94944                     .attr('class', 'restriction-control restriction-distance');
94945
94946                 distControlEnter
94947                     .append('span')
94948                     .attr('class', 'restriction-control-label restriction-distance-label')
94949                     .text(t('restriction.controls.distance') + ':');
94950
94951                 distControlEnter
94952                     .append('input')
94953                     .attr('class', 'restriction-distance-input')
94954                     .attr('type', 'range')
94955                     .attr('min', '20')
94956                     .attr('max', '50')
94957                     .attr('step', '5');
94958
94959                 distControlEnter
94960                     .append('span')
94961                     .attr('class', 'restriction-distance-text');
94962
94963                 // update
94964                 selection.selectAll('.restriction-distance-input')
94965                     .property('value', _maxDistance)
94966                     .on('input', function() {
94967                         var val = d3_select(this).property('value');
94968                         _maxDistance = +val;
94969                         _intersection = null;
94970                         _container.selectAll('.layer-osm .layer-turns *').remove();
94971                         context.storage('turn-restriction-distance', _maxDistance);
94972                         _parent.call(restrictions);
94973                     });
94974
94975                 selection.selectAll('.restriction-distance-text')
94976                     .text(displayMaxDistance(_maxDistance));
94977
94978
94979                 var viaControl = selection.selectAll('.restriction-via-way')
94980                     .data([0]);
94981
94982                 viaControl.exit()
94983                     .remove();
94984
94985                 var viaControlEnter = viaControl.enter()
94986                     .append('div')
94987                     .attr('class', 'restriction-control restriction-via-way');
94988
94989                 viaControlEnter
94990                     .append('span')
94991                     .attr('class', 'restriction-control-label restriction-via-way-label')
94992                     .text(t('restriction.controls.via') + ':');
94993
94994                 viaControlEnter
94995                     .append('input')
94996                     .attr('class', 'restriction-via-way-input')
94997                     .attr('type', 'range')
94998                     .attr('min', '0')
94999                     .attr('max', '2')
95000                     .attr('step', '1');
95001
95002                 viaControlEnter
95003                     .append('span')
95004                     .attr('class', 'restriction-via-way-text');
95005
95006                 // update
95007                 selection.selectAll('.restriction-via-way-input')
95008                     .property('value', _maxViaWay)
95009                     .on('input', function() {
95010                         var val = d3_select(this).property('value');
95011                         _maxViaWay = +val;
95012                         _container.selectAll('.layer-osm .layer-turns *').remove();
95013                         context.storage('turn-restriction-via-way', _maxViaWay);
95014                         _parent.call(restrictions);
95015                     });
95016
95017                 selection.selectAll('.restriction-via-way-text')
95018                     .text(displayMaxVia(_maxViaWay));
95019             }
95020
95021
95022             function renderViewer(selection) {
95023                 if (!_intersection) return;
95024
95025                 var vgraph = _intersection.graph;
95026                 var filter = utilFunctor(true);
95027                 var projection = geoRawMercator();
95028
95029                 // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
95030                 // Instead of asking the restriction-container for its dimensions,
95031                 //  we can ask the #sidebar, which can have its dimensions cached.
95032                 // width: calc as sidebar - padding
95033                 // height: hardcoded (from `80_app.css`)
95034                 // var d = utilGetDimensions(selection);
95035                 var sdims = utilGetDimensions(d3_select('#sidebar'));
95036                 var d = [ sdims[0] - 50, 370 ];
95037                 var c = geoVecScale(d, 0.5);
95038                 var z = 22;
95039
95040                 projection.scale(geoZoomToScale(z));
95041
95042                 // Calculate extent of all key vertices
95043                 var extent = geoExtent();
95044                 for (var i = 0; i < _intersection.vertices.length; i++) {
95045                     extent._extend(_intersection.vertices[i].extent());
95046                 }
95047
95048                 // If this is a large intersection, adjust zoom to fit extent
95049                 if (_intersection.vertices.length > 1) {
95050                     var padding = 180;   // in z22 pixels
95051                     var tl = projection([extent[0][0], extent[1][1]]);
95052                     var br = projection([extent[1][0], extent[0][1]]);
95053                     var hFactor = (br[0] - tl[0]) / (d[0] - padding);
95054                     var vFactor = (br[1] - tl[1]) / (d[1] - padding);
95055                     var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
95056                     var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
95057                     z = z - Math.max(hZoomDiff, vZoomDiff);
95058                     projection.scale(geoZoomToScale(z));
95059                 }
95060
95061                 var padTop = 35;   // reserve top space for hint text
95062                 var extentCenter = projection(extent.center());
95063                 extentCenter[1] = extentCenter[1] - padTop;
95064
95065                 projection
95066                     .translate(geoVecSubtract(c, extentCenter))
95067                     .clipExtent([[0, 0], d]);
95068
95069                 var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
95070                 var drawVertices = svgVertices(projection, context);
95071                 var drawLines = svgLines(projection, context);
95072                 var drawTurns = svgTurns(projection, context);
95073
95074                 var firstTime = selection.selectAll('.surface').empty();
95075
95076                 selection
95077                     .call(drawLayers);
95078
95079                 var surface = selection.selectAll('.surface')
95080                     .classed('tr', true);
95081
95082                 if (firstTime) {
95083                     _initialized = true;
95084
95085                     surface
95086                         .call(breathe);
95087                 }
95088
95089                 // This can happen if we've lowered the detail while a FROM way
95090                 // is selected, and that way is no longer part of the intersection.
95091                 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
95092                     _fromWayID = null;
95093                     _oldTurns = null;
95094                 }
95095
95096                 surface
95097                     .call(utilSetDimensions, d)
95098                     .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
95099                     .call(drawLines, vgraph, _intersection.ways, filter)
95100                     .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
95101
95102                 surface
95103                     .on('click.restrictions', click)
95104                     .on('mouseover.restrictions', mouseover);
95105
95106                 surface
95107                     .selectAll('.selected')
95108                     .classed('selected', false);
95109
95110                 surface
95111                     .selectAll('.related')
95112                     .classed('related', false);
95113
95114                 if (_fromWayID) {
95115                     var way = vgraph.entity(_fromWayID);
95116                     surface
95117                         .selectAll('.' + _fromWayID)
95118                         .classed('selected', true)
95119                         .classed('related', true);
95120                 }
95121
95122                 document.addEventListener('resizeWindow', function () {
95123                     utilSetDimensions(_container, null);
95124                     redraw(1);
95125                 }, false);
95126
95127                 updateHints(null);
95128
95129
95130                 function click() {
95131                     surface
95132                         .call(breathe.off)
95133                         .call(breathe);
95134
95135                     var datum = event.target.__data__;
95136                     var entity = datum && datum.properties && datum.properties.entity;
95137                     if (entity) {
95138                         datum = entity;
95139                     }
95140
95141                     if (datum instanceof osmWay && (datum.__from || datum.__via)) {
95142                         _fromWayID = datum.id;
95143                         _oldTurns = null;
95144                         redraw();
95145
95146                     } else if (datum instanceof osmTurn) {
95147                         var actions, extraActions, turns, i;
95148                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
95149
95150                         if (datum.restrictionID && !datum.direct) {
95151                             return;
95152
95153                         } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
95154                             var seen = {};
95155                             var datumOnly = JSON.parse(JSON.stringify(datum));   // deep clone the datum
95156                             datumOnly.only = true;                               // but change this property
95157                             restrictionType = restrictionType.replace(/^no/, 'only');
95158
95159                             // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
95160                             // We will remember them in _oldTurns, and restore them if the user clicks again.
95161                             turns = _intersection.turns(_fromWayID, 2);
95162                             extraActions = [];
95163                             _oldTurns = [];
95164                             for (i = 0; i < turns.length; i++) {
95165                                 var turn = turns[i];
95166                                 if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
95167
95168                                 if (turn.direct && turn.path[1] === datum.path[1]) {
95169                                     seen[turns[i].restrictionID] = true;
95170                                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
95171                                     _oldTurns.push(turn);
95172                                     extraActions.push(actionUnrestrictTurn(turn));
95173                                 }
95174                             }
95175
95176                             actions = _intersection.actions.concat(extraActions, [
95177                                 actionRestrictTurn(datumOnly, restrictionType),
95178                                 t('operations.restriction.annotation.create')
95179                             ]);
95180
95181                         } else if (datum.restrictionID) {   // ONLY -> Allowed
95182                             // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
95183                             // This relies on the assumption that the intersection was already split up when we
95184                             // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
95185                             turns = _oldTurns || [];
95186                             extraActions = [];
95187                             for (i = 0; i < turns.length; i++) {
95188                                 if (turns[i].key !== datum.key) {
95189                                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
95190                                 }
95191                             }
95192                             _oldTurns = null;
95193
95194                             actions = _intersection.actions.concat(extraActions, [
95195                                 actionUnrestrictTurn(datum),
95196                                 t('operations.restriction.annotation.delete')
95197                             ]);
95198
95199                         } else {    // Allowed -> NO
95200                             actions = _intersection.actions.concat([
95201                                 actionRestrictTurn(datum, restrictionType),
95202                                 t('operations.restriction.annotation.create')
95203                             ]);
95204                         }
95205
95206                         context.perform.apply(context, actions);
95207
95208                         // At this point the datum will be changed, but will have same key..
95209                         // Refresh it and update the help..
95210                         var s = surface.selectAll('.' + datum.key);
95211                         datum = s.empty() ? null : s.datum();
95212                         updateHints(datum);
95213
95214                     } else {
95215                         _fromWayID = null;
95216                         _oldTurns = null;
95217                         redraw();
95218                     }
95219                 }
95220
95221
95222                 function mouseover() {
95223                     var datum = event.target.__data__;
95224                     updateHints(datum);
95225                 }
95226
95227                 _lastXPos = _lastXPos || sdims[0];
95228
95229                 function redraw(minChange) {
95230                     var xPos = -1;
95231
95232                     if (minChange) {
95233                         xPos = utilGetDimensions(d3_select('#sidebar'))[0];
95234                     }
95235
95236                     if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
95237                         if (context.hasEntity(_vertexID)) {
95238                             _lastXPos = xPos;
95239                             _container.call(renderViewer);
95240                         }
95241                     }
95242                 }
95243
95244
95245                 function highlightPathsFrom(wayID) {
95246                     surface.selectAll('.related')
95247                         .classed('related', false)
95248                         .classed('allow', false)
95249                         .classed('restrict', false)
95250                         .classed('only', false);
95251
95252                     surface.selectAll('.' + wayID)
95253                         .classed('related', true);
95254
95255                     if (wayID) {
95256                         var turns = _intersection.turns(wayID, _maxViaWay);
95257                         for (var i = 0; i < turns.length; i++) {
95258                             var turn = turns[i];
95259                             var ids = [turn.to.way];
95260                             var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
95261
95262                             if (turn.only || turns.length === 1) {
95263                                 if (turn.via.ways) {
95264                                     ids = ids.concat(turn.via.ways);
95265                                 }
95266                             } else if (turn.to.way === wayID) {
95267                                 continue;
95268                             }
95269
95270                             surface.selectAll(utilEntitySelector(ids))
95271                                 .classed('related', true)
95272                                 .classed('allow', (klass === 'allow'))
95273                                 .classed('restrict', (klass === 'restrict'))
95274                                 .classed('only', (klass === 'only'));
95275                         }
95276                     }
95277                 }
95278
95279
95280                 function updateHints(datum) {
95281                     var help = _container.selectAll('.restriction-help').html('');
95282
95283                     var placeholders = {};
95284                     ['from', 'via', 'to'].forEach(function(k) {
95285                         placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
95286                     });
95287
95288                     var entity = datum && datum.properties && datum.properties.entity;
95289                     if (entity) {
95290                         datum = entity;
95291                     }
95292
95293                     if (_fromWayID) {
95294                         way = vgraph.entity(_fromWayID);
95295                         surface
95296                             .selectAll('.' + _fromWayID)
95297                             .classed('selected', true)
95298                             .classed('related', true);
95299                     }
95300
95301                     // Hovering a way
95302                     if (datum instanceof osmWay && datum.__from) {
95303                         way = datum;
95304
95305                         highlightPathsFrom(_fromWayID ? null : way.id);
95306                         surface.selectAll('.' + way.id)
95307                             .classed('related', true);
95308
95309                         var clickSelect = (!_fromWayID || _fromWayID !== way.id);
95310                         help
95311                             .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
95312                             .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
95313                                 from: placeholders.from,
95314                                 fromName: displayName(way.id, vgraph)
95315                             }));
95316
95317
95318                     // Hovering a turn arrow
95319                     } else if (datum instanceof osmTurn) {
95320                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
95321                         var turnType = restrictionType.replace(/^(only|no)\_/, '');
95322                         var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
95323                         var klass, turnText, nextText;
95324
95325                         if (datum.no) {
95326                             klass = 'restrict';
95327                             turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
95328                             nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
95329                         } else if (datum.only) {
95330                             klass = 'only';
95331                             turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
95332                             nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
95333                         } else {
95334                             klass = 'allow';
95335                             turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
95336                             nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
95337                         }
95338
95339                         help
95340                             .append('div')      // "NO Right Turn (indirect)"
95341                             .attr('class', 'qualifier ' + klass)
95342                             .text(turnText);
95343
95344                         help
95345                             .append('div')      // "FROM {fromName} TO {toName}"
95346                             .html(t('restriction.help.from_name_to_name', {
95347                                 from: placeholders.from,
95348                                 fromName: displayName(datum.from.way, vgraph),
95349                                 to: placeholders.to,
95350                                 toName: displayName(datum.to.way, vgraph)
95351                             }));
95352
95353                         if (datum.via.ways && datum.via.ways.length) {
95354                             var names = [];
95355                             for (var i = 0; i < datum.via.ways.length; i++) {
95356                                 var prev = names[names.length - 1];
95357                                 var curr = displayName(datum.via.ways[i], vgraph);
95358                                 if (!prev || curr !== prev)   // collapse identical names
95359                                     names.push(curr);
95360                             }
95361
95362                             help
95363                                 .append('div')      // "VIA {viaNames}"
95364                                 .html(t('restriction.help.via_names', {
95365                                     via: placeholders.via,
95366                                     viaNames: names.join(', ')
95367                                 }));
95368                         }
95369
95370                         if (!indirect) {
95371                             help
95372                                 .append('div')      // Click for "No Right Turn"
95373                                 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
95374                         }
95375
95376                         highlightPathsFrom(null);
95377                         var alongIDs = datum.path.slice();
95378                         surface.selectAll(utilEntitySelector(alongIDs))
95379                             .classed('related', true)
95380                             .classed('allow', (klass === 'allow'))
95381                             .classed('restrict', (klass === 'restrict'))
95382                             .classed('only', (klass === 'only'));
95383
95384
95385                     // Hovering empty surface
95386                     } else {
95387                         highlightPathsFrom(null);
95388                         if (_fromWayID) {
95389                             help
95390                                 .append('div')      // "FROM {fromName}"
95391                                 .html(t('restriction.help.from_name', {
95392                                     from: placeholders.from,
95393                                     fromName: displayName(_fromWayID, vgraph)
95394                                 }));
95395
95396                         } else {
95397                             help
95398                                 .append('div')      // "Click to select a FROM segment."
95399                                 .html(t('restriction.help.select_from', {
95400                                     from: placeholders.from
95401                                 }));
95402                         }
95403                     }
95404                 }
95405             }
95406
95407
95408             function displayMaxDistance(maxDist) {
95409                 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
95410                 var opts;
95411
95412                 if (isImperial) {
95413                     var distToFeet = {   // imprecise conversion for prettier display
95414                         20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
95415                     }[maxDist];
95416                     opts = { distance: t('units.feet', { quantity: distToFeet }) };
95417                 } else {
95418                     opts = { distance: t('units.meters', { quantity: maxDist }) };
95419                 }
95420
95421                 return t('restriction.controls.distance_up_to', opts);
95422             }
95423
95424
95425             function displayMaxVia(maxVia) {
95426                 return maxVia === 0 ? t('restriction.controls.via_node_only')
95427                     : maxVia === 1 ? t('restriction.controls.via_up_to_one')
95428                     : t('restriction.controls.via_up_to_two');
95429             }
95430
95431
95432             function displayName(entityID, graph) {
95433                 var entity = graph.entity(entityID);
95434                 var name = utilDisplayName(entity) || '';
95435                 var matched = context.presets().match(entity, graph);
95436                 var type = (matched && matched.name()) || utilDisplayType(entity.id);
95437                 return name || type;
95438             }
95439
95440
95441             restrictions.entity = function(val) {
95442                 _intersection = null;
95443                 _fromWayID = null;
95444                 _oldTurns = null;
95445                 _vertexID = val.id;
95446             };
95447
95448
95449             restrictions.tags = function() {};
95450             restrictions.focus = function() {};
95451
95452
95453             restrictions.off = function(selection) {
95454                 if (!_initialized) return;
95455
95456                 selection.selectAll('.surface')
95457                     .call(breathe.off)
95458                     .on('click.restrictions', null)
95459                     .on('mouseover.restrictions', null);
95460
95461                 d3_select(window)
95462                     .on('resize.restrictions', null);
95463             };
95464
95465
95466             return utilRebind(restrictions, dispatch$1, 'on');
95467         }
95468
95469         function uiFieldTextarea(field) {
95470             var dispatch$1 = dispatch('change');
95471             var input = d3_select(null);
95472
95473
95474             function textarea(selection) {
95475                 var wrap = selection.selectAll('.form-field-input-wrap')
95476                     .data([0]);
95477
95478                 wrap = wrap.enter()
95479                     .append('div')
95480                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95481                     .merge(wrap);
95482
95483                 input = wrap.selectAll('textarea')
95484                     .data([0]);
95485
95486                 input = input.enter()
95487                     .append('textarea')
95488                     .attr('id', 'preset-input-' + field.safeid)
95489                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
95490                     .attr('maxlength', 255)
95491                     .call(utilNoAuto)
95492                     .on('input', change(true))
95493                     .on('blur', change())
95494                     .on('change', change())
95495                     .merge(input);
95496             }
95497
95498
95499             function change(onInput) {
95500                 return function() {
95501                     var t = {};
95502                     t[field.key] = utilGetSetValue(input) || undefined;
95503                     dispatch$1.call('change', this, t, onInput);
95504                 };
95505             }
95506
95507
95508             textarea.tags = function(tags) {
95509                 utilGetSetValue(input, tags[field.key] || '');
95510             };
95511
95512
95513             textarea.focus = function() {
95514                 input.node().focus();
95515             };
95516
95517
95518             return utilRebind(textarea, dispatch$1, 'on');
95519         }
95520
95521         function uiFieldWikidata(field, context) {
95522             var wikidata = services$1.wikidata;
95523             var dispatch$1 = dispatch('change');
95524             var searchInput = d3_select(null);
95525             var _qid = null;
95526             var _wikidataEntity = null;
95527             var _wikiURL = '';
95528             var _entity;
95529
95530             var combobox = uiCombobox(context, 'combo-' + field.safeid)
95531                 .caseSensitive(true)
95532                 .minItems(1);
95533
95534             function wiki(selection) {
95535
95536                 var wrap = selection.selectAll('.form-field-input-wrap')
95537                     .data([0]);
95538
95539                 wrap = wrap.enter()
95540                     .append('div')
95541                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95542                     .merge(wrap);
95543
95544
95545                 var list = wrap.selectAll('ul')
95546                     .data([0]);
95547
95548                 list = list.enter()
95549                     .append('ul')
95550                     .attr('class', 'rows')
95551                     .merge(list);
95552
95553                 var searchRow = list.selectAll('li.wikidata-search')
95554                     .data([0]);
95555
95556                 var searchRowEnter = searchRow.enter()
95557                     .append('li')
95558                     .attr('class', 'wikidata-search');
95559
95560                 searchInput = searchRowEnter
95561                     .append('input')
95562                     .attr('type', 'text')
95563                     .style('flex', '1')
95564                     .call(utilNoAuto);
95565
95566                 searchInput
95567                     .on('focus', function() {
95568                         var node = d3_select(this).node();
95569                         node.setSelectionRange(0, node.value.length);
95570                     })
95571                     .on('blur', function() {
95572                         setLabelForEntity();
95573                     })
95574                     .call(combobox.fetcher(fetchWikidataItems));
95575
95576                 combobox.on('accept', function(d) {
95577                     _qid = d.id;
95578                     change();
95579                 }).on('cancel', function() {
95580                     setLabelForEntity();
95581                 });
95582
95583                 searchRowEnter
95584                     .append('button')
95585                     .attr('class', 'form-field-button wiki-link')
95586                     .attr('title', t('icons.open_wikidata'))
95587                     .attr('tabindex', -1)
95588                     .call(svgIcon('#iD-icon-out-link'))
95589                     .on('click', function() {
95590                         event.preventDefault();
95591                         if (_wikiURL) window.open(_wikiURL, '_blank');
95592                     });
95593
95594                 var wikidataProperties = ['description', 'identifier'];
95595
95596                 var items = list.selectAll('li.labeled-input')
95597                     .data(wikidataProperties);
95598
95599                 // Enter
95600                 var enter = items.enter()
95601                     .append('li')
95602                     .attr('class', function(d) { return 'labeled-input preset-wikidata-' + d; });
95603
95604                 enter
95605                     .append('span')
95606                     .attr('class', 'label')
95607                     .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
95608                     .text(function(d) { return t('wikidata.' + d); });
95609
95610                 enter
95611                     .append('input')
95612                     .attr('type', 'text')
95613                     .attr('id', function(d) { return 'preset-input-wikidata-' + d; })
95614                     .call(utilNoAuto)
95615                     .classed('disabled', 'true')
95616                     .attr('readonly', 'true');
95617
95618                 enter
95619                     .append('button')
95620                     .attr('class', 'form-field-button')
95621                     .attr('title', t('icons.copy'))
95622                     .attr('tabindex', -1)
95623                     .call(svgIcon('#iD-operation-copy'))
95624                     .on('click', function() {
95625                         event.preventDefault();
95626                         d3_select(this.parentNode)
95627                             .select('input')
95628                             .node()
95629                             .select();
95630                         document.execCommand('copy');
95631                     });
95632
95633             }
95634
95635             function fetchWikidataItems(q, callback) {
95636
95637                 if (!q && _entity) {
95638                     q = context.entity(_entity.id).tags.name || '';
95639                 }
95640
95641                 wikidata.itemsForSearchQuery(q, function(err, data) {
95642                     if (err) return;
95643
95644                     for (var i in data) {
95645                         data[i].value = data[i].label + ' (' +  data[i].id + ')';
95646                         data[i].title = data[i].description;
95647                     }
95648
95649                     if (callback) callback(data);
95650                 });
95651             }
95652
95653
95654             function change() {
95655                 var syncTags = {};
95656                 syncTags[field.key] = _qid;
95657                 dispatch$1.call('change', this, syncTags);
95658
95659                 // attempt asynchronous update of wikidata tag..
95660                 var initGraph = context.graph();
95661                 var initEntityID = _entity.id;
95662
95663                 wikidata.entityByQID(_qid, function(err, entity) {
95664                     if (err) return;
95665
95666                     // If graph has changed, we can't apply this update.
95667                     if (context.graph() !== initGraph) return;
95668
95669                     if (!entity.sitelinks) return;
95670
95671                     var langs = wikidata.languagesToQuery();
95672                     // use the label and description languages as fallbacks
95673                     ['labels', 'descriptions'].forEach(function(key) {
95674                         if (!entity[key]) return;
95675
95676                         var valueLangs = Object.keys(entity[key]);
95677                         if (valueLangs.length === 0) return;
95678                         var valueLang = valueLangs[0];
95679
95680                         if (langs.indexOf(valueLang) === -1) {
95681                             langs.push(valueLang);
95682                         }
95683                     });
95684
95685                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95686
95687                     var foundPreferred;
95688                     for (var i in langs) {
95689                         var lang = langs[i];
95690                         var siteID = lang.replace('-', '_') + 'wiki';
95691                         if (entity.sitelinks[siteID]) {
95692                             foundPreferred = true;
95693                             currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title;
95694                             // use the first match
95695                             break;
95696                         }
95697                     }
95698
95699                     if (!foundPreferred) {
95700                         // No wikipedia sites available in the user's language or the fallback languages,
95701                         // default to any wikipedia sitelink
95702
95703                         var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
95704                             return site.endsWith('wiki');
95705                         });
95706
95707                         if (wikiSiteKeys.length === 0) {
95708                             // if no wikipedia pages are linked to this wikidata entity, delete that tag
95709                             if (currTags.wikipedia) {
95710                                 delete currTags.wikipedia;
95711                             }
95712                         } else {
95713                             var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
95714                             var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
95715                             currTags.wikipedia = wikiLang + ':' + wikiTitle;
95716                         }
95717                     }
95718
95719                     // Coalesce the update of wikidata tag into the previous tag change
95720                     context.overwrite(
95721                         actionChangeTags(initEntityID, currTags),
95722                         context.history().undoAnnotation()
95723                     );
95724
95725                     // do not dispatch.call('change') here, because entity_editor
95726                     // changeTags() is not intended to be called asynchronously
95727
95728                 });
95729             }
95730
95731             function setLabelForEntity() {
95732                 var label = '';
95733                 if (_wikidataEntity) {
95734                     label = entityPropertyForDisplay(_wikidataEntity, 'labels');
95735                     if (label.length === 0) {
95736                         label = _wikidataEntity.id.toString();
95737                     }
95738                 }
95739                 utilGetSetValue(d3_select('li.wikidata-search input'), label);
95740             }
95741
95742
95743             wiki.tags = function(tags) {
95744                 _qid = tags[field.key] || '';
95745
95746                 if (!/^Q[0-9]*$/.test(_qid)) {   // not a proper QID
95747                     unrecognized();
95748                     return;
95749                 }
95750
95751                 // QID value in correct format
95752                 _wikiURL = 'https://wikidata.org/wiki/' + _qid;
95753                 wikidata.entityByQID(_qid, function(err, entity) {
95754                     if (err) {
95755                         unrecognized();
95756                         return;
95757                     }
95758                     _wikidataEntity = entity;
95759
95760                     setLabelForEntity();
95761
95762                     var description = entityPropertyForDisplay(entity, 'descriptions');
95763
95764                     d3_select('.form-field-wikidata button.wiki-link')
95765                         .classed('disabled', false);
95766
95767                     d3_select('.preset-wikidata-description')
95768                         .style('display', function(){
95769                             return description.length > 0 ? 'flex' : 'none';
95770                         })
95771                         .select('input')
95772                         .attr('value', description);
95773
95774                     d3_select('.preset-wikidata-identifier')
95775                         .style('display', function(){
95776                             return entity.id ? 'flex' : 'none';
95777                         })
95778                         .select('input')
95779                         .attr('value', entity.id);
95780                 });
95781
95782
95783                 // not a proper QID
95784                 function unrecognized() {
95785                     _wikidataEntity = null;
95786                     setLabelForEntity();
95787
95788                     d3_select('.preset-wikidata-description')
95789                         .style('display', 'none');
95790                     d3_select('.preset-wikidata-identifier')
95791                         .style('display', 'none');
95792
95793                     d3_select('.form-field-wikidata button.wiki-link')
95794                         .classed('disabled', true);
95795
95796                     if (_qid && _qid !== '') {
95797                         _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
95798                     } else {
95799                         _wikiURL = '';
95800                     }
95801                 }
95802             };
95803
95804             function entityPropertyForDisplay(wikidataEntity, propKey) {
95805                 if (!wikidataEntity[propKey]) return '';
95806                 var propObj = wikidataEntity[propKey];
95807                 var langKeys = Object.keys(propObj);
95808                 if (langKeys.length === 0) return '';
95809                 // sorted by priority, since we want to show the user's language first if possible
95810                 var langs = wikidata.languagesToQuery();
95811                 for (var i in langs) {
95812                     var lang = langs[i];
95813                     var valueObj = propObj[lang];
95814                     if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
95815                 }
95816                 // default to any available value
95817                 return propObj[langKeys[0]].value;
95818             }
95819
95820
95821             wiki.entity = function(val) {
95822                 if (!arguments.length) return _entity;
95823                 _entity = val;
95824                 return wiki;
95825             };
95826
95827
95828             wiki.focus = function() {
95829                 searchInput.node().focus();
95830             };
95831
95832
95833             return utilRebind(wiki, dispatch$1, 'on');
95834         }
95835
95836         function uiFieldWikipedia(field, context) {
95837             var dispatch$1 = dispatch('change');
95838             var wikipedia = services$1.wikipedia;
95839             var wikidata = services$1.wikidata;
95840             var lang = d3_select(null);
95841             var title = d3_select(null);
95842             var _wikiURL = '';
95843             var _entity;
95844
95845             var langCombo = uiCombobox(context, 'wikipedia-lang')
95846                 .fetcher(function(value, cb) {
95847                     var v = value.toLowerCase();
95848
95849                     cb(wikipedia$2.filter(function(d) {
95850                         return d[0].toLowerCase().indexOf(v) >= 0 ||
95851                             d[1].toLowerCase().indexOf(v) >= 0 ||
95852                             d[2].toLowerCase().indexOf(v) >= 0;
95853                     }).map(function(d) {
95854                         return { value: d[1] };
95855                     }));
95856                 });
95857
95858             var titleCombo = uiCombobox(context, 'wikipedia-title')
95859                 .fetcher(function(value, cb) {
95860                     if (!value && _entity) {
95861                         value = context.entity(_entity.id).tags.name || '';
95862                     }
95863
95864                     var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
95865                     searchfn(language()[2], value, function(query, data) {
95866                         cb(data.map(function(d) {
95867                             return { value: d };
95868                         }));
95869                     });
95870                 });
95871
95872
95873             function wiki(selection) {
95874                 var wrap = selection.selectAll('.form-field-input-wrap')
95875                     .data([0]);
95876
95877                 wrap = wrap.enter()
95878                     .append('div')
95879                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95880                     .merge(wrap);
95881
95882
95883                 var langRow = wrap.selectAll('.wiki-lang-container')
95884                     .data([0]);
95885
95886                 langRow = langRow.enter()
95887                     .append('div')
95888                     .attr('class', 'wiki-lang-container')
95889                     .merge(langRow);
95890
95891
95892                 lang = langRow.selectAll('input.wiki-lang')
95893                     .data([0]);
95894
95895                 lang = lang.enter()
95896                     .append('input')
95897                     .attr('type', 'text')
95898                     .attr('class', 'wiki-lang')
95899                     .attr('placeholder', t('translate.localized_translation_language'))
95900                     .call(utilNoAuto)
95901                     .call(langCombo)
95902                     .merge(lang);
95903
95904                 utilGetSetValue(lang, language()[1]);
95905
95906                 lang
95907                     .on('blur', changeLang)
95908                     .on('change', changeLang);
95909
95910
95911                 var titleRow = wrap.selectAll('.wiki-title-container')
95912                     .data([0]);
95913
95914                 titleRow = titleRow.enter()
95915                     .append('div')
95916                     .attr('class', 'wiki-title-container')
95917                     .merge(titleRow);
95918
95919                 title = titleRow.selectAll('input.wiki-title')
95920                     .data([0]);
95921
95922                 title = title.enter()
95923                     .append('input')
95924                     .attr('type', 'text')
95925                     .attr('class', 'wiki-title')
95926                     .attr('id', 'preset-input-' + field.safeid)
95927                     .call(utilNoAuto)
95928                     .call(titleCombo)
95929                     .merge(title);
95930
95931                 title
95932                     .on('blur', blur)
95933                     .on('change', change);
95934
95935
95936                 var link = titleRow.selectAll('.wiki-link')
95937                     .data([0]);
95938
95939                 link = link.enter()
95940                     .append('button')
95941                     .attr('class', 'form-field-button wiki-link')
95942                     .attr('tabindex', -1)
95943                     .call(svgIcon('#iD-icon-out-link'))
95944                     .merge(link);
95945
95946                 link
95947                     .on('click', function() {
95948                         event.preventDefault();
95949                         if (_wikiURL) window.open(_wikiURL, '_blank');
95950                     });
95951             }
95952
95953
95954             function language() {
95955                 var value = utilGetSetValue(lang).toLowerCase();
95956                 var locale = utilDetect().locale.toLowerCase();
95957                 var localeLanguage;
95958                 return wikipedia$2.find(function(d) {
95959                     if (d[2] === locale) localeLanguage = d;
95960                     return d[0].toLowerCase() === value ||
95961                         d[1].toLowerCase() === value ||
95962                         d[2] === value;
95963                 }) || localeLanguage || ['English', 'English', 'en'];
95964             }
95965
95966
95967             function changeLang() {
95968                 utilGetSetValue(lang, language()[1]);
95969                 change(true);
95970             }
95971
95972
95973             function blur() {
95974                 change(true);
95975             }
95976
95977
95978             function change(skipWikidata) {
95979                 var value = utilGetSetValue(title);
95980                 var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
95981                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95982                 var syncTags = {};
95983
95984                 if (l) {
95985                     // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
95986                     value = decodeURIComponent(m[2]).replace(/_/g, ' ');
95987                     if (m[3]) {
95988                         var anchor;
95989                         // try {
95990                         // leave this out for now - #6232
95991                             // Best-effort `anchordecode:` implementation
95992                             // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
95993                         // } catch (e) {
95994                             anchor = decodeURIComponent(m[3]);
95995                         // }
95996                         value += '#' + anchor.replace(/_/g, ' ');
95997                     }
95998                     value = value.slice(0, 1).toUpperCase() + value.slice(1);
95999                     utilGetSetValue(lang, l[1]);
96000                     utilGetSetValue(title, value);
96001                 }
96002
96003                 if (value) {
96004                     syncTags.wikipedia = language()[2] + ':' + value;
96005                 } else {
96006                     syncTags.wikipedia = undefined;
96007                 }
96008
96009                 dispatch$1.call('change', this, syncTags);
96010
96011
96012                 if (skipWikidata || !value || !language()[2]) return;
96013
96014                 // attempt asynchronous update of wikidata tag..
96015                 var initGraph = context.graph();
96016                 var initEntityID = _entity.id;
96017
96018                 wikidata.itemsByTitle(language()[2], value, function(err, data) {
96019                     if (err) return;
96020
96021                     // If graph has changed, we can't apply this update.
96022                     if (context.graph() !== initGraph) return;
96023
96024                     if (!data || !Object.keys(data).length) return;
96025
96026                     var qids = Object.keys(data);
96027                     var value = qids && qids.find(function(id) { return id.match(/^Q\d+$/); });
96028                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
96029
96030                     currTags.wikidata = value;
96031
96032                     // Coalesce the update of wikidata tag into the previous tag change
96033                     context.overwrite(
96034                         actionChangeTags(initEntityID, currTags),
96035                         context.history().undoAnnotation()
96036                     );
96037
96038                     // do not dispatch.call('change') here, because entity_editor
96039                     // changeTags() is not intended to be called asynchronously
96040                 });
96041             }
96042
96043
96044             wiki.tags = function(tags) {
96045                 var value = tags[field.key] || '';
96046                 var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
96047                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
96048                 var anchor = m && m[3];
96049
96050                 // value in correct format
96051                 if (l) {
96052                     utilGetSetValue(lang, l[1]);
96053                     utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
96054                     if (anchor) {
96055                         try {
96056                             // Best-effort `anchorencode:` implementation
96057                             anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
96058                         } catch (e) {
96059                             anchor = anchor.replace(/ /g, '_');
96060                         }
96061                     }
96062                     _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
96063                         m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
96064
96065                 // unrecognized value format
96066                 } else {
96067                     utilGetSetValue(title, value);
96068                     if (value && value !== '') {
96069                         utilGetSetValue(lang, '');
96070                         _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
96071                     } else {
96072                         _wikiURL = '';
96073                     }
96074                 }
96075             };
96076
96077
96078             wiki.entity = function(val) {
96079                 if (!arguments.length) return _entity;
96080                 _entity = val;
96081                 return wiki;
96082             };
96083
96084
96085             wiki.focus = function() {
96086                 title.node().focus();
96087             };
96088
96089
96090             return utilRebind(wiki, dispatch$1, 'on');
96091         }
96092
96093         var uiFields = {
96094             access: uiFieldAccess,
96095             address: uiFieldAddress,
96096             check: uiFieldCheck,
96097             combo: uiFieldCombo,
96098             cycleway: uiFieldCycleway,
96099             defaultCheck: uiFieldCheck,
96100             email: uiFieldText,
96101             lanes: uiFieldLanes,
96102             localized: uiFieldLocalized,
96103             maxspeed: uiFieldMaxspeed,
96104             multiCombo: uiFieldCombo,
96105             networkCombo: uiFieldCombo,
96106             number: uiFieldText,
96107             onewayCheck: uiFieldCheck,
96108             radio: uiFieldRadio,
96109             restrictions: uiFieldRestrictions,
96110             semiCombo: uiFieldCombo,
96111             structureRadio: uiFieldRadio,
96112             tel: uiFieldText,
96113             text: uiFieldText,
96114             textarea: uiFieldTextarea,
96115             typeCombo: uiFieldCombo,
96116             url: uiFieldText,
96117             wikidata: uiFieldWikidata,
96118             wikipedia: uiFieldWikipedia
96119         };
96120
96121         function uiField(context, presetField, entity, options) {
96122             options = Object.assign({
96123                 show: true,
96124                 wrap: true,
96125                 remove: true,
96126                 revert: true,
96127                 info: true
96128             }, options);
96129
96130             var dispatch$1 = dispatch('change');
96131             var field = Object.assign({}, presetField);   // shallow copy
96132             var _show = options.show;
96133             var _state = '';
96134             var _tags = {};
96135
96136             var _locked = false;
96137             var _lockedTip = tooltip()
96138                 .title(t('inspector.lock.suggestion', { label: field.label }))
96139                 .placement('bottom');
96140
96141
96142             field.keys = field.keys || [field.key];
96143
96144             // only create the fields that are actually being shown
96145             if (_show && !field.impl) {
96146                 createField();
96147             }
96148
96149             // Creates the field.. This is done lazily,
96150             // once we know that the field will be shown.
96151             function createField() {
96152                 field.impl = uiFields[field.type](field, context)
96153                     .on('change', function(t, onInput) {
96154                         dispatch$1.call('change', field, t, onInput);
96155                     });
96156
96157                 if (entity) {
96158                     field.entityID = entity.id;
96159                     // if this field cares about the entity, pass it along
96160                     if (field.impl.entity) {
96161                         field.impl.entity(entity);
96162                     }
96163                 }
96164             }
96165
96166
96167             function isModified() {
96168                 if (!entity) return false;
96169                 var original = context.graph().base().entities[entity.id];
96170                 return field.keys.some(function(key) {
96171                     return original ? _tags[key] !== original.tags[key] : _tags[key];
96172                 });
96173             }
96174
96175
96176             function isPresent() {
96177                 return field.keys.some(function(key) {
96178                     if (field.type === 'multiCombo') {
96179                         for (var tagKey in _tags) {
96180                             if (tagKey.indexOf(key) === 0) {
96181                                 return true;
96182                             }
96183                         }
96184                         return false;
96185                     }
96186                     return _tags[key] !== undefined;
96187                 });
96188             }
96189
96190
96191             function revert(d) {
96192                 event.stopPropagation();
96193                 event.preventDefault();
96194                 if (!entity || _locked) return;
96195
96196                 var original = context.graph().base().entities[entity.id];
96197                 var t = {};
96198                 d.keys.forEach(function(key) {
96199                     t[key] = original ? original.tags[key] : undefined;
96200                 });
96201
96202                 dispatch$1.call('change', d, t);
96203             }
96204
96205
96206             function remove(d) {
96207                 event.stopPropagation();
96208                 event.preventDefault();
96209                 if (_locked) return;
96210
96211                 var t = {};
96212                 d.keys.forEach(function(key) {
96213                     t[key] = undefined;
96214                 });
96215
96216                 dispatch$1.call('change', d, t);
96217             }
96218
96219
96220             field.render = function(selection) {
96221                 var container = selection.selectAll('.form-field')
96222                     .data([field]);
96223
96224                 // Enter
96225                 var enter = container.enter()
96226                     .append('div')
96227                     .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
96228                     .classed('nowrap', !options.wrap);
96229
96230                 if (options.wrap) {
96231                     var labelEnter = enter
96232                         .append('label')
96233                         .attr('class', 'field-label')
96234                         .attr('for', function(d) { return 'preset-input-' + d.safeid; });
96235
96236                     var textEnter = labelEnter
96237                         .append('span')
96238                         .attr('class', 'label-text');
96239
96240                     textEnter
96241                         .append('span')
96242                         .attr('class', 'label-textvalue')
96243                         .text(function(d) { return d.label(); });
96244
96245                     textEnter
96246                         .append('span')
96247                         .attr('class', 'label-textannotation');
96248
96249                     if (options.remove) {
96250                         labelEnter
96251                             .append('button')
96252                             .attr('class', 'remove-icon')
96253                             .attr('title', t('icons.remove'))
96254                             .attr('tabindex', -1)
96255                             .call(svgIcon('#iD-operation-delete'));
96256                     }
96257
96258                     if (options.revert) {
96259                         labelEnter
96260                             .append('button')
96261                             .attr('class', 'modified-icon')
96262                             .attr('title', t('icons.undo'))
96263                             .attr('tabindex', -1)
96264                             .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
96265                     }
96266                 }
96267
96268
96269                 // Update
96270                 container = container
96271                     .merge(enter);
96272
96273                 container.select('.field-label > .remove-icon')  // propagate bound data
96274                     .on('click', remove);
96275
96276                 container.select('.field-label > .modified-icon')  // propagate bound data
96277                     .on('click', revert);
96278
96279                 container
96280                     .each(function(d) {
96281                         var selection = d3_select(this);
96282
96283                         if (!d.impl) {
96284                             createField();
96285                         }
96286
96287                         var reference, help;
96288
96289                         // instantiate field help
96290                         if (options.wrap && field.type === 'restrictions') {
96291                             help = uiFieldHelp(context, 'restrictions');
96292                         }
96293
96294                         // instantiate tag reference
96295                         if (options.wrap && options.info) {
96296                             var referenceKey = d.key;
96297                             if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
96298                                 referenceKey = referenceKey.replace(/:$/, '');
96299                             }
96300
96301                             reference = uiTagReference(d.reference || { key: referenceKey });
96302                             if (_state === 'hover') {
96303                                 reference.showing(false);
96304                             }
96305                         }
96306
96307                         selection
96308                             .call(d.impl);
96309
96310                         // add field help components
96311                         if (help) {
96312                             selection
96313                                 .call(help.body)
96314                                 .select('.field-label')
96315                                 .call(help.button);
96316                         }
96317
96318                         // add tag reference components
96319                         if (reference) {
96320                             selection
96321                                 .call(reference.body)
96322                                 .select('.field-label')
96323                                 .call(reference.button);
96324                         }
96325
96326                         d.impl.tags(_tags);
96327                     });
96328
96329
96330                     container
96331                         .classed('locked', _locked)
96332                         .classed('modified', isModified())
96333                         .classed('present', isPresent());
96334
96335
96336                     // show a tip and lock icon if the field is locked
96337                     var annotation = container.selectAll('.field-label .label-textannotation');
96338                     var icon = annotation.selectAll('.icon')
96339                         .data(_locked ? [0]: []);
96340
96341                     icon.exit()
96342                         .remove();
96343
96344                     icon.enter()
96345                         .append('svg')
96346                         .attr('class', 'icon')
96347                         .append('use')
96348                         .attr('xlink:href', '#fas-lock');
96349
96350                     container.call(_locked ? _lockedTip : _lockedTip.destroy);
96351             };
96352
96353
96354             field.state = function(val) {
96355                 if (!arguments.length) return _state;
96356                 _state = val;
96357                 return field;
96358             };
96359
96360
96361             field.tags = function(val) {
96362                 if (!arguments.length) return _tags;
96363                 _tags = val;
96364                 return field;
96365             };
96366
96367
96368             field.locked = function(val) {
96369                 if (!arguments.length) return _locked;
96370                 _locked = val;
96371                 return field;
96372             };
96373
96374
96375             field.show = function() {
96376                 _show = true;
96377                 if (!field.impl) {
96378                     createField();
96379                 }
96380                 if (field.default && field.key && _tags[field.key] !== field.default) {
96381                     var t = {};
96382                     t[field.key] = field.default;
96383                     dispatch$1.call('change', this, t);
96384                 }
96385             };
96386
96387             // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
96388             field.isShown = function() {
96389                 return _show || isPresent();
96390             };
96391
96392
96393             // An allowed field can appear in the UI or in the 'Add field' dropdown.
96394             // A non-allowed field is hidden from the user altogether
96395             field.isAllowed = function() {
96396                 if (!entity || isPresent()) return true;   // a field with a value should always display
96397
96398                 var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
96399                 if (!latest) return true;
96400
96401                 var require = field.prerequisiteTag;
96402                 if (require && require.key) {
96403                     var value = latest.tags[require.key];
96404                     if (!value) return false;
96405
96406                     if (require.valueNot) {
96407                         return require.valueNot !== value;
96408                     }
96409                     if (require.value) {
96410                         return require.value === value;
96411                     }
96412                     return true;
96413                 }
96414                 return true;
96415             };
96416
96417
96418             field.focus = function() {
96419                 if (field.impl) {
96420                     field.impl.focus();
96421                 }
96422             };
96423
96424
96425             return utilRebind(field, dispatch$1, 'on');
96426         }
96427
96428         function uiFormFields(context) {
96429             var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
96430             var _fieldsArr = [];
96431             var _lastPlaceholder = '';
96432             var _state = '';
96433             var _klass = '';
96434
96435
96436             function formFields(selection) {
96437                 var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
96438                 var shown = allowedFields.filter(function(field) { return field.isShown(); });
96439                 var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
96440
96441                 var container = selection.selectAll('.form-fields-container')
96442                     .data([0]);
96443
96444                 container = container.enter()
96445                     .append('div')
96446                     .attr('class', 'form-fields-container ' + (_klass || ''))
96447                     .merge(container);
96448
96449
96450                 var fields = container.selectAll('.wrap-form-field')
96451                     .data(shown, function(d) { return d.id + (d.entityID || ''); });
96452
96453                 fields.exit()
96454                     .remove();
96455
96456                 // Enter
96457                 var enter = fields.enter()
96458                     .append('div')
96459                     .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
96460
96461                 // Update
96462                 fields = fields
96463                     .merge(enter);
96464
96465                 fields
96466                     .order()
96467                     .each(function(d) {
96468                         d3_select(this)
96469                             .call(d.render);
96470                     });
96471
96472
96473                 var titles = [];
96474                 var moreFields = notShown.map(function(field) {
96475                     var label = field.label();
96476                     titles.push(label);
96477                     return {
96478                         title: label,
96479                         value: label,
96480                         field: field
96481                     };
96482                 });
96483
96484                 var placeholder = titles.slice(0,3).join(', ') + ((titles.length > 3) ? '…' : '');
96485
96486
96487                 var more = selection.selectAll('.more-fields')
96488                     .data((_state === 'hover' || moreFields.length === 0) ? [] : [0]);
96489
96490                 more.exit()
96491                     .remove();
96492
96493                 more = more.enter()
96494                     .append('div')
96495                     .attr('class', 'more-fields')
96496                     .append('label')
96497                     .text(t('inspector.add_fields'))
96498                     .merge(more);
96499
96500
96501                 var input = more.selectAll('.value')
96502                     .data([0]);
96503
96504                 input.exit()
96505                     .remove();
96506
96507                 input = input.enter()
96508                     .append('input')
96509                     .attr('class', 'value')
96510                     .attr('type', 'text')
96511                     .attr('placeholder', placeholder)
96512                     .call(utilNoAuto)
96513                     .merge(input);
96514
96515                 input
96516                     .call(utilGetSetValue, '')
96517                     .call(moreCombo
96518                         .data(moreFields)
96519                         .on('accept', function (d) {
96520                             if (!d) return;  // user entered something that was not matched
96521                             var field = d.field;
96522                             field.show();
96523                             selection.call(formFields);  // rerender
96524                             if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
96525                                 field.focus();
96526                             }
96527                         })
96528                     );
96529
96530                 // avoid updating placeholder excessively (triggers style recalc)
96531                 if (_lastPlaceholder !== placeholder) {
96532                     input.attr('placeholder', placeholder);
96533                     _lastPlaceholder = placeholder;
96534                 }
96535             }
96536
96537
96538             formFields.fieldsArr = function(val) {
96539                 if (!arguments.length) return _fieldsArr;
96540                 _fieldsArr = val || [];
96541                 return formFields;
96542             };
96543
96544             formFields.state = function(val) {
96545                 if (!arguments.length) return _state;
96546                 _state = val;
96547                 return formFields;
96548             };
96549
96550             formFields.klass = function(val) {
96551                 if (!arguments.length) return _klass;
96552                 _klass = val;
96553                 return formFields;
96554             };
96555
96556
96557             return formFields;
96558         }
96559
96560         function uiPresetEditor(context) {
96561             var dispatch$1 = dispatch('change');
96562             var formFields = uiFormFields(context);
96563             var _state;
96564             var _fieldsArr;
96565             var _preset;
96566             var _tags;
96567             var _entityID;
96568
96569
96570             function presetEditor(selection) {
96571                 selection.call(uiDisclosure(context, 'preset_fields', true)
96572                     .title(t('inspector.all_fields'))
96573                     .content(render)
96574                 );
96575             }
96576
96577
96578             function render(selection) {
96579                 if (!_fieldsArr) {
96580                     var entity = context.entity(_entityID);
96581                     var geometry = context.geometry(_entityID);
96582                     var presets = context.presets();
96583
96584                     _fieldsArr = [];
96585
96586                     _preset.fields.forEach(function(field) {
96587                         if (field.matchGeometry(geometry)) {
96588                             _fieldsArr.push(
96589                                 uiField(context, field, entity)
96590                             );
96591                         }
96592                     });
96593
96594                     if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
96595                         _fieldsArr.push(
96596                             uiField(context, presets.field('restrictions'), entity)
96597                         );
96598                     }
96599
96600                     var additionalFields = utilArrayUnion(_preset.moreFields, presets.universal());
96601                     additionalFields.sort(function(field1, field2) {
96602                         return field1.label() > field2.label();
96603                     });
96604
96605                     additionalFields.forEach(function(field) {
96606                         if (_preset.fields.indexOf(field) === -1) {
96607                             _fieldsArr.push(
96608                                 uiField(context, field, entity, { show: false })
96609                             );
96610                         }
96611                     });
96612
96613                     _fieldsArr.forEach(function(field) {
96614                         field
96615                             .on('change', function(t, onInput) {
96616                                 dispatch$1.call('change', field, t, onInput);
96617                             });
96618                     });
96619                 }
96620
96621                 _fieldsArr.forEach(function(field) {
96622                     field
96623                         .state(_state)
96624                         .tags(_tags);
96625                 });
96626
96627
96628                 selection
96629                     .call(formFields
96630                         .fieldsArr(_fieldsArr)
96631                         .state(_state)
96632                         .klass('inspector-inner fillL3')
96633                     );
96634
96635
96636                 selection.selectAll('.wrap-form-field input')
96637                     .on('keydown', function() {
96638                         // if user presses enter, and combobox is not active, accept edits..
96639                         if (event.keyCode === 13 && d3_select('.combobox').empty()) {
96640                             context.enter(modeBrowse(context));
96641                         }
96642                     });
96643             }
96644
96645
96646             presetEditor.preset = function(val) {
96647                 if (!arguments.length) return _preset;
96648                 if (_preset && _preset.id === val.id) return presetEditor;
96649                 _preset = val;
96650                 _fieldsArr = null;
96651                 return presetEditor;
96652             };
96653
96654
96655             presetEditor.state = function(val) {
96656                 if (!arguments.length) return _state;
96657                 _state = val;
96658                 return presetEditor;
96659             };
96660
96661
96662             presetEditor.tags = function(val) {
96663                 if (!arguments.length) return _tags;
96664                 _tags = val;
96665                 // Don't reset _fieldsArr here.
96666                 return presetEditor;
96667             };
96668
96669
96670             presetEditor.entityID = function(val) {
96671                 if (!arguments.length) return _entityID;
96672                 if (_entityID === val) return presetEditor;
96673                 _entityID = val;
96674                 _fieldsArr = null;
96675                 return presetEditor;
96676             };
96677
96678
96679             return utilRebind(presetEditor, dispatch$1, 'on');
96680         }
96681
96682         function uiEntityIssues(context) {
96683             var _selection = d3_select(null);
96684             var _activeIssueID;
96685             var _entityID;
96686
96687             // Refresh on validated events
96688             context.validator()
96689                 .on('validated.entity_issues', function() {
96690                      _selection.selectAll('.disclosure-wrap-entity_issues')
96691                          .call(render);
96692
96693                     update();
96694                 })
96695                 .on('focusedIssue.entity_issues', function(issue) {
96696                      makeActiveIssue(issue.id);
96697                 });
96698
96699
96700             function entityIssues(selection) {
96701                 _selection = selection;
96702
96703                 selection
96704                     .call(uiDisclosure(context, 'entity_issues', true)
96705                         .content(render)
96706                     );
96707
96708                 update();
96709             }
96710
96711             function getIssues() {
96712                 return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true });
96713             }
96714
96715             function makeActiveIssue(issueID) {
96716                 _activeIssueID = issueID;
96717                 _selection.selectAll('.issue-container')
96718                     .classed('active', function(d) { return d.id === _activeIssueID; });
96719             }
96720
96721             function update() {
96722
96723                 var issues = getIssues();
96724
96725                 _selection
96726                     .classed('hide', issues.length === 0);
96727
96728                 _selection.selectAll('.hide-toggle-entity_issues span')
96729                     .text(t('issues.list_title', { count: issues.length }));
96730             }
96731
96732
96733             function render(selection) {
96734                 var issues = getIssues();
96735                 _activeIssueID = issues.length > 0 ? issues[0].id : null;
96736
96737
96738                 var containers = selection.selectAll('.issue-container')
96739                     .data(issues, function(d) { return d.id; });
96740
96741                 // Exit
96742                 containers.exit()
96743                     .remove();
96744
96745                 // Enter
96746                 var containersEnter = containers.enter()
96747                     .append('div')
96748                     .attr('class', 'issue-container');
96749
96750
96751                 var itemsEnter = containersEnter
96752                     .append('div')
96753                     .attr('class', function(d) { return 'issue severity-' + d.severity; })
96754                     .on('mouseover.highlight', function(d) {
96755                         // don't hover-highlight the selected entity
96756                         var ids = d.entityIds
96757                             .filter(function(e) { return e !== _entityID; });
96758
96759                         utilHighlightEntities(ids, true, context);
96760                     })
96761                     .on('mouseout.highlight', function(d) {
96762                         var ids = d.entityIds
96763                             .filter(function(e) { return e !== _entityID; });
96764
96765                         utilHighlightEntities(ids, false, context);
96766                     });
96767
96768                 var labelsEnter = itemsEnter
96769                     .append('div')
96770                     .attr('class', 'issue-label')
96771                     .on('click', function(d) {
96772
96773                         makeActiveIssue(d.id); // expand only the clicked item
96774
96775                         var extent = d.extent(context.graph());
96776                         if (extent) {
96777                             var setZoom = Math.max(context.map().zoom(), 19);
96778                             context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
96779                         }
96780                     });
96781
96782                 var textEnter = labelsEnter
96783                     .append('span')
96784                     .attr('class', 'issue-text');
96785
96786                 textEnter
96787                     .append('span')
96788                     .attr('class', 'issue-icon')
96789                     .each(function(d) {
96790                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
96791                         d3_select(this)
96792                             .call(svgIcon(iconName));
96793                     });
96794
96795                 textEnter
96796                     .append('span')
96797                     .attr('class', 'issue-message');
96798
96799
96800                 var infoButton = labelsEnter
96801                     .append('button')
96802                     .attr('class', 'issue-info-button')
96803                     .attr('title', t('icons.information'))
96804                     .attr('tabindex', -1)
96805                     .call(svgIcon('#iD-icon-inspect'));
96806
96807                 infoButton
96808                     .on('click', function () {
96809                         event.stopPropagation();
96810                         event.preventDefault();
96811                         this.blur();    // avoid keeping focus on the button - #4641
96812
96813                         var container = d3_select(this.parentNode.parentNode.parentNode);
96814                         var info = container.selectAll('.issue-info');
96815                         var isExpanded = info.classed('expanded');
96816
96817                         if (isExpanded) {
96818                             info
96819                                 .transition()
96820                                 .duration(200)
96821                                 .style('max-height', '0px')
96822                                 .style('opacity', '0')
96823                                 .on('end', function () {
96824                                     info.classed('expanded', false);
96825                                 });
96826                         } else {
96827                             info
96828                                 .classed('expanded', true)
96829                                 .transition()
96830                                 .duration(200)
96831                                 .style('max-height', '200px')
96832                                 .style('opacity', '1')
96833                                 .on('end', function () {
96834                                     info.style('max-height', null);
96835                                 });
96836                         }
96837                     });
96838
96839                 itemsEnter
96840                     .append('ul')
96841                     .attr('class', 'issue-fix-list');
96842
96843                 containersEnter
96844                     .append('div')
96845                     .attr('class', 'issue-info')
96846                     .style('max-height', '0')
96847                     .style('opacity', '0')
96848                     .each(function(d) {
96849                         if (typeof d.reference === 'function') {
96850                             d3_select(this)
96851                                 .call(d.reference);
96852                         } else {
96853                             d3_select(this)
96854                                 .text(t('inspector.no_documentation_key'));
96855                         }
96856                     });
96857
96858
96859                 // Update
96860                 containers = containers
96861                     .merge(containersEnter)
96862                     .classed('active', function(d) { return d.id === _activeIssueID; });
96863
96864                 containers.selectAll('.issue-message')
96865                     .text(function(d) {
96866                         return d.message(context);
96867                     });
96868
96869                 // fixes
96870                 var fixLists = containers.selectAll('.issue-fix-list');
96871
96872                 var fixes = fixLists.selectAll('.issue-fix-item')
96873                     .data(function(d) { return d.fixes ? d.fixes : []; });
96874
96875                 var fixesEnter = fixes.enter()
96876                     .append('li')
96877                     .attr('class', function(d) {
96878                         return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
96879                     })
96880                     .on('click', function(d) {
96881                         // not all fixes are actionable
96882                         if (!d.onClick) return;
96883
96884                         // Don't run another fix for this issue within a second of running one
96885                         // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
96886                         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
96887                         d.issue.dateLastRanFix = new Date();
96888
96889                         // remove hover-highlighting
96890                         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
96891
96892                         new Promise(function(resolve, reject) {
96893                             d.onClick(context, resolve, reject);
96894                             if (d.onClick.length <= 1) {
96895                                 // if the fix doesn't take any completion parameters then consider it resolved
96896                                 resolve();
96897                             }
96898                         })
96899                         .then(function() {
96900                             // revalidate whenever the fix has finished running successfully
96901                             context.validator().validate();
96902                         });
96903                     })
96904                     .on('mouseover.highlight', function(d) {
96905                         utilHighlightEntities(d.entityIds, true, context);
96906                     })
96907                     .on('mouseout.highlight', function(d) {
96908                         utilHighlightEntities(d.entityIds, false, context);
96909                     });
96910
96911                 fixesEnter
96912                     .append('span')
96913                     .attr('class', 'fix-icon')
96914                     .each(function(d) {
96915                         var iconName = d.icon || 'iD-icon-wrench';
96916                         if (iconName.startsWith('maki')) {
96917                             iconName += '-15';
96918                         }
96919                         d3_select(this).call(svgIcon('#' + iconName));
96920                     });
96921
96922                 fixesEnter
96923                     .append('span')
96924                     .attr('class', 'fix-message')
96925                     .text(function(d) { return d.title; });
96926             }
96927
96928
96929             entityIssues.entityID = function(val) {
96930                 if (!arguments.length) return _entityID;
96931                 if (_entityID !== val) {
96932                     _entityID = val;
96933                     _activeIssueID = null;
96934                 }
96935                 return entityIssues;
96936             };
96937
96938
96939             return entityIssues;
96940         }
96941
96942         function uiEntityEditor(context) {
96943             var dispatch$1 = dispatch('choose');
96944             var _state = 'select';
96945             var _coalesceChanges = false;
96946             var _modified = false;
96947             var _scrolled = false;
96948             var _base;
96949             var _entityID;
96950             var _activePreset;
96951             var _tagReference;
96952             var _presetFavorite;
96953
96954             var entityIssues = uiEntityIssues(context);
96955             var quickLinks = uiQuickLinks();
96956             var presetEditor = uiPresetEditor(context).on('change', changeTags);
96957             var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
96958             var rawMemberEditor = uiRawMemberEditor(context);
96959             var rawMembershipEditor = uiRawMembershipEditor(context);
96960
96961             function entityEditor(selection) {
96962                 var entity = context.entity(_entityID);
96963                 var tags = Object.assign({}, entity.tags);  // shallow copy
96964
96965                 // Header
96966                 var header = selection.selectAll('.header')
96967                     .data([0]);
96968
96969                 // Enter
96970                 var headerEnter = header.enter()
96971                     .append('div')
96972                     .attr('class', 'header fillL cf');
96973
96974                 headerEnter
96975                     .append('button')
96976                     .attr('class', 'fl preset-reset preset-choose')
96977                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
96978
96979                 headerEnter
96980                     .append('button')
96981                     .attr('class', 'fr preset-close')
96982                     .on('click', function() { context.enter(modeBrowse(context)); })
96983                     .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96984
96985                 headerEnter
96986                     .append('h3')
96987                     .text(t('inspector.edit'));
96988
96989                 // Update
96990                 header = header
96991                     .merge(headerEnter);
96992
96993                 header.selectAll('.preset-reset')
96994                     .on('click', function() {
96995                         dispatch$1.call('choose', this, _activePreset);
96996                     });
96997
96998
96999                 // Body
97000                 var body = selection.selectAll('.inspector-body')
97001                     .data([0]);
97002
97003                 // Enter
97004                 var bodyEnter = body.enter()
97005                     .append('div')
97006                     .attr('class', 'inspector-body')
97007                     .on('scroll.entity-editor', function() { _scrolled = true; });
97008
97009                 bodyEnter
97010                     .append('div')
97011                     .attr('class', 'preset-list-item inspector-inner')
97012                     .append('div')
97013                     .attr('class', 'preset-list-button-wrap')
97014                     .append('button')
97015                     .attr('class', 'preset-list-button preset-reset')
97016                     .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
97017                     .append('div')
97018                     .attr('class', 'label')
97019                     .append('div')
97020                     .attr('class', 'label-inner');
97021
97022                 bodyEnter
97023                     .append('div')
97024                     .attr('class', 'preset-quick-links');
97025
97026                 bodyEnter
97027                     .append('div')
97028                     .attr('class', 'entity-issues');
97029
97030                 bodyEnter
97031                     .append('div')
97032                     .attr('class', 'preset-editor');
97033
97034                 bodyEnter
97035                     .append('div')
97036                     .attr('class', 'raw-tag-editor inspector-inner');
97037
97038                 bodyEnter
97039                     .append('div')
97040                     .attr('class', 'raw-member-editor inspector-inner');
97041
97042                 bodyEnter
97043                     .append('div')
97044                     .attr('class', 'raw-membership-editor inspector-inner');
97045
97046                 bodyEnter
97047                     .append('input')
97048                     .attr('type', 'text')
97049                     .attr('class', 'key-trap');
97050
97051
97052                 // Update
97053                 body = body
97054                     .merge(bodyEnter);
97055
97056                 if (_presetFavorite) {
97057                     body.selectAll('.preset-list-button-wrap')
97058                         .call(_presetFavorite.button);
97059                 }
97060
97061                 // update header
97062                 if (_tagReference) {
97063                     body.selectAll('.preset-list-button-wrap')
97064                         .call(_tagReference.button);
97065
97066                     body.selectAll('.preset-list-item')
97067                         .call(_tagReference.body);
97068                 }
97069
97070                 body.selectAll('.preset-reset')
97071                     .on('click', function() {
97072                         dispatch$1.call('choose', this, _activePreset);
97073                     });
97074
97075                 body.select('.preset-list-item button')
97076                     .call(uiPresetIcon(context)
97077                         .geometry(context.geometry(_entityID))
97078                         .preset(_activePreset)
97079                     );
97080
97081                 // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
97082                 var label = body.select('.label-inner');
97083                 var nameparts = label.selectAll('.namepart')
97084                     .data(_activePreset.name().split(' – '), function(d) { return d; });
97085
97086                 nameparts.exit()
97087                     .remove();
97088
97089                 nameparts
97090                     .enter()
97091                     .append('div')
97092                     .attr('class', 'namepart')
97093                     .text(function(d) { return d; });
97094
97095                 // update quick links
97096                 var choices = [{
97097                     id: 'zoom_to',
97098                     label: 'inspector.zoom_to.title',
97099                     tooltip: function() {
97100                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
97101                     },
97102                     click: function zoomTo() {
97103                         context.mode().zoomToSelected();
97104                     }
97105                 }];
97106
97107                 body.select('.preset-quick-links')
97108                     .call(quickLinks.choices(choices));
97109
97110
97111                 // update editor sections
97112                 body.select('.entity-issues')
97113                     .call(entityIssues
97114                         .entityID(_entityID)
97115                     );
97116
97117                 body.select('.preset-editor')
97118                     .call(presetEditor
97119                         .preset(_activePreset)
97120                         .entityID(_entityID)
97121                         .tags(tags)
97122                         .state(_state)
97123                     );
97124
97125                 body.select('.raw-tag-editor')
97126                     .call(rawTagEditor
97127                         .preset(_activePreset)
97128                         .entityID(_entityID)
97129                         .tags(tags)
97130                         .state(_state)
97131                     );
97132
97133                 if (entity.type === 'relation') {
97134                     body.select('.raw-member-editor')
97135                         .style('display', 'block')
97136                         .call(rawMemberEditor
97137                             .entityID(_entityID)
97138                         );
97139                 } else {
97140                     body.select('.raw-member-editor')
97141                         .style('display', 'none');
97142                 }
97143
97144                 body.select('.raw-membership-editor')
97145                     .call(rawMembershipEditor
97146                         .entityID(_entityID)
97147                     );
97148
97149                 body.select('.key-trap')
97150                     .on('keydown.key-trap', function() {
97151                         // On tabbing, send focus back to the first field on the inspector-body
97152                         // (probably the `name` field) #4159
97153                         if (event.keyCode === 9 && !event.shiftKey) {
97154                             event.preventDefault();
97155                             body.select('input').node().focus();
97156                         }
97157                     });
97158
97159                 context.history()
97160                     .on('change.entity-editor', historyChanged);
97161
97162
97163                 function historyChanged(difference) {
97164                     if (_state === 'hide') return;
97165                     var significant = !difference ||
97166                             difference.didChange.properties ||
97167                             difference.didChange.addition ||
97168                             difference.didChange.deletion;
97169                     if (!significant) return;
97170
97171                     var entity = context.hasEntity(_entityID);
97172                     var graph = context.graph();
97173                     if (!entity) return;
97174
97175                     var match = context.presets().match(entity, graph);
97176                     var activePreset = entityEditor.preset();
97177                     var weakPreset = activePreset &&
97178                         Object.keys(activePreset.addTags || {}).length === 0;
97179
97180                     // A "weak" preset doesn't set any tags. (e.g. "Address")
97181                     // Don't replace a weak preset with a fallback preset (e.g. "Point")
97182                     if (!(weakPreset && match.isFallback())) {
97183                         entityEditor.preset(match);
97184                     }
97185                     entityEditor.modified(_base !== graph);
97186                     entityEditor(selection);
97187                 }
97188             }
97189
97190
97191             // Tag changes that fire on input can all get coalesced into a single
97192             // history operation when the user leaves the field.  #2342
97193             function changeTags(changed, onInput) {
97194                 var entity = context.entity(_entityID);
97195                 var annotation = t('operations.change_tags.annotation');
97196                 var tags = Object.assign({}, entity.tags);   // shallow copy
97197
97198                 for (var k in changed) {
97199                     if (!k) continue;
97200                     var v = changed[k];
97201                     if (v !== undefined || tags.hasOwnProperty(k)) {
97202                         tags[k] = v;
97203                     }
97204                 }
97205
97206                 if (!onInput) {
97207                     tags = utilCleanTags(tags);
97208                 }
97209
97210                 if (!fastDeepEqual(entity.tags, tags)) {
97211                     if (_coalesceChanges) {
97212                         context.overwrite(actionChangeTags(_entityID, tags), annotation);
97213                     } else {
97214                         context.perform(actionChangeTags(_entityID, tags), annotation);
97215                         _coalesceChanges = !!onInput;
97216                     }
97217                 }
97218
97219                 // if leaving field (blur event), rerun validation
97220                 if (!onInput) {
97221                     context.validator().validate();
97222                 }
97223             }
97224
97225
97226             entityEditor.modified = function(val) {
97227                 if (!arguments.length) return _modified;
97228                 _modified = val;
97229                 d3_selectAll('button.preset-close use')
97230                     .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
97231                 return entityEditor;
97232             };
97233
97234
97235             entityEditor.state = function(val) {
97236                 if (!arguments.length) return _state;
97237                 _state = val;
97238                 return entityEditor;
97239             };
97240
97241
97242             entityEditor.entityID = function(val) {
97243                 if (!arguments.length) return _entityID;
97244                 if (_entityID === val) return entityEditor;  // exit early if no change
97245
97246                 _entityID = val;
97247                 _base = context.graph();
97248                 _coalesceChanges = false;
97249
97250                 // reset the scroll to the top of the inspector (warning: triggers reflow)
97251                 if (_scrolled) {
97252                     window.requestIdleCallback(function() {
97253                         var body = d3_selectAll('.entity-editor-pane .inspector-body');
97254                         if (!body.empty()) {
97255                             _scrolled = false;
97256                             body.node().scrollTop = 0;
97257                         }
97258                     });
97259                 }
97260
97261                 var presetMatch = context.presets().match(context.entity(_entityID), _base);
97262
97263                 return entityEditor
97264                     .preset(presetMatch)
97265                     .modified(false);
97266             };
97267
97268
97269             entityEditor.preset = function(val) {
97270                 if (!arguments.length) return _activePreset;
97271                 if (val !== _activePreset) {
97272                     _activePreset = val;
97273                     _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)))
97274                         .showing(false);
97275                 }
97276                 _presetFavorite = uiPresetFavoriteButton(_activePreset, context.geometry(_entityID), context);
97277                 return entityEditor;
97278             };
97279
97280
97281             return utilRebind(entityEditor, dispatch$1, 'on');
97282         }
97283
97284         function uiPresetList(context) {
97285             var dispatch$1 = dispatch('choose');
97286             var _entityID;
97287             var _currentPreset;
97288             var _autofocus = false;
97289             var geocoder = services$1.geocoder;
97290
97291
97292             function presetList(selection) {
97293                 var entity = context.entity(_entityID);
97294                 var geometry = context.geometry(_entityID);
97295
97296                 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
97297                 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
97298                     geometry = 'point';
97299                 }
97300
97301                 var presets = context.presets().matchGeometry(geometry);
97302
97303                 selection.html('');
97304
97305                 var messagewrap = selection
97306                     .append('div')
97307                     .attr('class', 'header fillL');
97308
97309                 var message = messagewrap
97310                     .append('h3')
97311                     .text(t('inspector.choose'));
97312
97313                 messagewrap
97314                     .append('button')
97315                     .attr('class', 'preset-choose')
97316                     .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
97317                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
97318
97319                 function initialKeydown() {
97320                     // hack to let delete shortcut work when search is autofocused
97321                     if (search.property('value').length === 0 &&
97322                         (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
97323                          event.keyCode === utilKeybinding.keyCodes['⌦'])) {
97324                         event.preventDefault();
97325                         event.stopPropagation();
97326                         operationDelete([_entityID], context)();
97327
97328                     // hack to let undo work when search is autofocused
97329                     } else if (search.property('value').length === 0 &&
97330                         (event.ctrlKey || event.metaKey) &&
97331                         event.keyCode === utilKeybinding.keyCodes.z) {
97332                         event.preventDefault();
97333                         event.stopPropagation();
97334                         context.undo();
97335                     } else if (!event.ctrlKey && !event.metaKey) {
97336                         // don't check for delete/undo hack on future keydown events
97337                         d3_select(this).on('keydown', keydown);
97338                         keydown.call(this);
97339                     }
97340                 }
97341
97342                 function keydown() {
97343                     // down arrow
97344                     if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
97345                         // if insertion point is at the end of the string
97346                         search.node().selectionStart === search.property('value').length) {
97347                         event.preventDefault();
97348                         event.stopPropagation();
97349                         // move focus to the first item in the preset list
97350                         var buttons = list.selectAll('.preset-list-button');
97351                         if (!buttons.empty()) buttons.nodes()[0].focus();
97352                     }
97353                 }
97354
97355                 function keypress() {
97356                     // enter
97357                     var value = search.property('value');
97358                     if (event.keyCode === 13 && value.length) {
97359                         list.selectAll('.preset-list-item:first-child')
97360                             .each(function(d) { d.choose.call(this); });
97361                     }
97362                 }
97363
97364                 function inputevent() {
97365                     var value = search.property('value');
97366                     list.classed('filtered', value.length);
97367                     if (value.length) {
97368                         var entity = context.entity(_entityID);
97369                         if (geocoder && entity) {
97370                             var center = entity.extent(context.graph()).center();
97371                             geocoder.countryCode(center, function countryCallback(err, countryCode) {
97372                                 // get the input value again because it may have changed
97373                                 var currentValue = search.property('value');
97374
97375                                 if (!currentValue.length) return;
97376
97377                                 var results;
97378                                 if (!err && countryCode) {
97379                                     countryCode = countryCode.toLowerCase();
97380                                     results = presets.search(currentValue, geometry, countryCode);
97381                                 } else {
97382                                     results = presets.search(currentValue, geometry);
97383                                 }
97384                                 message.text(t('inspector.results', {
97385                                     n: results.collection.length,
97386                                     search: currentValue
97387                                 }));
97388                                 list.call(drawList, results);
97389                             });
97390                         }
97391                     } else {
97392                         list.call(drawList, context.presets().defaults(geometry, 36));
97393                         message.text(t('inspector.choose'));
97394                     }
97395                 }
97396
97397                 var searchWrap = selection
97398                     .append('div')
97399                     .attr('class', 'search-header');
97400
97401                 var search = searchWrap
97402                     .append('input')
97403                     .attr('class', 'preset-search-input')
97404                     .attr('placeholder', t('inspector.search'))
97405                     .attr('type', 'search')
97406                     .call(utilNoAuto)
97407                     .on('keydown', initialKeydown)
97408                     .on('keypress', keypress)
97409                     .on('input', inputevent);
97410
97411                 searchWrap
97412                     .call(svgIcon('#iD-icon-search', 'pre-text'));
97413
97414                 if (_autofocus) {
97415                     search.node().focus();
97416                 }
97417
97418                 var listWrap = selection
97419                     .append('div')
97420                     .attr('class', 'inspector-body');
97421
97422                 var list = listWrap
97423                     .append('div')
97424                     .attr('class', 'preset-list fillL cf')
97425                     .call(drawList, context.presets().defaults(geometry, 36));
97426
97427                 context.features().on('change.preset-list', updateForFeatureHiddenState);
97428             }
97429
97430
97431             function drawList(list, presets) {
97432                 var collection = presets.collection.reduce(function(collection, preset) {
97433                     if (preset.members) {
97434                         if (preset.members.collection.filter(function(preset) {
97435                             return preset.visible();
97436                         }).length > 1) {
97437                             collection.push(CategoryItem(preset));
97438                         }
97439                     } else if (preset.visible()) {
97440                         collection.push(PresetItem(preset));
97441                     }
97442                     return collection;
97443                 }, []);
97444
97445                 var items = list.selectAll('.preset-list-item')
97446                     .data(collection, function(d) { return d.preset.id; });
97447
97448                 items.order();
97449
97450                 items.exit()
97451                     .remove();
97452
97453                 items.enter()
97454                     .append('div')
97455                     .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
97456                     .classed('current', function(item) { return item.preset === _currentPreset; })
97457                     .each(function(item) { d3_select(this).call(item); })
97458                     .style('opacity', 0)
97459                     .transition()
97460                     .style('opacity', 1);
97461
97462                 updateForFeatureHiddenState();
97463             }
97464
97465             function itemKeydown(){
97466                 // the actively focused item
97467                 var item = d3_select(this.closest('.preset-list-item'));
97468                 var parentItem = d3_select(item.node().parentNode.closest('.preset-list-item'));
97469
97470                 // arrow down, move focus to the next, lower item
97471                 if (event.keyCode === utilKeybinding.keyCodes['↓']) {
97472                     event.preventDefault();
97473                     event.stopPropagation();
97474                     // the next item in the list at the same level
97475                     var nextItem = d3_select(item.node().nextElementSibling);
97476                     // if there is no next item in this list
97477                     if (nextItem.empty()) {
97478                         // if there is a parent item
97479                         if (!parentItem.empty()) {
97480                             // the item is the last item of a sublist,
97481                             // select the next item at the parent level
97482                             nextItem = d3_select(parentItem.node().nextElementSibling);
97483                         }
97484                     // if the focused item is expanded
97485                     } else if (d3_select(this).classed('expanded')) {
97486                         // select the first subitem instead
97487                         nextItem = item.select('.subgrid .preset-list-item:first-child');
97488                     }
97489                     if (!nextItem.empty()) {
97490                         // focus on the next item
97491                         nextItem.select('.preset-list-button').node().focus();
97492                     }
97493
97494                 // arrow up, move focus to the previous, higher item
97495                 } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
97496                     event.preventDefault();
97497                     event.stopPropagation();
97498                     // the previous item in the list at the same level
97499                     var previousItem = d3_select(item.node().previousElementSibling);
97500
97501                     // if there is no previous item in this list
97502                     if (previousItem.empty()) {
97503                         // if there is a parent item
97504                         if (!parentItem.empty()) {
97505                             // the item is the first subitem of a sublist select the parent item
97506                             previousItem = parentItem;
97507                         }
97508                     // if the previous item is expanded
97509                     } else if (previousItem.select('.preset-list-button').classed('expanded')) {
97510                         // select the last subitem of the sublist of the previous item
97511                         previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
97512                     }
97513
97514                     if (!previousItem.empty()) {
97515                         // focus on the previous item
97516                         previousItem.select('.preset-list-button').node().focus();
97517                     } else {
97518                         // the focus is at the top of the list, move focus back to the search field
97519                         var search = d3_select(this.closest('.preset-list-pane')).select('.preset-search-input');
97520                         search.node().focus();
97521                     }
97522
97523                 // arrow left, move focus to the parent item if there is one
97524                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97525                     event.preventDefault();
97526                     event.stopPropagation();
97527                     // if there is a parent item, focus on the parent item
97528                     if (!parentItem.empty()) {
97529                         parentItem.select('.preset-list-button').node().focus();
97530                     }
97531
97532                 // arrow right, choose this item
97533                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97534                     event.preventDefault();
97535                     event.stopPropagation();
97536                     item.datum().choose.call(d3_select(this).node());
97537                 }
97538             }
97539
97540
97541             function CategoryItem(preset) {
97542                 var box, sublist, shown = false;
97543
97544                 function item(selection) {
97545                     var wrap = selection.append('div')
97546                         .attr('class', 'preset-list-button-wrap category');
97547
97548                     function click() {
97549                         var isExpanded = d3_select(this).classed('expanded');
97550                         var iconName = isExpanded ?
97551                             (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
97552                         d3_select(this)
97553                             .classed('expanded', !isExpanded);
97554                         d3_select(this).selectAll('div.label-inner svg.icon use')
97555                             .attr('href', iconName);
97556                         item.choose();
97557                     }
97558
97559                     var button = wrap
97560                         .append('button')
97561                         .attr('class', 'preset-list-button')
97562                         .classed('expanded', false)
97563                         .call(uiPresetIcon(context)
97564                             .geometry(context.geometry(_entityID))
97565                             .preset(preset))
97566                         .on('click', click)
97567                         .on('keydown', function() {
97568                             // right arrow, expand the focused item
97569                             if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97570                                 event.preventDefault();
97571                                 event.stopPropagation();
97572                                 // if the item isn't expanded
97573                                 if (!d3_select(this).classed('expanded')) {
97574                                     // toggle expansion (expand the item)
97575                                     click.call(this);
97576                                 }
97577                             // left arrow, collapse the focused item
97578                             } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97579                                 event.preventDefault();
97580                                 event.stopPropagation();
97581                                 // if the item is expanded
97582                                 if (d3_select(this).classed('expanded')) {
97583                                     // toggle expansion (collapse the item)
97584                                     click.call(this);
97585                                 }
97586                             } else {
97587                                 itemKeydown.call(this);
97588                             }
97589                         });
97590
97591                     var label = button
97592                         .append('div')
97593                         .attr('class', 'label')
97594                         .append('div')
97595                         .attr('class', 'label-inner');
97596
97597                     label
97598                         .append('div')
97599                         .attr('class', 'namepart')
97600                         .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
97601                         .append('span')
97602                         .html(function() { return preset.name() + '&hellip;'; });
97603
97604                     box = selection.append('div')
97605                         .attr('class', 'subgrid')
97606                         .style('max-height', '0px')
97607                         .style('opacity', 0);
97608
97609                     box.append('div')
97610                         .attr('class', 'arrow');
97611
97612                     sublist = box.append('div')
97613                         .attr('class', 'preset-list fillL3');
97614                 }
97615
97616
97617                 item.choose = function() {
97618                     if (!box || !sublist) return;
97619
97620                     if (shown) {
97621                         shown = false;
97622                         box.transition()
97623                             .duration(200)
97624                             .style('opacity', '0')
97625                             .style('max-height', '0px')
97626                             .style('padding-bottom', '0px');
97627                     } else {
97628                         shown = true;
97629                         var members = preset.members.matchGeometry(context.geometry(_entityID));
97630                         sublist.call(drawList, members);
97631                         box.transition()
97632                             .duration(200)
97633                             .style('opacity', '1')
97634                             .style('max-height', 200 + members.collection.length * 190 + 'px')
97635                             .style('padding-bottom', '10px');
97636                     }
97637                 };
97638
97639                 item.preset = preset;
97640                 return item;
97641             }
97642
97643
97644             function PresetItem(preset) {
97645                 function item(selection) {
97646                     var wrap = selection.append('div')
97647                         .attr('class', 'preset-list-button-wrap');
97648
97649                     var button = wrap.append('button')
97650                         .attr('class', 'preset-list-button')
97651                         .call(uiPresetIcon(context)
97652                             .geometry(context.geometry(_entityID))
97653                             .preset(preset))
97654                         .on('click', item.choose)
97655                         .on('keydown', itemKeydown);
97656
97657                     var label = button
97658                         .append('div')
97659                         .attr('class', 'label')
97660                         .append('div')
97661                         .attr('class', 'label-inner');
97662
97663                     // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
97664                     label.selectAll('.namepart')
97665                         .data(preset.name().split(' – '))
97666                         .enter()
97667                         .append('div')
97668                         .attr('class', 'namepart')
97669                         .text(function(d) { return d; });
97670
97671                     wrap.call(item.reference.button);
97672                     selection.call(item.reference.body);
97673                 }
97674
97675                 item.choose = function() {
97676                     if (d3_select(this).classed('disabled')) return;
97677
97678                     context.presets().setMostRecent(preset, context.geometry(_entityID));
97679                     context.perform(
97680                         actionChangePreset(_entityID, _currentPreset, preset),
97681                         t('operations.change_tags.annotation')
97682                     );
97683
97684                     context.validator().validate();  // rerun validation
97685                     dispatch$1.call('choose', this, preset);
97686                 };
97687
97688                 item.help = function() {
97689                     event.stopPropagation();
97690                     item.reference.toggle();
97691                 };
97692
97693                 item.preset = preset;
97694                 item.reference = uiTagReference(preset.reference(context.geometry(_entityID)));
97695
97696                 return item;
97697             }
97698
97699
97700             function updateForFeatureHiddenState() {
97701                 if (!context.hasEntity(_entityID)) return;
97702
97703                 var geometry = context.geometry(_entityID);
97704                 var button = d3_selectAll('.preset-list .preset-list-button');
97705
97706                 // remove existing tooltips
97707                 button.call(tooltip().destroyAny);
97708
97709                 button.each(function(item, index) {
97710                     var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
97711                     var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
97712
97713                     d3_select(this)
97714                         .classed('disabled', isHiddenPreset);
97715
97716                     if (isHiddenPreset) {
97717                         var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
97718                         var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
97719                         var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
97720                         d3_select(this).call(tooltip()
97721                             .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
97722                             .placement(index < 2 ? 'bottom' : 'top')
97723                         );
97724                     }
97725                 });
97726             }
97727
97728             presetList.autofocus = function(val) {
97729                 if (!arguments.length) return _autofocus;
97730                 _autofocus = val;
97731                 return presetList;
97732             };
97733
97734
97735             presetList.entityID = function(val) {
97736                 if (!arguments.length) return _entityID;
97737                 _entityID = val;
97738                 presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
97739                 return presetList;
97740             };
97741
97742
97743             presetList.preset = function(val) {
97744                 if (!arguments.length) return _currentPreset;
97745                 _currentPreset = val;
97746                 return presetList;
97747             };
97748
97749
97750             return utilRebind(presetList, dispatch$1, 'on');
97751         }
97752
97753         function uiInspector(context) {
97754             var presetList = uiPresetList(context);
97755             var entityEditor = uiEntityEditor(context);
97756             var wrap = d3_select(null),
97757                 presetPane = d3_select(null),
97758                 editorPane = d3_select(null);
97759             var _state = 'select';
97760             var _entityID;
97761             var _newFeature = false;
97762
97763
97764             function inspector(selection, newFeature) {
97765                 presetList
97766                     .entityID(_entityID)
97767                     .autofocus(_newFeature)
97768                     .on('choose', inspector.setPreset);
97769
97770                 entityEditor
97771                     .state(_state)
97772                     .entityID(_entityID)
97773                     .on('choose', inspector.showList);
97774
97775                 wrap = selection.selectAll('.panewrap')
97776                     .data([0]);
97777
97778                 var enter = wrap.enter()
97779                     .append('div')
97780                     .attr('class', 'panewrap');
97781
97782                 enter
97783                     .append('div')
97784                     .attr('class', 'preset-list-pane pane');
97785
97786                 enter
97787                     .append('div')
97788                     .attr('class', 'entity-editor-pane pane');
97789
97790                 wrap = wrap.merge(enter);
97791                 presetPane = wrap.selectAll('.preset-list-pane');
97792                 editorPane = wrap.selectAll('.entity-editor-pane');
97793
97794                 var entity = context.entity(_entityID);
97795
97796                 var hasNonGeometryTags = entity.hasNonGeometryTags();
97797                 var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
97798                     (!hasNonGeometryTags && !entity.isHighwayIntersection(context.graph()));
97799                 var issues = context.validator().getEntityIssues(_entityID);
97800                 // start with the preset list if the feature is new and untagged or is an uninteresting vertex
97801                 var showPresetList = (newFeature && !hasNonGeometryTags) || (isTaglessOrIntersectionVertex && !issues.length);
97802
97803                 if (showPresetList) {
97804                     wrap.style('right', '-100%');
97805                     presetPane.call(presetList);
97806                 } else {
97807                     wrap.style('right', '0%');
97808                     editorPane.call(entityEditor);
97809                 }
97810
97811                 var footer = selection.selectAll('.footer')
97812                     .data([0]);
97813
97814                 footer = footer.enter()
97815                     .append('div')
97816                     .attr('class', 'footer')
97817                     .merge(footer);
97818
97819                 footer
97820                     .call(uiViewOnOSM(context)
97821                         .what(context.hasEntity(_entityID))
97822                     );
97823             }
97824
97825             inspector.showList = function(preset) {
97826                 wrap.transition()
97827                     .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
97828
97829                 presetPane
97830                     .call(presetList.preset(preset).autofocus(true));
97831             };
97832
97833             inspector.setPreset = function(preset) {
97834
97835                 // upon setting multipolygon, go to the area preset list instead of the editor
97836                 if (preset.id === 'type/multipolygon') {
97837                     presetPane
97838                         .call(presetList.preset(preset).autofocus(true));
97839
97840                 } else {
97841                     wrap.transition()
97842                         .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
97843
97844                     editorPane
97845                         .call(entityEditor.preset(preset));
97846                 }
97847
97848             };
97849
97850             inspector.state = function(val) {
97851                 if (!arguments.length) return _state;
97852                 _state = val;
97853                 entityEditor.state(_state);
97854
97855                 // remove any old field help overlay that might have gotten attached to the inspector
97856                 d3_selectAll('.field-help-body').remove();
97857
97858                 return inspector;
97859             };
97860
97861
97862             inspector.entityID = function(val) {
97863                 if (!arguments.length) return _entityID;
97864                 _entityID = val;
97865                 return inspector;
97866             };
97867
97868
97869             inspector.newFeature = function(val) {
97870                 if (!arguments.length) return _newFeature;
97871                 _newFeature = val;
97872                 return inspector;
97873             };
97874
97875
97876             return inspector;
97877         }
97878
97879         function uiSidebar(context) {
97880             var inspector = uiInspector(context);
97881             var dataEditor = uiDataEditor(context);
97882             var noteEditor = uiNoteEditor(context);
97883             var improveOsmEditor = uiImproveOsmEditor(context);
97884             var keepRightEditor = uiKeepRightEditor(context);
97885             var _current;
97886             var _wasData = false;
97887             var _wasNote = false;
97888             var _wasQAError = false;
97889
97890
97891             function sidebar(selection) {
97892                 var container = d3_select('#id-container');
97893                 var minWidth = 280;
97894                 var sidebarWidth;
97895                 var containerWidth;
97896                 var dragOffset;
97897
97898                 var resizer = selection
97899                     .append('div')
97900                     .attr('id', 'sidebar-resizer');
97901
97902                 // Set the initial width constraints
97903                 selection
97904                     .style('min-width', minWidth + 'px')
97905                     .style('max-width', '400px')
97906                     .style('width', '33.3333%');
97907
97908                 resizer.call(d3_drag()
97909                     .container(container.node())
97910                     .on('start', function() {
97911                         // offset from edge of sidebar-resizer
97912                         dragOffset = event.sourceEvent.offsetX - 1;
97913
97914                         sidebarWidth = selection.node().getBoundingClientRect().width;
97915                         containerWidth = container.node().getBoundingClientRect().width;
97916                         var widthPct = (sidebarWidth / containerWidth) * 100;
97917                         selection
97918                             .style('width', widthPct + '%')    // lock in current width
97919                             .style('max-width', '85%');        // but allow larger widths
97920
97921                         resizer.classed('dragging', true);
97922                     })
97923                     .on('drag', function() {
97924                         var isRTL = (textDirection === 'rtl');
97925                         var scaleX = isRTL ? 0 : 1;
97926                         var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97927
97928                         var x = event.x - dragOffset;
97929                         sidebarWidth = isRTL ? containerWidth - x : x;
97930
97931                         var isCollapsed = selection.classed('collapsed');
97932                         var shouldCollapse = sidebarWidth < minWidth;
97933
97934                         selection.classed('collapsed', shouldCollapse);
97935
97936                         if (shouldCollapse) {
97937                             if (!isCollapsed) {
97938                                 selection
97939                                     .style(xMarginProperty, '-400px')
97940                                     .style('width', '400px');
97941
97942                                 context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
97943                             }
97944
97945                         } else {
97946                             var widthPct = (sidebarWidth / containerWidth) * 100;
97947                             selection
97948                                 .style(xMarginProperty, null)
97949                                 .style('width', widthPct + '%');
97950
97951                             if (isCollapsed) {
97952                                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
97953                             } else {
97954                                 context.ui().onResize([-event.dx * scaleX, 0]);
97955                             }
97956                         }
97957                     })
97958                     .on('end', function() {
97959                         resizer.classed('dragging', false);
97960                     })
97961                 );
97962
97963                 var featureListWrap = selection
97964                     .append('div')
97965                     .attr('class', 'feature-list-pane')
97966                     .call(uiFeatureList(context));
97967
97968                 var inspectorWrap = selection
97969                     .append('div')
97970                     .attr('class', 'inspector-hidden inspector-wrap fr');
97971
97972
97973                 function hover(datum) {
97974                     if (datum && datum.__featurehash__) {   // hovering on data
97975                         _wasData = true;
97976                         sidebar
97977                             .show(dataEditor.datum(datum));
97978
97979                         selection.selectAll('.sidebar-component')
97980                             .classed('inspector-hover', true);
97981
97982                     } else if (datum instanceof osmNote) {
97983                         if (context.mode().id === 'drag-note') return;
97984                         _wasNote = true;
97985
97986                         var osm = services$1.osm;
97987                         if (osm) {
97988                             datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
97989                         }
97990
97991                         sidebar
97992                             .show(noteEditor.note(datum));
97993
97994                         selection.selectAll('.sidebar-component')
97995                             .classed('inspector-hover', true);
97996
97997                     } else if (datum instanceof qaError) {
97998                         _wasQAError = true;
97999
98000                         var errService = services$1[datum.service];
98001                         if (errService) {
98002                             // marker may contain stale data - get latest
98003                             datum = errService.getError(datum.id);
98004                         }
98005
98006                         // Temporary solution while only two services
98007                         var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
98008
98009                         d3_selectAll('.qa_error.' + datum.service)
98010                             .classed('hover', function(d) { return d.id === datum.id; });
98011
98012                         sidebar
98013                             .show(errEditor.error(datum));
98014
98015                         selection.selectAll('.sidebar-component')
98016                             .classed('inspector-hover', true);
98017
98018                     } else if (!_current && (datum instanceof osmEntity)) {
98019                         featureListWrap
98020                             .classed('inspector-hidden', true);
98021
98022                         inspectorWrap
98023                             .classed('inspector-hidden', false)
98024                             .classed('inspector-hover', true);
98025
98026                         if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
98027                             inspector
98028                                 .state('hover')
98029                                 .entityID(datum.id);
98030
98031                             inspectorWrap
98032                                 .call(inspector);
98033                         }
98034
98035                     } else if (!_current) {
98036                         featureListWrap
98037                             .classed('inspector-hidden', false);
98038                         inspectorWrap
98039                             .classed('inspector-hidden', true);
98040                         inspector
98041                             .state('hide');
98042
98043                     } else if (_wasData || _wasNote || _wasQAError) {
98044                         _wasNote = false;
98045                         _wasData = false;
98046                         _wasQAError = false;
98047                         d3_selectAll('.note').classed('hover', false);
98048                         d3_selectAll('.qa_error').classed('hover', false);
98049                         sidebar.hide();
98050                     }
98051                 }
98052
98053                 sidebar.hover = throttle(hover, 200);
98054
98055
98056                 sidebar.intersects = function(extent) {
98057                     var rect = selection.node().getBoundingClientRect();
98058                     return extent.intersects([
98059                         context.projection.invert([0, rect.height]),
98060                         context.projection.invert([rect.width, 0])
98061                     ]);
98062                 };
98063
98064
98065                 sidebar.select = function(id, newFeature) {
98066                     sidebar.hide();
98067
98068                     if (id) {
98069                         var entity = context.entity(id);
98070                         // uncollapse the sidebar
98071                         if (selection.classed('collapsed')) {
98072                             if (newFeature) {
98073                                 var extent = entity.extent(context.graph());
98074                                 sidebar.expand(sidebar.intersects(extent));
98075                             }
98076                         }
98077
98078                         featureListWrap
98079                             .classed('inspector-hidden', true);
98080
98081                         inspectorWrap
98082                             .classed('inspector-hidden', false)
98083                             .classed('inspector-hover', false);
98084
98085                         if (inspector.entityID() !== id || inspector.state() !== 'select') {
98086                             inspector
98087                                 .state('select')
98088                                 .entityID(id)
98089                                 .newFeature(newFeature);
98090
98091                             inspectorWrap
98092                                 .call(inspector, newFeature);
98093                         }
98094
98095                         sidebar.showPresetList = function() {
98096                             inspector.showList(context.presets().match(entity, context.graph()));
98097                         };
98098
98099                     } else {
98100                         inspector
98101                             .state('hide');
98102                     }
98103                 };
98104
98105
98106                 sidebar.show = function(component, element) {
98107                     featureListWrap
98108                         .classed('inspector-hidden', true);
98109                     inspectorWrap
98110                         .classed('inspector-hidden', true);
98111
98112                     if (_current) _current.remove();
98113                     _current = selection
98114                         .append('div')
98115                         .attr('class', 'sidebar-component')
98116                         .call(component, element);
98117                 };
98118
98119
98120                 sidebar.hide = function() {
98121                     featureListWrap
98122                         .classed('inspector-hidden', false);
98123                     inspectorWrap
98124                         .classed('inspector-hidden', true);
98125
98126                     if (_current) _current.remove();
98127                     _current = null;
98128                 };
98129
98130
98131                 sidebar.expand = function(moveMap) {
98132                     if (selection.classed('collapsed')) {
98133                         sidebar.toggle(moveMap);
98134                     }
98135                 };
98136
98137
98138                 sidebar.collapse = function(moveMap) {
98139                     if (!selection.classed('collapsed')) {
98140                         sidebar.toggle(moveMap);
98141                     }
98142                 };
98143
98144
98145                 sidebar.toggle = function(moveMap) {
98146                     var e = event;
98147                     if (e && e.sourceEvent) {
98148                         e.sourceEvent.preventDefault();
98149                     } else if (e) {
98150                         e.preventDefault();
98151                     }
98152
98153                     // Don't allow sidebar to toggle when the user is in the walkthrough.
98154                     if (context.inIntro()) return;
98155
98156                     var isCollapsed = selection.classed('collapsed');
98157                     var isCollapsing = !isCollapsed;
98158                     var isRTL = (textDirection === 'rtl');
98159                     var scaleX = isRTL ? 0 : 1;
98160                     var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
98161
98162                     sidebarWidth = selection.node().getBoundingClientRect().width;
98163
98164                     // switch from % to px
98165                     selection.style('width', sidebarWidth + 'px');
98166
98167                     var startMargin, endMargin, lastMargin;
98168                     if (isCollapsing) {
98169                         startMargin = lastMargin = 0;
98170                         endMargin = -sidebarWidth;
98171                     } else {
98172                         startMargin = lastMargin = -sidebarWidth;
98173                         endMargin = 0;
98174                     }
98175
98176                     selection.transition()
98177                         .style(xMarginProperty, endMargin + 'px')
98178                         .tween('panner', function() {
98179                             var i = d3_interpolateNumber(startMargin, endMargin);
98180                             return function(t) {
98181                                 var dx = lastMargin - Math.round(i(t));
98182                                 lastMargin = lastMargin - dx;
98183                                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
98184                             };
98185                         })
98186                         .on('end', function() {
98187                             selection.classed('collapsed', isCollapsing);
98188
98189                             // switch back from px to %
98190                             if (!isCollapsing) {
98191                                 var containerWidth = container.node().getBoundingClientRect().width;
98192                                 var widthPct = (sidebarWidth / containerWidth) * 100;
98193                                 selection
98194                                     .style(xMarginProperty, null)
98195                                     .style('width', widthPct + '%');
98196                             }
98197                         });
98198                 };
98199
98200                 // toggle the sidebar collapse when double-clicking the resizer
98201                 resizer.on('dblclick', sidebar.toggle);
98202             }
98203
98204             sidebar.showPresetList = function() {};
98205             sidebar.hover = function() {};
98206             sidebar.hover.cancel = function() {};
98207             sidebar.intersects = function() {};
98208             sidebar.select = function() {};
98209             sidebar.show = function() {};
98210             sidebar.hide = function() {};
98211             sidebar.expand = function() {};
98212             sidebar.collapse = function() {};
98213             sidebar.toggle = function() {};
98214
98215             return sidebar;
98216         }
98217
98218         function uiSpinner(context) {
98219             var osm = context.connection();
98220
98221
98222             return function(selection) {
98223                 var img = selection
98224                     .append('img')
98225                     .attr('src', context.imagePath('loader-black.gif'))
98226                     .style('opacity', 0);
98227
98228                 if (osm) {
98229                     osm
98230                         .on('loading.spinner', function() {
98231                             img.transition()
98232                                 .style('opacity', 1);
98233                         })
98234                         .on('loaded.spinner', function() {
98235                             img.transition()
98236                                 .style('opacity', 0);
98237                         });
98238                 }
98239             };
98240         }
98241
98242         function uiSplash(context) {
98243
98244             return function(selection) {
98245                 if (context.storage('sawSplash'))
98246                      return;
98247
98248                 context.storage('sawSplash', true);
98249
98250                 var modalSelection = uiModal(selection);
98251
98252                 modalSelection.select('.modal')
98253                     .attr('class', 'modal-splash modal');
98254
98255                 var introModal = modalSelection.select('.content')
98256                     .append('div')
98257                     .attr('class', 'fillL');
98258
98259                 introModal
98260                     .append('div')
98261                     .attr('class','modal-section')
98262                     .append('h3').text(t('splash.welcome'));
98263
98264                 introModal
98265                     .append('div')
98266                     .attr('class','modal-section')
98267                     .append('p')
98268                     .html(t('splash.text', {
98269                         version: context.version,
98270                         website: '<a href="http://ideditor.com/">ideditor.com</a>',
98271                         github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
98272                     }));
98273
98274                 var buttonWrap = introModal
98275                     .append('div')
98276                     .attr('class', 'modal-actions');
98277
98278                 var walkthrough = buttonWrap
98279                     .append('button')
98280                     .attr('class', 'walkthrough')
98281                     .on('click', function() {
98282                         context.container().call(uiIntro(context));
98283                         modalSelection.close();
98284                     });
98285
98286                 walkthrough
98287                     .append('svg')
98288                     .attr('class', 'logo logo-walkthrough')
98289                     .append('use')
98290                     .attr('xlink:href', '#iD-logo-walkthrough');
98291
98292                 walkthrough
98293                     .append('div')
98294                     .text(t('splash.walkthrough'));
98295
98296                 var startEditing = buttonWrap
98297                     .append('button')
98298                     .attr('class', 'start-editing')
98299                     .on('click', modalSelection.close);
98300
98301                 startEditing
98302                     .append('svg')
98303                     .attr('class', 'logo logo-features')
98304                     .append('use')
98305                     .attr('xlink:href', '#iD-logo-features');
98306
98307                 startEditing
98308                     .append('div')
98309                     .text(t('splash.start'));
98310
98311
98312                 modalSelection.select('button.close')
98313                     .attr('class','hide');
98314
98315             };
98316         }
98317
98318         function uiStatus(context) {
98319             var osm = context.connection();
98320
98321
98322             return function(selection) {
98323                 if (!osm) return;
98324
98325                 function update() {
98326                     osm.status(function(err, apiStatus) {
98327                         selection.html('');
98328
98329                         if (err) {
98330                             if (apiStatus === 'connectionSwitched') {
98331                                 // if the connection was just switched, we can't rely on
98332                                 // the status (we're getting the status of the previous api)
98333                                 return;
98334
98335                             } else if (apiStatus === 'rateLimited') {
98336                                 selection
98337                                     .text(t('status.rateLimit'))
98338                                     .append('a')
98339                                     .attr('class', 'api-status-login')
98340                                     .attr('target', '_blank')
98341                                     .call(svgIcon('#iD-icon-out-link', 'inline'))
98342                                     .append('span')
98343                                     .text(t('login'))
98344                                     .on('click.login', function() {
98345                                         event.preventDefault();
98346                                         osm.authenticate();
98347                                     });
98348                             } else {
98349                                 // eslint-disable-next-line no-warning-comments
98350                                 // TODO: nice messages for different error types
98351                                 selection.text(t('status.error'));
98352                             }
98353
98354                         } else if (apiStatus === 'readonly') {
98355                             selection.text(t('status.readonly'));
98356                         } else if (apiStatus === 'offline') {
98357                             selection.text(t('status.offline'));
98358                         }
98359
98360                         selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
98361                     });
98362                 }
98363
98364                 osm.on('change', function() { update(); });
98365
98366                 window.setInterval(update, 90000);
98367                 update();
98368             };
98369         }
98370
98371         function modeDrawArea(context, wayID, startGraph, baselineGraph, button) {
98372             var mode = {
98373                 button: button,
98374                 id: 'draw-area'
98375             };
98376
98377             var behavior;
98378
98379             mode.wayID = wayID;
98380
98381             mode.enter = function() {
98382                 var way = context.entity(wayID);
98383
98384                 behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
98385                     .tail(t('modes.draw_area.tail'));
98386
98387                 var addNode = behavior.addNode;
98388
98389                 behavior.addNode = function(node, d) {
98390                     var length = way.nodes.length;
98391                     var penultimate = length > 2 ? way.nodes[length - 2] : null;
98392
98393                     if (node.id === way.first() || node.id === penultimate) {
98394                         behavior.finish();
98395                     } else {
98396                         addNode(node, d);
98397                     }
98398                 };
98399
98400                 context.install(behavior);
98401             };
98402
98403
98404             mode.exit = function() {
98405                 context.uninstall(behavior);
98406             };
98407
98408
98409             mode.selectedIDs = function() {
98410                 return [wayID];
98411             };
98412
98413
98414             mode.activeID = function() {
98415                 return (behavior && behavior.activeID()) || [];
98416             };
98417
98418
98419             return mode;
98420         }
98421
98422         function modeAddArea(context, mode) {
98423             mode.id = 'add-area';
98424
98425             var behavior = behaviorAddWay(context)
98426                 .tail(t('modes.add_area.tail'))
98427                 .on('start', start)
98428                 .on('startFromWay', startFromWay)
98429                 .on('startFromNode', startFromNode);
98430
98431             var defaultTags = { area: 'yes' };
98432             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
98433
98434
98435             function actionClose(wayId) {
98436                 return function (graph) {
98437                     return graph.replace(graph.entity(wayId).close());
98438                 };
98439             }
98440
98441
98442             function start(loc) {
98443                 var startGraph = context.graph();
98444                 var node = osmNode({ loc: loc });
98445                 var way = osmWay({ tags: defaultTags });
98446
98447                 context.perform(
98448                     actionAddEntity(node),
98449                     actionAddEntity(way),
98450                     actionAddVertex(way.id, node.id),
98451                     actionClose(way.id)
98452                 );
98453
98454                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98455             }
98456
98457
98458             function startFromWay(loc, edge) {
98459                 var startGraph = context.graph();
98460                 var node = osmNode({ loc: loc });
98461                 var way = osmWay({ tags: defaultTags });
98462
98463                 context.perform(
98464                     actionAddEntity(node),
98465                     actionAddEntity(way),
98466                     actionAddVertex(way.id, node.id),
98467                     actionClose(way.id),
98468                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98469                 );
98470
98471                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98472             }
98473
98474
98475             function startFromNode(node) {
98476                 var startGraph = context.graph();
98477                 var way = osmWay({ tags: defaultTags });
98478
98479                 context.perform(
98480                     actionAddEntity(way),
98481                     actionAddVertex(way.id, node.id),
98482                     actionClose(way.id)
98483                 );
98484
98485                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98486             }
98487
98488
98489             mode.enter = function() {
98490                 context.install(behavior);
98491             };
98492
98493
98494             mode.exit = function() {
98495                 context.uninstall(behavior);
98496             };
98497
98498
98499             return mode;
98500         }
98501
98502         function modeAddLine(context, mode) {
98503             mode.id = 'add-line';
98504
98505             var behavior = behaviorAddWay(context)
98506                 .tail(t('modes.add_line.tail'))
98507                 .on('start', start)
98508                 .on('startFromWay', startFromWay)
98509                 .on('startFromNode', startFromNode);
98510
98511             var defaultTags = {};
98512             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
98513
98514
98515             function start(loc) {
98516                 var startGraph = context.graph();
98517                 var node = osmNode({ loc: loc });
98518                 var way = osmWay({ tags: defaultTags });
98519
98520                 context.perform(
98521                     actionAddEntity(node),
98522                     actionAddEntity(way),
98523                     actionAddVertex(way.id, node.id)
98524                 );
98525
98526                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98527             }
98528
98529
98530             function startFromWay(loc, edge) {
98531                 var startGraph = context.graph();
98532                 var node = osmNode({ loc: loc });
98533                 var way = osmWay({ tags: defaultTags });
98534
98535                 context.perform(
98536                     actionAddEntity(node),
98537                     actionAddEntity(way),
98538                     actionAddVertex(way.id, node.id),
98539                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98540                 );
98541
98542                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98543             }
98544
98545
98546             function startFromNode(node) {
98547                 var startGraph = context.graph();
98548                 var way = osmWay({ tags: defaultTags });
98549
98550                 context.perform(
98551                     actionAddEntity(way),
98552                     actionAddVertex(way.id, node.id)
98553                 );
98554
98555                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98556             }
98557
98558
98559             mode.enter = function() {
98560                 context.install(behavior);
98561             };
98562
98563
98564             mode.exit = function() {
98565                 context.uninstall(behavior);
98566             };
98567
98568             return mode;
98569         }
98570
98571         function modeAddPoint(context, mode) {
98572
98573             mode.id = 'add-point';
98574
98575             var behavior = behaviorDraw(context)
98576                 .tail(t('modes.add_point.tail'))
98577                 .on('click', add)
98578                 .on('clickWay', addWay)
98579                 .on('clickNode', addNode)
98580                 .on('cancel', cancel)
98581                 .on('finish', cancel);
98582
98583             var defaultTags = {};
98584             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
98585
98586
98587             function add(loc) {
98588                 var node = osmNode({ loc: loc, tags: defaultTags });
98589
98590                 context.perform(
98591                     actionAddEntity(node),
98592                     t('operations.add.annotation.point')
98593                 );
98594
98595                 enterSelectMode(node);
98596             }
98597
98598
98599             function addWay(loc, edge) {
98600                 var node = osmNode({ tags: defaultTags });
98601
98602                 context.perform(
98603                     actionAddMidpoint({loc: loc, edge: edge}, node),
98604                     t('operations.add.annotation.vertex')
98605                 );
98606
98607                 enterSelectMode(node);
98608             }
98609
98610             function enterSelectMode(node) {
98611                 context.enter(
98612                     modeSelect(context, [node.id]).newFeature(true)
98613                 );
98614             }
98615
98616
98617             function addNode(node) {
98618                 if (Object.keys(defaultTags).length === 0) {
98619                     enterSelectMode(node);
98620                     return;
98621                 }
98622
98623                 var tags = Object.assign({}, node.tags);  // shallow copy
98624                 for (var key in defaultTags) {
98625                     tags[key] = defaultTags[key];
98626                 }
98627
98628                 context.perform(
98629                     actionChangeTags(node.id, tags),
98630                     t('operations.add.annotation.point')
98631                 );
98632
98633                 enterSelectMode(node);
98634             }
98635
98636
98637             function cancel() {
98638                 context.enter(modeBrowse(context));
98639             }
98640
98641
98642             mode.enter = function() {
98643                 context.install(behavior);
98644             };
98645
98646
98647             mode.exit = function() {
98648                 context.uninstall(behavior);
98649             };
98650
98651
98652             return mode;
98653         }
98654
98655         function modeAddNote(context) {
98656             var mode = {
98657                 id: 'add-note',
98658                 button: 'note',
98659                 title: t('modes.add_note.title'),
98660                 description: t('modes.add_note.description'),
98661                 key: t('modes.add_note.key')
98662             };
98663
98664             var behavior = behaviorDraw(context)
98665                 .tail(t('modes.add_note.tail'))
98666                 .on('click', add)
98667                 .on('cancel', cancel)
98668                 .on('finish', cancel);
98669
98670
98671             function add(loc) {
98672                 var osm = services$1.osm;
98673                 if (!osm) return;
98674
98675                 var note = osmNote({ loc: loc, status: 'open', comments: [] });
98676                 osm.replaceNote(note);
98677
98678                 // force a reraw (there is no history change that would otherwise do this)
98679                 context.pan([0,0]);
98680
98681                 context
98682                     .selectedNoteID(note.id)
98683                     .enter(modeSelectNote(context, note.id).newFeature(true));
98684             }
98685
98686
98687             function cancel() {
98688                 context.enter(modeBrowse(context));
98689             }
98690
98691
98692             mode.enter = function() {
98693                 context.install(behavior);
98694             };
98695
98696
98697             mode.exit = function() {
98698                 context.uninstall(behavior);
98699             };
98700
98701
98702             return mode;
98703         }
98704
98705         function uiConflicts(context) {
98706             var dispatch$1 = dispatch('cancel', 'save');
98707             var keybinding = utilKeybinding('conflicts');
98708             var _origChanges;
98709             var _conflictList;
98710
98711
98712             function keybindingOn() {
98713                 d3_select(document)
98714                     .call(keybinding.on('⎋', cancel, true));
98715             }
98716
98717             function keybindingOff() {
98718                 d3_select(document)
98719                     .call(keybinding.unbind);
98720             }
98721
98722             function tryAgain() {
98723                 keybindingOff();
98724                 dispatch$1.call('save');
98725             }
98726
98727             function cancel() {
98728                 keybindingOff();
98729                 dispatch$1.call('cancel');
98730             }
98731
98732
98733             function conflicts(selection) {
98734                 keybindingOn();
98735
98736                 var headerEnter = selection.selectAll('.header')
98737                     .data([0])
98738                     .enter()
98739                     .append('div')
98740                     .attr('class', 'header fillL');
98741
98742                 headerEnter
98743                     .append('button')
98744                     .attr('class', 'fr')
98745                     .on('click', cancel)
98746                     .call(svgIcon('#iD-icon-close'));
98747
98748                 headerEnter
98749                     .append('h3')
98750                     .text(t('save.conflict.header'));
98751
98752                 var bodyEnter = selection.selectAll('.body')
98753                     .data([0])
98754                     .enter()
98755                     .append('div')
98756                     .attr('class', 'body fillL');
98757
98758                 var conflictsHelpEnter = bodyEnter
98759                     .append('div')
98760                     .attr('class', 'conflicts-help')
98761                     .text(t('save.conflict.help'));
98762
98763
98764                 // Download changes link
98765                 var detected = utilDetect();
98766                 var changeset = new osmChangeset();
98767
98768                 delete changeset.id;  // Export without changeset_id
98769
98770                 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
98771                 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
98772                 var fileName = 'changes.osc';
98773
98774                 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
98775                     .append('a')
98776                     .attr('class', 'download-changes');
98777
98778                 if (detected.download) {      // All except IE11 and Edge
98779                     linkEnter                 // download the data as a file
98780                         .attr('href', window.URL.createObjectURL(blob))
98781                         .attr('download', fileName);
98782
98783                 } else {                      // IE11 and Edge
98784                     linkEnter                 // open data uri in a new tab
98785                         .attr('target', '_blank')
98786                         .on('click.download', function() {
98787                             navigator.msSaveBlob(blob, fileName);
98788                         });
98789                 }
98790
98791                 linkEnter
98792                     .call(svgIcon('#iD-icon-load', 'inline'))
98793                     .append('span')
98794                     .text(t('save.conflict.download_changes'));
98795
98796
98797                 bodyEnter
98798                     .append('div')
98799                     .attr('class', 'conflict-container fillL3')
98800                     .call(showConflict, 0);
98801
98802                 bodyEnter
98803                     .append('div')
98804                     .attr('class', 'conflicts-done')
98805                     .attr('opacity', 0)
98806                     .style('display', 'none')
98807                     .text(t('save.conflict.done'));
98808
98809                 var buttonsEnter = bodyEnter
98810                     .append('div')
98811                     .attr('class','buttons col12 joined conflicts-buttons');
98812
98813                 buttonsEnter
98814                     .append('button')
98815                     .attr('disabled', _conflictList.length > 1)
98816                     .attr('class', 'action conflicts-button col6')
98817                     .text(t('save.title'))
98818                     .on('click.try_again', tryAgain);
98819
98820                 buttonsEnter
98821                     .append('button')
98822                     .attr('class', 'secondary-action conflicts-button col6')
98823                     .text(t('confirm.cancel'))
98824                     .on('click.cancel', cancel);
98825             }
98826
98827
98828             function showConflict(selection, index) {
98829                 index = utilWrap(index, _conflictList.length);
98830
98831                 var parent = d3_select(selection.node().parentNode);
98832
98833                 // enable save button if this is the last conflict being reviewed..
98834                 if (index === _conflictList.length - 1) {
98835                     window.setTimeout(function() {
98836                         parent.select('.conflicts-button')
98837                             .attr('disabled', null);
98838
98839                         parent.select('.conflicts-done')
98840                             .transition()
98841                             .attr('opacity', 1)
98842                             .style('display', 'block');
98843                     }, 250);
98844                 }
98845
98846                 var conflict = selection
98847                     .selectAll('.conflict')
98848                     .data([_conflictList[index]]);
98849
98850                 conflict.exit()
98851                     .remove();
98852
98853                 var conflictEnter = conflict.enter()
98854                     .append('div')
98855                     .attr('class', 'conflict');
98856
98857                 conflictEnter
98858                     .append('h4')
98859                     .attr('class', 'conflict-count')
98860                     .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
98861
98862                 conflictEnter
98863                     .append('a')
98864                     .attr('class', 'conflict-description')
98865                     .attr('href', '#')
98866                     .text(function(d) { return d.name; })
98867                     .on('click', function(d) {
98868                         event.preventDefault();
98869                         zoomToEntity(d.id);
98870                     });
98871
98872                 var details = conflictEnter
98873                     .append('div')
98874                     .attr('class', 'conflict-detail-container');
98875
98876                 details
98877                     .append('ul')
98878                     .attr('class', 'conflict-detail-list')
98879                     .selectAll('li')
98880                     .data(function(d) { return d.details || []; })
98881                     .enter()
98882                     .append('li')
98883                     .attr('class', 'conflict-detail-item')
98884                     .html(function(d) { return d; });
98885
98886                 details
98887                     .append('div')
98888                     .attr('class', 'conflict-choices')
98889                     .call(addChoices);
98890
98891                 details
98892                     .append('div')
98893                     .attr('class', 'conflict-nav-buttons joined cf')
98894                     .selectAll('button')
98895                     .data(['previous', 'next'])
98896                     .enter()
98897                     .append('button')
98898                     .text(function(d) { return t('save.conflict.' + d); })
98899                     .attr('class', 'conflict-nav-button action col6')
98900                     .attr('disabled', function(d, i) {
98901                         return (i === 0 && index === 0) ||
98902                             (i === 1 && index === _conflictList.length - 1) || null;
98903                     })
98904                     .on('click', function(d, i) {
98905                         event.preventDefault();
98906
98907                         var container = parent.selectAll('.conflict-container');
98908                         var sign = (i === 0 ? -1 : 1);
98909
98910                         container
98911                             .selectAll('.conflict')
98912                             .remove();
98913
98914                         container
98915                             .call(showConflict, index + sign);
98916                     });
98917
98918             }
98919
98920
98921             function addChoices(selection) {
98922                 var choices = selection
98923                     .append('ul')
98924                     .attr('class', 'layer-list')
98925                     .selectAll('li')
98926                     .data(function(d) { return d.choices || []; });
98927
98928                 // enter
98929                 var choicesEnter = choices.enter()
98930                     .append('li')
98931                     .attr('class', 'layer');
98932
98933                 var labelEnter = choicesEnter
98934                     .append('label');
98935
98936                 labelEnter
98937                     .append('input')
98938                     .attr('type', 'radio')
98939                     .attr('name', function(d) { return d.id; })
98940                     .on('change', function(d, i) {
98941                         var ul = this.parentNode.parentNode.parentNode;
98942                         ul.__data__.chosen = i;
98943                         choose(ul, d);
98944                     });
98945
98946                 labelEnter
98947                     .append('span')
98948                     .text(function(d) { return d.text; });
98949
98950                 // update
98951                 choicesEnter
98952                     .merge(choices)
98953                     .each(function(d, i) {
98954                         var ul = this.parentNode;
98955                         if (ul.__data__.chosen === i) {
98956                             choose(ul, d);
98957                         }
98958                     });
98959             }
98960
98961
98962             function choose(ul, datum) {
98963                 if (event) event.preventDefault();
98964
98965                 d3_select(ul)
98966                     .selectAll('li')
98967                     .classed('active', function(d) { return d === datum; })
98968                     .selectAll('input')
98969                     .property('checked', function(d) { return d === datum; });
98970
98971                 var extent = geoExtent();
98972                 var entity;
98973
98974                 entity = context.graph().hasEntity(datum.id);
98975                 if (entity) extent._extend(entity.extent(context.graph()));
98976
98977                 datum.action();
98978
98979                 entity = context.graph().hasEntity(datum.id);
98980                 if (entity) extent._extend(entity.extent(context.graph()));
98981
98982                 zoomToEntity(datum.id, extent);
98983             }
98984
98985
98986             function zoomToEntity(id, extent) {
98987                 context.surface().selectAll('.hover')
98988                     .classed('hover', false);
98989
98990                 var entity = context.graph().hasEntity(id);
98991                 if (entity) {
98992                     if (extent) {
98993                         context.map().trimmedExtent(extent);
98994                     } else {
98995                         context.map().zoomToEase(entity);
98996                     }
98997                     context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
98998                         .classed('hover', true);
98999                 }
99000             }
99001
99002
99003             // The conflict list should be an array of objects like:
99004             // {
99005             //     id: id,
99006             //     name: entityName(local),
99007             //     details: merge.conflicts(),
99008             //     chosen: 1,
99009             //     choices: [
99010             //         choice(id, keepMine, forceLocal),
99011             //         choice(id, keepTheirs, forceRemote)
99012             //     ]
99013             // }
99014             conflicts.conflictList = function(_) {
99015                 if (!arguments.length) return _conflictList;
99016                 _conflictList = _;
99017                 return conflicts;
99018             };
99019
99020
99021             conflicts.origChanges = function(_) {
99022                 if (!arguments.length) return _origChanges;
99023                 _origChanges = _;
99024                 return conflicts;
99025             };
99026
99027
99028             return utilRebind(conflicts, dispatch$1, 'on');
99029         }
99030
99031         function uiChangesetEditor(context) {
99032             var dispatch$1 = dispatch('change');
99033             var formFields = uiFormFields(context);
99034             var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
99035             var _fieldsArr;
99036             var _tags;
99037             var _changesetID;
99038
99039
99040             function changesetEditor(selection) {
99041                 render(selection);
99042             }
99043
99044
99045             function render(selection) {
99046                 var initial = false;
99047
99048                 if (!_fieldsArr) {
99049                     initial = true;
99050                     var presets = context.presets();
99051
99052                     _fieldsArr = [
99053                         uiField(context, presets.field('comment'), null, { show: true, revert: false }),
99054                         uiField(context, presets.field('source'), null, { show: false, revert: false }),
99055                         uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
99056                     ];
99057
99058                     _fieldsArr.forEach(function(field) {
99059                         field
99060                             .on('change', function(t, onInput) {
99061                                 dispatch$1.call('change', field, t, onInput);
99062                             });
99063                     });
99064                 }
99065
99066                 _fieldsArr.forEach(function(field) {
99067                     field
99068                         .tags(_tags);
99069                 });
99070
99071
99072                 selection
99073                     .call(formFields.fieldsArr(_fieldsArr));
99074
99075
99076                 if (initial) {
99077                     var commentField = selection.select('#preset-input-comment');
99078                     var commentNode = commentField.node();
99079
99080                     if (commentNode) {
99081                         commentNode.focus();
99082                         commentNode.select();
99083                     }
99084
99085                     // trigger a 'blur' event so that comment field can be cleaned
99086                     // and checked for hashtags, even if retrieved from localstorage
99087                     utilTriggerEvent(commentField, 'blur');
99088
99089                     var osm = context.connection();
99090                     if (osm) {
99091                         osm.userChangesets(function (err, changesets) {
99092                             if (err) return;
99093
99094                             var comments = changesets.map(function(changeset) {
99095                                 var comment = changeset.tags.comment;
99096                                 return comment ? { title: comment, value: comment } : null;
99097                             }).filter(Boolean);
99098
99099                             commentField
99100                                 .call(commentCombo
99101                                     .data(utilArrayUniqBy(comments, 'title'))
99102                                 );
99103                         });
99104                     }
99105                 }
99106
99107                 // Add warning if comment mentions Google
99108                 var hasGoogle = _tags.comment.match(/google/i);
99109                 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
99110                     .data(hasGoogle ? [0] : []);
99111
99112                 commentWarning.exit()
99113                     .transition()
99114                     .duration(200)
99115                     .style('opacity', 0)
99116                     .remove();
99117
99118                 var commentEnter = commentWarning.enter()
99119                     .insert('div', '.tag-reference-body')
99120                     .attr('class', 'field-warning comment-warning')
99121                     .style('opacity', 0);
99122
99123                 commentEnter
99124                     .append('a')
99125                     .attr('target', '_blank')
99126                     .attr('tabindex', -1)
99127                     .call(svgIcon('#iD-icon-alert', 'inline'))
99128                     .attr('href', t('commit.google_warning_link'))
99129                     .append('span')
99130                     .text(t('commit.google_warning'));
99131
99132                 commentEnter
99133                     .transition()
99134                     .duration(200)
99135                     .style('opacity', 1);
99136             }
99137
99138
99139             changesetEditor.tags = function(_) {
99140                 if (!arguments.length) return _tags;
99141                 _tags = _;
99142                 // Don't reset _fieldsArr here.
99143                 return changesetEditor;
99144             };
99145
99146
99147             changesetEditor.changesetID = function(_) {
99148                 if (!arguments.length) return _changesetID;
99149                 if (_changesetID === _) return changesetEditor;
99150                 _changesetID = _;
99151                 _fieldsArr = null;
99152                 return changesetEditor;
99153             };
99154
99155
99156             return utilRebind(changesetEditor, dispatch$1, 'on');
99157         }
99158
99159         function uiCommitChanges(context) {
99160             var detected = utilDetect();
99161             var _entityID;
99162
99163
99164             function commitChanges(selection) {
99165                 var history = context.history();
99166                 var summary = history.difference().summary();
99167
99168                 var container = selection.selectAll('.modal-section.commit-section')
99169                     .data([0]);
99170
99171                 var containerEnter = container.enter()
99172                     .append('div')
99173                     .attr('class', 'commit-section modal-section fillL2');
99174
99175                 containerEnter
99176                     .append('h3')
99177                     .text(t('commit.changes', { count: summary.length }));
99178
99179                 containerEnter
99180                     .append('ul')
99181                     .attr('class', 'changeset-list');
99182
99183                 container = containerEnter
99184                     .merge(container);
99185
99186
99187                 var items = container.select('ul').selectAll('li')
99188                     .data(summary);
99189
99190                 var itemsEnter = items.enter()
99191                     .append('li')
99192                     .attr('class', 'change-item');
99193
99194                 itemsEnter
99195                     .each(function(d) {
99196                         d3_select(this)
99197                             .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
99198                     });
99199
99200                 itemsEnter
99201                     .append('span')
99202                     .attr('class', 'change-type')
99203                     .text(function(d) { return t('commit.' + d.changeType) + ' '; });
99204
99205                 itemsEnter
99206                     .append('strong')
99207                     .attr('class', 'entity-type')
99208                     .text(function(d) {
99209                         var matched = context.presets().match(d.entity, d.graph);
99210                         return (matched && matched.name()) || utilDisplayType(d.entity.id);
99211                     });
99212
99213                 itemsEnter
99214                     .append('span')
99215                     .attr('class', 'entity-name')
99216                     .text(function(d) {
99217                         var name = utilDisplayName(d.entity) || '',
99218                             string = '';
99219                         if (name !== '') {
99220                             string += ':';
99221                         }
99222                         return string += ' ' + name;
99223                     });
99224
99225                 itemsEnter
99226                     .style('opacity', 0)
99227                     .transition()
99228                     .style('opacity', 1);
99229
99230                 items = itemsEnter
99231                     .merge(items);
99232
99233                 items
99234                     .on('mouseover', mouseover)
99235                     .on('mouseout', mouseout)
99236                     .on('click', click);
99237
99238
99239                 // Download changeset link
99240                 var changeset = new osmChangeset().update({ id: undefined });
99241                 var changes = history.changes(actionDiscardTags(history.difference()));
99242
99243                 delete changeset.id;  // Export without chnageset_id
99244
99245                 var data = JXON.stringify(changeset.osmChangeJXON(changes));
99246                 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
99247                 var fileName = 'changes.osc';
99248
99249                 var linkEnter = container.selectAll('.download-changes')
99250                     .data([0])
99251                     .enter()
99252                     .append('a')
99253                     .attr('class', 'download-changes');
99254
99255                 if (detected.download) {      // All except IE11 and Edge
99256                     linkEnter                 // download the data as a file
99257                         .attr('href', window.URL.createObjectURL(blob))
99258                         .attr('download', fileName);
99259
99260                 } else {                      // IE11 and Edge
99261                     linkEnter                 // open data uri in a new tab
99262                         .attr('target', '_blank')
99263                         .on('click.download', function() {
99264                             navigator.msSaveBlob(blob, fileName);
99265                         });
99266                 }
99267
99268                 linkEnter
99269                     .call(svgIcon('#iD-icon-load', 'inline'))
99270                     .append('span')
99271                     .text(t('commit.download_changes'));
99272
99273
99274                 function mouseover(d) {
99275                     if (d.entity) {
99276                         context.surface().selectAll(
99277                             utilEntityOrMemberSelector([d.entity.id], context.graph())
99278                         ).classed('hover', true);
99279                     }
99280                 }
99281
99282
99283                 function mouseout() {
99284                     context.surface().selectAll('.hover')
99285                         .classed('hover', false);
99286                 }
99287
99288
99289                 function click(change) {
99290                     if (change.changeType === 'deleted') {
99291                         _entityID = null;
99292                     } else {
99293                         var entity = change.entity;
99294                         _entityID = change.entity.id;
99295                         context.map().zoomToEase(entity);
99296                         context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
99297                             .classed('hover', true);
99298                     }
99299                 }
99300             }
99301
99302
99303             commitChanges.entityID = function(_) {
99304                 if (!arguments.length) return _entityID;
99305                 _entityID = _;
99306                 return commitChanges;
99307             };
99308
99309
99310             return commitChanges;
99311         }
99312
99313         function uiCommitWarnings(context) {
99314
99315             function commitWarnings(selection) {
99316                 var issuesBySeverity = context.validator()
99317                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeDisabledRules: true });
99318
99319                 for (var severity in issuesBySeverity) {
99320                     var issues = issuesBySeverity[severity];
99321                     var section = severity + '-section';
99322                     var issueItem = severity + '-item';
99323
99324                     var container = selection.selectAll('.' + section)
99325                         .data(issues.length ? [0] : []);
99326
99327                     container.exit()
99328                         .remove();
99329
99330                     var containerEnter = container.enter()
99331                         .append('div')
99332                         .attr('class', 'modal-section ' + section + ' fillL2');
99333
99334                     containerEnter
99335                         .append('h3')
99336                         .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
99337
99338                     containerEnter
99339                         .append('ul')
99340                         .attr('class', 'changeset-list');
99341
99342                     container = containerEnter
99343                         .merge(container);
99344
99345
99346                     var items = container.select('ul').selectAll('li')
99347                         .data(issues, function(d) { return d.id; });
99348
99349                     items.exit()
99350                         .remove();
99351
99352                     var itemsEnter = items.enter()
99353                         .append('li')
99354                         .attr('class', issueItem);
99355
99356                     itemsEnter
99357                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
99358
99359                     itemsEnter
99360                         .append('strong')
99361                         .attr('class', 'issue-message');
99362
99363                     itemsEnter.filter(function(d) { return d.tooltip; })
99364                         .call(tooltip()
99365                             .title(function(d) { return d.tooltip; })
99366                             .placement('top')
99367                         );
99368
99369                     items = itemsEnter
99370                         .merge(items);
99371
99372                     items.selectAll('.issue-message')
99373                         .text(function(d) {
99374                             return d.message(context);
99375                         });
99376
99377                     items
99378                         .on('mouseover', function(d) {
99379                             if (d.entityIds) {
99380                                 context.surface().selectAll(
99381                                     utilEntityOrMemberSelector(
99382                                         d.entityIds,
99383                                         context.graph()
99384                                     )
99385                                 ).classed('hover', true);
99386                             }
99387                         })
99388                         .on('mouseout', function() {
99389                             context.surface().selectAll('.hover')
99390                                 .classed('hover', false);
99391                         })
99392                         .on('click', function(d) {
99393                             context.validator().focusIssue(d);
99394                         });
99395                 }
99396             }
99397
99398
99399             return commitWarnings;
99400         }
99401
99402         var _changeset$1;
99403         var readOnlyTags = [
99404             /^changesets_count$/,
99405             /^created_by$/,
99406             /^ideditor:/,
99407             /^imagery_used$/,
99408             /^host$/,
99409             /^locale$/,
99410             /^warnings:/
99411         ];
99412
99413         // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
99414         // from https://stackoverflow.com/a/25575009
99415         var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
99416
99417
99418         function uiCommit(context) {
99419             var dispatch$1 = dispatch('cancel', 'save');
99420             var _userDetails;
99421             var _selection;
99422
99423             var changesetEditor = uiChangesetEditor(context)
99424                 .on('change', changeTags);
99425             var rawTagEditor = uiRawTagEditor(context)
99426                 .on('change', changeTags);
99427             var commitChanges = uiCommitChanges(context);
99428             var commitWarnings = uiCommitWarnings(context);
99429
99430
99431             function commit(selection) {
99432                 _selection = selection;
99433
99434                 var osm = context.connection();
99435                 if (!osm) return;
99436
99437                 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
99438                 var commentDate = +context.storage('commentDate') || 0;
99439                 var currDate = Date.now();
99440                 var cutoff = 2 * 86400 * 1000;   // 2 days
99441                 if (commentDate > currDate || currDate - commentDate > cutoff) {
99442                     context.storage('comment', null);
99443                     context.storage('hashtags', null);
99444                     context.storage('source', null);
99445                 }
99446
99447                 var tags;
99448                 // Initialize changeset if one does not exist yet.
99449                 // Also pull values from local storage.
99450                 if (!_changeset$1) {
99451
99452                     // load in the URL hash values, if any
99453                     var hash = context.ui().hash;
99454                     if (hash.comment) {
99455                         context.storage('comment', hash.comment);
99456                         context.storage('commentDate', Date.now());
99457                     }
99458                     if (hash.source) {
99459                         context.storage('source', hash.source);
99460                         context.storage('commentDate', Date.now());
99461                     }
99462                     if (hash.hashtags) {
99463                         context.storage('hashtags', hash.hashtags);
99464                     }
99465
99466                     var detected = utilDetect();
99467                     tags = {
99468                         comment: context.storage('comment') || '',
99469                         created_by: ('iD ' + context.version).substr(0, 255),
99470                         host: detected.host.substr(0, 255),
99471                         locale: detected.locale.substr(0, 255)
99472                     };
99473
99474                     // call findHashtags initially - this will remove stored
99475                     // hashtags if any hashtags are found in the comment - #4304
99476                     findHashtags(tags, true);
99477
99478                     var hashtags = context.storage('hashtags');
99479                     if (hashtags) {
99480                         tags.hashtags = hashtags;
99481                     }
99482
99483                     var source = context.storage('source');
99484                     if (source) {
99485                         tags.source = source;
99486                     }
99487                     var photoOverlaysUsed = context.history().photoOverlaysUsed();
99488                     if (photoOverlaysUsed.length) {
99489                         var sources = (tags.source || '').split(';');
99490
99491                         // include this tag for any photo layer
99492                         if (sources.indexOf('streetlevel imagery') === -1) {
99493                             sources.push('streetlevel imagery');
99494                         }
99495
99496                         // add the photo overlays used during editing as sources
99497                         photoOverlaysUsed.forEach(function(photoOverlay) {
99498                             if (sources.indexOf(photoOverlay) === -1) {
99499                                 sources.push(photoOverlay);
99500                             }
99501                         });
99502
99503                         tags.source = sources.join(';').substr(0, 255);
99504                     }
99505
99506                     _changeset$1 = new osmChangeset({ tags: tags });
99507                 }
99508
99509                 tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99510
99511                 // assign tags for imagery used
99512                 var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
99513                 tags.imagery_used = imageryUsed || 'None';
99514
99515                 // assign tags for closed issues and notes
99516                 var osmClosed = osm.getClosedIDs();
99517                 if (osmClosed.length) {
99518                     tags['closed:note'] = osmClosed.join(';').substr(0, 255);
99519                 }
99520                 if (services$1.keepRight) {
99521                     var krClosed = services$1.keepRight.getClosedIDs();
99522                     if (krClosed.length) {
99523                         tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
99524                     }
99525                 }
99526                 if (services$1.improveOSM) {
99527                     var iOsmClosed = services$1.improveOSM.getClosedIDs();
99528                     if (iOsmClosed.length) {
99529                         tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
99530                     }
99531                 }
99532
99533                 // remove existing warning counts
99534                 for (var key in tags) {
99535                     if (key.match(/^warnings:/)) {
99536                         delete tags[key];
99537                     }
99538                 }
99539
99540                 // add counts of warnings generated by the user's edits
99541                 var warnings = context.validator()
99542                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeIgnored: true, includeDisabledRules: true }).warning;
99543
99544                 var warningsByType = utilArrayGroupBy(warnings, 'type');
99545                 for (var warningType in warningsByType) {
99546                     var warningsOfType = warningsByType[warningType];
99547                     if (warningsOfType[0].subtype) {
99548                         var warningsBySubtype = utilArrayGroupBy(warningsOfType, 'subtype');
99549                         for (var warningSubtype in warningsBySubtype) {
99550                             var warningsOfSubtype = warningsBySubtype[warningSubtype];
99551                             tags['warnings:' + warningType + ':' + warningSubtype] = warningsOfSubtype.length.toString();
99552                         }
99553                     } else {
99554                         tags['warnings:' + warningType] = warningsOfType.length.toString();
99555                     }
99556                 }
99557
99558
99559                 _changeset$1 = _changeset$1.update({ tags: tags });
99560
99561                 var header = selection.selectAll('.header')
99562                     .data([0]);
99563
99564                 var headerTitle = header.enter()
99565                     .append('div')
99566                     .attr('class', 'header fillL header-container');
99567
99568                 headerTitle
99569                     .append('div')
99570                     .attr('class', 'header-block header-block-outer');
99571
99572                 headerTitle
99573                     .append('div')
99574                     .attr('class', 'header-block')
99575                     .append('h3')
99576                     .text(t('commit.title'));
99577
99578                 headerTitle
99579                     .append('div')
99580                     .attr('class', 'header-block header-block-outer header-block-close')
99581                     .append('button')
99582                     .attr('class', 'close')
99583                     .on('click', function() { context.enter(modeBrowse(context)); })
99584                     .call(svgIcon('#iD-icon-close'));
99585
99586                 var body = selection.selectAll('.body')
99587                     .data([0]);
99588
99589                 body = body.enter()
99590                     .append('div')
99591                     .attr('class', 'body')
99592                     .merge(body);
99593
99594
99595                 // Changeset Section
99596                 var changesetSection = body.selectAll('.changeset-editor')
99597                     .data([0]);
99598
99599                 changesetSection = changesetSection.enter()
99600                     .append('div')
99601                     .attr('class', 'modal-section changeset-editor')
99602                     .merge(changesetSection);
99603
99604                 changesetSection
99605                     .call(changesetEditor
99606                         .changesetID(_changeset$1.id)
99607                         .tags(tags)
99608                     );
99609
99610
99611                 // Warnings
99612                 body.call(commitWarnings);
99613
99614
99615                 // Upload Explanation
99616                 var saveSection = body.selectAll('.save-section')
99617                     .data([0]);
99618
99619                 saveSection = saveSection.enter()
99620                     .append('div')
99621                     .attr('class','modal-section save-section fillL cf')
99622                     .merge(saveSection);
99623
99624                 var prose = saveSection.selectAll('.commit-info')
99625                     .data([0]);
99626
99627                 if (prose.enter().size()) {   // first time, make sure to update user details in prose
99628                     _userDetails = null;
99629                 }
99630
99631                 prose = prose.enter()
99632                     .append('p')
99633                     .attr('class', 'commit-info')
99634                     .text(t('commit.upload_explanation'))
99635                     .merge(prose);
99636
99637                 // always check if this has changed, but only update prose.html()
99638                 // if needed, because it can trigger a style recalculation
99639                 osm.userDetails(function(err, user) {
99640                     if (err) return;
99641
99642                     if (_userDetails === user) return;  // no change
99643                     _userDetails = user;
99644
99645                     var userLink = d3_select(document.createElement('div'));
99646
99647                     if (user.image_url) {
99648                         userLink
99649                             .append('img')
99650                             .attr('src', user.image_url)
99651                             .attr('class', 'icon pre-text user-icon');
99652                     }
99653
99654                     userLink
99655                         .append('a')
99656                         .attr('class', 'user-info')
99657                         .text(user.display_name)
99658                         .attr('href', osm.userURL(user.display_name))
99659                         .attr('tabindex', -1)
99660                         .attr('target', '_blank');
99661
99662                     prose
99663                         .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
99664                 });
99665
99666
99667                 // Request Review
99668                 var requestReview = saveSection.selectAll('.request-review')
99669                     .data([0]);
99670
99671                 // Enter
99672                 var requestReviewEnter = requestReview.enter()
99673                     .append('div')
99674                     .attr('class', 'request-review');
99675
99676                 var labelEnter = requestReviewEnter
99677                     .append('label')
99678                     .attr('for', 'commit-input-request-review');
99679
99680                 labelEnter
99681                     .append('input')
99682                     .attr('type', 'checkbox')
99683                     .attr('id', 'commit-input-request-review');
99684
99685                 labelEnter
99686                     .append('span')
99687                     .text(t('commit.request_review'));
99688
99689                 // Update
99690                 requestReview = requestReview
99691                     .merge(requestReviewEnter);
99692
99693                 var requestReviewInput = requestReview.selectAll('input')
99694                     .property('checked', isReviewRequested(_changeset$1.tags))
99695                     .on('change', toggleRequestReview);
99696
99697
99698                 // Buttons
99699                 var buttonSection = saveSection.selectAll('.buttons')
99700                     .data([0]);
99701
99702                 // enter
99703                 var buttonEnter = buttonSection.enter()
99704                     .append('div')
99705                     .attr('class', 'buttons fillL cf');
99706
99707                 buttonEnter
99708                     .append('button')
99709                     .attr('class', 'secondary-action button cancel-button')
99710                     .append('span')
99711                     .attr('class', 'label')
99712                     .text(t('commit.cancel'));
99713
99714                 var uploadButton = buttonEnter
99715                     .append('button')
99716                     .attr('class', 'action button save-button');
99717
99718                 uploadButton.append('span')
99719                     .attr('class', 'label')
99720                     .text(t('commit.save'));
99721
99722                 var uploadBlockerTooltipText = getUploadBlockerMessage();
99723
99724                 // update
99725                 buttonSection = buttonSection
99726                     .merge(buttonEnter);
99727
99728                 buttonSection.selectAll('.cancel-button')
99729                     .on('click.cancel', function() {
99730                         var selectedID = commitChanges.entityID();
99731                         dispatch$1.call('cancel', this, selectedID);
99732                     });
99733
99734                 buttonSection.selectAll('.save-button')
99735                     .classed('disabled', uploadBlockerTooltipText !== null)
99736                     .on('click.save', function() {
99737                         if (!d3_select(this).classed('disabled')) {
99738                             this.blur();    // avoid keeping focus on the button - #4641
99739                             dispatch$1.call('save', this, _changeset$1);
99740                         }
99741                     });
99742
99743                 // remove any existing tooltip
99744                 tooltip().destroyAny(buttonSection.selectAll('.save-button'));
99745
99746                 if (uploadBlockerTooltipText) {
99747                     buttonSection.selectAll('.save-button')
99748                         .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
99749                 }
99750
99751                 // Raw Tag Editor
99752                 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
99753                     .data([0]);
99754
99755                 tagSection = tagSection.enter()
99756                     .append('div')
99757                     .attr('class', 'modal-section tag-section raw-tag-editor')
99758                     .merge(tagSection);
99759
99760                 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99761                 tagSection
99762                     .call(rawTagEditor
99763                         .expanded(expanded)
99764                         .readOnlyTags(readOnlyTags)
99765                         .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99766                     );
99767
99768
99769                 // Change summary
99770                 body.call(commitChanges);
99771
99772
99773                 function toggleRequestReview() {
99774                     var rr = requestReviewInput.property('checked');
99775                     updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
99776
99777                     var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99778                     tagSection
99779                         .call(rawTagEditor
99780                             .expanded(expanded)
99781                             .readOnlyTags(readOnlyTags)
99782                             .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99783                         );
99784                 }
99785             }
99786
99787
99788             function getUploadBlockerMessage() {
99789                 var errors = context.validator()
99790                     .getIssuesBySeverity({ what: 'edited', where: 'all' }).error;
99791
99792                 if (errors.length) {
99793                     return t('commit.outstanding_errors_message', { count: errors.length });
99794
99795                 } else {
99796                     var n = d3_select('#preset-input-comment').node();
99797                     var hasChangesetComment = n && n.value.length > 0;
99798                     if (!hasChangesetComment) {
99799                         return t('commit.comment_needed_message');
99800                     }
99801                 }
99802                 return null;
99803             }
99804
99805
99806             function changeTags(changed, onInput) {
99807                 if (changed.hasOwnProperty('comment')) {
99808                     if (changed.comment === undefined) {
99809                         changed.comment = '';
99810                     }
99811                     if (!onInput) {
99812                         context.storage('comment', changed.comment);
99813                         context.storage('commentDate', Date.now());
99814                     }
99815                 }
99816                 if (changed.hasOwnProperty('source')) {
99817                     if (changed.source === undefined) {
99818                         context.storage('source', null);
99819                     } else if (!onInput) {
99820                         context.storage('source', changed.source);
99821                         context.storage('commentDate', Date.now());
99822                     }
99823                 }
99824
99825                 updateChangeset(changed, onInput);
99826
99827                 if (_selection) {
99828                     _selection.call(commit);
99829                 }
99830             }
99831
99832
99833             function findHashtags(tags, commentOnly) {
99834                 var inComment = commentTags();
99835                 var inHashTags = hashTags();
99836
99837                 if (inComment !== null) {                    // when hashtags are detected in comment...
99838                     context.storage('hashtags', null);       // always remove stored hashtags - #4304
99839                     if (commentOnly) { inHashTags = []; }    // optionally override hashtags field
99840                 }
99841
99842                 // keep only one copy of the tags
99843                 var all = new Set();
99844                 var keepTags = [];
99845                 inComment.forEach(checkTag);
99846                 inHashTags.forEach(checkTag);
99847                 return keepTags;
99848
99849                 // Compare tags as lowercase strings, but keep original case tags
99850                 function checkTag(s) {
99851                     var compare = s.toLowerCase();
99852                     if (!all.has(compare)) {
99853                         all.add(compare);
99854                         keepTags.push(s);
99855                     }
99856                 }
99857
99858                 // Extract hashtags from `comment`
99859                 function commentTags() {
99860                     var matches = (tags.comment || '')
99861                         .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
99862                         .match(hashtagRegex);
99863
99864                     return (matches || []);
99865                 }
99866
99867                 // Extract and clean hashtags from `hashtags`
99868                 function hashTags() {
99869                     var matches = (tags.hashtags || '')
99870                         .split(/[,;\s]+/)
99871                         .map(function (s) {
99872                             if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
99873                             var matched = s.match(hashtagRegex);
99874                             return matched && matched[0];
99875                         }).filter(Boolean);                       // exclude falsy
99876
99877                     return (matches || []);
99878                 }
99879             }
99880
99881
99882             function isReviewRequested(tags) {
99883                 var rr = tags.review_requested;
99884                 if (rr === undefined) return false;
99885                 rr = rr.trim().toLowerCase();
99886                 return !(rr === '' || rr === 'no');
99887             }
99888
99889
99890             function updateChangeset(changed, onInput) {
99891                 var tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99892
99893                 Object.keys(changed).forEach(function(k) {
99894                     var v = changed[k];
99895                     k = k.trim().substr(0, 255);
99896                     if (readOnlyTags.indexOf(k) !== -1) return;
99897
99898                     if (k !== '' && v !== undefined) {
99899                         if (onInput) {
99900                             tags[k] = v;
99901                         } else {
99902                             tags[k] = v.trim().substr(0, 255);
99903                         }
99904                     } else {
99905                         delete tags[k];
99906                     }
99907                 });
99908
99909                 if (!onInput) {
99910                     // when changing the comment, override hashtags with any found in comment.
99911                     var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
99912                     var arr = findHashtags(tags, commentOnly);
99913                     if (arr.length) {
99914                         tags.hashtags = arr.join(';').substr(0, 255);
99915                         context.storage('hashtags', tags.hashtags);
99916                     } else {
99917                         delete tags.hashtags;
99918                         context.storage('hashtags', null);
99919                     }
99920                 }
99921
99922                 // always update userdetails, just in case user reauthenticates as someone else
99923                 if (_userDetails && _userDetails.changesets_count !== undefined) {
99924                     var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
99925                     tags.changesets_count = String(changesetsCount);
99926
99927                     // first 100 edits - new user
99928                     if (changesetsCount <= 100) {
99929                         var s;
99930                         s = context.storage('walkthrough_completed');
99931                         if (s) {
99932                             tags['ideditor:walkthrough_completed'] = s;
99933                         }
99934
99935                         s = context.storage('walkthrough_progress');
99936                         if (s) {
99937                             tags['ideditor:walkthrough_progress'] = s;
99938                         }
99939
99940                         s = context.storage('walkthrough_started');
99941                         if (s) {
99942                             tags['ideditor:walkthrough_started'] = s;
99943                         }
99944                     }
99945                 } else {
99946                     delete tags.changesets_count;
99947                 }
99948
99949                 if (!fastDeepEqual(_changeset$1.tags, tags)) {
99950                     _changeset$1 = _changeset$1.update({ tags: tags });
99951                 }
99952             }
99953
99954
99955             commit.reset = function() {
99956                 _changeset$1 = null;
99957             };
99958
99959
99960             return utilRebind(commit, dispatch$1, 'on');
99961         }
99962
99963         function uiSuccess(context) {
99964             var MAXEVENTS = 2;
99965
99966             // All else being equal, rank more "social" communities higher
99967             // (anything not in this list receives no adjustment)
99968             var COMMUNITYRANK = {
99969                 'meetup': +5,
99970                 'slack': +4,
99971                 'facebook': +3,
99972                 'reddit': +2,
99973                 'forum': -2,
99974                 'mailinglist': -3,
99975                 'irc': -4
99976             };
99977
99978             var detected = utilDetect();
99979             var dispatch$1 = dispatch('cancel');
99980             var _changeset;
99981             var _location;
99982
99983
99984             // string-to-date parsing in JavaScript is weird
99985             function parseEventDate(when) {
99986                 if (!when) return;
99987
99988                 var raw = when.trim();
99989                 if (!raw) return;
99990
99991                 if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
99992                     raw += 'Z';           // this forces date to be parsed as a UTC date
99993                 }
99994
99995                 var parsed = new Date(raw);
99996                 return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
99997             }
99998
99999
100000             function success(selection) {
100001                 var header = selection
100002                     .append('div')
100003                     .attr('class', 'header fillL');
100004
100005                 header
100006                     .append('button')
100007                     .attr('class', 'fr')
100008                     .on('click', function() { dispatch$1.call('cancel'); })
100009                     .call(svgIcon('#iD-icon-close'));
100010
100011                 header
100012                     .append('h3')
100013                     .text(t('success.just_edited'));
100014
100015                 var body = selection
100016                     .append('div')
100017                     .attr('class', 'body save-success fillL');
100018
100019                 var summary = body
100020                     .append('div')
100021                     .attr('class', 'save-summary');
100022
100023                 summary
100024                     .append('h3')
100025                     .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
100026
100027                 summary
100028                     .append('p')
100029                     .text(t('success.help_html'))
100030                     .append('a')
100031                     .attr('class', 'link-out')
100032                     .attr('target', '_blank')
100033                     .attr('tabindex', -1)
100034                     .attr('href', t('success.help_link_url'))
100035                     .call(svgIcon('#iD-icon-out-link', 'inline'))
100036                     .append('span')
100037                     .text(t('success.help_link_text'));
100038
100039                 var osm = context.connection();
100040                 if (!osm) return;
100041
100042                 var changesetURL = osm.changesetURL(_changeset.id);
100043
100044                 var table = summary
100045                     .append('table')
100046                     .attr('class', 'summary-table');
100047
100048                 var row = table
100049                     .append('tr')
100050                     .attr('class', 'summary-row');
100051
100052                 row
100053                     .append('td')
100054                     .attr('class', 'cell-icon summary-icon')
100055                     .append('a')
100056                     .attr('target', '_blank')
100057                     .attr('href', changesetURL)
100058                     .append('svg')
100059                     .attr('class', 'logo-small')
100060                     .append('use')
100061                     .attr('xlink:href', '#iD-logo-osm');
100062
100063                 var summaryDetail = row
100064                     .append('td')
100065                     .attr('class', 'cell-detail summary-detail');
100066
100067                 summaryDetail
100068                     .append('a')
100069                     .attr('class', 'cell-detail summary-view-on-osm')
100070                     .attr('target', '_blank')
100071                     .attr('href', changesetURL)
100072                     .text(t('success.view_on_osm'));
100073
100074                 summaryDetail
100075                     .append('div')
100076                     .text(t('success.changeset_id', { changeset_id: _changeset.id }));
100077
100078
100079                 // Gather community polygon IDs intersecting the map..
100080                 var matchFeatures = data.community.query(context.map().center(), true) || [];
100081                 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
100082
100083                 // Gather community resources that are either global or match a polygon.
100084                 var matchResources = Object.values(data.community.resources)
100085                     .filter(function(v) { return !v.featureId || matchIDs.indexOf(v.featureId) !== -1; });
100086
100087                 if (matchResources.length) {
100088                     // sort by size ascending, then by community rank
100089                     matchResources.sort(function(a, b) {
100090                         var aSize = Infinity;
100091                         var bSize = Infinity;
100092                         var aRank = COMMUNITYRANK[a.type] || 0;
100093                         var bRank = COMMUNITYRANK[b.type] || 0;
100094
100095                         if (a.featureId) {
100096                             aSize = data.community.features[a.featureId].properties.area;
100097                         }
100098                         if (b.featureId) {
100099                             bSize = data.community.features[b.featureId].properties.area;
100100                         }
100101
100102                         return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
100103                     });
100104
100105                     body
100106                         .call(showCommunityLinks, matchResources);
100107                 }
100108             }
100109
100110
100111             function showCommunityLinks(selection, matchResources) {
100112                 var communityLinks = selection
100113                     .append('div')
100114                     .attr('class', 'save-communityLinks');
100115
100116                 communityLinks
100117                     .append('h3')
100118                     .text(t('success.like_osm'));
100119
100120                 var table = communityLinks
100121                     .append('table')
100122                     .attr('class', 'community-table');
100123
100124                 var row = table.selectAll('.community-row')
100125                     .data(matchResources);
100126
100127                 var rowEnter = row.enter()
100128                     .append('tr')
100129                     .attr('class', 'community-row');
100130
100131                 rowEnter
100132                     .append('td')
100133                     .attr('class', 'cell-icon community-icon')
100134                     .append('a')
100135                     .attr('target', '_blank')
100136                     .attr('href', function(d) { return d.url; })
100137                     .append('svg')
100138                     .attr('class', 'logo-small')
100139                     .append('use')
100140                     .attr('xlink:href', function(d) { return '#community-' + d.type; });
100141
100142                 var communityDetail = rowEnter
100143                     .append('td')
100144                     .attr('class', 'cell-detail community-detail');
100145
100146                 communityDetail
100147                     .each(showCommunityDetails);
100148
100149                 communityLinks
100150                     .append('div')
100151                     .attr('class', 'community-missing')
100152                     .text(t('success.missing'))
100153                     .append('a')
100154                     .attr('class', 'link-out')
100155                     .attr('target', '_blank')
100156                     .attr('tabindex', -1)
100157                     .call(svgIcon('#iD-icon-out-link', 'inline'))
100158                     .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
100159                     .append('span')
100160                     .text(t('success.tell_us'));
100161             }
100162
100163
100164             function showCommunityDetails(d) {
100165                 var selection = d3_select(this);
100166                 var communityID = d.id;
100167                 var replacements = {
100168                     url: linkify(d.url),
100169                     signupUrl: linkify(d.signupUrl || d.url)
100170                 };
100171
100172                 selection
100173                     .append('div')
100174                     .attr('class', 'community-name')
100175                     .append('a')
100176                     .attr('target', '_blank')
100177                     .attr('href', d.url)
100178                     .text(t('community.' + d.id + '.name'));
100179
100180                 var descriptionHTML = t('community.' + d.id + '.description', replacements);
100181
100182                 if (d.type === 'reddit') {   // linkify subreddits  #4997
100183                     descriptionHTML = descriptionHTML
100184                         .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
100185                 }
100186
100187                 selection
100188                     .append('div')
100189                     .attr('class', 'community-description')
100190                     .html(descriptionHTML);
100191
100192                 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
100193                     selection
100194                         .append('div')
100195                         .call(uiDisclosure(context, 'community-more-' + d.id, false)
100196                             .expanded(false)
100197                             .updatePreference(false)
100198                             .title(t('success.more'))
100199                             .content(showMore)
100200                         );
100201                 }
100202
100203                 var nextEvents = (d.events || [])
100204                     .map(function(event) {
100205                         event.date = parseEventDate(event.when);
100206                         return event;
100207                     })
100208                     .filter(function(event) {               // date is valid and future (or today)
100209                         var t = event.date.getTime();
100210                         var now = (new Date()).setHours(0,0,0,0);
100211                         return !isNaN(t) && t >= now;
100212                     })
100213                     .sort(function(a, b) {                  // sort by date ascending
100214                         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
100215                     })
100216                     .slice(0, MAXEVENTS);                   // limit number of events shown
100217
100218                 if (nextEvents.length) {
100219                     selection
100220                         .append('div')
100221                         .call(uiDisclosure(context, 'community-events-' + d.id, false)
100222                             .expanded(false)
100223                             .updatePreference(false)
100224                             .title(t('success.events'))
100225                             .content(showNextEvents)
100226                         )
100227                         .select('.hide-toggle')
100228                         .append('span')
100229                         .attr('class', 'badge-text')
100230                         .text(nextEvents.length);
100231                 }
100232
100233
100234                 function showMore(selection) {
100235                     var more = selection.selectAll('.community-more')
100236                         .data([0]);
100237
100238                     var moreEnter = more.enter()
100239                         .append('div')
100240                         .attr('class', 'community-more');
100241
100242                     if (d.extendedDescription) {
100243                         moreEnter
100244                             .append('div')
100245                             .attr('class', 'community-extended-description')
100246                             .html(t('community.' + d.id + '.extendedDescription', replacements));
100247                     }
100248
100249                     if (d.languageCodes && d.languageCodes.length) {
100250                         moreEnter
100251                             .append('div')
100252                             .attr('class', 'community-languages')
100253                             .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
100254                     }
100255                 }
100256
100257
100258                 function showNextEvents(selection) {
100259                     var events = selection
100260                         .append('div')
100261                         .attr('class', 'community-events');
100262
100263                     var item = events.selectAll('.community-event')
100264                         .data(nextEvents);
100265
100266                     var itemEnter = item.enter()
100267                         .append('div')
100268                         .attr('class', 'community-event');
100269
100270                     itemEnter
100271                         .append('div')
100272                         .attr('class', 'community-event-name')
100273                         .append('a')
100274                         .attr('target', '_blank')
100275                         .attr('href', function(d) { return d.url; })
100276                         .text(function(d) {
100277                             var name = d.name;
100278                             if (d.i18n && d.id) {
100279                                 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
100280                             }
100281                             return name;
100282                         });
100283
100284                     itemEnter
100285                         .append('div')
100286                         .attr('class', 'community-event-when')
100287                         .text(function(d) {
100288                             var options = {
100289                                 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
100290                             };
100291                             if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
100292                                 options.hour = 'numeric';
100293                                 options.minute = 'numeric';
100294                             }
100295                             return d.date.toLocaleString(detected.locale, options);
100296                         });
100297
100298                     itemEnter
100299                         .append('div')
100300                         .attr('class', 'community-event-where')
100301                         .text(function(d) {
100302                             var where = d.where;
100303                             if (d.i18n && d.id) {
100304                                 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
100305                             }
100306                             return where;
100307                         });
100308
100309                     itemEnter
100310                         .append('div')
100311                         .attr('class', 'community-event-description')
100312                         .text(function(d) {
100313                             var description = d.description;
100314                             if (d.i18n && d.id) {
100315                                 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
100316                             }
100317                             return description;
100318                         });
100319                 }
100320
100321
100322                 function linkify(url, text) {
100323                     text = text || url;
100324                     return '<a target="_blank" href="' + url + '">' + text + '</a>';
100325                 }
100326             }
100327
100328
100329             success.changeset = function(_) {
100330                 if (!arguments.length) return _changeset;
100331                 _changeset = _;
100332                 return success;
100333             };
100334
100335
100336             success.location = function(_) {
100337                 if (!arguments.length) return _location;
100338                 _location = _;
100339                 return success;
100340             };
100341
100342
100343             return utilRebind(success, dispatch$1, 'on');
100344         }
100345
100346         var _isSaving = false;
100347
100348
100349         function modeSave(context) {
100350             var mode = { id: 'save' };
100351             var keybinding = utilKeybinding('modeSave');
100352
100353             var loading = uiLoading(context)
100354                 .message(t('save.uploading'))
100355                 .blocking(true);
100356
100357             var commit = uiCommit(context)
100358                 .on('cancel', cancel)
100359                 .on('save', save);
100360
100361             var _toCheck = [];
100362             var _toLoad = [];
100363             var _loaded = {};
100364             var _toLoadCount = 0;
100365             var _toLoadTotal = 0;
100366
100367             var _conflicts = [];
100368             var _errors = [];
100369             var _origChanges;
100370             var _location;
100371
100372
100373             function cancel(selectedID) {
100374                 if (selectedID) {
100375                     context.enter(modeSelect(context, [selectedID]));
100376                 } else {
100377                     context.enter(modeBrowse(context));
100378                 }
100379             }
100380
100381
100382             function save(changeset, tryAgain, checkConflicts) {
100383                 // Guard against accidentally entering save code twice - #4641
100384                 if (_isSaving && !tryAgain) {
100385                     return;
100386                 }
100387
100388                 var osm = context.connection();
100389                 if (!osm) {
100390                     cancel();
100391                     return;
100392                 }
100393
100394                 // If user somehow got logged out mid-save, try to reauthenticate..
100395                 // This can happen if they were logged in from before, but the tokens are no longer valid.
100396                 if (!osm.authenticated()) {
100397                     osm.authenticate(function(err) {
100398                         if (err) {
100399                             cancel();   // quit save mode..
100400                         } else {
100401                             save(changeset, tryAgain, checkConflicts);  // continue where we left off..
100402                         }
100403                     });
100404                     return;
100405                 }
100406
100407                 if (!_isSaving) {
100408                     keybindingOff();
100409                     context.container().call(loading);  // block input
100410                     _isSaving = true;
100411                 }
100412
100413                 var history = context.history();
100414                 var localGraph = context.graph();
100415                 var remoteGraph = coreGraph(history.base(), true);
100416
100417                 _conflicts = [];
100418                 _errors = [];
100419
100420                 // Store original changes, in case user wants to download them as an .osc file
100421                 _origChanges = history.changes(actionDiscardTags(history.difference()));
100422
100423                 // First time, `history.perform` a no-op action.
100424                 // Any conflict resolutions will be done as `history.replace`
100425                 if (!tryAgain) {
100426                     history.perform(actionNoop());
100427                 }
100428
100429                 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
100430                 if (!checkConflicts) {
100431                     upload(changeset);
100432
100433                 // Do the full (slow) conflict check..
100434                 } else {
100435                     var summary = history.difference().summary();
100436                     _toCheck = [];
100437                     for (var i = 0; i < summary.length; i++) {
100438                         var item = summary[i];
100439                         if (item.changeType === 'modified') {
100440                             _toCheck.push(item.entity.id);
100441                         }
100442                     }
100443
100444                     _toLoad = withChildNodes(_toCheck, localGraph);
100445                     _loaded = {};
100446                     _toLoadCount = 0;
100447                     _toLoadTotal = _toLoad.length;
100448
100449                     if (_toCheck.length) {
100450                         showProgress(_toLoadCount, _toLoadTotal);
100451                         _toLoad.forEach(function(id) { _loaded[id] = false; });
100452                         osm.loadMultiple(_toLoad, loaded);
100453                     } else {
100454                         upload(changeset);
100455                     }
100456                 }
100457
100458                 return;
100459
100460
100461                 function withChildNodes(ids, graph) {
100462                     var s = new Set(ids);
100463                     ids.forEach(function(id) {
100464                         var entity = graph.entity(id);
100465                         if (entity.type !== 'way') return;
100466
100467                         graph.childNodes(entity).forEach(function(child) {
100468                             if (child.version !== undefined) {
100469                                 s.add(child.id);
100470                             }
100471                         });
100472                     });
100473
100474                     return Array.from(s);
100475                 }
100476
100477
100478                 // Reload modified entities into an alternate graph and check for conflicts..
100479                 function loaded(err, result) {
100480                     if (_errors.length) return;
100481
100482                     if (err) {
100483                         _errors.push({
100484                             msg: err.message || err.responseText,
100485                             details: [ t('save.status_code', { code: err.status }) ]
100486                         });
100487                         showErrors();
100488
100489                     } else {
100490                         var loadMore = [];
100491
100492                         result.data.forEach(function(entity) {
100493                             remoteGraph.replace(entity);
100494                             _loaded[entity.id] = true;
100495                             _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
100496
100497                             if (!entity.visible) return;
100498
100499                             // Because loadMultiple doesn't download /full like loadEntity,
100500                             // need to also load children that aren't already being checked..
100501                             var i, id;
100502                             if (entity.type === 'way') {
100503                                 for (i = 0; i < entity.nodes.length; i++) {
100504                                     id = entity.nodes[i];
100505                                     if (_loaded[id] === undefined) {
100506                                         _loaded[id] = false;
100507                                         loadMore.push(id);
100508                                     }
100509                                 }
100510                             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
100511                                 for (i = 0; i < entity.members.length; i++) {
100512                                     id = entity.members[i].id;
100513                                     if (_loaded[id] === undefined) {
100514                                         _loaded[id] = false;
100515                                         loadMore.push(id);
100516                                     }
100517                                 }
100518                             }
100519                         });
100520
100521                         _toLoadCount += result.data.length;
100522                         _toLoadTotal += loadMore.length;
100523                         showProgress(_toLoadCount, _toLoadTotal);
100524
100525                         if (loadMore.length) {
100526                             _toLoad.push.apply(_toLoad, loadMore);
100527                             osm.loadMultiple(loadMore, loaded);
100528                         }
100529
100530                         if (!_toLoad.length) {
100531                             detectConflicts();
100532                         }
100533                     }
100534                 }
100535
100536
100537                 function detectConflicts() {
100538                     function choice(id, text, action) {
100539                         return { id: id, text: text, action: function() { history.replace(action); } };
100540                     }
100541                     function formatUser(d) {
100542                         return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
100543                     }
100544                     function entityName(entity) {
100545                         return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
100546                     }
100547
100548                     function sameVersions(local, remote) {
100549                         if (local.version !== remote.version) return false;
100550
100551                         if (local.type === 'way') {
100552                             var children = utilArrayUnion(local.nodes, remote.nodes);
100553                             for (var i = 0; i < children.length; i++) {
100554                                 var a = localGraph.hasEntity(children[i]);
100555                                 var b = remoteGraph.hasEntity(children[i]);
100556                                 if (a && b && a.version !== b.version) return false;
100557                             }
100558                         }
100559
100560                         return true;
100561                     }
100562
100563                     _toCheck.forEach(function(id) {
100564                         var local = localGraph.entity(id);
100565                         var remote = remoteGraph.entity(id);
100566
100567                         if (sameVersions(local, remote)) return;
100568
100569                         var action = actionMergeRemoteChanges;
100570                         var merge = action(id, localGraph, remoteGraph, formatUser);
100571
100572                         history.replace(merge);
100573
100574                         var mergeConflicts = merge.conflicts();
100575                         if (!mergeConflicts.length) return;  // merged safely
100576
100577                         var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
100578                         var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
100579                         var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
100580                         var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
100581
100582                         _conflicts.push({
100583                             id: id,
100584                             name: entityName(local),
100585                             details: mergeConflicts,
100586                             chosen: 1,
100587                             choices: [
100588                                 choice(id, keepMine, forceLocal),
100589                                 choice(id, keepTheirs, forceRemote)
100590                             ]
100591                         });
100592                     });
100593
100594                     upload(changeset);
100595                 }
100596             }
100597
100598
100599             function upload(changeset) {
100600                 var osm = context.connection();
100601                 if (!osm) {
100602                     _errors.push({ msg: 'No OSM Service' });
100603                 }
100604
100605                 if (_conflicts.length) {
100606                     _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
100607                     showConflicts(changeset);
100608
100609                 } else if (_errors.length) {
100610                     showErrors();
100611
100612                 } else {
100613                     var history = context.history();
100614                     var changes = history.changes(actionDiscardTags(history.difference()));
100615                     if (changes.modified.length || changes.created.length || changes.deleted.length) {
100616                         loadLocation();  // so it is ready when we display the save screen
100617                         osm.putChangeset(changeset, changes, uploadCallback);
100618                     } else {        // changes were insignificant or reverted by user
100619                         d3_select('.inspector-wrap *').remove();
100620                         loading.close();
100621                         _isSaving = false;
100622                         context.flush();
100623                         cancel();
100624                     }
100625                 }
100626             }
100627
100628
100629             function uploadCallback(err, changeset) {
100630                 if (err) {
100631                     if (err.status === 409) {          // 409 Conflict
100632                         save(changeset, true, true);   // tryAgain = true, checkConflicts = true
100633                     } else {
100634                         _errors.push({
100635                             msg: err.message || err.responseText,
100636                             details: [ t('save.status_code', { code: err.status }) ]
100637                         });
100638                         showErrors();
100639                     }
100640
100641                 } else {
100642                     context.history().clearSaved();
100643                     success(changeset);
100644                     // Add delay to allow for postgres replication #1646 #2678
100645                     window.setTimeout(function() {
100646                         d3_select('.inspector-wrap *').remove();
100647                         loading.close();
100648                         _isSaving = false;
100649                         context.flush();
100650                     }, 2500);
100651                 }
100652             }
100653
100654
100655             function showProgress(num, total) {
100656                 var modal = context.container().select('.loading-modal .modal-section');
100657                 var progress = modal.selectAll('.progress')
100658                     .data([0]);
100659
100660                 // enter/update
100661                 progress.enter()
100662                     .append('div')
100663                     .attr('class', 'progress')
100664                     .merge(progress)
100665                     .text(t('save.conflict_progress', { num: num, total: total }));
100666             }
100667
100668
100669             function showConflicts(changeset) {
100670                 var history = context.history();
100671                 var selection = context.container()
100672                     .select('#sidebar')
100673                     .append('div')
100674                     .attr('class','sidebar-component');
100675
100676                 loading.close();
100677                 _isSaving = false;
100678
100679                 var ui = uiConflicts(context)
100680                     .conflictList(_conflicts)
100681                     .origChanges(_origChanges)
100682                     .on('cancel', function() {
100683                         history.pop();
100684                         selection.remove();
100685                         keybindingOn();
100686                     })
100687                     .on('save', function() {
100688                         for (var i = 0; i < _conflicts.length; i++) {
100689                             if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
100690                                 var entity = context.hasEntity(_conflicts[i].id);
100691                                 if (entity && entity.type === 'way') {
100692                                     var children = utilArrayUniq(entity.nodes);
100693                                     for (var j = 0; j < children.length; j++) {
100694                                         history.replace(actionRevert(children[j]));
100695                                     }
100696                                 }
100697                                 history.replace(actionRevert(_conflicts[i].id));
100698                             }
100699                         }
100700
100701                         selection.remove();
100702                         save(changeset, true, false);  // tryAgain = true, checkConflicts = false
100703                     });
100704
100705                 selection.call(ui);
100706             }
100707
100708
100709             function showErrors() {
100710                 keybindingOn();
100711                 context.history().pop();
100712                 loading.close();
100713                 _isSaving = false;
100714
100715                 var selection = uiConfirm(context.container());
100716                 selection
100717                     .select('.modal-section.header')
100718                     .append('h3')
100719                     .text(t('save.error'));
100720
100721                 addErrors(selection, _errors);
100722                 selection.okButton();
100723             }
100724
100725
100726             function addErrors(selection, data) {
100727                 var message = selection
100728                     .select('.modal-section.message-text');
100729
100730                 var items = message
100731                     .selectAll('.error-container')
100732                     .data(data);
100733
100734                 var enter = items.enter()
100735                     .append('div')
100736                     .attr('class', 'error-container');
100737
100738                 enter
100739                     .append('a')
100740                     .attr('class', 'error-description')
100741                     .attr('href', '#')
100742                     .classed('hide-toggle', true)
100743                     .text(function(d) { return d.msg || t('save.unknown_error_details'); })
100744                     .on('click', function() {
100745                         event.preventDefault();
100746
100747                         var error = d3_select(this);
100748                         var detail = d3_select(this.nextElementSibling);
100749                         var exp = error.classed('expanded');
100750
100751                         detail.style('display', exp ? 'none' : 'block');
100752                         error.classed('expanded', !exp);
100753                     });
100754
100755                 var details = enter
100756                     .append('div')
100757                     .attr('class', 'error-detail-container')
100758                     .style('display', 'none');
100759
100760                 details
100761                     .append('ul')
100762                     .attr('class', 'error-detail-list')
100763                     .selectAll('li')
100764                     .data(function(d) { return d.details || []; })
100765                     .enter()
100766                     .append('li')
100767                     .attr('class', 'error-detail-item')
100768                     .text(function(d) { return d; });
100769
100770                 items.exit()
100771                     .remove();
100772             }
100773
100774
100775             function success(changeset) {
100776                 commit.reset();
100777
100778                 var ui = uiSuccess(context)
100779                     .changeset(changeset)
100780                     .location(_location)
100781                     .on('cancel', function() { context.ui().sidebar.hide(); });
100782
100783                 context.enter(modeBrowse(context).sidebar(ui));
100784             }
100785
100786
100787             function keybindingOn() {
100788                 d3_select(document)
100789                     .call(keybinding.on('⎋', cancel, true));
100790             }
100791
100792
100793             function keybindingOff() {
100794                 d3_select(document)
100795                     .call(keybinding.unbind);
100796             }
100797
100798
100799             // Reverse geocode current map location so we can display a message on
100800             // the success screen like "Thank you for editing around place, region."
100801             function loadLocation() {
100802                 _location = null;
100803                 if (!services$1.geocoder) return;
100804
100805                 services$1.geocoder.reverse(context.map().center(), function(err, result) {
100806                     if (err || !result || !result.address) return;
100807
100808                     var addr = result.address;
100809                     var place = (addr && (addr.town || addr.city || addr.county)) || '';
100810                     var region = (addr && (addr.state || addr.country)) || '';
100811                     var separator = (place && region) ? t('success.thank_you_where.separator') : '';
100812
100813                     _location = t('success.thank_you_where.format',
100814                         { place: place, separator: separator, region: region }
100815                     );
100816                 });
100817             }
100818
100819
100820             mode.enter = function() {
100821                 // Show sidebar
100822                 context.ui().sidebar.expand();
100823
100824                 function done() {
100825                     context.ui().sidebar.show(commit);
100826                 }
100827
100828                 keybindingOn();
100829
100830                 context.container().selectAll('#content')
100831                     .attr('class', 'inactive');
100832
100833                 var osm = context.connection();
100834                 if (!osm) {
100835                     cancel();
100836                     return;
100837                 }
100838
100839                 if (osm.authenticated()) {
100840                     done();
100841                 } else {
100842                     osm.authenticate(function(err) {
100843                         if (err) {
100844                             cancel();
100845                         } else {
100846                             done();
100847                         }
100848                     });
100849                 }
100850             };
100851
100852
100853             mode.exit = function() {
100854                 _isSaving = false;
100855
100856                 keybindingOff();
100857
100858                 context.container().selectAll('#content')
100859                     .attr('class', 'active');
100860
100861                 context.ui().sidebar.hide();
100862             };
100863
100864             return mode;
100865         }
100866
100867         function uiToolOldDrawModes(context) {
100868
100869             var tool = {
100870                 id: 'old_modes',
100871                 label: t('toolbar.add_feature')
100872             };
100873
100874             var modes = [
100875                 modeAddPoint(context, {
100876                     title: t('modes.add_point.title'),
100877                     button: 'point',
100878                     description: t('modes.add_point.description'),
100879                     preset: context.presets().item('point'),
100880                     key: '1'
100881                 }),
100882                 modeAddLine(context, {
100883                     title: t('modes.add_line.title'),
100884                     button: 'line',
100885                     description: t('modes.add_line.description'),
100886                     preset: context.presets().item('line'),
100887                     key: '2'
100888                 }),
100889                 modeAddArea(context, {
100890                     title: t('modes.add_area.title'),
100891                     button: 'area',
100892                     description: t('modes.add_area.description'),
100893                     preset: context.presets().item('area'),
100894                     key: '3'
100895                 })
100896             ];
100897
100898
100899             function enabled() {
100900                 return osmEditable();
100901             }
100902
100903             function osmEditable() {
100904                 var mode = context.mode();
100905                 return context.editable() && mode && mode.id !== 'save';
100906             }
100907
100908             modes.forEach(function(mode) {
100909                 context.keybinding().on(mode.key, function() {
100910                     if (!enabled()) return;
100911
100912                     if (mode.id === context.mode().id) {
100913                         context.enter(modeBrowse(context));
100914                     } else {
100915                         context.enter(mode);
100916                     }
100917                 });
100918             });
100919
100920             tool.render = function(selection) {
100921
100922                 var wrap = selection
100923                     .append('div')
100924                     .attr('class', 'joined')
100925                     .style('display', 'flex');
100926
100927                 context
100928                     .on('enter.editor', function(entered) {
100929                         selection.selectAll('button.add-button')
100930                             .classed('active', function(mode) { return entered.button === mode.button; });
100931                         context.container()
100932                             .classed('mode-' + entered.id, true);
100933                     });
100934
100935                 context
100936                     .on('exit.editor', function(exited) {
100937                         context.container()
100938                             .classed('mode-' + exited.id, false);
100939                     });
100940
100941
100942                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100943
100944                 context.map()
100945                     .on('move.modes', debouncedUpdate)
100946                     .on('drawn.modes', debouncedUpdate);
100947
100948                 context
100949                     .on('enter.modes', update);
100950
100951                 update();
100952
100953
100954                 function update() {
100955
100956                     var buttons = wrap.selectAll('button.add-button')
100957                         .data(modes, function(d) { return d.id; });
100958
100959                     // exit
100960                     buttons.exit()
100961                         .remove();
100962
100963                     // enter
100964                     var buttonsEnter = buttons.enter()
100965                         .append('button')
100966                         .attr('tabindex', -1)
100967                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100968                         .on('click.mode-buttons', function(d) {
100969                             if (!enabled()) return;
100970
100971                             // When drawing, ignore accidental clicks on mode buttons - #4042
100972                             var currMode = context.mode().id;
100973                             if (/^draw/.test(currMode)) return;
100974
100975                             if (d.id === currMode) {
100976                                 context.enter(modeBrowse(context));
100977                             } else {
100978                                 context.enter(d);
100979                             }
100980                         })
100981                         .call(tooltip()
100982                             .placement('bottom')
100983                             .html(true)
100984                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100985                         );
100986
100987                     buttonsEnter
100988                         .each(function(d) {
100989                             d3_select(this)
100990                                 .call(svgIcon('#iD-icon-' + d.button));
100991                         });
100992
100993                     buttonsEnter
100994                         .append('span')
100995                         .attr('class', 'label')
100996                         .text(function(mode) { return mode.title; });
100997
100998                     // if we are adding/removing the buttons, check if toolbar has overflowed
100999                     if (buttons.enter().size() || buttons.exit().size()) {
101000                         context.ui().checkOverflow('#bar', true);
101001                     }
101002
101003                     // update
101004                     buttons = buttons
101005                         .merge(buttonsEnter)
101006                         .classed('disabled', function(d) { return !enabled(); });
101007                 }
101008             };
101009
101010             return tool;
101011         }
101012
101013         function uiToolNotes(context) {
101014
101015             var tool = {
101016                 id: 'notes',
101017                 label: t('modes.add_note.label')
101018             };
101019
101020             var mode = modeAddNote(context);
101021
101022             function enabled() {
101023                 return notesEnabled() && notesEditable();
101024             }
101025
101026             function notesEnabled() {
101027                 var noteLayer = context.layers().layer('notes');
101028                 return noteLayer && noteLayer.enabled();
101029             }
101030
101031             function notesEditable() {
101032                 var mode = context.mode();
101033                 return context.map().notesEditable() && mode && mode.id !== 'save';
101034             }
101035
101036             context.keybinding().on(mode.key, function() {
101037                 if (!enabled()) return;
101038
101039                 if (mode.id === context.mode().id) {
101040                     context.enter(modeBrowse(context));
101041                 } else {
101042                     context.enter(mode);
101043                 }
101044             });
101045
101046             tool.render = function(selection) {
101047
101048                 context
101049                     .on('enter.editor.notes', function(entered) {
101050                         selection.selectAll('button.add-button')
101051                             .classed('active', function(mode) { return entered.button === mode.button; });
101052                         context.container()
101053                             .classed('mode-' + entered.id, true);
101054                     });
101055
101056                 context
101057                     .on('exit.editor.notes', function(exited) {
101058                         context.container()
101059                             .classed('mode-' + exited.id, false);
101060                     });
101061
101062
101063                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101064
101065                 context.map()
101066                     .on('move.notes', debouncedUpdate)
101067                     .on('drawn.notes', debouncedUpdate);
101068
101069                 context
101070                     .on('enter.notes', update);
101071
101072                 update();
101073
101074
101075                 function update() {
101076                     var showNotes = notesEnabled();
101077                     var data = showNotes ? [mode] : [];
101078
101079                     var buttons = selection.selectAll('button.add-button')
101080                         .data(data, function(d) { return d.id; });
101081
101082                     // exit
101083                     buttons.exit()
101084                         .remove();
101085
101086                     // enter
101087                     var buttonsEnter = buttons.enter()
101088                         .append('button')
101089                         .attr('tabindex', -1)
101090                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
101091                         .on('click.notes', function(d) {
101092                             if (!enabled()) return;
101093
101094                             // When drawing, ignore accidental clicks on mode buttons - #4042
101095                             var currMode = context.mode().id;
101096                             if (/^draw/.test(currMode)) return;
101097
101098                             if (d.id === currMode) {
101099                                 context.enter(modeBrowse(context));
101100                             } else {
101101                                 context.enter(d);
101102                             }
101103                         })
101104                         .call(tooltip()
101105                             .placement('bottom')
101106                             .html(true)
101107                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
101108                         );
101109
101110                     buttonsEnter
101111                         .each(function(d) {
101112                             d3_select(this)
101113                                 .call(svgIcon(d.icon || '#iD-icon-' + d.button));
101114                         });
101115
101116                     // if we are adding/removing the buttons, check if toolbar has overflowed
101117                     if (buttons.enter().size() || buttons.exit().size()) {
101118                         context.ui().checkOverflow('#bar', true);
101119                     }
101120
101121                     // update
101122                     buttons = buttons
101123                         .merge(buttonsEnter)
101124                         .classed('disabled', function(d) { return !enabled(); });
101125                 }
101126             };
101127
101128             tool.uninstall = function() {
101129                 context
101130                     .on('enter.editor.notes', null)
101131                     .on('exit.editor.notes', null)
101132                     .on('enter.notes', null);
101133
101134                 context.map()
101135                     .on('move.notes', null)
101136                     .on('drawn.notes', null);
101137             };
101138
101139             return tool;
101140         }
101141
101142         function uiToolSave(context) {
101143
101144             var tool = {
101145                 id: 'save',
101146                 label: t('save.title')
101147             };
101148
101149             var button = null;
101150             var tooltipBehavior = null;
101151             var history = context.history();
101152             var key = uiCmd('⌘S');
101153             var _numChanges = 0;
101154
101155             function isSaving() {
101156                 var mode = context.mode();
101157                 return mode && mode.id === 'save';
101158             }
101159
101160             function isDisabled() {
101161                 return _numChanges === 0 || isSaving();
101162             }
101163
101164             function save() {
101165                 event.preventDefault();
101166                 if (!context.inIntro() && !isSaving() && history.hasChanges()) {
101167                     context.enter(modeSave(context));
101168                 }
101169             }
101170
101171             function bgColor() {
101172                 var step;
101173                 if (_numChanges === 0) {
101174                     return null;
101175                 } else if (_numChanges <= 50) {
101176                     step = _numChanges / 50;
101177                     return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
101178                 } else {
101179                     step = Math.min((_numChanges - 50) / 50, 1.0);
101180                     return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
101181                 }
101182             }
101183
101184
101185             function updateCount() {
101186                 var val = history.difference().summary().length;
101187                 if (val === _numChanges) return;
101188                 _numChanges = val;
101189
101190                 if (tooltipBehavior) {
101191                     tooltipBehavior
101192                         .title(uiTooltipHtml(
101193                             t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
101194                         );
101195                 }
101196
101197                 if (button) {
101198                     button
101199                         .classed('disabled', isDisabled())
101200                         .style('background', bgColor());
101201
101202                     button.select('span.count')
101203                         .text(_numChanges);
101204                 }
101205             }
101206
101207
101208             tool.render = function(selection) {
101209                 tooltipBehavior = tooltip()
101210                     .placement('bottom')
101211                     .html(true)
101212                     .title(uiTooltipHtml(t('save.no_changes'), key));
101213
101214                 button = selection
101215                     .append('button')
101216                     .attr('class', 'save disabled bar-button')
101217                     .attr('tabindex', -1)
101218                     .on('click', save)
101219                     .call(tooltipBehavior);
101220
101221                 button
101222                     .call(svgIcon('#iD-icon-save'));
101223
101224                 button
101225                     .append('span')
101226                     .attr('class', 'count')
101227                     .text('0');
101228
101229                 updateCount();
101230
101231
101232                 context.keybinding()
101233                     .on(key, save, true);
101234
101235
101236                 context.history()
101237                     .on('change.save', updateCount);
101238
101239                 context
101240                     .on('enter.save', function() {
101241                         if (button) {
101242                             button
101243                                 .classed('disabled', isDisabled());
101244
101245                             if (isSaving()) {
101246                                 button.call(tooltipBehavior.hide);
101247                             }
101248                         }
101249                     });
101250             };
101251
101252
101253             tool.uninstall = function() {
101254                 context.keybinding()
101255                     .off(key, true);
101256
101257                 context.history()
101258                     .on('change.save', null);
101259
101260                 context
101261                     .on('enter.save', null);
101262
101263                 button = null;
101264                 tooltipBehavior = null;
101265             };
101266
101267             return tool;
101268         }
101269
101270         function uiToolSidebarToggle(context) {
101271
101272             var tool = {
101273                 id: 'sidebar_toggle',
101274                 label: t('toolbar.inspect')
101275             };
101276
101277             tool.render = function(selection) {
101278                 selection
101279                     .append('button')
101280                     .attr('class', 'bar-button')
101281                     .attr('tabindex', -1)
101282                     .on('click', function() {
101283                         context.ui().sidebar.toggle();
101284                     })
101285                     .call(tooltip()
101286                         .placement('bottom')
101287                         .html(true)
101288                         .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
101289                     )
101290                     .call(svgIcon('#iD-icon-sidebar-' + (textDirection === 'rtl' ? 'right' : 'left')));
101291             };
101292
101293             return tool;
101294         }
101295
101296         function uiToolUndoRedo(context) {
101297
101298             var tool = {
101299                 id: 'undo_redo',
101300                 label: t('toolbar.undo_redo')
101301             };
101302
101303             var commands = [{
101304                 id: 'undo',
101305                 cmd: uiCmd('⌘Z'),
101306                 action: function() { if (editable()) context.undo(); },
101307                 annotation: function() { return context.history().undoAnnotation(); }
101308             }, {
101309                 id: 'redo',
101310                 cmd: uiCmd('⌘⇧Z'),
101311                 action: function() { if (editable()) context.redo(); },
101312                 annotation: function() { return context.history().redoAnnotation(); }
101313             }];
101314
101315
101316             function editable() {
101317                 var mode = context.mode();
101318                 return context.editable() && mode && mode.id !== 'save';
101319             }
101320
101321
101322             tool.render = function(selection) {
101323                 var tooltipBehavior = tooltip()
101324                     .placement('bottom')
101325                     .html(true)
101326                     .title(function (d) {
101327                         return uiTooltipHtml(d.annotation() ?
101328                             t(d.id + '.tooltip', {action: d.annotation()}) :
101329                             t(d.id + '.nothing'), d.cmd);
101330                     });
101331
101332                 var buttons = selection.selectAll('button')
101333                     .data(commands)
101334                     .enter()
101335                     .append('button')
101336                     .attr('class', function(d) { return 'disabled ' + d.id + '-button bar-button'; })
101337                     .on('click', function(d) { return d.action(); })
101338                     .call(tooltipBehavior);
101339
101340                 buttons.each(function(d) {
101341                     var iconName = d.id;
101342                     if (textDirection === 'rtl') {
101343                         if (iconName === 'undo') {
101344                             iconName = 'redo';
101345                         } else if (iconName === 'redo') {
101346                             iconName = 'undo';
101347                         }
101348                     }
101349                     d3_select(this)
101350                         .call(svgIcon('#iD-icon-' + iconName));
101351                 });
101352
101353                 context.keybinding()
101354                     .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
101355                     .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
101356
101357
101358                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101359
101360                 context.map()
101361                     .on('move.undo_redo', debouncedUpdate)
101362                     .on('drawn.undo_redo', debouncedUpdate);
101363
101364                 context.history()
101365                     .on('change.undo_redo', function(difference) {
101366                         if (difference) update();
101367                     });
101368
101369                 context
101370                     .on('enter.undo_redo', update);
101371
101372
101373                 function update() {
101374                     buttons
101375                         .property('disabled', !editable())
101376                         .classed('disabled', function(d) {
101377                             return !editable() || !d.annotation();
101378                         })
101379                         .each(function() {
101380                             var selection = d3_select(this);
101381                             if (selection.property('tooltipVisible')) {
101382                                 selection.call(tooltipBehavior.show);
101383                             }
101384                         });
101385                 }
101386             };
101387
101388             tool.uninstall = function() {
101389                 context.keybinding()
101390                     .off(commands[0].cmd)
101391                     .off(commands[1].cmd);
101392
101393                 context.map()
101394                     .on('move.undo_redo', null)
101395                     .on('drawn.undo_redo', null);
101396
101397                 context.history()
101398                     .on('change.undo_redo', null);
101399
101400                 context
101401                     .on('enter.undo_redo', null);
101402             };
101403
101404             return tool;
101405         }
101406
101407         function uiTopToolbar(context) {
101408
101409             var sidebarToggle = uiToolSidebarToggle(context),
101410                 modes = uiToolOldDrawModes(context),
101411                 //searchAdd = uiToolSearchAdd(context),
101412                 //addFavorite = uiToolAddFavorite(context),
101413                 //addRecent = uiToolAddRecent(context),
101414                 notes = uiToolNotes(context),
101415                 undoRedo = uiToolUndoRedo(context),
101416                 save = uiToolSave(context);
101417
101418             function notesEnabled() {
101419                 var noteLayer = context.layers().layer('notes');
101420                 return noteLayer && noteLayer.enabled();
101421             }
101422
101423             function topToolbar(bar) {
101424
101425                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101426                 context.layers()
101427                     .on('change.topToolbar', debouncedUpdate);
101428
101429                 context.presets()
101430                     .on('favoritePreset.topToolbar', update)
101431                     .on('recentsChange.topToolbar', update);
101432
101433                 update();
101434
101435                 function update() {
101436
101437                     var tools = [
101438                         sidebarToggle,
101439                         'spacer',
101440                         modes
101441                     //    searchAdd
101442                     ];
101443                     /*
101444                     if (context.presets().getFavorites().length > 0) {
101445                         tools.push(addFavorite);
101446                     }
101447
101448                     if (addRecent.shouldShow()) {
101449                         tools.push(addRecent);
101450                     }*/
101451
101452                     tools.push('spacer');
101453
101454                     if (notesEnabled()) {
101455                         tools = tools.concat([notes, 'spacer']);
101456                     }
101457
101458                     tools = tools.concat([undoRedo, save]);
101459
101460                     var toolbarItems = bar.selectAll('.toolbar-item')
101461                         .data(tools, function(d) {
101462                             return d.id || d;
101463                         });
101464
101465                     toolbarItems.exit()
101466                         .each(function(d) {
101467                             if (d.uninstall) {
101468                                 d.uninstall();
101469                             }
101470                         })
101471                         .remove();
101472
101473                     var itemsEnter = toolbarItems
101474                         .enter()
101475                         .append('div')
101476                         .attr('class', function(d) {
101477                             var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
101478                             if (d.klass) classes += ' ' + d.klass;
101479                             return classes;
101480                         });
101481
101482                     var actionableItems = itemsEnter.filter(function(d) { return d !== 'spacer'; });
101483
101484                     actionableItems
101485                         .append('div')
101486                         .attr('class', 'item-content')
101487                         .each(function(d) {
101488                             d3_select(this).call(d.render, bar);
101489                         });
101490
101491                     actionableItems
101492                         .append('div')
101493                         .attr('class', 'item-label')
101494                         .text(function(d) {
101495                             return d.label;
101496                         });
101497                 }
101498
101499             }
101500
101501             return topToolbar;
101502         }
101503
101504         // these are module variables so they are preserved through a ui.restart()
101505         var sawVersion = null;
101506         var isNewVersion = false;
101507         var isNewUser = false;
101508
101509
101510         function uiVersion(context) {
101511
101512             var currVersion = context.version;
101513             var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
101514
101515             if (sawVersion === null && matchedVersion !== null) {
101516                 isNewVersion = (context.storage('sawVersion') !== currVersion);
101517                 isNewUser = !context.storage('sawSplash');
101518                 context.storage('sawVersion', currVersion);
101519                 sawVersion = currVersion;
101520             }
101521
101522             return function(selection) {
101523                 selection
101524                     .append('a')
101525                     .attr('target', '_blank')
101526                     .attr('tabindex', -1)
101527                     .attr('href', 'https://github.com/openstreetmap/iD')
101528                     .text(currVersion);
101529
101530                 // only show new version indicator to users that have used iD before
101531                 if (isNewVersion && !isNewUser) {
101532                     selection
101533                         .append('div')
101534                         .attr('class', 'badge')
101535                         .append('a')
101536                         .attr('target', '_blank')
101537                         .attr('tabindex', -1)
101538                         .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
101539                         .call(svgIcon('#maki-gift-11'))
101540                         .call(tooltip()
101541                             .title(t('version.whats_new', { version: currVersion }))
101542                             .placement('top')
101543                         );
101544                 }
101545             };
101546         }
101547
101548         function uiZoom(context) {
101549             var zooms = [{
101550                 id: 'zoom-in',
101551                 icon: 'plus',
101552                 title: t('zoom.in'),
101553                 action: context.zoomIn,
101554                 key: '+'
101555             }, {
101556                 id: 'zoom-out',
101557                 icon: 'minus',
101558                 title: t('zoom.out'),
101559                 action: context.zoomOut,
101560                 key: '-'
101561             }];
101562
101563
101564             function zoomIn() {
101565                 event.preventDefault();
101566                 context.zoomIn();
101567             }
101568
101569
101570             function zoomOut() {
101571                 event.preventDefault();
101572                 context.zoomOut();
101573             }
101574
101575
101576             function zoomInFurther() {
101577                 event.preventDefault();
101578                 context.zoomInFurther();
101579             }
101580
101581
101582             function zoomOutFurther() {
101583                 event.preventDefault();
101584                 context.zoomOutFurther();
101585             }
101586
101587
101588             return function(selection) {
101589                 var button = selection.selectAll('button')
101590                     .data(zooms)
101591                     .enter()
101592                     .append('button')
101593                     .attr('tabindex', -1)
101594                     .attr('class', function(d) { return d.id; })
101595                     .on('click.editor', function(d) { d.action(); })
101596                     .call(tooltip()
101597                         .placement((textDirection === 'rtl') ? 'right' : 'left')
101598                         .html(true)
101599                         .title(function(d) {
101600                             return uiTooltipHtml(d.title, d.key);
101601                         })
101602                     );
101603
101604                 button.each(function(d) {
101605                     d3_select(this)
101606                         .call(svgIcon('#iD-icon-' + d.icon, 'light'));
101607                 });
101608
101609                 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
101610                     context.keybinding().on([key], zoomIn);
101611                     context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
101612                 });
101613
101614                 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
101615                     context.keybinding().on([key], zoomOut);
101616                     context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
101617                 });
101618             };
101619         }
101620
101621         function uiInit(context) {
101622             var _initCounter = 0;
101623             var _initCallback;
101624             var _needWidth = {};
101625
101626
101627             function render(container) {
101628                 container
101629                     .attr('dir', textDirection);
101630
101631                 // setup fullscreen keybindings (no button shown at this time)
101632                 container
101633                     .call(uiFullScreen(context));
101634
101635                 var map = context.map();
101636                 map.redrawEnable(false);  // don't draw until we've set zoom/lat/long
101637
101638                 container
101639                     .append('svg')
101640                     .attr('id', 'defs')
101641                     .call(svgDefs(context));
101642
101643                 container
101644                     .append('div')
101645                     .attr('id', 'sidebar')
101646                     .call(ui.sidebar);
101647
101648                 var content = container
101649                     .append('div')
101650                     .attr('id', 'content')
101651                     .attr('class', 'active');
101652
101653                 // Top toolbar
101654                 content
101655                     .append('div')
101656                     .attr('id', 'bar')
101657                     .attr('class', 'fillD')
101658                     .call(uiTopToolbar(context));
101659
101660                 content
101661                     .append('div')
101662                     .attr('id', 'map')
101663                     .attr('dir', 'ltr')
101664                     .call(map);
101665
101666
101667                 // Map controls
101668                 var controls = content
101669                     .append('div')
101670                     .attr('class', 'map-controls');
101671
101672                 controls
101673                     .append('div')
101674                     .attr('class', 'map-control zoombuttons')
101675                     .call(uiZoom(context));
101676
101677                 controls
101678                     .append('div')
101679                     .attr('class', 'map-control geolocate-control')
101680                     .call(uiGeolocate(context));
101681
101682                 var background = uiBackground(context);
101683                 controls
101684                     .append('div')
101685                     .attr('class', 'map-control background-control')
101686                     .call(background.renderToggleButton);
101687
101688                 var mapData = uiMapData(context);
101689                 controls
101690                     .append('div')
101691                     .attr('class', 'map-control map-data-control')
101692                     .call(mapData.renderToggleButton);
101693
101694                 var issues = uiIssues(context);
101695                 controls
101696                     .append('div')
101697                     .attr('class', 'map-control map-issues-control')
101698                     .call(issues.renderToggleButton);
101699
101700                 var help = uiHelp(context);
101701                 controls
101702                     .append('div')
101703                     .attr('class', 'map-control help-control')
101704                     .call(help.renderToggleButton);
101705
101706                 content
101707                     .append('div')
101708                     .attr('class', 'spinner')
101709                     .call(uiSpinner(context));
101710
101711                 // Add attribution and footer
101712                 var about = content
101713                     .append('div')
101714                     .attr('id', 'about');
101715
101716                 about
101717                     .append('div')
101718                     .attr('id', 'attrib')
101719                     .attr('dir', 'ltr')
101720                     .call(uiAttribution(context));
101721
101722                 about
101723                     .append('div')
101724                     .attr('class', 'api-status')
101725                     .call(uiStatus(context));
101726
101727
101728                 var footer = about
101729                     .append('div')
101730                     .attr('id', 'footer')
101731                     .attr('class', 'fillD');
101732
101733                 footer
101734                     .append('div')
101735                     .attr('id', 'flash-wrap')
101736                     .attr('class', 'footer-hide');
101737
101738                 var footerWrap = footer
101739                     .append('div')
101740                     .attr('id', 'footer-wrap')
101741                     .attr('class', 'footer-show');
101742
101743                 footerWrap
101744                     .append('div')
101745                     .attr('id', 'scale-block')
101746                     .call(uiScale(context));
101747
101748                 var aboutList = footerWrap
101749                     .append('div')
101750                     .attr('id', 'info-block')
101751                     .append('ul')
101752                     .attr('id', 'about-list');
101753
101754                 if (!context.embed()) {
101755                     aboutList
101756                         .call(uiAccount(context));
101757                 }
101758
101759                 aboutList
101760                     .append('li')
101761                     .attr('class', 'version')
101762                     .call(uiVersion(context));
101763
101764                 var issueLinks = aboutList
101765                     .append('li');
101766
101767                 issueLinks
101768                     .append('a')
101769                     .attr('target', '_blank')
101770                     .attr('tabindex', -1)
101771                     .attr('href', 'https://github.com/openstreetmap/iD/issues')
101772                     .call(svgIcon('#iD-icon-bug', 'light'))
101773                     .call(tooltip().title(t('report_a_bug')).placement('top'));
101774
101775                 issueLinks
101776                     .append('a')
101777                     .attr('target', '_blank')
101778                     .attr('tabindex', -1)
101779                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
101780                     .call(svgIcon('#iD-icon-translate', 'light'))
101781                     .call(tooltip().title(t('help_translate')).placement('top'));
101782
101783                 aboutList
101784                     .append('li')
101785                     .attr('class', 'feature-warning')
101786                     .attr('tabindex', -1)
101787                     .call(uiFeatureInfo(context));
101788
101789                 aboutList
101790                     .append('li')
101791                     .attr('class', 'user-list')
101792                     .attr('tabindex', -1)
101793                     .call(uiContributors(context));
101794
101795
101796                 // Setup map dimensions and move map to initial center/zoom.
101797                 // This should happen after #content and toolbars exist.
101798                 ui.onResize();
101799                 map.redrawEnable(true);
101800
101801                 ui.hash = behaviorHash(context);
101802                 ui.hash();
101803                 if (!ui.hash.hadHash) {
101804                     map.centerZoom([0, 0], 2);
101805                 }
101806
101807
101808                 var overMap = content
101809                     .append('div')
101810                     .attr('class', 'over-map');
101811
101812                 // Add panes
101813                 // This should happen after map is initialized, as some require surface()
101814                 var panes = overMap
101815                     .append('div')
101816                     .attr('class', 'map-panes');
101817
101818                 panes
101819                     .call(background.renderPane)
101820                     .call(mapData.renderPane)
101821                     .call(issues.renderPane)
101822                     .call(help.renderPane);
101823
101824                 // Add absolutely-positioned elements that sit on top of the map
101825                 // This should happen after the map is ready (center/zoom)
101826                 overMap
101827                     .call(uiMapInMap(context))
101828                     .call(uiInfo(context))
101829                     .call(uiNotice(context));
101830
101831
101832                 overMap
101833                     .append('div')
101834                     .attr('id', 'photoviewer')
101835                     .classed('al', true)       // 'al'=left,  'ar'=right
101836                     .classed('hide', true)
101837                     .call(ui.photoviewer);
101838
101839
101840                 // Bind events
101841                 window.onbeforeunload = function() {
101842                     return context.save();
101843                 };
101844                 window.onunload = function() {
101845                     context.history().unlock();
101846                 };
101847
101848                 d3_select(window)
101849                     .on('gesturestart.editor', eventCancel)
101850                     .on('gesturechange.editor', eventCancel)
101851                     .on('gestureend.editor', eventCancel)
101852                     .on('resize.editor', ui.onResize);
101853
101854
101855                 var panPixels = 80;
101856                 context.keybinding()
101857                     .on('⌫', function() { event.preventDefault(); })
101858                     .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
101859                     .on('←', pan([panPixels, 0]))
101860                     .on('↑', pan([0, panPixels]))
101861                     .on('→', pan([-panPixels, 0]))
101862                     .on('↓', pan([0, -panPixels]))
101863                     .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
101864                     .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
101865                     .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
101866                     .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
101867
101868                 context.enter(modeBrowse(context));
101869
101870                 if (!_initCounter++) {
101871                     if (!ui.hash.startWalkthrough) {
101872                         context.container()
101873                             .call(uiSplash(context))
101874                             .call(uiRestore(context));
101875                     }
101876
101877                     context.container()
101878                         .call(uiShortcuts(context));
101879                 }
101880
101881                 var osm = context.connection();
101882                 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
101883
101884                 if (osm && auth) {
101885                     osm
101886                         .on('authLoading.ui', function() {
101887                             context.container()
101888                                 .call(auth);
101889                         })
101890                         .on('authDone.ui', function() {
101891                             auth.close();
101892                         });
101893                 }
101894
101895                 _initCounter++;
101896
101897                 if (ui.hash.startWalkthrough) {
101898                     ui.hash.startWalkthrough = false;
101899                     context.container().call(uiIntro(context));
101900                 }
101901
101902
101903                 function pan(d) {
101904                     return function() {
101905                         if (d3_select('.combobox').size()) return;
101906                         event.preventDefault();
101907                         context.pan(d, 100);
101908                     };
101909                 }
101910
101911                 function eventCancel() {
101912                     event.preventDefault();
101913                 }
101914             }
101915
101916
101917             function ui(node, callback) {
101918                 _initCallback = callback;
101919                 var container = d3_select(node);
101920                 context.container(container);
101921                 context.loadLocale(function(err) {
101922                     if (!err) {
101923                         render(container);
101924                     }
101925                     if (callback) {
101926                         callback(err);
101927                     }
101928                 });
101929             }
101930
101931
101932             ui.restart = function(arg) {
101933                 context.keybinding().clear();
101934                 context.locale(arg);
101935                 context.loadLocale(function(err) {
101936                     if (!err) {
101937                         context.container().selectAll('*').remove();
101938                         render(context.container());
101939                         if (_initCallback) _initCallback();
101940                     }
101941                 });
101942             };
101943
101944
101945             ui.sidebar = uiSidebar(context);
101946
101947             ui.photoviewer = uiPhotoviewer(context);
101948
101949             ui.onResize = function(withPan) {
101950                 var map = context.map();
101951
101952                 // Recalc dimensions of map and sidebar.. (`true` = force recalc)
101953                 // This will call `getBoundingClientRect` and trigger reflow,
101954                 //  but the values will be cached for later use.
101955                 var mapDimensions = utilGetDimensions(d3_select('#content'), true);
101956                 utilGetDimensions(d3_select('#sidebar'), true);
101957
101958                 if (withPan !== undefined) {
101959                     map.redrawEnable(false);
101960                     map.pan(withPan);
101961                     map.redrawEnable(true);
101962                 }
101963                 map.dimensions(mapDimensions);
101964
101965                 ui.photoviewer.onMapResize();
101966
101967                 // check if header or footer have overflowed
101968                 ui.checkOverflow('#bar');
101969                 ui.checkOverflow('#footer');
101970
101971                 // Use outdated code so it works on Explorer
101972                 var resizeWindowEvent = document.createEvent('Event');
101973
101974                 resizeWindowEvent.initEvent('resizeWindow', true, true);
101975
101976                 document.dispatchEvent(resizeWindowEvent);
101977             };
101978
101979
101980             // Call checkOverflow when resizing or whenever the contents change.
101981             ui.checkOverflow = function(selector, reset) {
101982                 if (reset) {
101983                     delete _needWidth[selector];
101984                 }
101985
101986                 var element = d3_select(selector);
101987                 var scrollWidth = element.property('scrollWidth');
101988                 var clientWidth = element.property('clientWidth');
101989                 var needed = _needWidth[selector] || scrollWidth;
101990
101991                 if (scrollWidth > clientWidth) {    // overflow happening
101992                     element.classed('narrow', true);
101993                     if (!_needWidth[selector]) {
101994                         _needWidth[selector] = scrollWidth;
101995                     }
101996
101997                 } else if (scrollWidth >= needed) {
101998                     element.classed('narrow', false);
101999                 }
102000             };
102001
102002             ui.togglePanes = function(showPane) {
102003                 var shownPanes = d3_selectAll('.map-pane.shown');
102004
102005                 var side = textDirection === 'ltr' ? 'right' : 'left';
102006
102007                 shownPanes
102008                     .classed('shown', false);
102009
102010                 d3_selectAll('.map-control button')
102011                     .classed('active', false);
102012
102013                 if (showPane) {
102014                     shownPanes
102015                         .style('display', 'none')
102016                         .style(side, '-500px');
102017
102018                     d3_selectAll('.' + showPane.attr('pane') + '-control button')
102019                         .classed('active', true);
102020
102021                     showPane
102022                         .classed('shown', true)
102023                         .style('display', 'block');
102024                     if (shownPanes.empty()) {
102025                         showPane
102026                             .style('display', 'block')
102027                             .style(side, '-500px')
102028                             .transition()
102029                             .duration(200)
102030                             .style(side, '0px');
102031                     } else {
102032                         showPane
102033                             .style(side, '0px');
102034                     }
102035                 } else {
102036                     shownPanes
102037                         .style('display', 'block')
102038                         .style(side, '0px')
102039                         .transition()
102040                         .duration(200)
102041                         .style(side, '-500px')
102042                         .on('end', function() {
102043                             d3_select(this).style('display', 'none');
102044                         });
102045                 }
102046             };
102047
102048             return ui;
102049         }
102050
102051         function coreContext() {
102052             var dispatch$1 = dispatch('enter', 'exit', 'change');
102053             var context = utilRebind({}, dispatch$1, 'on');
102054             var _deferred = new Set();
102055
102056             context.version = '2.15.4';
102057
102058             // create a special translation that contains the keys in place of the strings
102059             var tkeys = JSON.parse(JSON.stringify(en));  // clone deep
102060             var parents = [];
102061
102062             function traverser(v, k, obj) {
102063                 parents.push(k);
102064                 if (typeof v === 'object') {
102065                     forOwn(v, traverser);
102066                 } else if (typeof v === 'string') {
102067                     obj[k] = parents.join('.');
102068                 }
102069                 parents.pop();
102070             }
102071
102072             function forOwn(obj, fn) {
102073                 Object.keys(obj).forEach(function(k) { fn(obj[k], k, obj); });
102074             }
102075
102076             forOwn(tkeys, traverser);
102077             addTranslation('_tkeys_', tkeys);
102078
102079             addTranslation('en', en);
102080             setLocale('en');
102081
102082
102083             // https://github.com/openstreetmap/iD/issues/772
102084             // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
102085             var storage;
102086             try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
102087             storage = storage || (function() {
102088                 var s = {};
102089                 return {
102090                     getItem: function(k) { return s[k]; },
102091                     setItem: function(k, v) { s[k] = v; },
102092                     removeItem: function(k) { delete s[k]; }
102093                 };
102094             })();
102095
102096             context.storage = function(k, v) {
102097                 try {
102098                     if (arguments.length === 1) return storage.getItem(k);
102099                     else if (v === null) storage.removeItem(k);
102100                     else storage.setItem(k, v);
102101                 } catch (e) {
102102                     // localstorage quota exceeded
102103                     /* eslint-disable no-console */
102104                     if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
102105                     /* eslint-enable no-console */
102106                 }
102107             };
102108
102109
102110             /* User interface and keybinding */
102111             var ui;
102112             context.ui = function() { return ui; };
102113
102114             var keybinding = utilKeybinding('context');
102115             context.keybinding = function() { return keybinding; };
102116             d3_select(document).call(keybinding);
102117
102118
102119             /* Straight accessors. Avoid using these if you can. */
102120             var connection, history, validator;
102121             context.connection = function() { return connection; };
102122             context.history = function() { return history; };
102123             context.validator = function() { return validator; };
102124
102125             /* Connection */
102126             context.preauth = function(options) {
102127                 if (connection) {
102128                     connection.switch(options);
102129                 }
102130                 return context;
102131             };
102132
102133
102134             function afterLoad(cid, callback) {
102135                 return function(err, result) {
102136                     if (err) {
102137                         // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
102138                         if (err.status === 400 || err.status === 401 || err.status === 403) {
102139                             if (connection) {
102140                                 connection.logout();
102141                             }
102142                         }
102143                         if (typeof callback === 'function') {
102144                             callback(err);
102145                         }
102146                         return;
102147
102148                     } else if (connection && connection.getConnectionId() !== cid) {
102149                         if (typeof callback === 'function') {
102150                             callback({ message: 'Connection Switched', status: -1 });
102151                         }
102152                         return;
102153
102154                     } else {
102155                         history.merge(result.data, result.extent);
102156                         if (typeof callback === 'function') {
102157                             callback(err, result);
102158                         }
102159                         return;
102160                     }
102161                 };
102162             }
102163
102164
102165             context.loadTiles = function(projection, callback) {
102166                 var handle = window.requestIdleCallback(function() {
102167                     _deferred.delete(handle);
102168                     if (connection && context.editable()) {
102169                         var cid = connection.getConnectionId();
102170                         connection.loadTiles(projection, afterLoad(cid, callback));
102171                     }
102172                 });
102173                 _deferred.add(handle);
102174             };
102175
102176             context.loadTileAtLoc = function(loc, callback) {
102177                 var handle = window.requestIdleCallback(function() {
102178                     _deferred.delete(handle);
102179                     if (connection && context.editable()) {
102180                         var cid = connection.getConnectionId();
102181                         connection.loadTileAtLoc(loc, afterLoad(cid, callback));
102182                     }
102183                 });
102184                 _deferred.add(handle);
102185             };
102186
102187             context.loadEntity = function(entityID, callback) {
102188                 if (connection) {
102189                     var cid = connection.getConnectionId();
102190                     connection.loadEntity(entityID, afterLoad(cid, callback));
102191                 }
102192             };
102193
102194             context.zoomToEntity = function(entityID, zoomTo) {
102195                 if (zoomTo !== false) {
102196                     this.loadEntity(entityID, function(err, result) {
102197                         if (err) return;
102198                         var entity = result.data.find(function(e) { return e.id === entityID; });
102199                         if (entity) {
102200                             map.zoomTo(entity);
102201                         }
102202                     });
102203                 }
102204
102205                 map.on('drawn.zoomToEntity', function() {
102206                     if (!context.hasEntity(entityID)) return;
102207                     map.on('drawn.zoomToEntity', null);
102208                     context.on('enter.zoomToEntity', null);
102209                     context.enter(modeSelect(context, [entityID]));
102210                 });
102211
102212                 context.on('enter.zoomToEntity', function() {
102213                     if (mode.id !== 'browse') {
102214                         map.on('drawn.zoomToEntity', null);
102215                         context.on('enter.zoomToEntity', null);
102216                     }
102217                 });
102218             };
102219
102220             var minEditableZoom = 16;
102221             context.minEditableZoom = function(val) {
102222                 if (!arguments.length) return minEditableZoom;
102223                 minEditableZoom = val;
102224                 if (connection) {
102225                     connection.tileZoom(val);
102226                 }
102227                 return context;
102228             };
102229
102230
102231             /* History */
102232             var inIntro = false;
102233             context.inIntro = function(val) {
102234                 if (!arguments.length) return inIntro;
102235                 inIntro = val;
102236                 return context;
102237             };
102238
102239             context.save = function() {
102240                 // no history save, no message onbeforeunload
102241                 if (inIntro || d3_select('.modal').size()) return;
102242
102243                 var canSave;
102244                 if (mode && mode.id === 'save') {
102245                     canSave = false;
102246
102247                     // Attempt to prevent user from creating duplicate changes - see #5200
102248                     if (services$1.osm && services$1.osm.isChangesetInflight()) {
102249                         history.clearSaved();
102250                         return;
102251                     }
102252
102253                 } else {
102254                     canSave = context.selectedIDs().every(function(id) {
102255                         var entity = context.hasEntity(id);
102256                         return entity && !entity.isDegenerate();
102257                     });
102258                 }
102259
102260                 if (canSave) {
102261                     history.save();
102262                 }
102263                 if (history.hasChanges()) {
102264                     return t('save.unsaved_changes');
102265                 }
102266             };
102267
102268
102269             /* Graph */
102270             context.hasEntity = function(id) {
102271                 return history.graph().hasEntity(id);
102272             };
102273             context.entity = function(id) {
102274                 return history.graph().entity(id);
102275             };
102276             context.childNodes = function(way) {
102277                 return history.graph().childNodes(way);
102278             };
102279             context.geometry = function(id) {
102280                 return context.entity(id).geometry(history.graph());
102281             };
102282
102283
102284             /* Modes */
102285             var mode;
102286             context.mode = function() {
102287                 return mode;
102288             };
102289             context.enter = function(newMode) {
102290                 if (mode) {
102291                     mode.exit();
102292                     dispatch$1.call('exit', this, mode);
102293                 }
102294
102295                 mode = newMode;
102296                 mode.enter();
102297                 dispatch$1.call('enter', this, mode);
102298             };
102299
102300             context.selectedIDs = function() {
102301                 if (mode && mode.selectedIDs) {
102302                     return mode.selectedIDs();
102303                 } else {
102304                     return [];
102305                 }
102306             };
102307
102308             context.activeID = function() {
102309                 return mode && mode.activeID && mode.activeID();
102310             };
102311
102312             var _selectedNoteID;
102313             context.selectedNoteID = function(noteID) {
102314                 if (!arguments.length) return _selectedNoteID;
102315                 _selectedNoteID = noteID;
102316                 return context;
102317             };
102318
102319             var _selectedErrorID;
102320             context.selectedErrorID = function(errorID) {
102321                 if (!arguments.length) return _selectedErrorID;
102322                 _selectedErrorID = errorID;
102323                 return context;
102324             };
102325
102326
102327             /* Behaviors */
102328             context.install = function(behavior) {
102329                 context.surface().call(behavior);
102330             };
102331             context.uninstall = function(behavior) {
102332                 context.surface().call(behavior.off);
102333             };
102334
102335
102336             /* Copy/Paste */
102337             var copyIDs = [], copyGraph;
102338             context.copyGraph = function() { return copyGraph; };
102339             context.copyIDs = function(val) {
102340                 if (!arguments.length) return copyIDs;
102341                 copyIDs = val;
102342                 copyGraph = history.graph();
102343                 return context;
102344             };
102345
102346
102347             /* Background */
102348             var background;
102349             context.background = function() { return background; };
102350
102351
102352             /* Features */
102353             var features;
102354             context.features = function() { return features; };
102355             context.hasHiddenConnections = function(id) {
102356                 var graph = history.graph();
102357                 var entity = graph.entity(id);
102358                 return features.hasHiddenConnections(entity, graph);
102359             };
102360
102361
102362             /* Photos */
102363             var photos;
102364             context.photos = function() { return photos; };
102365
102366
102367             /* Presets */
102368             var presets;
102369             context.presets = function() { return presets; };
102370
102371
102372             /* Map */
102373             var map;
102374             context.map = function() { return map; };
102375             context.layers = function() { return map.layers; };
102376             context.surface = function() { return map.surface; };
102377             context.editable = function() { return map.editable(); };
102378             context.surfaceRect = function() {
102379                 return map.surface.node().getBoundingClientRect();
102380             };
102381
102382
102383             /* Debug */
102384             var debugFlags = {
102385                 tile: false,        // tile boundaries
102386                 collision: false,   // label collision bounding boxes
102387                 imagery: false,     // imagery bounding polygons
102388                 community: false,   // community bounding polygons
102389                 imperial: false,    // imperial (not metric) bounding polygons
102390                 driveLeft: false,   // driveLeft bounding polygons
102391                 target: false,      // touch targets
102392                 downloaded: false   // downloaded data from osm
102393             };
102394             context.debugFlags = function() {
102395                 return debugFlags;
102396             };
102397             context.setDebug = function(flag, val) {
102398                 if (arguments.length === 1) val = true;
102399                 debugFlags[flag] = val;
102400                 dispatch$1.call('change');
102401                 return context;
102402             };
102403             context.getDebug = function(flag) {
102404                 return flag && debugFlags[flag];
102405             };
102406
102407
102408             /* Container */
102409             var container = d3_select(document.body);
102410             context.container = function(val) {
102411                 if (!arguments.length) return container;
102412                 container = val;
102413                 container.classed('id-container', true);
102414                 return context;
102415             };
102416             var embed;
102417             context.embed = function(val) {
102418                 if (!arguments.length) return embed;
102419                 embed = val;
102420                 return context;
102421             };
102422
102423
102424             /* Assets */
102425             var assetPath = '';
102426             context.assetPath = function(val) {
102427                 if (!arguments.length) return assetPath;
102428                 assetPath = val;
102429                 return context;
102430             };
102431
102432             var assetMap = {};
102433             context.assetMap = function(val) {
102434                 if (!arguments.length) return assetMap;
102435                 assetMap = val;
102436                 return context;
102437             };
102438
102439             context.asset = function(val) {
102440                 var filename = assetPath + val;
102441                 return assetMap[filename] || filename;
102442             };
102443
102444             context.imagePath = function(val) {
102445                 return context.asset('img/' + val);
102446             };
102447
102448
102449             /* locales */
102450             // `locale` variable contains a "requested locale".
102451             // It won't become the `currentLocale` until after loadLocale() is called.
102452             var locale, localePath;
102453
102454             context.locale = function(loc, path) {
102455                 if (!arguments.length) return currentLocale;
102456                 locale = loc;
102457                 localePath = path;
102458                 return context;
102459             };
102460
102461             context.loadLocale = function(callback) {
102462                 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
102463                     localePath = localePath || context.asset('locales/' + locale + '.json');
102464                     d3_json(localePath)
102465                         .then(function(result) {
102466                             addTranslation(locale, result[locale]);
102467                             setLocale(locale);
102468                             utilDetect(true);
102469                             if (callback) callback();
102470                         })
102471                         .catch(function(err) {
102472                             if (callback) callback(err.message);
102473                         });
102474                 } else {
102475                     if (locale) {
102476                         setLocale(locale);
102477                         utilDetect(true);
102478                     }
102479                     if (callback) {
102480                         callback();
102481                     }
102482                 }
102483             };
102484
102485
102486             /* reset (aka flush) */
102487             context.reset = context.flush = function() {
102488                 context.debouncedSave.cancel();
102489
102490                 Array.from(_deferred).forEach(function(handle) {
102491                     window.cancelIdleCallback(handle);
102492                     _deferred.delete(handle);
102493                 });
102494
102495                 Object.values(services$1).forEach(function(service) {
102496                     if (service && typeof service.reset === 'function') {
102497                         service.reset(context);
102498                     }
102499                 });
102500
102501                 validator.reset();
102502                 features.reset();
102503                 history.reset();
102504
102505                 return context;
102506             };
102507
102508
102509             /* Init */
102510
102511             context.projection = geoRawMercator();
102512             context.curtainProjection = geoRawMercator();
102513
102514             locale = utilDetect().locale;
102515             if (locale && !dataLocales.hasOwnProperty(locale)) {
102516                 locale = locale.split('-')[0];
102517             }
102518
102519             history = coreHistory(context);
102520             validator = coreValidator(context);
102521
102522             context.graph = history.graph;
102523             context.changes = history.changes;
102524             context.intersects = history.intersects;
102525             context.pauseChangeDispatch = history.pauseChangeDispatch;
102526             context.resumeChangeDispatch = history.resumeChangeDispatch;
102527
102528             // Debounce save, since it's a synchronous localStorage write,
102529             // and history changes can happen frequently (e.g. when dragging).
102530             context.debouncedSave = debounce(context.save, 350);
102531             function withDebouncedSave(fn) {
102532                 return function() {
102533                     var result = fn.apply(history, arguments);
102534                     context.debouncedSave();
102535                     return result;
102536                 };
102537             }
102538
102539             context.perform = withDebouncedSave(history.perform);
102540             context.replace = withDebouncedSave(history.replace);
102541             context.pop = withDebouncedSave(history.pop);
102542             context.overwrite = withDebouncedSave(history.overwrite);
102543             context.undo = withDebouncedSave(history.undo);
102544             context.redo = withDebouncedSave(history.redo);
102545
102546             ui = uiInit(context);
102547
102548             connection = services$1.osm;
102549             background = rendererBackground(context);
102550             features = rendererFeatures(context);
102551             photos = rendererPhotos(context);
102552             presets = presetIndex(context);
102553
102554             if (services$1.maprules && utilStringQs(window.location.hash).maprules) {
102555                 var maprules = utilStringQs(window.location.hash).maprules;
102556                 d3_json(maprules)
102557                     .then(function(mapcss) {
102558                         services$1.maprules.init();
102559                         mapcss.forEach(function(mapcssSelector) {
102560                             return services$1.maprules.addRule(mapcssSelector);
102561                         });
102562                     })
102563                     .catch(function() {
102564                         /* ignore */
102565                     });
102566             }
102567
102568             map = rendererMap(context);
102569             context.mouse = map.mouse;
102570             context.extent = map.extent;
102571             context.pan = map.pan;
102572             context.zoomIn = map.zoomIn;
102573             context.zoomOut = map.zoomOut;
102574             context.zoomInFurther = map.zoomInFurther;
102575             context.zoomOutFurther = map.zoomOutFurther;
102576             context.redrawEnable = map.redrawEnable;
102577
102578             Object.values(services$1).forEach(function(service) {
102579                 if (service && typeof service.init === 'function') {
102580                     service.init(context);
102581                 }
102582             });
102583
102584             validator.init();
102585             background.init();
102586             features.init();
102587             photos.init();
102588
102589             var presetsParameter = utilStringQs(window.location.hash).presets;
102590             if (presetsParameter && presetsParameter.indexOf('://') !== -1) {
102591                 // assume URL of external presets file
102592
102593                 presets.fromExternal(external, function(externalPresets) {
102594                     context.presets = function() { return externalPresets; }; // default + external presets...
102595                     osmSetAreaKeys(presets.areaKeys());
102596                     osmSetPointTags(presets.pointTags());
102597                     osmSetVertexTags(presets.vertexTags());
102598                 });
102599             } else {
102600                 var isVisible;
102601                 if (presetsParameter) {
102602                     // assume list of allowed preset IDs
102603                     var visiblePresetIDs = new Set(presetsParameter.split(','));
102604                     isVisible = function(presetID) {
102605                         return visiblePresetIDs.has(presetID);
102606                     };
102607                 }
102608                 presets.init(isVisible);
102609                 osmSetAreaKeys(presets.areaKeys());
102610                 osmSetPointTags(presets.pointTags());
102611                 osmSetVertexTags(presets.vertexTags());
102612             }
102613
102614             return context;
102615         }
102616
102617         function uiSourceSwitch(context) {
102618             var keys;
102619
102620
102621             function click() {
102622                 event.preventDefault();
102623
102624                 var osm = context.connection();
102625                 if (!osm) return;
102626
102627                 if (context.inIntro()) return;
102628
102629                 if (context.history().hasChanges() &&
102630                     !window.confirm(t('source_switch.lose_changes'))) return;
102631
102632                 var isLive = d3_select(this)
102633                     .classed('live');
102634
102635                 isLive = !isLive;
102636                 context.enter(modeBrowse(context));
102637                 context.history().clearSaved();          // remove saved history
102638                 context.flush();                         // remove stored data
102639
102640                 d3_select(this)
102641                     .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
102642                     .classed('live', isLive);
102643
102644                 osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
102645             }
102646
102647             var sourceSwitch = function(selection) {
102648                 selection
102649                     .append('a')
102650                     .attr('href', '#')
102651                     .text(t('source_switch.live'))
102652                     .classed('live', true)
102653                     .attr('tabindex', -1)
102654                     .on('click', click);
102655             };
102656
102657
102658             sourceSwitch.keys = function(_) {
102659                 if (!arguments.length) return keys;
102660                 keys = _;
102661                 return sourceSwitch;
102662             };
102663
102664
102665             return sourceSwitch;
102666         }
102667
102668         var Connection = services$1.osm;
102669
102670         var debug = false;
102671
102672         var iD = /*#__PURE__*/Object.freeze({
102673                 Connection: Connection,
102674                 debug: debug,
102675                 d3: index$3,
102676                 Context: coreContext,
102677                 setAreaKeys: osmSetAreaKeys,
102678                 get areaKeys () { return osmAreaKeys; },
102679                 Difference: coreDifference,
102680                 Graph: coreGraph,
102681                 History: coreHistory,
102682                 Tree: coreTree,
102683                 geoCross: geoVecCross,
102684                 geoInterp: geoVecInterp,
102685                 geoRoundCoordinates: geoVecFloor,
102686                 geoEuclideanDistance: geoVecLength,
102687                 Entity: osmEntity,
102688                 Node: osmNode,
102689                 Relation: osmRelation,
102690                 Way: osmWay,
102691                 BackgroundSource: rendererBackgroundSource,
102692                 Background: rendererBackground,
102693                 Features: rendererFeatures,
102694                 Map: rendererMap,
102695                 TileLayer: rendererTileLayer,
102696                 Detect: utilDetect,
102697                 uiPreset: uiPresetEditor,
102698                 actionAddEntity: actionAddEntity,
102699                 actionAddMember: actionAddMember,
102700                 actionAddMidpoint: actionAddMidpoint,
102701                 actionAddVertex: actionAddVertex,
102702                 actionChangeMember: actionChangeMember,
102703                 actionChangePreset: actionChangePreset,
102704                 actionChangeTags: actionChangeTags,
102705                 actionCircularize: actionCircularize,
102706                 actionConnect: actionConnect,
102707                 actionCopyEntities: actionCopyEntities,
102708                 actionDeleteMember: actionDeleteMember,
102709                 actionDeleteMultiple: actionDeleteMultiple,
102710                 actionDeleteNode: actionDeleteNode,
102711                 actionDeleteRelation: actionDeleteRelation,
102712                 actionDeleteWay: actionDeleteWay,
102713                 actionDiscardTags: actionDiscardTags,
102714                 actionDisconnect: actionDisconnect,
102715                 actionExtract: actionExtract,
102716                 actionJoin: actionJoin,
102717                 actionMerge: actionMerge,
102718                 actionMergeNodes: actionMergeNodes,
102719                 actionMergePolygon: actionMergePolygon,
102720                 actionMergeRemoteChanges: actionMergeRemoteChanges,
102721                 actionMove: actionMove,
102722                 actionMoveMember: actionMoveMember,
102723                 actionMoveNode: actionMoveNode,
102724                 actionNoop: actionNoop,
102725                 actionOrthogonalize: actionOrthogonalize,
102726                 actionRestrictTurn: actionRestrictTurn,
102727                 actionReverse: actionReverse,
102728                 actionRevert: actionRevert,
102729                 actionRotate: actionRotate,
102730                 actionSplit: actionSplit,
102731                 actionStraightenNodes: actionStraightenNodes,
102732                 actionStraightenWay: actionStraightenWay,
102733                 actionUnrestrictTurn: actionUnrestrictTurn,
102734                 actionReflect: actionReflect,
102735                 actionUpgradeTags: actionUpgradeTags,
102736                 behaviorAddWay: behaviorAddWay,
102737                 behaviorBreathe: behaviorBreathe,
102738                 behaviorCopy: behaviorCopy,
102739                 behaviorDrag: behaviorDrag,
102740                 behaviorDrawWay: behaviorDrawWay,
102741                 behaviorDraw: behaviorDraw,
102742                 behaviorEdit: behaviorEdit,
102743                 behaviorHash: behaviorHash,
102744                 behaviorHover: behaviorHover,
102745                 behaviorLasso: behaviorLasso,
102746                 behaviorOperation: behaviorOperation,
102747                 behaviorPaste: behaviorPaste,
102748                 behaviorSelect: behaviorSelect,
102749                 behaviorTail: behaviorTail,
102750                 coreContext: coreContext,
102751                 coreDifference: coreDifference,
102752                 coreGraph: coreGraph,
102753                 coreHistory: coreHistory,
102754                 coreTree: coreTree,
102755                 coreValidator: coreValidator,
102756                 data: data,
102757                 dataWikipedia: wikipedia$2,
102758                 dataAddressFormats: dataAddressFormats,
102759                 dataDeprecated: dataDeprecated,
102760                 dataDiscarded: dataDiscarded,
102761                 dataLocales: dataLocales,
102762                 dataPhoneFormats: dataPhoneFormats,
102763                 dataShortcuts: dataShortcuts,
102764                 dataImperial: dataImperial,
102765                 dataMPH: dataMPH,
102766                 dataDriveLeft: dataDriveLeft,
102767                 dataEn: en,
102768                 geoExtent: geoExtent,
102769                 geoLatToMeters: geoLatToMeters,
102770                 geoLonToMeters: geoLonToMeters,
102771                 geoMetersToLat: geoMetersToLat,
102772                 geoMetersToLon: geoMetersToLon,
102773                 geoMetersToOffset: geoMetersToOffset,
102774                 geoOffsetToMeters: geoOffsetToMeters,
102775                 geoScaleToZoom: geoScaleToZoom,
102776                 geoSphericalClosestNode: geoSphericalClosestNode,
102777                 geoSphericalDistance: geoSphericalDistance,
102778                 geoZoomToScale: geoZoomToScale,
102779                 geoAngle: geoAngle,
102780                 geoChooseEdge: geoChooseEdge,
102781                 geoEdgeEqual: geoEdgeEqual,
102782                 geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
102783                 geoHasLineIntersections: geoHasLineIntersections,
102784                 geoHasSelfIntersections: geoHasSelfIntersections,
102785                 geoRotate: geoRotate,
102786                 geoLineIntersection: geoLineIntersection,
102787                 geoPathHasIntersections: geoPathHasIntersections,
102788                 geoPathIntersections: geoPathIntersections,
102789                 geoPathLength: geoPathLength,
102790                 geoPointInPolygon: geoPointInPolygon,
102791                 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
102792                 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
102793                 geoViewportEdge: geoViewportEdge,
102794                 geoRawMercator: geoRawMercator,
102795                 geoVecAdd: geoVecAdd,
102796                 geoVecAngle: geoVecAngle,
102797                 geoVecCross: geoVecCross,
102798                 geoVecDot: geoVecDot,
102799                 geoVecEqual: geoVecEqual,
102800                 geoVecFloor: geoVecFloor,
102801                 geoVecInterp: geoVecInterp,
102802                 geoVecLength: geoVecLength,
102803                 geoVecNormalize: geoVecNormalize,
102804                 geoVecNormalizedDot: geoVecNormalizedDot,
102805                 geoVecProject: geoVecProject,
102806                 geoVecSubtract: geoVecSubtract,
102807                 geoVecScale: geoVecScale,
102808                 geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
102809                 geoOrthoCalcScore: geoOrthoCalcScore,
102810                 geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
102811                 geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
102812                 modeAddArea: modeAddArea,
102813                 modeAddLine: modeAddLine,
102814                 modeAddPoint: modeAddPoint,
102815                 modeAddNote: modeAddNote,
102816                 modeBrowse: modeBrowse,
102817                 modeDragNode: modeDragNode,
102818                 modeDragNote: modeDragNote,
102819                 modeDrawArea: modeDrawArea,
102820                 modeDrawLine: modeDrawLine,
102821                 modeMove: modeMove,
102822                 modeRotate: modeRotate,
102823                 modeSave: modeSave,
102824                 modeSelect: modeSelect,
102825                 modeSelectData: modeSelectData,
102826                 modeSelectError: modeSelectError,
102827                 modeSelectNote: modeSelectNote,
102828                 operationCircularize: operationCircularize,
102829                 operationContinue: operationContinue,
102830                 operationDelete: operationDelete,
102831                 operationDisconnect: operationDisconnect,
102832                 operationDowngrade: operationDowngrade,
102833                 operationExtract: operationExtract,
102834                 operationMerge: operationMerge,
102835                 operationMove: operationMove,
102836                 operationOrthogonalize: operationOrthogonalize,
102837                 operationReflectShort: operationReflectShort,
102838                 operationReflectLong: operationReflectLong,
102839                 operationReverse: operationReverse,
102840                 operationRotate: operationRotate,
102841                 operationSplit: operationSplit,
102842                 operationStraighten: operationStraighten,
102843                 osmChangeset: osmChangeset,
102844                 osmEntity: osmEntity,
102845                 osmNode: osmNode,
102846                 osmNote: osmNote,
102847                 osmRelation: osmRelation,
102848                 osmWay: osmWay,
102849                 qaError: qaError,
102850                 osmIntersection: osmIntersection,
102851                 osmTurn: osmTurn,
102852                 osmInferRestriction: osmInferRestriction,
102853                 osmLanes: osmLanes,
102854                 osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
102855                 osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
102856                 osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
102857                 osmJoinWays: osmJoinWays,
102858                 get osmAreaKeys () { return osmAreaKeys; },
102859                 osmSetAreaKeys: osmSetAreaKeys,
102860                 get osmPointTags () { return osmPointTags; },
102861                 osmSetPointTags: osmSetPointTags,
102862                 get osmVertexTags () { return osmVertexTags; },
102863                 osmSetVertexTags: osmSetVertexTags,
102864                 osmNodeGeometriesForTags: osmNodeGeometriesForTags,
102865                 osmOneWayTags: osmOneWayTags,
102866                 osmPavedTags: osmPavedTags,
102867                 osmIsInterestingTag: osmIsInterestingTag,
102868                 osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
102869                 osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
102870                 osmRailwayTrackTagValues: osmRailwayTrackTagValues,
102871                 presetCategory: presetCategory,
102872                 presetCollection: presetCollection,
102873                 presetField: presetField,
102874                 presetPreset: presetPreset,
102875                 presetIndex: presetIndex,
102876                 rendererBackgroundSource: rendererBackgroundSource,
102877                 rendererBackground: rendererBackground,
102878                 rendererFeatures: rendererFeatures,
102879                 rendererMap: rendererMap,
102880                 rendererPhotos: rendererPhotos,
102881                 rendererTileLayer: rendererTileLayer,
102882                 services: services$1,
102883                 serviceKeepRight: serviceKeepRight,
102884                 serviceImproveOSM: serviceImproveOSM,
102885                 serviceMapillary: serviceMapillary,
102886                 serviceMapRules: serviceMapRules,
102887                 serviceNominatim: serviceNominatim,
102888                 serviceOpenstreetcam: serviceOpenstreetcam,
102889                 serviceOsm: serviceOsm,
102890                 serviceOsmWikibase: serviceOsmWikibase,
102891                 serviceStreetside: serviceStreetside,
102892                 serviceTaginfo: serviceTaginfo,
102893                 serviceVectorTile: serviceVectorTile,
102894                 serviceWikidata: serviceWikidata,
102895                 serviceWikipedia: serviceWikipedia,
102896                 svgAreas: svgAreas,
102897                 svgData: svgData,
102898                 svgDebug: svgDebug,
102899                 svgDefs: svgDefs,
102900                 svgKeepRight: svgKeepRight,
102901                 svgIcon: svgIcon,
102902                 svgGeolocate: svgGeolocate,
102903                 svgLabels: svgLabels,
102904                 svgLayers: svgLayers,
102905                 svgLines: svgLines,
102906                 svgMapillaryImages: svgMapillaryImages,
102907                 svgMapillarySigns: svgMapillarySigns,
102908                 svgMidpoints: svgMidpoints,
102909                 svgNotes: svgNotes,
102910                 svgMarkerSegments: svgMarkerSegments,
102911                 svgOpenstreetcamImages: svgOpenstreetcamImages,
102912                 svgOsm: svgOsm,
102913                 svgPassiveVertex: svgPassiveVertex,
102914                 svgPath: svgPath,
102915                 svgPointTransform: svgPointTransform,
102916                 svgPoints: svgPoints,
102917                 svgRelationMemberTags: svgRelationMemberTags,
102918                 svgSegmentWay: svgSegmentWay,
102919                 svgStreetside: svgStreetside,
102920                 svgTagClasses: svgTagClasses,
102921                 svgTouch: svgTouch,
102922                 svgTurns: svgTurns,
102923                 svgVertices: svgVertices,
102924                 uiFields: uiFields,
102925                 uiFieldDefaultCheck: uiFieldCheck,
102926                 uiFieldOnewayCheck: uiFieldCheck,
102927                 uiFieldCheck: uiFieldCheck,
102928                 uiFieldMultiCombo: uiFieldCombo,
102929                 uiFieldNetworkCombo: uiFieldCombo,
102930                 uiFieldSemiCombo: uiFieldCombo,
102931                 uiFieldTypeCombo: uiFieldCombo,
102932                 uiFieldCombo: uiFieldCombo,
102933                 uiFieldUrl: uiFieldText,
102934                 uiFieldNumber: uiFieldText,
102935                 uiFieldTel: uiFieldText,
102936                 uiFieldEmail: uiFieldText,
102937                 uiFieldText: uiFieldText,
102938                 uiFieldAccess: uiFieldAccess,
102939                 uiFieldAddress: uiFieldAddress,
102940                 uiFieldCycleway: uiFieldCycleway,
102941                 uiFieldLanes: uiFieldLanes,
102942                 uiFieldLocalized: uiFieldLocalized,
102943                 uiFieldMaxspeed: uiFieldMaxspeed,
102944                 uiFieldStructureRadio: uiFieldRadio,
102945                 uiFieldRadio: uiFieldRadio,
102946                 uiFieldRestrictions: uiFieldRestrictions,
102947                 uiFieldTextarea: uiFieldTextarea,
102948                 uiFieldWikidata: uiFieldWikidata,
102949                 uiFieldWikipedia: uiFieldWikipedia,
102950                 uiIntro: uiIntro,
102951                 uiInfoPanels: uiInfoPanels,
102952                 uiPanelBackground: uiPanelBackground,
102953                 uiPanelHistory: uiPanelHistory,
102954                 uiPanelLocation: uiPanelLocation,
102955                 uiPanelMeasurement: uiPanelMeasurement,
102956                 uiSettingsCustomBackground: uiSettingsCustomBackground,
102957                 uiSettingsCustomData: uiSettingsCustomData,
102958                 uiInit: uiInit,
102959                 uiAccount: uiAccount,
102960                 uiAttribution: uiAttribution,
102961                 uiBackground: uiBackground,
102962                 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
102963                 uiBackgroundOffset: uiBackgroundOffset,
102964                 uiChangesetEditor: uiChangesetEditor,
102965                 uiCmd: uiCmd,
102966                 uiCombobox: uiCombobox,
102967                 uiCommit: uiCommit,
102968                 uiCommitChanges: uiCommitChanges,
102969                 uiCommitWarnings: uiCommitWarnings,
102970                 uiConfirm: uiConfirm,
102971                 uiConflicts: uiConflicts,
102972                 uiContributors: uiContributors,
102973                 uiCurtain: uiCurtain,
102974                 uiDataEditor: uiDataEditor,
102975                 uiDataHeader: uiDataHeader,
102976                 uiDisclosure: uiDisclosure,
102977                 uiEditMenu: uiEditMenu,
102978                 uiEntityEditor: uiEntityEditor,
102979                 uiFeatureInfo: uiFeatureInfo,
102980                 uiFeatureList: uiFeatureList,
102981                 uiField: uiField,
102982                 uiFieldHelp: uiFieldHelp,
102983                 uiFlash: uiFlash,
102984                 uiFormFields: uiFormFields,
102985                 uiFullScreen: uiFullScreen,
102986                 uiGeolocate: uiGeolocate,
102987                 uiHelp: uiHelp,
102988                 uiImproveOsmComments: uiImproveOsmComments,
102989                 uiImproveOsmDetails: uiImproveOsmDetails,
102990                 uiImproveOsmEditor: uiImproveOsmEditor,
102991                 uiImproveOsmHeader: uiImproveOsmHeader,
102992                 uiInfo: uiInfo,
102993                 uiInspector: uiInspector,
102994                 uiKeepRightDetails: uiKeepRightDetails,
102995                 uiKeepRightEditor: uiKeepRightEditor,
102996                 uiKeepRightHeader: uiKeepRightHeader,
102997                 uiLasso: uiLasso,
102998                 uiLoading: uiLoading,
102999                 uiMapData: uiMapData,
103000                 uiMapInMap: uiMapInMap,
103001                 uiModal: uiModal,
103002                 uiNotice: uiNotice,
103003                 uiNoteComments: uiNoteComments,
103004                 uiNoteEditor: uiNoteEditor,
103005                 uiNoteHeader: uiNoteHeader,
103006                 uiNoteReport: uiNoteReport,
103007                 uiPresetEditor: uiPresetEditor,
103008                 uiPresetIcon: uiPresetIcon,
103009                 uiPresetList: uiPresetList,
103010                 uiQuickLinks: uiQuickLinks,
103011                 uiRadialMenu: uiRadialMenu,
103012                 uiRawMemberEditor: uiRawMemberEditor,
103013                 uiRawMembershipEditor: uiRawMembershipEditor,
103014                 uiRawTagEditor: uiRawTagEditor,
103015                 uiRestore: uiRestore,
103016                 uiScale: uiScale,
103017                 uiSelectionList: uiSelectionList,
103018                 uiSidebar: uiSidebar,
103019                 uiSourceSwitch: uiSourceSwitch,
103020                 uiSpinner: uiSpinner,
103021                 uiSplash: uiSplash,
103022                 uiStatus: uiStatus,
103023                 uiSuccess: uiSuccess,
103024                 uiTagReference: uiTagReference,
103025                 uiToggle: uiToggle,
103026                 uiTooltipHtml: uiTooltipHtml,
103027                 uiVersion: uiVersion,
103028                 uiViewOnOSM: uiViewOnOSM,
103029                 uiViewOnKeepRight: uiViewOnKeepRight,
103030                 uiZoom: uiZoom,
103031                 utilArrayChunk: utilArrayChunk,
103032                 utilArrayDifference: utilArrayDifference,
103033                 utilArrayFlatten: utilArrayFlatten,
103034                 utilArrayGroupBy: utilArrayGroupBy,
103035                 utilArrayIntersection: utilArrayIntersection,
103036                 utilArrayUnion: utilArrayUnion,
103037                 utilArrayUniq: utilArrayUniq,
103038                 utilArrayUniqBy: utilArrayUniqBy,
103039                 utilAsyncMap: utilAsyncMap,
103040                 utilCleanTags: utilCleanTags,
103041                 utilDetect: utilDetect,
103042                 utilDisplayName: utilDisplayName,
103043                 utilDisplayNameForPath: utilDisplayNameForPath,
103044                 utilDisplayType: utilDisplayType,
103045                 utilDisplayLabel: utilDisplayLabel,
103046                 utilEntityRoot: utilEntityRoot,
103047                 utilEditDistance: utilEditDistance,
103048                 utilEntitySelector: utilEntitySelector,
103049                 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
103050                 utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
103051                 utilFastMouse: utilFastMouse,
103052                 utilFunctor: utilFunctor,
103053                 utilGetAllNodes: utilGetAllNodes,
103054                 utilGetSetValue: utilGetSetValue,
103055                 utilHashcode: utilHashcode,
103056                 utilHighlightEntities: utilHighlightEntities,
103057                 utilKeybinding: utilKeybinding,
103058                 utilNoAuto: utilNoAuto,
103059                 utilObjectOmit: utilObjectOmit,
103060                 utilPrefixCSSProperty: utilPrefixCSSProperty,
103061                 utilPrefixDOMProperty: utilPrefixDOMProperty,
103062                 utilPreset: utilPreset,
103063                 utilQsString: utilQsString,
103064                 utilRebind: utilRebind,
103065                 utilSetTransform: utilSetTransform,
103066                 utilSessionMutex: utilSessionMutex,
103067                 utilStringQs: utilStringQs,
103068                 utilTagDiff: utilTagDiff,
103069                 utilTagText: utilTagText,
103070                 utilTiler: utilTiler,
103071                 utilTriggerEvent: utilTriggerEvent,
103072                 utilWrap: utilWrap,
103073                 validationAlmostJunction: validationAlmostJunction,
103074                 validationCloseNodes: validationCloseNodes,
103075                 validationCrossingWays: validationCrossingWays,
103076                 validationDisconnectedWay: validationDisconnectedWay,
103077                 validationFixmeTag: validationFixmeTag,
103078                 validationGenericName: validationGenericName,
103079                 validationImpossibleOneway: validationImpossibleOneway,
103080                 validationIncompatibleSource: validationIncompatibleSource,
103081                 validationFormatting: validationFormatting,
103082                 validationMaprules: validationMaprules,
103083                 validationMissingRole: validationMissingRole,
103084                 validationMissingTag: validationMissingTag,
103085                 validationOutdatedTags: validationOutdatedTags,
103086                 validationPrivateData: validationPrivateData,
103087                 validationTagSuggestsArea: validationTagSuggestsArea,
103088                 validationUnsquareWay: validationUnsquareWay
103089         });
103090
103091         // polyfill requestIdleCallback
103092         window.requestIdleCallback = window.requestIdleCallback ||
103093             function(cb) {
103094                 var start = Date.now();
103095                 return window.requestAnimationFrame(function() {
103096                     cb({
103097                         didTimeout: false,
103098                         timeRemaining: function() {
103099                             return Math.max(0, 50 - (Date.now() - start));
103100                         }
103101                     });
103102                 });
103103             };
103104
103105         window.cancelIdleCallback = window.cancelIdleCallback ||
103106             function(id) {
103107                 window.cancelAnimationFrame(id);
103108             };
103109         window.iD = iD;
103110
103111 }());
103112 //# sourceMappingURL=iD.js.map